Webhook - WhatsApp Flow Responses

Receive and process a contact's WhatsApp Flow submission at a configured webhook endpoint. For developers connecting Flow completions to a Keyword automation or Custom Webhook integration.

Receive and process the answers an end user submits through a WhatsApp Flow at your configured webhook endpoint.

Configure your webhook

Connect your webhook endpoint to the platform using one of the following options:

The platform sends a JSON payload whenever an end user completes and submits a Flow.

Identify Flow responses

Distinguish Flow response events from regular inbound WhatsApp messages before processing the payload:

  • Regular user messages contain the message content as plain text.
  • Flow responses contain a structured response with the answers collected during the Flow. The payload stores this response as a serialized data object that maps each Flow component to the value the user selected or entered.

The following example shows the payload sent 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"
      }
    ]
  }
}

Parse the submitted answers

  1. Read the "extraInfo.interactive.nfmReply.responseJson" field. The user's answers are not stored at the top level of the payload.
  2. Parse "responseJson" from a JSON string into a JSON object before processing its values.

After parsing, the value of "responseJson" is:

{
  "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 in the Flow configuration. Each value is the option the user selected or the text they entered.

Use the Flow definition for the submitted experience to interpret the available keys and their values.