WhatsApp Group Webhooks

Receive real-time notifications for activity inside WhatsApp Groups managed through DoubleTick, including group creation, membership changes, and inbound/outbound group messages.

Events Covered

EventDescription
GROUP_CREATEDA new WhatsApp Group was created through DoubleTick
GROUP_PARTICIPANT_JOINEDA participant joined one of your WhatsApp Groups
GROUP_PARTICIPANT_LEFTA participant voluntarily left one of your WhatsApp Groups
GROUP_PARTICIPANT_REMOVEDA participant was removed from one of your WhatsApp Groups by an admin
WA_GROUP_MESSAGE_RECEIVEDA message was sent inside a WhatsApp Group recognized by your workspace
WA_GROUP_MESSAGE_SENTA team member sent a message inside a WhatsApp Group from DoubleTick

All six events are currently available only for WhatsApp Cloud API integrations. Gupshup and 360dialog integrations do not support WhatsApp Group events.


Group Lifecycle Events

Group lifecycle events fire when a group is created through DoubleTick. Membership events fire when participants join or leave via the group.

Common Fields — Lifecycle and Membership Events

All four lifecycle/membership events share the following base fields:

FieldTypeRequiredDescription
eventstringYesThe event type. See each section for the fixed value.
orgIdstringYesOpaque routing identifier for your DoubleTick organization.
integrationIdstringYesOpaque routing identifier for the WABA integration. Use groupId or callId for cross-event correlation
groupIdstring | nullYesDoubleTick identifier for the group. null if not yet resolvable.
groupNamestring | nullYesThe group's display name (subject). null if not available at delivery time

groupId is a DoubleTick-assigned identifier for the group. It may be null for brief moments during group creation before the identifier is confirmed.


WhatsApp Group Created

Event type: GROUP_CREATED

Fires when a WhatsApp Group is successfully created through your DoubleTick integration. This event is emitted after Meta confirms the group was created successfully.

Trigger Conditions

The event is emitted when:

  • A WhatsApp Group creation request completes successfully.
  • Meta Cloud API confirms the group is active and the external group ID is available.

It is not emitted when:

  • Group creation fails or returns an error.
  • A group is deleted.

Sample Payload

{
  "event": "GROUP_CREATED",
  "orgId": "org_abc123",
  "integrationId": "int_xyz789",
  "groupId": "grp_01HX9abc123",
  "groupName": "Q1 Promotions Team",
  "inviteLink": "https://chat.whatsapp.com/abc123xyz",
  "groupCreatedAt": "2026-01-15T09:30:00.000Z"
}

Field Reference

All common fields apply. The following fields are specific to this event:

FieldTypeRequiredDescription
inviteLinkstring | nullYesThe group's invite link. null if not generated yet. Handle like an access credential — anyone with this URL can join the group. Avoid plain-text logging and restrict access to authorized systems only.
groupCreatedAtstringYesISO 8601 timestamp of when the group was created

WhatsApp Group Participant Joined

Event type: GROUP_PARTICIPANT_JOINED

Fires when a participant joins one of your WhatsApp Groups — whether added by an admin or by following an invite link.

Sample Payload

{
  "event": "GROUP_PARTICIPANT_JOINED",
  "orgId": "org_abc123",
  "integrationId": "int_xyz789",
  "groupId": "grp_01HX9abc123",
  "groupName": "Q1 Promotions Team",
  "customerPhone": "+919876543210",
  "participantJoinedAt": "2026-01-15T10:00:00.000Z"
}

Field Reference

All common fields apply. The following fields are specific to this event:

FieldTypeRequiredDescription
customerPhonestringYesWhatsApp phone number of the participant who joined
participantJoinedAtstringYesISO 8601 timestamp of when the participant joined

WhatsApp Group Participant Left

Event type: GROUP_PARTICIPANT_LEFT

Fires when a participant voluntarily leaves one of your WhatsApp Groups. Use GROUP_PARTICIPANT_REMOVED to detect admin-initiated removals.

Trigger Conditions

The event fires when:

  • A participant exits the group themselves (not removed by an admin).

It is not emitted when:

  • An admin removes the participant — that fires GROUP_PARTICIPANT_REMOVED instead.

Sample Payload

{
  "event": "GROUP_PARTICIPANT_LEFT",
  "orgId": "org_abc123",
  "integrationId": "int_xyz789",
  "groupId": "grp_01HX9abc123",
  "groupName": "Q1 Promotions Team",
  "customerPhone": "+919876543210",
  "participantLeftAt": "2026-01-15T11:15:00.000Z"
}

Field Reference

All common fields apply. The following fields are specific to this event:

