Marketing webhooks
Here you will find the list of all the marketing events you can track. Please consider the request schema and parameters for each of them when you decide to build the Notify URL on your side.
- Marked as Spam
- Opened
- Clicked
- Hard Bounced
- Soft Bounced
- Delivered
- Unsubscribe
- Contact Deleted
- Contact Updated
- Contact added to list
- Proxy Open
- Unique Coupon Sent
Datetime parameters 🕗
The following parameters are present in all events we offer tracking for. Keep this information in mind whenever working with webhook datetime values.
ts_sent, ts_event : UTC Timezone
date_sent, date_event : Local Timezone
date : CET/CEST Timezone
Marketing email
Marked as Spam
| Attribute name | Data type | Description |
|---|---|---|
event | string | ”spam” |
email | string | Recipient email |
id | integer | Internal id of webhook |
date_sent | string | Date the campaign was sent (year-month-day, hour:minute:second) |
date_event | string | Date the event occurred (year-month-day, hour:minute:second) |
ts_sent | integer | Timestamp in seconds of when campaign was sent |
ts_event | integer | Timestamp in seconds of when event occurred |
camp_id | integer | Internal id of campaign |
campaign name | string | Internal name of campaign |
reason | string | Spam reason |
ts | integer | Timestamp in seconds of when event occurred |
tag | string | Internal tag of campaign |
1 { 2 "id": xxxxxx, 3 "camp_id": xx, 4 "email": "example@domain.com", 5 "campaign name": "My First Campaign ", 6 "date_sent": "2020-10-09 00:00:00", 7 "date_event": "2020-10-09 00:00:00", 8 "event": "spam", 9 "reason": "undesired", 10 "tag": "", 11 "ts_sent": 1604933619, 12 "ts_event": 1604933737, 13 "ts": 1604937337, 14 }
Opened
| Attribute name | Data type | Description |
|---|---|---|
event | string | ”opened” |
email | string | Recipient email |
id | integer | Internal id of webhook |
date_sent | string | Date the campaign was sent (year-month-day, hour:minute:second) |
date_event | string | Date the event occurred (year-month-day, hour:minute:second) |
ts_sent | integer | Timestamp in seconds of when campaign was sent |
ts_event | integer | Timestamp in seconds of when event occurred |
camp_id | integer | Internal id of campaign |
campaign name | string | Internal name of campaign |
tag | string | Internal tag of campaign |
ts | integer | Timestamp in seconds of when event occurred |
segment_ids | array of integers | Newly added fields for mails that are sent to a segment |
1 { 2 "id": xxxxxx, 3 "camp_id": xx, 4 "email": "example@domain.com", 5 "campaign name": "My First Campaign", 6 "date_sent": "2020-10-09 00:00:00", 7 "date_event": "2020-10-09 00:00:00", 8 "event": "opened", 9 "tag": "", 10 "segment_ids": [ 11 1, 12 10, 13 ], 14 "ts_sent": 1604933619, 15 "ts_event": 1604933737, 16 "ts": 1604937337 17 }
Clicked
| Attribute name | Data type | Description |
|---|---|---|
event | string | ”click” |
email | string | Recipient email |
id | integer | Internal id of webhook |
date_sent | string | Date the campaign was sent (year-month-day, hour:minute:second) |
date_event | string | Date the event occurred (year-month-day, hour:minute:second) |
ts_sent | integer | Timestamp in seconds of when campaign was sent |
ts_event | integer | Timestamp in seconds of when event occurred |
camp_id | integer | Internal id of campaign |
campaign name | string | Internal name of campaign |
tag | string | Internal tag of campaign |
ts | integer | Timestamp in seconds of when event occurred |
URL | string | Url clicked |
segment_ids | array of integers | Newly added fields for mails that are sent to a segment |
1 { 2 "id": xxxxxx, 3 "camp_id": xx, 4 "email": "example@domain.com", 5 "campaign name": "My First Campaign", 6 "date_sent": "2020-10-09 00:00:00", 7 "date_event": "2020-10-09 00:00:00", 8 "event": "click", 9 "tag": "", 10 "segment_ids": [ 11 1, 12 10, 13 ], 14 "ts_sent": 1604933619, 15 "ts_event": 1604933737, 16 "ts": 1604937337, 17 "URL": "https://myCampaignUrl.net" 18 }
Hard Bounced
| Attribute name | Data type | Description |
|---|---|---|
event | string | ”hard_bounce” |
email | string | Recipient email |
id | integer | Internal id of webhook |
date_sent | string | Date the campaign was sent (year-month-day, hour:minute:second) |
date_event | string | Date the event occurred (year-month-day, hour:minute:second) |
ts_sent | integer | Timestamp in seconds of when campaign was sent |
ts_event | integer | Timestamp in seconds of when event occurred |
camp_id | integer | Internal id of campaign |
campaign name | string | Internal name of campaign |
sending_ip | string | Ip used to send message |
reason | string | Hard bounce reason |
ts | integer | Timestamp in seconds of when event occurred |
tag | string | Internal tag of campaign |
1 { 2 "id": xxxxxx, 3 "camp_id": xx, 4 "email": "example@domain.com", 5 "campaign name": "My First Campaign", 6 "date_sent": "2020-10-09 00:00:00", 7 "date_event": "2020-10-09 00:00:00", 8 "reason": "deferred", 9 "event": "hard_bounce", 10 "tag": "", 11 "sending_ip": "xxx.xxx.xxx.xxx", 12 "ts_sent": 1604933619, 13 "ts_event": 1604933737, 14 "ts": 1604937337, 15 }
Soft Bounced
| Attribute type | Data type | Description |
|---|---|---|
event | string | ”soft_bounce” |
email | string | Recipient email |
id | 1integer | Internal id of webhook |
date_sent | string | Date the campaign was sent (year-month-day, hour:minute:second) |
date_event | string | Date the event occurred (year-month-day, hour:minute:second) |
ts_sent | integer | Timestamp in seconds of when campaign was sent |
ts_event | integer | Timestamp in seconds of when event occurred |
camp_id | integer | Internal id of campaign |
campaign name | string | Internal name of campaign |
reason | string | Soft bounce reason |
sending_ip | string | Ip used to send message |
ts | integer | Timestamp in seconds of when event occurred |
tag | string | Internal tag of campaign |
1 { 2 "id": xxxxxx, 3 "camp_id": xx, 4 "email": "example@domain.com", 5 "campaign name": "My First Campaign", 6 "date_sent": "2020-10-09 00:00:00", 7 "date_event": "2020-10-09 00:00:00", 8 "reason": "deferred", 9 "event": "soft_bounced", 10 "tag": "", 11 "sending_ip": "xxx.xxx.xxx.xxx" 12 "ts_sent": 1604933619, 13 "ts_event": 1604933737, 14 "ts": 1604937337, 15 }
Delivered
| Attribute name | Data type | Description |
|---|---|---|
event | string | ”delivered” |
email | string | Recipient email |
id | integer | Internal id of webhook |
date_sent | string | Date the campaign was sent (year-month-day, hour:minute:second) |
date_event | string | Date the event occurred (year-month-day, hour:minute:second) |
ts_sent | integer | Timestamp in seconds of when campaign was sent |
ts_event | integer | Timestamp in seconds of when event occurred |
sending_ip | string | Ip used to send message |
camp_id | integer | Internal id of campaign |
campaign name | string | Internal name of campaign |
ts | integer | Timestamp in seconds of when event occurred |
tag | string | Internal tag of campaign |
1 { 2 "id": xxxxxx, 3 "camp_id": xx, 4 "email": "example@domain.com", 5 "campaign name": "My First Campaign", 6 "date_sent": "2020-10-09 00:00:00", 7 "date_event": "2020-10-09 00:00:00", 8 "event": "delivered", 9 "tag": "", 10 "sending_ip": "xxx.xxx.xxx.xxx" 11 "ts_sent": 1604933619, 12 "ts_event": 1604933737, 13 "ts": 1604937337, 14 }
Unsubscribe
| Attribute name | Data type | Description |
|---|---|---|
event | string | ”unsubscribe” |
email | string | Recipient email |
id | integer | Internal id of webhook |
date_sent | string | Date the campaign was sent (year-month-day, hour:minute:second) |
date_event | string | Date the event occurred (year-month-day, hour:minute:second) |
ts_sent | integer | Timestamp in seconds of when campaign was sent |
ts_event | integer | Timestamp in seconds of when event occurred |
camp_id | integer | Internal id of campaign |
campaign name | string | Internal name of campaign |
list_id | array of integers | The internal list id’s the recipient has been unsubscribed from |
ts | integer | Timestamp in seconds of when event occurred |
tag | string | Internal tag of campaign |
segment_ids | array of integers | Newly added fields for mails that are sent to a segment |
1 { 2 "id": xxxxxx, 3 "camp_id": xx, 4 "email": "example@domain.com", 5 "campaign_name": "My First Campaign", 6 "date_sent": "2020-10-09 00:00:00", 7 "date_event": "2020-10-09 00:00:00", 8 "event": "unsubscribe", 9 "tag": "", 10 "sending_ip": "xxx.xxx.xxx.xxx", 11 "list_id": [ 12 3, 13 42 14 ], 15 "segment_ids": [ 16 1, 17 10 18 ], 19 "ts_sent": 1604933619, 20 "ts_event": 1604933737, 21 "ts": 1604937337 22 }
Contact deleted
| Attribute name | Data type | Description |
|---|---|---|
event | string | ”contact_deleted” |
email | string | Email address of added recipient |
id | integer | Internal id of webhook |
key | string | Internal key |
date | string | Date the event occurred (year-month-day, hour:minute:second) |
ts | integer | Timestamp in seconds of when event occurred |
1 { 2 "id": xxxxxx, 3 "email": "example@domain.com", 4 "event": "contact_deleted", 5 "key": "xxxxxxxxxxxxxxxxxx", 6 "list_id": [ 7 35 8 ], 9 "date": "2020-10-09 00:00:00", 10 "ts": 1604937111 11 }
Contact updated
| Attribute name | Data type | Description |
|---|---|---|
event | string | ”contact_updated” |
email | string | Email address of added recipient |
id | integer | Internal id of webhook |
key | string | Internal key |
date | string | Date the event occurred (year-month-day, hour:minute:second) |
ts | integer | Timestamp in seconds of when event occurred |
content | array of strings | Full contact information with updates |
1 { 2 "id": xxxxxx, 3 "email": "example@domain.com", 4 "event": "contact_updated", 5 "key": "xxxxxxxxxxxxxxxxxx", 6 "content": [ 7 { 8 "name": "John", 9 "lastname" : "Doe", 10 "work_phone": "+506 2220 2307" 11 } 12 ], 13 "date": "2020-10-09 00:00:00", 14 "ts": 1604937111 15 }
Contact added to list
| Attribute name | Data type | Description |
|---|---|---|
event | string | ”list_addition” |
email | string | Email address of added recipient |
id | integer | Internal id of webhook |
key | string | Internal key |
date | string | Date the event occurred (year-month-day, hour:minute:second) |
ts | integer | Timestamp in seconds of when event occurred |
list_id | array of integers | Array of lists where the contact is now present. |
There is a possibility to transfer multiple emails as adding contacts to the list. Also, this webhook is triggered when a list of multiple contacts is added through the API endpoint.
1 { 2 "id":"xxxxxx", 3 "email":"example@domain.com", 4 "event":"list_addition", 5 "key":"xxxxxxxxxxxxxxxxxx", 6 "list_id":[ 7 34, 8 12 9 ], 10 "date":"2020-10-09 00:00:00", 11 "ts":1604937111 12 }
Proxy Open
| Attribute name | Data type | Description |
|---|---|---|
id | integer | Internal id of webhook |
camp_id | integer | Campaign id |
email | string | Email address of added recipient |
campaign_name | string | Name of the marketing campaign |
date_sent | string | Date of when the campaign was sent |
date_event | string | Date of the webhook event occurrence |
tag | string | Internal tag of campaign |
event | string | ”proxy_open” |
ts | integer | Timestamp in seconds of when event occurred |
ts_event | integer | Timestamp in seconds of when event occurred |
ts_sent | integer | Timestamp in seconds of when campaign was sent |
1 { 2 "id":"xxxxxxx", 3 "camp_id":"xxx", 4 "email":"example@domain.com", 5 "campaign name":"campaign_copy", 6 "date_sent":"2025-04-03 13:20:23", 7 "date_event":"12025-04-03 13:41:24", 8 "tag":"", 9 "event":"proxy _open", 10 "ts":1743667884, 11 "ts_event":1743667884, 12 "ts_sent":1743666623 13 }
Marketing SMS
Sent
| Attribute name | Data type | Description |
|---|---|---|
id | integer | unique id generated for each payload |
to | string | mobile number |
sms_count | integer | number of sms parts sent |
credits_used | float | credits deducted |
remaining_credit | float | remaining balance credit |
msg_status | string | status of the message(sent, delivered, soft_bounce, hard_bounce) |
date | string | time at which the event is generated |
type | string | type of sms(marketing/transactional) |
campaign_id | integer | campaign id for campaign sms |
1 { 2 "id": 26570, 3 "to": "918076721713", 4 "sms_count": 1, 5 "credits_used": 1.5, 6 "remaining_credit": 11488.845, 7 "msg_status": "sent", 8 "date": "2024-10-11 14:19:59", 9 "type": "marketing", 10 "campaign_id": 220 11 }
Delivered
| Attribute name | Data type | Description |
|---|---|---|
id | integer | unique id generated for each payload |
to | string | mobile number |
msg_status | string | status of the message(sent, delivered, soft_bounce, hard_bounce) |
date | string | time at which the event is generated |
type | string | type of sms(marketing/transactional) |
campaign_id | integer | campaign id for campaign sms |
status | string | status |
description | string | Bounce Reason for Failed to deliver message |
ts_event | integer | timestamp in seconds of when event occurred |
tag | array of strings | internal tag of campaign |
1 { 2 "id": 26527, 3 "status": "OK", 4 "msg_status": "delivered", 5 "description": "delivered", 6 "to": "919102606271", 7 "ts_event": 1728459617, 8 "date": "2024-10-09 13:10:17", 9 "tag": [ 10 "tag1name" 11 ], 12 "type": "marketing", 13 "campaign_id": 220 14 }
Replied
| Attribute name | Data type | Description |
|---|---|---|
id | integer | unique id generated for each payload |
to | string | mobile number |
msg_status | string | status of the message(sent, delivered, soft_bounce, hard_bounce etc.) |
date | string | time at which the event is generated |
type | string | type of sms(marketing/transactional) |
campaign_id | integer | campaign id for campaign sms |
description | string | Bounce Reason for Failed to deliver message, description of the event |
ts_event | integer | timestamp in seconds of when event occurred |
tag | array of strings | internal tag of campaign |
error_code | integer | error code |
reply | string | reply of the sms |
1 { 2 "id": 26519, 3 "msg_status": "replied", 4 "error_code": 101, 5 "description": "replied", 6 "to": "919368207022", 7 "reply": "Hi", 8 "ts_event": 1728386415, 9 "date": "2024-10-08 16:50:16", 10 "tag": [ 11 "tag1name","tag2name" 12 ], 13 "type": "marketing", 14 "campaign_id": 220 15 }
Soft bounce
| Attribute name | Data type | Description |
|---|---|---|
id | integer | unique id generated for each payload |
to | string | mobile number |
msg_status | string | status of the message(sent, delivered, soft_bounce, hard_bounce etc.) |
date | string | time at which the event is generated |
type | string | type of sms(marketing/transactional) |
campaign_id | integer | campaign id for campaign sms |
description | string | Bounce Reason for Failed to deliver message, description of the event |
ts_event | integer | timestamp in seconds of when event occurred |
tag | array of strings | internal tag of campaign |
error_code | integer | error code |
bounce_type | string | hard bounce or soft bounce |
1 { 2 "id": 26519, 3 "msg_status": "soft_bounce", 4 "description": "Failed to deliver message for reasons unknown", 5 "bounce_type": "soft_bounce", 6 "error_code": 7, 7 "to": "916778678623", 8 "ts_event": 1728390422, 9 "date": "2024-10-08 17:57:03", 10 "tag": [ 11 "tag1name","tag2name" 12 ], 13 "type": "marketing", 14 "campaign_id": 220 15 }
Hard bounce
| Attribute name | Data type | Description |
|---|---|---|
id | integer | unique id generated for each payload |
to | string | mobile number |
msg_status | string | status of the message(sent, delivered, soft_bounce, hard_bounce etc.) |
date | string | time at which the event is generated |
type | string | type of sms(marketing/transactional) |
campaign_id | integer | campaign id for campaign sms |
description | string | Bounce Reason for Failed to deliver message, description of the event |
ts_event | integer | timestamp in seconds of when event occurred |
tag | array of strings | internal tag of campaign |
error_code | integer | error code |
bounce_type | string | hard bounce or soft bounce |
1 { 2 "id": 26519, 3 "msg_status": "hard_bounce", 4 "description": "Message is undeliverable due to an incorrect / invalid / blacklisted / permanently barred MSISDN for this operator", 5 "bounce_type": "hard_bounce", 6 "error_code": 23, 7 "to": "916778678623", 8 "ts_event": 1728390422, 9 "date": "2024-10-08 17:57:03", 10 "tag": [ 11 "tag1name","tag2name" 12 ], 13 "type": "marketing" 14 "campaign_id": 220 15 }
Subscribe
| Attribute name | Data type | Description |
|---|---|---|
id | integer | unique id generated for each payload |
to | string | mobile number |
msg_status | string | status of the message(sent, delivered, soft_bounce, hard_bounce etc.) |
date | string | time at which the event is generated |
type | string | type of sms(marketing/transactional) |
campaign_id | integer | campaign id for campaign sms |
description | string | Bounce Reason for Failed to deliver message, description of the event |
ts_event | integer | timestamp in seconds of when event occurred |
tag | array of strings | internal tag of campaign |
error_code | integer | error code |
reply | string | reply of the sms |
1 { 2 "id": 26527, 3 "msg_status": "subscribe", 4 "description": "subscribe", 5 "to": "919102606271", 6 "reply": "START", 7 "ts_event": 1728459617, 8 "error_code": 101, 9 "date": "2024-10-09 13:10:17", 10 "tag": [ 11 "tag1name" 12 ], 13 "type": "marketing", 14 "campaign_id": 220 15 }
Unsubscribe
| Attribute name | Data type | Description |
|---|---|---|
id | integer | unique id generated for each payload |
to | string | mobile number |
msg_status | string | status of the message(sent, delivered, soft_bounce, hard_bounce etc.) |
date | string | time at which the event is generated |
type | string | type of sms(marketing/transactional) |
campaign_id | integer | campaign id for campaign sms |
description | string | Bounce Reason for Failed to deliver message, description of the event |
ts_event | integer | timestamp in seconds of when event occurred |
tag | array of strings | internal tag of campaign |
error_code | integer | error code |
reply | string | reply of the sms |
1 { 2 "id": 26527, 3 "msg_status": "unsubscribed", 4 "description": "unsubscribed", 5 "to": "919102606271", 6 "ts_event": 1728459617, 7 "error_code": 100, 8 "reply": "STOP", 9 "date": "2024-10-09 13:10:17", 10 "tag": [ 11 "tag1name" 12 ], 13 "type": "marketing", 14 "campaign_id": 220 15 }
Skip
| Attribute name | Data type | Description |
|---|---|---|
id | integer | unique id generated for each payload |
to | string | mobile number |
msg_status | string | status of the message(sent, delivered, soft_bounce, hard_bounce etc.) |
date | string | time at which the event is generated |
type | string | type of sms(marketing/transactional) |
campaign_id | integer | campaign id for campaign sms |
description | string | Bounce Reason for Failed to deliver message, description of the event |
ts_event | integer | timestamp in seconds of when event occurred |
tag | array of strings | internal tag of campaign |
messageId | integer | message id for transactional sms |
1 { 2 "id": 26519, 3 "msg_status": "skip", 4 "description": "skip", 5 "to": "12018577757", 6 "ts_event": 1728390414, 7 "date": "2024-10-08 17:56:54", 8 "messageId": 0, 9 "tag": [ 10 "tag1name","tag2name" 11 ], 12 "type": "marketing", 13 "campaign_id": 220 14 }
Coupons webhooks
Coupons webhooks notify your endpoint when a unique coupon code is delivered to a contact through any Brevo channel (email, SMS, automation workflow). They allow you to track which specific code was sent to which contact, reconcile your coupon inventory, and sync coupon status into an external CMS, OMS, or loyalty system.
Coupon events are delivered through the same Outbound Webhooks pipeline as other marketing events, with at-least-once delivery semantics. Use event_id to dedupe.
Unique Coupon Sent
Triggered when a unique coupon code is sent to a contact from a coupon collection.
| Attribute name | Data type | Description |
|---|---|---|
id | integer | Unique webhook delivery ID. Increments per delivery attempt. |
event_id | UUID (string) | Unique identifier of the underlying coupon-sent event. Use this for idempotency / deduplication. |
event_name | string | Always unique_coupon_sent for this event. |
event_date | ISO 8601 string | When the coupon was sent (UTC). |
source | string | Always coupon for this event. |
contact_id | integer | Brevo contact ID. |
contact_properties | object | null | Reserved for contact attributes. Currently always null. |
identifiers.email_id | string | Contact email address. |
identifiers.ext_id | string | Contact external ID. Only present when the contact has an external ID set. |
couponCode | string | The unique coupon code value sent to the contact (e.g. SPRING-TEST-fzm8yj). |
couponCollection.id | UUID (string) | Coupon collection ID. |
couponCollection.name | string | Coupon collection name. |
couponCollection.defaultCoupon | string | Fallback coupon code used when the collection’s unique codes are exhausted. |
couponCollection.couponResendDurationDays | integer | Number of days during which the same code will be resent to a contact who already received one (deduplication window). |
couponCollection.remainingCouponsAlert | integer | Inventory alert threshold — number of remaining unique codes below which an alert is fired on the collection. |
couponCollection.remainingDaysAlert | integer | Days-based alert threshold configured on the collection. |
1 { 2 "id": 1969104, 3 "event_id": "1aebf68d-63f7-45c6-9583-da37549d41dd", 4 "event_name": "unique_coupon_sent", 5 "event_date": "2026-04-27T11:51:39.085Z", 6 "source": "coupon", 7 "contact_id": 1, 8 "contact_properties": null, 9 "identifiers": { 10 "email_id": "lea.hugon@brevo.com", 11 "ext_id": "8555183931565" 12 }, 13 "couponCode": "SPRING-TEST-fzm8yj", 14 "couponCollection": { 15 "id": "caa90e82-d04b-439f-bc89-d183eb4c329d", 16 "name": "Sprint-Sales-test", 17 "defaultCoupon": "DEFAULT", 18 "couponResendDurationDays": 20, 19 "remainingCouponsAlert": 40, 20 "remainingDaysAlert": 0 21 } 22 }
Notes for integrators
- Naming: Top-level fields use
snake_case(Brevo unified events convention); nestedcouponCollectionfields usecamelCase. - Coupon expiration date is not included in the webhook payload at this time.
- Delivery is asynchronous and batched. Expect occasional bursts and possible retries on 5xx responses from your endpoint. Use
event_idfor idempotency.
Use cases
- Track which specific code was assigned to which contact.
- Reconcile sent codes per collection with timestamps.
- Sync coupon code status into an external CMS, OMS, or loyalty system.