Webhooks
What’s a Webhook?
Webhooks are HTTP requests we send to an Endpoint you provide. They will be executed when certain events occur in our system, such as when a Member joins your account, or when a Member sends you a message.
Availability
Setting up Webhooks in Community requires certain permissions on your account which may be included in your Plan. Please contact [email protected] to inquire about access to the feature.
Configuration
Webhooks can only be configured in the Community Dashboard. Go to Settings → Integrations → Webhooks and click "Configure" (note that this option is only available if you have the appropriate permission), or go directly to https://dashboard.community.com/settings/integrations/webhooks. Any webhooks that have already been configured will be listed. Webhooks can be enabled or disabled directly from this list.

When a webhook is created or edited a modal window will be displayed. In this modal the name, endpoint URL, and event types to be published can be configured. The endpoint should accept POST requests with the JSON data defined below. A signature secret field will be displayed in this modal as well. The signature secret is unique to each webhook.

Authentication
To make sure the requests you receive actually originate from Community, we’ve implemented some safeguards.
- Only HTTPS endpoints will be accepted
- SSL certificates will be verified as valid and for the correct host
- Each payload will be signed with a
community-signatureheader generated with the shared signature secret (see Configuration)
The community-signature header will be of the form
community-signature: t=1711666033,v1=b777f6ae2497ae95e99811c88b28d8ba377c95d615905963c68fae4c800de48dt is the timestamp the request was generated. v1 is the HMAC SHA-256 signature for the request. The signature is generated with the signature secret as the HMAC key and the data is the concatenation of the timestamp, the . character, and the request body.
Event Types
We support subscriptions to the following events:
- Inbound messages (Event type:
message.inbound): Messages sent from members. - Outbound messages (Event type:
message.outbound): Messages sent to a member from your account. Some messages will be filtered out based on whether the content is handled by other Community features, such ashelp,start, andstopmessages; tapbacks, and others. In addition, messages containing text, such as messages with only media, will also be filtered. - Member updates (Event types include
member.created,member.updatedandmember.deleted) Member update events will be published when a new member joins, unsubscribes, deletes themselves, or changes any of the standard personal data collected.
Payloads
Each published event will be a JSON object. At the top level will be fields for the event type, a unique id, the timestamp when the request was created, the api_version being published, a data object holding event specific data, and an object field defining what object is in the data field.
Member update events will include a member object in the event's data field. It will include a unique id for the member, any personal data collected, the communication channel and identifier for the channel (phone number), the timestamp the member was last updated, and whether the member is active (can receive campaigns and DMs).
Inbound and outbound message events will have a message object in the event's data field. It will include a unique id for the message, the text of the message, and a member object with all of the current member data for the sender of the message.
member.created Event Type Sample Payload
member.created Event Type Sample Payload{
"data": {
"object": {
"active": true,
"id": "7a3e02ec-ac2b-952a-9fc0-11b93f283de6",
"timestamp": "2025-01-16T08:33:47.925975Z",
"email": "[email protected]",
"city": "Detroit",
"country": "United States",
"client_id": "34e13e8d-241e-52k9-87hf-143322017665",
"country_code": "US",
"communication_channel": "sms",
"date_of_birth": "1990-05-16",
"communication_channel_id": "12126885505",
"gender_identity": "male",
"geolocation": {
"latitude": 42.331427,
"longitude": -83.0457538
},
"given_name": "John",
"postal_code": "",
"state_or_province": "Michigan",
"state_or_province_abbreviation": "MI",
"surname": "Smith"
}
},
"id": "4fab65b1-c98f-466e-b52f-c170768a6d89",
"type": "member.created",
"object": "member",
"created": "2025-01-05T23:59:45.643131Z",
"api_version": "2024-02-12"
}member.updated Event Type Sample Payload
member.updated Event Type Sample Payload{
"data": {
"object": {
"active": true,
"id": "7a3e02ec-ac2b-952a-9fc0-11b93f283de6",
"timestamp": "2025-01-16T08:33:47.925975Z",
"email": "[email protected]",
"city": "Detroit",
"country": "United States",
"client_id": "34e13e8d-241e-52k9-87hf-143322017665",
"country_code": "US",
"communication_channel": "sms",
"date_of_birth": "1990-05-16",
"communication_channel_id": "12126885505",
"gender_identity": "male",
"geolocation": {
"latitude": 42.331427,
"longitude": -83.0457538
},
"given_name": "John",
"postal_code": "",
"state_or_province": "Michigan",
"state_or_province_abbreviation": "MI",
"surname": "Smith"
}
},
"id": "a2414f4e-a057-4305-946c-79a0cd6049fc",
"type": "member.updated",
"object": "member",
"created": "2025-01-16T08:33:47.950941Z",
"api_version": "2024-02-12"
}member.deleted Event Type Sample Payload
member.deleted Event Type Sample Payload{
"data": {
"object": {
"active": false,
"id": "e9e98f87-ecd4-453c-9b82-5dd0c61f1cda",
"timestamp": "2025-10-07T20:05:41.051488Z",
"client_id": "34e13e8d-241e-52k9-87hf-143322017665",
"communication_channel": "sms",
"communication_channel_id": ""
}
},
"id": "a2414f4e-a057-4305-946c-79a0cd6049fc",
"type": "member.deleted",
"object": "member",
"created": "2025-01-16T18:00:41.909260Z",
"api_version": "2024-02-12"
}message.inbound Event Type Sample Payload
message.inbound Event Type Sample Payload{
"data": {
"object": {
"id": "96c8b483-c16f-4bc3-8f1b-5fe9e1001162",
"member": {
"active": true,
"id": "7a3e02ec-ac2b-952a-9fc0-11b93f283de6",
"timestamp": "2025-01-16T08:33:47.925975Z",
"email": "[email protected]",
"city": "Detroit",
"country": "United States",
"client_id": "34e13e8d-241e-52k9-87hf-143322017665",
"country_code": "US",
"communication_channel": "sms",
"date_of_birth": "1990-05-16",
"communication_channel_id": "12126885505",
"gender_identity": "male",
"geolocation": {
"latitude": 42.331427,
"longitude": -83.0457538
},
"given_name": "John",
"postal_code": "",
"state_or_province": "Michigan",
"state_or_province_abbreviation": "MI",
"surname": "Smith"
},
"text": "Spotify",
"media_list": [
{
"id": "f2dc18ca-3793-439d-a34f-1d140068d3ca",
"byte_size": null,
"filename": "twilio-inbound/9aaf09b7-76e9-4a37-8c5b-eed43d62f456/e856be74-6111-4c7a-bfbc-aaf6248a4816.jpg",
"url": "https://media.community.com/twilio-inbound/9aaf09b7-76e9-4a37-8c5b-eed43d62f456/e856be74-6111-4c7a-bfbc-aaf6248a4816.jpg",
"width": 1536,
"mime_type": "image/jpeg",
"height": 2048,
"thumbnail_filename": null,
"thumbnail_url": null,
"short_url": ""
}
],
"outbound_message_type": "not_set"
}
},
"id": "82e92c84-c1a7-4cb2-83ca-b7f13ed938d6",
"type": "message.inbound",
"object": "message",
"created": "2025-01-05T21:31:19.740650Z",
"api_version": "2024-02-12"
}message.outbound Event Type Sample Payload
message.outbound Event Type Sample Payload{
"data": {
"object": {
"id": "19b736d7-1d45-4572-a1dd-24ff82d4e102",
"member": {
"active": true,
"id": "7a3e02ec-ac2b-952a-9fc0-11b93f283de6",
"timestamp": "2025-01-16T08:33:47.925975Z",
"email": "[email protected]",
"city": "Detroit",
"country": "United States",
"client_id": "34e13e8d-241e-52k9-87hf-143322017665",
"country_code": "US",
"communication_channel": "sms",
"date_of_birth": "1990-05-16",
"communication_channel_id": "12126885505",
"gender_identity": "male",
"geolocation": {
"latitude": 42.331427,
"longitude": -83.0457538
},
"given_name": "John",
"postal_code": "",
"state_or_province": "Michigan",
"state_or_province_abbreviation": "MI",
"surname": "Smith"
},
"text": "Hey Cayleb - looks like you've left some items in your cart!",
"media_list": [
{
"id": "a4b553ad-edce-4c46-a1f6-db2c7e649c9d",
"byte_size": 433297,
"filename": "204fa4f6-84e9-4aba-a345-ead7bf4c7316.jpg",
"url": "https://media.community.com/uploads/34e13e8d-241e-52k9-87hf-143322017665/images/204fa4f6-84e9-4aba-a345-ead7bf4c7316.jpg",
"width": 800,
"mime_type": "image/jpeg",
"height": 450,
"thumbnail_filename": null,
"thumbnail_url": null,
"short_url": "https://m.community.com/mZPjvbMPLru04SC"
}
],
"outbound_message_type": "automated"
}
},
"id": "30bc3fb5-0c6b-4d6e-8e64-9c93525f8c5c",
"type": "message.outbound",
"object": "message",
"created": "2025-01-05T18:54:21.236681Z",
"api_version": "2024-02-12"
}Outbound Message Types:
- Direct Message:
DM - Campaign:
Campaign - Fan Onboarding:
Fan_Onboarding - Opt-In:
Opt_In - Opt-Out:
Opt_Out - Keyword Response:
Keyword_Response - Seat Onboarding:
Seat_Onboarding - Help Response:
Help_Response - Automated:
Automated - External:
External - External Customer Support:
External_Customer_Support
Implementation Guide
De-Duplication
Webhooks can in some cases be sent more than once for the same object or event as the guarantee is that they will be delivered at-least-once. Care needs to be taken for this on some types of events, for example messages, so that multiple actions are not taken for the same event. For sending messages it's usually recommended to follow the at-most-once principle, it's better to not send a message at all than to send it more than once.
Events should be deduplicated by storing the object or webhook ID for at least an hour and checking if the ID has already been stored before processing the event.
Expected Responses
A 200-299 HTTP status code within 15 seconds. The response body is ignored.
Error Handling and Retries
If the webhook request fails because of an error, such as connection error, a non-2xx response code, or a timeout the request will be retried. Requests will be retried 5 times with an increasing back off, they can be retried for up to an hour of when the first request was sent. An email will be sent to notify you when a webhook continues to fail or timeout. These webhooks may be disabled by Community and can be re-enabled once the situation has been resolved.