Webhook - WhatsApp Flow Responses

When an end user completes a WhatsApp Flow, our system delivers the interaction result to the customer’s configured webhook endpoint. This webhook notification allows your system to receive and process the data submitted by the user inside the Flow. In other words, when an end user completes and submits a WhatsApp Flow, a webhook notification is sent to the customer’s configured webhook endpoint.

To receive Flow response events, the webhook endpoint must be properly integrated with the platform. This integration can be established in different ways, depending on the configuration:

  • Through an automation that handles inbound WhatsApp interactions, such as a Keyword.
  • Through a Custom Webhook integration configured in the platform’s integrations.

Once the webhook is configured, a JSON payload is delivered every time a user completes a Flow and submits their responses.

Flow Responses vs. Regular User Messages

Inbound WhatsApp events can represent different types of user interactions. It is important to distinguish between these event types, as the webhook payload structure and content differ depending on how the user interacts with the business.

  • Regular user messages: When an end user sends a standard WhatsApp message, such as free text, the webhook payload includes the message content as plain text. These events typically represent conversational input initiated by the user.
  • Flow responses: When a user completes and submits a WhatsApp Flow, the webhook payload contains a structured response that represents all answers collected during the Flow interaction. Instead of simple text, the payload includes a serialized data object that maps each Flow component to the value selected or entered by the user.

This section focuses specifically on the webhook payload generated by Flow submissions, explaining how the structured response is delivered and how it can be interpreted by the receiving system.

The following example shows the JSON payload delivered to the webhook when a user completes a customer feedback Flow:

{
  "owner": "elipackage",
  "date": "2026-01-19T20:38:39.321185230Z",
  "processId": 1234,
  "origin": "580000000000",
  "externalId": "test_121214",
  "callback": "https://webhook.site/example",
  "id": "abcdefg12345678",
  "text": "",
  "user": "525600000000",
  "extraInfo": {
    "SAMWELL_WEBHOOK_NAME": "whatsapp w",
    "MSGI_SOURCE_CAMPAIGN": "KWC",
    "interactive": {
      "type": "nfm_reply",
      "id": null,
      "title": null,
      "description": null,
      "nfmReply": {
        "type": "nfm_reply",
        "responseJson": "{\"overall_experience\":\"0_very_satisfied\",\"improvement_areas\":[\"0_response_time\"],\"flow_token\":\"unused\",\"would_attend_again\":\"1_yes\"}",
        "body": "Sent",
        "name": "flow"
      }
    },
    "type": "interactive",
    "contacts": [
      {
        "profile": {
          "name": "Julian"
        },
        "wa_id": "123456789"
      }
    ]
  }
}

The user's actual answers are not at the top level of the payload. Instead, they are contained within the following path: "extraInfo.interactive.nfmReply.responseJson"

The "responseJson" field is a JSON string that represents the structured output of the Flow. This string must be parsed into a JSON object before your application can process it.

For example, once parsed, the value of "responseJson" becomes:

{
  "overall_experience": "0_very_satisfied",
  "improvement_areas": ["0_response_time"],
  "flow_token": "unused",
  "would_attend_again": "1_yes"
}

Each key in the parsed responseJson object corresponds to an input component defined in the Flow configuration. The values represent the option selected or the text entered by the end user. The exact keys and values depend on how the Flow was designed. For this reason, your webhook consumer should interpret the response based on the Flow definition used when creating the experience.