Skip to main content
FlowIQ sends a POST request to your registered webhook URL whenever an event occurs. Each payload includes an event_type field so you can route events accordingly.
Subscribers registered as type all receive every event. Those registered for a specific type (e.g. message_received) only receive that one.

Platforms

Webhooks cover WhatsApp, Web and Instagram conversations (Instagram rollout is pending). When registering a webhook in the FlowIQ dashboard (or with platform on Create Webhook), select the platform you want to listen to. Each platform fires its own set of events described below. To authenticate deliveries to your server or verify that they came from FlowIQ, see Delivery. Add Messaging Webhook modal with Platform and Event Type selectors

WhatsApp Events

message_received

Fired when a user sends you a WhatsApp message.
  • whatsapp_id is the contact’s phone number with country code (e.g. 27834321234)
  • media_type / media_url / file_name are populated for image, video, audio, and document messages
  • location_data is { latitude, longitude, name, address } for location messages
  • reply_context_id is the wamid of the message being replied to
  • reaction / reacted_to_message_id are only present when message_type is reaction — reaction is the emoji (e.g. 👍) and reacted_to_message_id is the wamid of the message that was reacted to

message_sent (WhatsApp)

Fired when Meta confirms your outbound message was sent (lightweight receipt).

sent_message

Also fired on sent — but with the full message record so you have the message content.

message_delivered


message_read


message_failed

Fired for failed, undelivered, and warning statuses.

call

Fired when a WhatsApp call event arrives for your number (WhatsApp Business Calling). The body is Meta’s raw webhook payload, with FlowIQ’s fields added at the top level:
  • entry is passed through unchanged; see Meta’s Calling API webhooks for its contents
  • phone_number_id is your WhatsApp number’s Meta phone number ID

Instagram Events

Instagram webhook support is prepared for rollout and is not yet deployed.
Register with platform: "instagram" on Create Webhook. Events describe Instagram activity stored in the FlowIQ inbox, including staff, API, automated and native-app messages when recorded there. Instagram does not emit call. Delivery, read and failure information depends on what the connection reports and what FlowIQ records. A successful send alone does not imply delivery. Subscription changes apply to future events; history is not replayed.

Identifiers

Incoming message

message_received includes the content and media fields. Comment and story identifiers are populated when available. Text messages have message_type: "text" and null media fields.

Outgoing content and status

sent_message uses the same content fields as the incoming example, with an outgoing sender_type and its own event_id. message_sent, message_delivered, message_read and message_failed carry status instead of the message and media fields. They refer to the same message IDs. For example:

Customer reactions

A customer reaction is delivered as message_received with message_type: "reaction". Its message IDs identify the target message, and its event_id includes the reaction timestamp, actor, action and emoji. Reactions made by the connected business account do not generate incoming customer events.
Use the shared delivery headers and signature verification. Acknowledge quickly and process asynchronously. Delivery is best effort, without a durable retry queue.

Web Events

Web webhooks fire for conversations that happen through the FlowIQ web chat widget. Register them by selecting Web as the platform when adding a webhook in the FlowIQ dashboard. Add Messaging Webhook modal showing Web platform selected

message_received

Fired when a web visitor sends a message (sender_type: "user-web").

sent_message

Fired when a human agent or AI bot sends a web message (sender_type: "human-web" or "bot-web").
  • sender_type will be "human-web" for messages sent by a support agent, or "bot-web" for AI-generated replies.
  • media_type / media_url / media_file_name are populated when the message contains a file or image.
  • more_data contains any additional structured data attached to the message.

Delivery

Each event is sent as a single POST with a JSON body. Register webhooks with Create Webhook or in the FlowIQ dashboard.

Headers

Non-ASCII characters (emoji, accented letters) are sent as JSON \uXXXX escapes, so the body is plain ASCII. Any JSON parser turns them back into the original characters.

Verifying signatures

If you set a secret, compute an HMAC-SHA256 of the raw request body with that secret and compare it to the X-Flowiq-Signature header. Use the bytes exactly as received: parsing and re-serialising the JSON changes them and the signature won’t match.

Delivery behaviour

  • FlowIQ makes one attempt per event and waits up to 10 seconds for your server. Failed deliveries aren’t retried, so respond with a 2xx quickly and do slow work in the background.
  • If the configured authentication can’t be built (for example your OAuth token endpoint is down), the delivery is skipped rather than sent without credentials.
  • Events can arrive out of order. Use timestamp and the platform message ID to reconcile. For Instagram, deduplicate by event_id and group updates by message_id or instagram_message_id.