standby Webhook

Field reference for WhatsApp standby webhooks: passive Conversation Routing view of threads another responder owns, inbound messages, message echoes, status receipts, prerequisites, and why Dualhook does not subscribe to it.

The standby field gives an app a passive view of conversations it does not own under Meta's Conversation Routing. When several responders share one business phone number, the thread owner receives normal messages webhooks and every other responder with standby visibility receives standby webhooks instead.

What standby Reports

The value.standby object contains exactly one of three arrays:

Sub-fieldWhat happened
standby.messagesA WhatsApp user sent a message on a thread you do not own. Uses the same schema as normal inbound messages, for every message type.
standby.message_echoesAnother responder, such as Meta Business Agent, sent a message to the user.
standby.statusesA message sent by another responder was sent, delivered, or read.

You do not receive standby webhooks for threads you own (those arrive as messages), for messages your own app sends, or when the conditions below are not met.

Do not reply to a user because of a standby webhook. Only the thread owner may send Service messages; a non-owner's send is rejected. The exception is the designated escalation partner, whose Service message takes the thread implicitly. See messaging_handovers.

Prerequisites

Standby is off by default. An app receives it only when both are true:

  • the app is subscribed to the standby field in its App Dashboard, and
  • the business granted the app standby visibility in its routing configuration in Meta Business Suite.

The app cannot grant visibility to itself, and it can decline standby by not subscribing.

Payload Shape

{
  "object": "whatsapp_business_account",
  "entry": [
    {
      "id": "<WABA_ID>",
      "changes": [
        {
          "field": "standby",
          "value": {
            "messaging_product": "whatsapp",
            "metadata": {
              "display_phone_number": "<BUSINESS_PHONE_NUMBER>",
              "phone_number_id": "<PHONE_NUMBER_ID>"
            },
            "standby": {
              "contacts": [
                { "profile": { "name": "Test User" }, "wa_id": "<WA_ID>" }
              ],
              "messages": [
                {
                  "from": "<WA_ID>",
                  "id": "<WAMID>",
                  "timestamp": "<UNIX_SECONDS>",
                  "type": "text",
                  "text": { "body": "Test standby message" }
                }
              ]
            }
          }
        }
      ]
    }
  ]
}

Message Echoes

Each standby.message_echoes[] item has the message id, its send timestamp, and message: the exact request body the other responder passed to POST /<PHONE_NUMBER_ID>/messages, not the rendered content.

FieldPresent forNotes
messageEvery echoThe send-time request body, including to, type, and context.
templateTemplate messagesThe full unhydrated template definition, with placeholders. message.template holds the values substituted at send time.
flowFlow messagesThe flow definition as returned by GET /<FLOW_ID>.

Status Receipts

Each standby.statuses[] item has id, status (sent, delivered, or read), timestamp, recipient_id, conversation (id and origin.type), and pricing (billable, pricing_model, category, type).

If you receive standby events for a conversation, a control_passed notification for it carries no conversation_context summary, because you already have the history.

Dualhook Handling

Dualhook subscription: not subscribed. Dualhook's Meta app does not subscribe to standby, so a Dualhook connection never delivers it to you, even though Meta allows Webhook Override for this field. Dualhook has no Conversation Routing features.

Meta Business Agent moves other integrations here. Once Meta Business Agent is enabled on a number, it becomes the primary responder for new conversations, and previous primary responders receive the conversations they don't own on standby instead of messages. On a Dualhook connection, those conversations stop reaching your endpoint. Don't enable it on a number your own agent answers through Dualhook; see AI agents on WhatsApp Business.

To observe threads as a standby responder, subscribe your own Meta app to standby and have the business grant that app standby visibility in Meta Business Suite. Standby payloads contain message content, so they belong on your own infrastructure.

Implementation Notes

  • Store standby context so your app can continue the conversation if it later receives a pass.
  • Index stored events by BSUID where you have one; it stays stable if the user's phone number changes.
  • Deduplicate on the message id, since Meta can redeliver.
  • Use status receipts to measure delivery and read rates for other responders' messages.

Related

  • Webhook Subscription FieldsReference list of all 22+ WhatsApp Business Platform webhook subscription fields, what each notifies you of, required permissions, payload size limits, retry policy, and IP allowlisting.
  • messaging_handovers WebhookField reference for WhatsApp messaging_handovers webhooks: Conversation Routing thread ownership changes, control_passed and control_taken payloads, role fields, deduplication, and why Dualhook does not subscribe to it.
  • Messaging WebhookReal-time webhook events for inbound messages, delivery statuses, and errors.
  • WhatsApp Webhook OverrideHow Dualhook uses WhatsApp Webhook Override to route supported customer-path webhooks directly from Meta to your server.
Browse more docsStart Free Trial