Webhooks
Monitor incoming messages and statuses.
Using your Sendo dashboard, you can set up campaign-specific webhooks URLs to listen for incoming messages, message status updates, and recipient optouts. These will be sent as POST
requests to the URLs you provide, and they will be resent if the request fails.
If you navigate to the Webhooks
tab on a Campaign
page, you can see a history of the events that have been sent to your URLs and check for any failures.
Authentication
When you create a webhook URL on your dashboard, the system will generate a unique secret token. This token will be sent as a X-Webhook-Token
header with each request. You should verify the token to ensure that the request is coming from Sendo.
Retry policy
If our attempt to deliver the POST
request to your webhook URL fails with an HTTP response that is not 2XX
, we will retry the request up to 6 times with a 60 second delay between each attempt. With each subsequent failure, the wait time will double. If after all attempts the webhook is still not acknowledged, no further attempts will be made.
message.incoming
Whenever a user sends a message to a phone number associated with a campaign, a POST
request will be sent to your provided webhook URL with the following JSON body:
message.status
Whenever the status of a sent message changes (see full list below), a POST
request will be sent to your provided webhook URL with the following JSON body:
metadata
field (learn more)Statuses
Status | Description |
---|---|
CREATED | The message has been created |
QUEUED | The message is queued for sending |
SCHEDULED | The message is scheduled for sending |
SENT | The message has been sent |
DELIVERED | The message has been delivered |
READ | The message has been opened |
FAILED | The message send has failed |
EXPIRED | The send has failed. Contact support |
FAILED
statusSENT
and are never marked as DELIVERED
recipient.optout
When a recipient texts STOP
or another keyword to unsubscribe from messages, a POST
request will be sent to your webhook URL with the following JSON body:
message.incoming
events