Build a pipeline.
Pipelines are composed visually in the dashboard. There's no YAML to author, no file to commit, no separate apply step. Every change is a deploy when you click the button.
Open the canvas
/pipelines/new
From /pipelines, click + new pipeline. You land on an empty canvas with three slots: sources at the top, actions in the middle, destinations at the bottom. Name the pipeline and add a one-line note for your future self.
Pick a source
What triggers it.
A source can be the SDK with a match expression (e.g. user.signup), an inbound HTTP webhook, or a configured third-party (Stripe, GitHub). The pipeline fires for every event whose type matches. Empty match means "every event from this source."
Stack actions
Up to twelve of them.
Click + add step and pick from twelve action types grouped by category: enrichment (entity lookup, person/company derivation, LLM classify / summarize / translate), mutation (redact, transform, upsert entity), and control (filter, dedupe, throttle). Actions run in declared order; reorder by dragging the row.
See the full action catalog for what each one does.
Wire a destination
Where it lands.
Destinations are the egress half. An HTTP webhook just needs a URL; the body is whatever your last transform action emitted (or the raw event envelope if you don't add one). One pipeline fans out to all configured destinations on every event it matches.
Deploy
Click the button.
The deploy button in the footer persists the pipeline and bumps its revision. From the next event onward, the new definition runs. To take a pipeline out of service, toggle its status from active to paused in the header — no redeploy needed, the toggle is its own write.
Watch it run
/events shows everything.
Every matched event creates one delivery row per pipeline. The event detail page shows each delivery's status, attempt count, and last error if any. Failures retry on an exponential backoff: 30s, 2m, 10m, 1h. After five attempts a delivery is marked dead.