Webhook Received
Fire a flow when an external system POSTs to a Wexio webhook URL
The Webhook Received trigger runs a flow when an outside system, such as Stripe, Shopify, your backend or an n8n workflow, sends an HTTP POST to a Wexio webhook URL.
This trigger needs the Pro or Enterprise plan.

Before You Start
This trigger points at an inbound webhook connection. Create the connection first in Settings → Webhooks and API → Webhooks. The connection holds the URL, the authentication, the contact mapping and the payload schema. See Webhooks → Inbound.
Many triggers in many flows can use the same connection.
Configuration
The trigger has one field, the connection to listen to.

| Field | Description |
|---|---|
| Webhook connection | One of your active inbound connections. If you have none, click Create webhook connection. |
The connection controls everything else: the URL, the authentication, how to find the contact and which fields become variables.
How It Works
External System Wexio
│ │
│ POST /webhooks/in/{connectionId} │
│ Authorisation header or secret │
│ Body: { customer: {...}, ... } │
│ ────────────────────────────────► │
│ │
│ 1. Verify authentication
│ 2. Parse the JSON body
│ 3. Resolve the contact using the
│ connection's identifier mapping
│ 4. Find the published flows with a
│ Webhook Received trigger on this
│ connection
│ 5. Start them
│ │
│ 202 Accepted │
│ ◄──────────────────────────────── │This trigger starts a flow only from a webhook. A contact's incoming message never starts it, whatever the flow's other rules say.
Variables
Each field in the payload becomes a flow variable under the webhook. namespace.
A payload like
{
"customer": { "id": "cus_123", "email": "jane@example.com" },
"order": { "id": "ord_456", "total": 99.50, "currency": "USD" }
}exposes:
{{webhook.customer.id}}{{webhook.customer.email}}{{webhook.order.id}}{{webhook.order.total}}{{webhook.order.currency}}
Nested objects are flattened into dotted names. To work with a list, use a Condition or API Call card.
To see real fields in the variable picker, capture a sample payload on the connection. See Webhooks → Inbound → Capture Schema.
Contact Resolution
The connection decides how the incoming payload maps to a Wexio contact. The mapping is:
- Contact identifier type - how to look the contact up: Chat ID, Phone Number, Email, or the user ID on a connected channel.
- JSON path to identifier - where to read it in the payload, for example
$.customer.email.
See Webhooks → Inbound → Contact Resolution for the complete setup.
If the path resolves to no matching contact, the webhook log row is flagged IDENTIFIER_NOT_FOUND and no flow runs.
Messaging Window
Webhook Received is a proactive trigger - there is no user message at the moment it fires, so the 24-hour messaging window may be closed.
| Channel | Outside 24h window |
|---|---|
| Telegram | Any card - no window |
| Viber | Any card - may be billable |
| Must start with a Template card | |
Delivery fails; 7-day extension available with human_agent tag |
Rules and Caveats
- Many flows, one connection. Several flows can listen to the same connection. Each published flow starts when a request arrives.
- Payload limit. 100 KB per request.
- Replays. Send an
X-Idempotency-Keyheader and Wexio ignores a repeated request with the same key.
Common Use Cases
- Payment notifications - Stripe, Paddle or Revolut → send a receipt with a WhatsApp template
- Store events - an order is paid → start a fulfilment flow
- CRM changes - a property changes → ask the contact a follow-up question
- No-code tools - n8n, Zapier or Make call Wexio for the messaging step
- Your backend - a ticket is escalated → message the contact
Related
- Webhooks → Inbound - connection setup, authentication modes, schema capture
- Webhooks → Integrations - step-by-step guides per external platform