Skip to content

Webhook

Trigger · Stable

Start a workflow via an inbound HTTP POST with optional secret validation.

Receives an HTTP POST at /flows/webhook/<workflow_id> (the exact URL is shown in the Webhook trigger panel, ready to copy). The request JSON body is available as payload (dict or raw string). An optional shared secret can be validated in workflow settings. Good for integrations with Stripe, GitHub, or any external service that supports outbound webhooks.

Use when an external service (Stripe, GitHub, a payment gateway, another app) needs to push data into a workflow and delivers it as an HTTP POST. The payload dict flows directly into downstream steps — no polling needed.

If the trigger is an internal platform state change, use Event instead — it carries typed event keys rather than a raw payload dict. For scheduled runs use Schedule (Cron); for email-initiated runs use Incoming email. Heads-up: a run from this trigger has no signed-in user, so {{ user.* }} and {{ actor.* }} are empty. Bind any recipient or owner — a send_email to, a deal owner_actor_id, a task assigned_to — to a concrete email or actor_id, never {{ user.* }}; or collect it at run time with an Ask-a-person step.

string · optional

A token the sender must echo back in the X-Webhook-Secret header on every POST. Leave empty to accept any POST to the URL — fine for a quick internal test, risky once the URL might leak into logs, browser history, or a shared channel.

Example: wf_shared_9c2a1e

  • ✓ wf_shared_9c2a1e — a long random token, generated once and pasted into both Routario and the sending service’s webhook config
  • ✗ password123 — guessable — anyone who finds the URL can also guess the secret; generate a random token instead

choice · optional · one of every, latest_per_key

“Run only the latest per key” needs “Coalesce key” below. A ticket updated five times in a minute then runs once, with the last payload; the four skipped deliveries are recorded as coalesced, not lost.

Example: every

  • ✓ latest_per_key — a “record changed” webhook where only the current state matters
  • ✓ every — an “order placed” webhook where every delivery is its own event

string · optional

Two deliveries with the same value at this path are about the same thing; the older waiting one is skipped when the newer runs. A delivery without a value at this path is never coalesced.

Example: ticket.id

  • ✓ ticket.id — Zendesk ticket events
  • ✓ data.object.id — Stripe-shaped payloads
  • ✗ payload.ticket.id — the path is relative to the payload already — leave “payload.” off

int · optional

A misconfigured sender can loop and post the same event thousands of times. Accepting is cheap; running is not. The cap turns that into a paused trigger and a notification instead of hours of runs nobody asked for.

Example: 500

  • ✓ 500 — well above any legitimate burst for a human-driven source
  • ✗ 5 — a normal Monday morning would trip it

Auto-generated from the skill registry (load_skills()). Do not edit by hand.