FieldTypeRequiredDescription
customerPhonestringYesWhatsApp phone number of the participant who left
participantLeftAtstringYesISO 8601 timestamp of when the participant left

WhatsApp Group Participant Removed

Event type: GROUP_PARTICIPANT_REMOVED

Fires when a participant is removed by an admin from one of your WhatsApp Groups. This is distinct from GROUP_PARTICIPANT_LEFT, which fires when a participant exits voluntarily.

Sample Payload

{
  "event": "GROUP_PARTICIPANT_REMOVED",
  "orgId": "org_abc123",
  "integrationId": "int_xyz789",
  "groupId": "grp_01HX9abc123",
  "groupName": "Q1 Promotions Team",
  "customerPhone": "+919876543210",
  "participantRemovedAt": "2026-01-15T12:00:00.000Z"
}

Field Reference

All common fields apply. The following fields are specific to this event:

FieldTypeRequiredDescription
customerPhonestringYesWhatsApp phone number of the participant who was removed
participantRemovedAtstringYesISO 8601 timestamp of when the removal occurred

Left vs. Removed

Both GROUP_PARTICIPANT_LEFT and GROUP_PARTICIPANT_REMOVED carry an identical payload shape (except the event type and its timestamp field name). The only practical difference is intent:

EventInitiatorTimestamp field
GROUP_PARTICIPANT_LEFTThe participantparticipantLeftAt
GROUP_PARTICIPANT_REMOVEDA group adminparticipantRemovedAt

WhatsApp Group Message Received

Event type: WA_GROUP_MESSAGE_RECEIVED

Fires whenever a message is sent inside a WhatsApp Group that is recognized within your DoubleTick workspace. This is the group-conversation counterpart to MESSAGE_RECEIVED (Messaging Webhooks), which only covers individual (1:1) conversations.

Trigger Conditions

The event is emitted when:

  • An inbound message is sent inside a WhatsApp Group.
  • The group is already known to your DoubleTick workspace.

It is not emitted for:

  • Messages in individual (1:1) conversations (see MESSAGE_RECEIVED).
  • System messages generated by group activity (e.g. membership changes).
  • Reactions sent inside a group.
  • Messages sent inside groups your workspace has not yet recognized.

Sample Payload

{
  "to": "120363012345678901",
  "from": "919999999999",
  "messageId": "wa_message_id",
  "dtMessageId": "dt_message_id",
  "receivedAt": "2026-01-15T11:57:57.796Z",
  "contact": {
    "name": "John Doe"
  },
  "integrationType": "WHATSAPP",
  "type": "wa_group",
  "message": {
    "type": "TEXT",
    "text": "Hello everyone",
    "context": {}
  },
  "dtLastMessageId": null,
  "lastMessageOrigin": "USER",
  "isAgentOffline": false,
  "customerId": "customer_pvgpZUh3wg",
  "dtCustomerId": "customer_pvgpZUh3wg"
}

Field Reference

This payload reuses the same base structure as MESSAGE_RECEIVED (see Messaging Webhooks: Common Fields). Two fields behave differently in this event, and one fixed field is added:

FieldTypeRequiredDescription
tostringYesThe group's identifier, not your WhatsApp Business number. See note below.
fromstringYesThe phone number of the individual participant who sent the message inside the group.
typestringYesAlways "wa_group". Identifies this payload as a group message.
customerId / dtCustomerIdstringYesIdentifies the sending participant, not the group itself.

Supported Message Types

Group messages support the same message types as individual messages:

  • Text
  • Image, Video, Audio, Sticker
  • Document
  • Location
  • Contacts
  • Button Replies
  • Flow Responses

Notes

  • to carries the group identifier instead of your WABA phone number. Branch on type: "wa_group" to identify this as a group-message payload. The value is a numeric string assigned by Meta's Cloud API and may be up to 20 digits long. Do not store it in a column sized or validated for phone numbers.
  • This payload never includes ad attribution data (no referral object).
  • This payload does not include the group's display name. Only the group identifier is provided in to.
  • customerId / dtCustomerId always identify the individual participant who sent the message.
  • System messages and reactions sent inside the group are not forwarded through this webhook.

Edge Cases

Unrecognized Groups

If a message arrives from a WhatsApp Group that is not yet recognized in your DoubleTick workspace, no webhook is delivered for that message. A group becomes recognized once it has been created through DoubleTick or appears in your DoubleTick inbox.


WhatsApp Group Message Sent

Event type: WA_GROUP_MESSAGE_SENT

Fires whenever a team member sends a message inside a WhatsApp Group from DoubleTick. This is the outbound counterpart to WA_GROUP_MESSAGE_RECEIVED above, and shares no payload shape with it — this event has its own, independent field set tailored to the sent direction.

