Configure Webhooks
Set up webhooks to receive real-time notifications for messages, delivery status updates, and campaign events.
Webhooks are HTTP callbacks that SendSeven uses to push real-time events to your application. Instead of polling the REST API, your endpoint receives instant notifications when something important happens — a message arrives, a conversation ends, a contact is created, or delivery status changes. Each webhook request is HMAC-signed for security and automatically retried on failure with exponential backoff, ensuring no events are lost.
A SendSeven account with at least one connected channel
A public HTTPS endpoint that can receive HTTP POST requests
A valid SSL certificate (Let's Encrypt works great)
Basic understanding of REST APIs and JSON
SendSeven dashboard Webhooks page with the Add Endpoint button highlighted
Add Endpoint dialog with HTTPS URL field and event subscriptions in SendSeven
Events: Select which events to receive (16 available)
Authorization Header (optional): Custom auth header sent with every delivery
Via the API you can also configure: retry_strategy (exponential/linear/none), max_retries (default 8, max 15), and timeout_seconds (default 30, range 5–60)
Webhook Created Successfully popup displaying the secret key with a Copy button
Webhook detail page showing endpoint URL, subscribed events, delivery history, and health status in SendSeven
conversation.closed — Conversation closed
An event occurs (e.g., message received)
If no 200, we retry with exponential backoff
Event type string (e.g., message.received)
ISO 8601 timestamp when the event occurred
ID of the resource that triggered the event
Event-specific payload (varies by event type)
Every event that includes a contact object also carries a contact_methods[] array listing all of the contact's identifiers (primary first). The top-level phone and email fields are kept for backwards compatibility.
Quick-reply and list selections arrive as message_type "button". The caption is in "text" and a structured "meta.button" object carries the id/payload so you can route on the selection without parsing text.
Show example with button click (quick-reply / list)
Stable identifier of the button as defined when the message was sent.
Payload returned by the channel (matches the id for quick replies).
Human-readable caption the user saw and tapped.
The attachments array is only present when the message includes media. Each attachment includes a unique id, content_type, file_size, and two download URLs. Supported types: image, video, audio, document, sticker.
url — Stable API endpoint. Requires authentication (API key or session token). Never expires.
signed_url — Pre-signed GCS URL. No authentication required. Expires after 24 hours.
If the platform media download fails, the raw platform data is passed through with a "source": "platform" marker instead of the enriched fields. Non-file types (location, contacts, reactions) are not affected.
Outbound messages that include file attachments contain the same enriched attachment schema (id, url, signed_url, content_type, file_size) as inbound messages.
The error field is at the data level (not inside message.meta). The full conversation and contact objects are also included.
Status update events (delivered, read) use a simpler conversation object without bot_session_id or last_*_at timestamp fields. The contact_method object is not included.
Email conversation objects include additional fields: email_integration_id and email_thread_id for threading context.
contact.updated uses the same structure as contact.created. The event type field distinguishes between them.
Get the raw request body (before parsing JSON)
Compute HMAC-SHA256 using your webhook secret
Prepend sha256= and compare with the X-Webhook-Signature header
Use timing-safe comparison to prevent timing attacks
Your URL is publicly accessible (not localhost)
Your SSL certificate is valid (not self-signed)
There's no firewall blocking SendSeven's IPs
Wrong webhook secret (copy again from settings)
Store the event ID and check for duplicates before processing
Respond with 200 as quickly as possible (process async)
Automatically when creating a webhook via the dashboard
Automatically when creating a webhook via the API (POST /api/v1/webhook-endpoints)
Automatically when the webhook URL is updated
On-demand via the verify endpoint (POST /api/v1/webhook-endpoints/{id}/verify)
- Create a webhook endpoint
- Register the webhook in SendSeven
- Select event types to receive
- Handle webhook verification challenge
- Verify webhook signature
- Handle incoming events
- Test with sample events
FAQ
What events can I subscribe to?
SendSeven webhooks support 16 event types across 5 categories: Messages (message.received, message.sent, message.delivered, message.read, message.failed), Conversations (conversation.created, conversation.closed), Contacts (contact.created, contact.updated), Email (email.received, email.sent, email.delivered, email.bounced, email.opened, email.complained), and Campaigns (link.clicked).
How does webhook retry work?
If your endpoint returns a non-2xx status code or doesn't respond within 30 seconds, SendSeven automatically retries with exponential backoff: 1 minute, 5 minutes, 30 minutes, 2 hours, and 8 hours. After 5 failed retries the event is marked as failed. If a webhook accumulates 20 consecutive failures, it is automatically paused and you receive an email notification.
How do I verify webhook signatures?
Each webhook request includes an X-Webhook-Signature header in the format sha256=. To verify, compute HMAC-SHA256 of the raw request body using your webhook secret (prefixed with whsec_), prepend sha256= to the hex digest, then compare it with the header value using a timing-safe comparison. If they match, the request is authentic.
What's the webhook payload format?
Webhooks are sent as JSON POST requests with a consistent structure: id (unique event identifier), type (event type), timestamp (Unix timestamp), relevant data object (message, conversation, or contact), and channel context. Payloads are typically 1-5 KB for standard events.
Can I configure multiple webhook endpoints?
Yes. You can add up to 10 webhook endpoints per workspace. Each endpoint can have a different URL and subscribe to different event types, allowing you to route events to different systems.
How do I test my webhook endpoint?
SendSeven provides a "Send Test Event" button in the webhook dashboard that sends a sample payload to your endpoint without affecting real data. For local testing, use webhook debugging tools like webhook.site, RequestBin, or ngrok.
What if my endpoint is temporarily unavailable?
Webhooks are retried with exponential backoff over approximately 10 hours (1 min → 5 min → 30 min → 2h → 8h). During this time, you can fix your endpoint and queued retries will be delivered. After all 5 retries are exhausted, the event is marked as failed and logged in your webhook delivery history.