Webhook events
This page lists the webhook event types an endpoint in Settings, then Webhooks can subscribe to, and the envelope every delivery uses. Receive webhooks shows how to create an endpoint and verify signatures.
Envelope
Section titled “Envelope”Every delivery is a POST with a JSON body of five fields:
| Field | Value |
|---|---|
id |
The event ID (UUID). Every endpoint that receives the event gets the same ID; use it to skip duplicates. |
type |
The event type, for example email.bounced. |
created_at |
When the event happened, in UTC (RFC 3339). |
workspace |
The workspace slug. |
data |
The event’s payload. Its shape depends on the type; six events that integrations use have a sample payload in their row below. |
Testing an endpoint sends a webhook.test event:
{ "id": "01934f6e-8b2a-7c3d-9e4f-5a6b7c8d9e0f", "type": "webhook.test", "created_at": "2026-10-22T09:30:00.482913Z", "workspace": "acme-newsletter", "data": { "message": "Test event from ReputeCast. Verify the signature, then answer 2xx." }}Headers
Section titled “Headers”| Header | Value |
|---|---|
Content-Type |
application/json |
User-Agent |
ReputeCast-Webhooks/<version> |
X-ReputeCast-Event |
The event type. |
X-ReputeCast-Delivery |
The delivery ID: one per endpoint and event, unchanged across retries. |
X-ReputeCast-Timestamp |
Unix time in seconds when this attempt was made. |
X-ReputeCast-Signature |
Lowercase hex HMAC-SHA256 of <timestamp>.<raw body>, keyed with the whole whsec_… secret. Reject timestamps more than 5 minutes off. |
Delivery and retries
Section titled “Delivery and retries”- A
2xxanswer within 10 seconds counts as delivered. Any other status, a timeout or a connection error is retried. - An event is tried up to 8 times, waiting 1, 2, 4, 8, 30, 90 and 225 minutes between attempts (about six hours in total). After the eighth failure it moves to the dead-letter queue, where you can replay it.
- A paused endpoint keeps queuing events; when you resume it, the queued events are delivered in order.
- The
webhook.testevent is tried once and never retried.
Subscribing to events
Section titled “Subscribing to events”An endpoint subscribes to 1–40 entries. Each entry is an exact event type (email.bounced), every event of a group (email.*, matching the part before the first dot) or every event (*).
Contacts
Section titled “Contacts”| Event | Description |
|---|---|
contact.subscribed | A contact joined a list (after double opt-in when it's on).Sample payload |
contact.unsubscribed | A contact left a list or unsubscribed from everything.Sample payload |
contact.updated | Fields, tags or preferences changed.Sample payload |
contact.erased | Personal data was erased. |
| Event | Description |
|---|---|
email.sent | A sending provider accepted a message. |
email.delivered | The mailbox provider accepted the message. |
email.deferred | Delivery was delayed and will be retried. |
email.bounced | Hard or soft bounce, with the provider's original code. |
email.complained | The recipient marked the message as spam. |
email.opened | A human open (machine opens carry machine: true). |
email.clicked | A tracked link was clicked. |
Campaigns
Section titled “Campaigns”| Event | Description |
|---|---|
campaign.scheduled | A campaign was scheduled. |
campaign.started | A send started. |
campaign.paused | A send paused, by a person or automatically. |
campaign.resumed | A paused send resumed. |
campaign.completed | A send finished.Sample payload |
Approvals
Section titled “Approvals”| Event | Description |
|---|---|
approval.requested | A send needs approval. |
approval.decided | A send was approved, rejected or sent back. |
Sending providers
Section titled “Sending providers”| Event | Description |
|---|---|
provider.down | A sending provider is failing or unreachable. |
provider.recovered | A sending provider is healthy again. |
Automations
Section titled “Automations”| Event | Description |
|---|---|
automation.published | A flow was published. |
Transactional messages
Section titled “Transactional messages”| Event | Description |
|---|---|
message.sent | A sending provider accepted a transactional message. |
message.delivered | The mailbox provider accepted the message. |
message.deferred | Delivery was delayed and will be retried. |
message.bounced | Hard or soft bounce, with the provider's original code.Sample payload |
message.complained | The recipient marked the message as spam. |
message.rejected | Stopped before sending: suppressed or opted out of its category. |
message.failed | Every provider in the route failed after the retries. |
message.opened | The message was opened (templates with open tracking). |
message.clicked | A tracked link was clicked (templates with click tracking). |
| Event | Description |
|---|---|
form.submitted | A signup was confirmed (at once for single opt-in), with the form and the answers.Sample payload |
Referrals
Section titled “Referrals”| Event | Description |
|---|---|
referral.counted | A referral counted: its subscriber confirmed and stayed through the hold. |
referral.held | A referral was held for review by a suspicion rule. |
referral.not_counted | A referral didn't count, with the reason. |
referral.milestone_reached | A referrer reached a milestone. |
referral.reward_sent | A reward went to a referrer (a download, a code, a claim link). |
referral.reward_failed | A webhook reward failed after 6 hours of retries. |
Paid members
Section titled “Paid members”| Event | Description |
|---|---|
subscription.trial_started | A paid subscription started with a free trial. |
subscription.started | A paid subscription started and its first payment was made. |
subscription.renewed | A subscription renewed and its payment went through. |
subscription.payment_failed | A payment failed; the provider retries. |
subscription.cancel_scheduled | A subscription will end at the end of its period. |
subscription.ended | Paid access ended: canceled, unpaid, or a trial that ended without payment. |
subscription.changed | A paid member switched tier or between monthly and yearly. |
access.complimentary_granted | A team member gave complimentary access. |
access.complimentary_ended | Complimentary access ended or was removed. |
gift.purchased | A reader bought a gift subscription. |
gift.redeemed | A gift was redeemed by its recipient. |
conversion.recorded | An upgrade or a conversion was credited to an email. |
Products and orders
Section titled “Products and orders”| Event | Description |
|---|---|
order.paid | A buyer paid for a digital product; the delivery email is on its way. |
order.refunded | An order was refunded in Stripe, in full or in part. |
order.disputed | A buyer disputed an order's payment with their bank. |
| Event | Description |
|---|---|
push.clicked | A reader clicked a notification or one of its buttons (once per notification). |
| Event | Description |
|---|---|
sms.delivered | A carrier delivered a text. |
sms.failed | A text failed, with the reason and the provider's own code. |
sms.clicked | A person clicked a text's short link (link previews carry machine: true). |
sms.opted_out | A number texted STOP: SMS consent withdrawn on every list. |
sms.opted_in | A number texted START: the consents STOP removed came back. |
sms.replied | A reply that isn't a keyword, with its text. |
Website
Section titled “Website”| Event | Description |
|---|---|
post.published | A post went live on the website, by a person, at its time or with its campaign's send. |
post.unpublished | A post was taken off the website or deleted. |
| Event | Description |
|---|---|
whatsapp.delivered | Meta delivered a WhatsApp message. |
whatsapp.read | A person read a WhatsApp message (only people who share read receipts). |
whatsapp.failed | A WhatsApp message failed, with the reason and Meta's code. |
whatsapp.replied | A person wrote or tapped a quick reply: the 24-hour window opens. |
whatsapp.opted_out | A number wrote an opt-out keyword: WhatsApp consent withdrawn on every list. |
whatsapp.opted_in | A number wrote an opt-in keyword: the consents the opt-out removed came back. |
whatsapp.template_status | Meta approved, rejected, paused or disabled a template. |
Related
Section titled “Related”- Receive webhooks has signature verification code in Node.js, Python, Go and PHP.
- Build an integration covers REST hooks that tools such as Zapier subscribe through.
- Permissions and roles lists who can manage webhook endpoints.
- Limits and defaults lists the webhook limits.