Trigger Conditions

The event is emitted when:

  • A team member sends a message into a WhatsApp Group recognized within your DoubleTick workspace.
  • The send is confirmed accepted by WhatsApp.

It is not emitted for:

  • Messages sent into DoubleTick's generic/legacy "Group" feature — a non-WhatsApp-native multi-recipient grouping, distinct from a real WhatsApp group.
  • Reactions sent inside a group.
  • Messages sent from an integration with no webhook subscribed to this event type.

Sample Payload

{
  "event": "WA_GROUP_MESSAGE_SENT",
  "to": "grp_3665bc49a5",
  "from": "919321721251",
  "type": "wa_group",
  "agentName": "Jyoti Kumari",
  "agentContactNumber": "918169776684",
  "message": {
    "text": "Hi @919686651328, could you share a screenshot of the error?",
    "type": "TEXT",
    "media": null
  },
  "messageId": "wamid.HBgSMTIwMzYz...",
  "dtMessageId": "464c920a-bc9a-461a-83f6-6098d1269602",
  "integrationType": "WHATSAPP",
  "lastMessageOrigin": "CUSTOMER",
  "sentAt": "2026-09-28T07:48:17.239Z",
  "dtLastMessageId": "b54343dd-0830-4cde-81dd-8d1930180052"
}

Field Reference

FieldTypeRequiredDescription
eventstringYesAlways "WA_GROUP_MESSAGE_SENT".
tostringYesThe group's identifier, not your WhatsApp Business number. See note below.
fromstringYesThe WABA phone number the message was sent from.
typestringYesAlways "wa_group". Identifies this payload as a group message.
agentNamestringYesName of the sending team member. Empty string if it could not be resolved.
agentContactNumberstringYesSending team member's phone number. Empty string if it could not be resolved.
messageobjectYesThe sent message content. See Supported Message Types below.
messageIdstring | nullNoMeta's own message id (wamid). null if not yet assigned at the time the webhook was forwarded.
dtMessageIdstringYesDoubleTick's internal message id.
sentAtstringYesISO 8601 timestamp of the send.
integrationTypestringYesAlways "WHATSAPP".
lastMessageOriginstring | nullNoOrigin of the chat's previous message — "CUSTOMER" or "USER". null if this is the first message in the chat.
dtLastMessageIdstring | nullNoDoubleTick id of that previous message. null if this is the first message in the chat.

Supported Message Types

message.type is one of: Text, Image, Video, Audio, Sticker, Document, Location, Contacts.

  • message.media is null for Text, Location, and Contacts; otherwise an object with url, mimeType, and (Document only) fileName.
  • message.text is omitted entirely (not even null) for Audio and Sticker.
  • Template sends are reported as type: "TEXT" with the fully rendered, variable-substituted body, groups do not support template variable substitution, so this is exactly what reached WhatsApp.
  • Button Replies and Flow Responses are not applicable to this event — those are inbound-only interactions, covered by WA_GROUP_MESSAGE_RECEIVED.

Notes

  • to identifies the WhatsApp group, not the WABA phone number. Treat it as an opaque group identifier; do not assume it is a phone number or that its format matches other webhook events.
  • agentName / agentContactNumber identify the sending team member, the mirror of how customerId / dtCustomerId identify the sending participant in WA_GROUP_MESSAGE_RECEIVED.
  • lastMessageOrigin / dtLastMessageId describe the previous message in the chat, not the sender of this event's own message. A group where the customer spoke most recently will report lastMessageOrigin: "CUSTOMER" even though this event itself is about something a team member just sent.
  • Only USER and CUSTOMER origins are ever reported in lastMessageOrigin — internal notes, system logs (assign/unassign/tag changes), and reminder triggers are excluded even when one of them is the most recent row in the chat.
  • This payload never includes ad attribution, reply-threading (context/mentions), or template-metadata fields.
  • Delivery is fire-and-forget: a failure to deliver this webhook never affects whether the underlying message was actually sent.

Edge Cases

First Message In A Group

If this is the first message ever sent in the group, lastMessageOrigin and dtLastMessageId are both null.

Reactions

Reaction messages never trigger this webhook, there is no stable id to report them against.

Best Practices

  • Treat to as an opaque group identifier for this event type rather than a phone number.
  • Use dtCustomerId to attribute the message to the sending participant in your CRM, separately from however you track the group itself.
  • Since this event is mutually exclusive with MESSAGE_RECEIVED, route both events into the same downstream message-handling logic, branching on type: "wa_group" where group-specific handling is required.