Skip to main content
SkedX
Help · Flow · APIs & Developers

Get notified with outbound webhooks

8 min readFor adminsIn review

Instead of your system asking Flow “anything new?” every minute, Flow tells it the moment something happens: a customer writes in, a message is delivered or read, a template is approved, a conversation is assigned.

You give Flow an address and choose the events; Flow sends each one, signed, within seconds. About eight minutes.

In review: written from the product, not yet walked through live.

1Create the webhook

In Flow, go to Settings → Developers → Outbound Webhooks and click + New webhook. Give it a Name you’ll recognise (1), paste your system’s address under Where should we send it? (2) — use an https:// address — and click Create (3). Flow shows the signing secret once, starting whsec_: copy it into your system’s settings now. It proves each delivery came from Flow.
The new webhook form: its name (1), the address to send to (2) and Create (3)

Open Outbound Webhooks in SkedX Flow

2Choose what to hear about

Open the new webhook in the list. Under What should we tell them about? tick the events you need — each shows a plain name and its code name (2), and a ticked box (3) is an event Flow will send. A new webhook starts with A customer sends a message. The ones most teams use:
  • A customer sends a message (message.received)
  • A message is delivered, is read, fails to send (message.delivered, .read, .failed)
  • A conversation is assigned, is resolved, goes quiet (conversation.assigned, .resolved, .idle)
  • A contact gets a tag, opts out (contact.tagged, contact.opted_out)
  • A template is approved, paused or rejected (template.status_changed)
There are events for campaigns, complaints, orders and lead ads too, or pick Everything, including new events we add later (1).
The event picker: Everything (1), an event with its plain and code names (2), and a ticked event (3); the address is blurred

3Send only what matters

Only from one channel? · optional (1) limits the webhook to WhatsApp, Instagram or another channel; Only for one brand? · optional (2) to one of your brands. Events that don’t belong to a channel or brand are then not sent. Click Save changes, and make sure On is ticked — only switched-on webhooks receive events.
Optional filters on a webhook: one channel (1) or one brand (2)

4What arrives

Each event is a POST with a JSON body — the event’s name, your workspace id, and a data object with the contact, the conversation and the event’s own details. For A customer sends a message that includes the text, message_type and message_id; for delivered, read or failed, the status and time; for templates, the name, status and previous_status. The headers say which event it is (X-Flow-Event), give the delivery an id (X-Flow-Delivery) and sign it (X-Webhook-Signature).
{
  "event": "message.received",
  "org_id": "…",
  "data": {
    "eventMeta": {"type": "message.received", "timestamp": "…"},
    "contact": {"id": "…", "name": "Meera Nair", "firstName": "Meera", "phone": "…", "tags": ["batch-108"]},
    "conversation": {"id": "…", "channel": "whatsapp", "status": "OPEN", "assigneeStatus": "unassigned"},
    "channel": "whatsapp",
    "message_id": "…",
    "message_type": "text",
    "text": "Is class on today?"
  }
}

5Change the shape they receive (optional)

If the other app expects its own format, write it under What we’ll send them · empty = the standard envelope. Put each value in as a token without quotes — {{contact.name}}, {{contact.phone | digits}}, {{text | truncate: 200}} — and Flow writes it in correctly, text or number. Tidy-ups: digits, e164, upper, lower, trim, date, truncate, json, default, prefix. Need an API key in the request for their gateway? Add it under Extra details their app needs to let us in · optional.
{
  "name":   {{contact.name}},
  "mobile": {{contact.phone | digits}},
  "note":   {{text | truncate: 200}}
}

6Answer fast; failures retry by themselves

Reply with any 2xx within 2 seconds, then do slow work afterwards. If your system is down or slow, Flow tries again after 30 seconds, 5 minutes, 30 minutes and 2 hours. The webhook’s delivery log shows every attempt — Event, Result, Speed, Try — and Send again on any that didn’t get through. After 10 failures in a row Flow pauses for 30 seconds (“Paused — their app failed … times in a row”), and an address that answers 410 Gone switches the webhook off.

7Check each delivery is genuine

Before acting on a delivery, check its signature and skip ids you’ve already handled. The right signature passes (1); a wrong one (2), or a body changed on the way (3), fails — Check that a webhook really came from Flow has the code for Node, Python and PHP.
The signature check run three times: ok: True for the right signature (1), ok: False for a wrong one (2) and for a changed body (3)

© 2026 SkedX · Sample data only · Share and link freely · Copying the product or its design is not allowed · Terms

Common questions

Is there a “send test event” button?

Not yet. Make the event happen once — for A customer sends a message, message your business number from your own phone — and watch it arrive in the delivery log and at your end.

Can I match delivery updates to the template I sent over the API?

By conversation and contact, yes: each update names them. It doesn’t carry the id or callback_data from the send request.

How long is the delivery log kept?

It shows the last 100 deliveries per webhook, each with its attempts — including any that still failed after the last retry, which you can Send again. Older ones drop off the list.

Can I pause a webhook?

Yes — untick On and save. Nothing is sent until you tick it again; events in between aren’t queued.

Can I connect it to Zapier or n8n?

Yes — paste Zapier’s Catch Hook URL or n8n’s Webhook node address as the destination. Zapier · n8n.

Useful links

Previous: Secure an inbound hook · All APIs & Developers guides

Did this guide help?

View as markdown

Keep reading

READY WHEN YOU ARE

One record
Start there

Free plan, no card. Five tools replaced in an afternoon; your data stays yours.

pick a slot. we call you, on your clock.
pick a slot.
we call you,
on your clock.

No card. We only use your details to set you up or call you back.

A 20-minute call with a real person, on your clock.
SetupUnder 5 min
CardNot required
Replaces5 tools
Your dataExport anytime