Process once. Route to multiple destinations.

Graph, source and sample debugging make your rules visible.

Edit and validate

Pipeline uses Platypus. Canvas, shortcuts and source stay in sync, with .ppl import/export. Configure scripts per signal category; the Go executor validates before publication.

Sample debugging checks processing logic. It does not validate upstream connectivity or send data to real destinations.

set_tag("env", environment)
set_tag("service", service)
set_tag("processed", "yes")

Combined conditions and target sets

Routing reads Tags after Pipeline. Rules combine all (AND) or any (OR) conditions and bind one or more destinations. Rules match in order; unmatched records use defaults.

Default destinations are a fallback set, not automatically added to every matched rule. Changing a field does not necessarily change a Tag; use set_tag explicitly.

{
  "when": {
    "match": "all",
    "conditions": [
      {
        "tag": "env",
        "value": "production"
      },
      {
        "tag": "service",
        "value": "checkout"
      }
    ]
  },
  "destination_ids": [
    "dataway-primary",
    "search-primary"
  ]
}

Independent delivery

Processed Points are copied into independent durable branches. A failed target does not require successful targets to resend. Signal filtering happens after routing; ensure every signal has a valid path.

No routing match is different from a Pipeline drop. Configure defaults to avoid records with no available delivery path.