A system webhook sends data from Iterable to a third-party system whenever a specified event occurs (for example, an email send, an email open, etc.).
Each system webhook is specific to an Iterable project, but not to a particular template, campaign, or journey. The webhook sends whenever a specified system event occurs anywhere in the project.
NOTE
To call a webhook as part of a specific journey, use a journey webhook.
# In this article
- Creating a system webhook
- Editing a system webhook
- System webhook settings
- Error handling
- System webhook request headers
- System webhook request body
-
Example system webhook payloads
- Email Blast Send
- Email Bounce
- Email Click
- Email Complaint
- Email Open
- Email Send Skip
- Email Subscribe
- Email Triggered Send
- Email Unsubscribe
- Embedded Click
- Embedded Impression
- Embedded Received
- Embedded Session
- Hosted Unsubscribe Click
- In-App Click
- In-App Delete (consume)
- In-App Recall
- In-App Open
- In-App Send
- In-App Send Skip
- Journey Exit
- Push Bounce
- Push Open
- Push Send
- Push Send Skip
- Push Uninstall
- SMS Bounce
- SMS Click
- SMS Received
- SMS Send
- SMS Send Skip
- Web Push Click
- Web Push Send
- Web Push Send Skip
- WhatsApp Received
- WhatsApp Seen
- WhatsApp Send
- WhatsApp Click
- WhatsApp Bounce
- WhatsApp Send Skip
- Want to learn more?
# Creating a system webhook
Before creating a system webhook in Iterable, you need:
- A webhook endpoint that can receive
POSTrequests. The URL must begin withhttps://. - Permission to configure the webhook's settings in Iterable. The logged in member may be an org admin, or may have the Manage Integrations project permission.
To create a new system webhook:
Go to Integrations > System Webhooks.
Click Create Webhook to bring up the system webhook creation form:
Enter the Webhook URL. The URL must begin with
https://.Click Create. Iterable takes you to the Edit System Webhook screen.
Configure the system webhook settings as needed.
Set the Status to Enabled to activate your new webhook.
Click Save Webhook.
# Editing a system webhook
When you change an existing system webhook, the changes take some time to propagate due to caching. For example, if you change the URL, Iterable may continue to send data to the old webhook URL for a short time after you update it.
To edit a system webhook:
Go to Integrations > System Webhooks.
Click the Edit button for the system webhook you want to change.
Update system webhook settings as needed.
Click Save Webhook.
# System webhook settings
When creating or editing a system webhook, you can configure the following settings:
- Endpoint URL (required)
- Status (Enabled or Disabled)
- Authentication (None, Basic, or OAuth2)
- Exclude list update events (if enabled)
- Custom HTTP headers (optional)
- Triggering events (one or more)
NOTE
There isn't a way to add custom fields to a system webhook, but you can use a journey webhook to build custom payloads.
# Endpoint URL
The endpoint URL is a URL that you provide as a location for Iterable send
data. Typically this is a third-party service, but can be any URL that can
receive a POST request.
You can edit this URL later, and you can add merge tags to customize it.
The URL must be able to accept a POST request, and must begin with https://.
# Status
By default, new system webhooks are set to Disabled.
To activate the system webhook, set Status to Enabled.
You can also disable the system webhook later by setting Status to Disabled.
# Authentication
Iterable supports three types of HTTP authentication for system webhooks:
None, Basic, and OAuth 2.0.
To learn more about the different types of HTTP authentication, see Beeceptor's documentation.
# None
Select this when no authentication is required or if you are using a different
method to authenticate the webhook request like an API key. The webhook request
will not include an Authorization header.
This is the default setting, however, it's best practice to use some form of authentication to secure your webhook.
# Basic
Use a username and password to authenticate. This is a simple authentication method that sends an encoded username and password in the request header.
To use Basic auth in your system webhook headers:
-
Get your username and password and base64-encode them. To do this:
- Combine your username and password with a colon (
:) between them. - Base64-encode the string.
For example, for a username and password of
Aladdin:OpenSesame, the base-64 encoded version isQWxhZGRpbjpPcGVuU2VzYW1l.IMPORTANT
Iterable does not encode the username and password for you. You must encode them before entering them in the webhook settings.
- Combine your username and password with a colon (
Select Basic for Authentication.
-
In the Authentication Token field, enter
Basicfollowed by a space and then the base64-encoded username and password.Example:
Basic QWxhZGRpbjpPcGVuU2VzYW1l Click Save Webhook.
Then, when the system webhook is triggered, Iterable sends the following
Authorization header:
"authorization": "Basic QWxhZGRpbjpPcGVuU2VzYW1l",
# OAuth 2.0 (bearer token)
For system web hooks, Iterable supports OAuth 2.0 authentication using a bearer token. Bearer tokens are a type of access token that are used to authenticate requests to a server. They are typically used in OAuth 2.0 authentication.
IMPORTANT
Bearer tokens for system webhooks may expire.
When creating a webhook with OAuth 2.0 authentication, you must provide a valid bearer token. Bearer tokens may have an expiration, after which they are no longer valid and must be replaced.
When you set up a bearer token in a system webhook, you can either:
-
Periodically replace the expired token.
Keep track of when your webhook expires, and periodically edit your webhook in Iterable to replace the token when you generate the new one. There is a risk of missing data if the token expires before you replace it, as requests will fail for expired credentials.
-
Create a token that does not expire.
Some OAuth 2.0 systems allow you to create non-expiring tokens. This is useful for system webhooks that need to run indefinitely.
Check with your company's security policies to determine the best approach for your project.
(For journey webhooks, Iterable supports OAuth 2.0 client credentials, and access tokens are programmatically generated.)
To add a bearer token to your system webhook headers:
Select OAuth2 for Authentication.
-
In the Authentication Token field, enter the Bearer token.
Example:
<YOUR-TOKEN> Click Save Webhook.
Then, when the webhook is triggered, Iterable sends the following
Authorization header:
"authorization": "Bearer <YOUR-TOKEN>",
# Excluding list update events
By default, actions like adding or removing users from a list (which update the
emailListIds or userIdListIds field in the user profile) create subscribe
(emailSubscribe) and unsubscribe (emailUnsubscribe)
events in the user's history, and trigger system webhooks.
This occurs when you:
- Upload a CSV file to create or add users to a list.
- Use certain API endpoints to subscribe or unsubscribe users from a list.
- Use a List Membership journey tile to change a user's list membership.
These events can trigger webhooks in large numbers in a short period of time, potentially causing rate limit issues. They may also be irrelevant to your use case as they do not indicate user engagement.
To trigger webhooks only for user-initiated events like subscribing and
unsubscribing from message channels and message types, enable
Exclude List Update Events. This setting prevents list update events from
triggering webhooks for subscribe (emailSubscribe) and unsubscribe
(emailUnsubscribe) events.
# Custom HTTP headers
You can add additional custom headers to the webhook request. This is useful for sending more information with the webhook endpoint. For example, this is where you can include an API key.
Click on Add HTTP Header to add custom headers to the webhook request.
For each header, enter a Name and a Value.
# Example custom header for an API key
There are multiple ways to include API keys in a webhook request. Always check with the service you are sending the webhook to for the correct way to include an API key in the request headers.
Example: For a system that accepts Api-Key as the header name, you can add a
custom header like this:
- Enter
Api-Keyin the Name field. - Enter
<YOUR_API_KEY>(the actual value of your API key) in the Value field.
IMPORTANT
For security reasons, do not include API keys in the URL of your webhook. Instead, include them in the headers.
Iterable doesn't accept API keys in the URL of a webhook request.
# Triggering events
Select one or more events that trigger the webhook:
The following events can trigger a system webhook:
# Email webhooks
- Blast send
- Triggered send
- Click
- Open
- Subscribe - Universal event for all channels. Optional filter available - learn more.
- Unsubscribe - Universal event for all channels. Optional filter available - learn more.
- Hosted unsubscribe
- Bounce
- Complaint
- Send skip
# Embedded webhooks
- Click
- Impression
- Received
- Session
# In-App webhooks
- Click
- Close
- Delete
- Delivery
- Open
- Recall
- Send
- Send skip
For subscribe and unsubscribe events, use Email Subscribe and Unsubscribe webhooks. These events are universal to all channels.
# Journey webhooks
- Journey Exit
# Push webhooks
- Send
- Click
- Received
- Bounce
- Uninstall
- Send skip
For subscribe and unsubscribe events, use Email Subscribe and Unsubscribe webhooks. These events are universal to all channels.
# SMS webhooks
- Send
- Click
- Received
- Bounce
- Send skip
For subscribe and unsubscribe events, use Email Subscribe and Unsubscribe webhooks. These events are universal to all channels.
# Web push webhooks
- Send
- Click
- Send skip
For subscribe and unsubscribe events, use Email Subscribe and Unsubscribe webhooks. These events are universal to all channels.
# WhatsApp webhooks
- Send
- Send skip
- Bounce
- Received
For subscribe and unsubscribe events, use Email Subscribe and Unsubscribe webhooks. These events are universal to all channels.
# Customizing system webhooks with merge tags
Merge tags are placeholders that are replaced with actual values when the webhook is triggered.
You can add merge tags to the webhook's URL to customize the data sent to
the webhook endpoint, as well as in the webhook's custom headers. Make sure to
use curly braces ({{ and }}) around the merge tags.
The following merge tags can be used in the webhook's URL:
campaignIdcampaignNametemplateIdtemplateNamechannelIdworkflowIdworkflowNameexperimentIdmessageTypeId
For example, you can enter merge tags in the webhook URL like this:
https://mywebhook.example.com/XXXXXX?src=iterable&cname={{campaignName}}&cid={{campaignId}}
If any of these parameters are not defined when the webhook is called, they will render as blank.
# Error handling
TIP
After creating a system webhook in Iterable, test it to make sure it works as expected. Do this before sending any campaigns that rely on it.
Iterable does not guarantee the successful delivery of system webhooks.
If a system webhook request fails, Iterable makes several retry attempts in the following minutes. If the retries are also unsuccessful, the event is dropped.
Iterable may duplicate successful system webhook requests. For example, this can sometimes happen when a request is retried after a timeout.
Iterable disables system webhooks for which there is a sustained, elevated error rate. After you resolve the issue, re-enable the system webhook on the Integrations > System Webhooks page.
If your system webhook endpoint uses a certificate signed by a certificate authority not trusted by Iterable, Iterable's system webhook calls to that endpoint will fail.
# System webhook request headers
A webhook sends a POST request with the following headers:
Content-Type: application/json-
Authorization: <authType> <authToken>(when configured)For example:
-
Selecting Basic for Authentication and providing an Authentication Token of
XXXXXXXXXXXXXXXXXXXXXXXXXXXyields the following header:Authorization: XXXXXXXXXXXXXXXXXXXXXXXXXXX -
Selecting OAuth2 for Authentication and providing an Authentication Token of
XXXXXXXXXXXXXXXXXXXXXXXXXXXwould yield the following header:Authorization: Bearer XXXXXXXXXXXXXXXXXXXXXXXXXXX By selecting Authentication of None, the webhook request doesn't
include anAuthorizationheader.
-
# Example system webhook request headers
{
"user-agent": "AHC/2.1",
"content-length": "951",
"accept": "*/*",
"authorization": "Basic QWxhZGRpbjpPcGVuU2VzYW1l",
"content-type": "application/json",
"x-forwarded-for": "192.0.2.23",
"x-forwarded-host": "https://my-webhook.example.com",
"x-forwarded-proto": "https",
"accept-encoding": "gzip"
}
# System webhook request body
The body of a webhook request is provided in JSON. It often contain the following fields:
-
emailoruserId- The unique identifier for the user associated with the event. This field varies by project type and user data. For example, in hybrid projects, users may haveemailand/oruserIdfields set in their profile. If a user has both fields set on their profile, Iterable's webhook payload includes both fields. -
eventName- The name of the event for which a webhook has been triggered. -
dataFields- An object that contains fields related to the webhook's triggering event. The fields indataFieldsvary depending on the event, your webhook settings, and your project's configuration.
# Example system webhook payloads
The following examples reflect JSON payloads that Iterable sends to a webhook endpoint for various system events. These examples are intended to provide a general idea of the data that Iterable sends in a webhook payload.
IMPORTANT
These webhook payloads are examples, not exhaustive schemas.
Iterable reserves the right to add new fields to webhook payloads at any time without prior notice. The payloads in this article are not exhaustive, and may not be up to date. Do not rely on the payloads in this article as a source of truth for system webhook schemas.
To see all the fields that Iterable sends in a given webhook payload, you should test your webhook with real data. The payload for a webhook always varies greatly depending on the event that triggered it, the settings you have configured for the webhook and your project.
# Email Blast Send
{ "email": "user@example.com", "eventName": "emailSend", "dataFields": { "contentId": 331201, "email": "user@example.com", "createdAt": "2016-12-02 20:21:04 +00:00", "campaignId": 59667, "templateId": 93849, "messageId": "9c438a20d26e4e9f8ad4edea23f811cd", "emailSubject": "My subject", "campaignName": "My campaign name", "workflowId": null, "workflowName": null, "templateName": "My template name", "channelId": 3420, "messageTypeId": 3866, "experimentId": null, "labels": [ "Example", "test-1", "test-2", "test-3" ], "emailId": "c123456:t456789:user@example.com" } }
# Email Bounce
{ "email": "user@example.com", "eventName": "emailBounce", "dataFields": { "emailSubject": "My subject", "campaignName": "My campaign name", "workflowId": null, "workflowName": null, "templateName": "My template name", "channelId": 2598, "messageTypeId": 2870, "experimentId": null, "labels": [ "Example", "test-1", "test-2", "test-3" ], "recipientState": "HardBounce", "templateId": 167484, "email": "user@example.com", "createdAt": "2017-05-15 23:59:47 +00:00", "campaignId": 114746, "messageId": "9c438a20d26e4e9f8ad4edea23f811cd", "emailId": "c123456:t456789:user@example.com" } }
# Email Click
{ "email": "user@example.com", "eventName": "emailClick", "dataFields": { "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36", "ip": "192.0.2.23", "templateId": 93849, "userAgentDevice": "Mac", "proxySource": null, "isBot": false, "url": "https://www.iterable.com", "hrefIndex": 1, "canonicalUrlId": "3145668988", "city": "San Francisco", "region": "CA", "country": "United States", "timeZone": "America/Los_Angeles", "locale": "en-US", "email": "user@example.com", "createdAt": "2016-12-02 20:31:39 +00:00", "campaignId": 59667, "messageId": "9c438a20d26e4e9f8ad4edea23f811cd", "emailSubject": "My subject", "campaignName": "My campaign name", "workflowId": null, "workflowName": null, "templateName": "My template name", "channelId": 3420, "messageTypeId": 3866, "experimentId": null, "labels": [ "Example", "test-1", "test-2", "test-3" ], "linkUrl": "https://www.iterable.com", "emailId": "c123456:t456789:user@example.com" } }
# Email Complaint
{ "email": "user@example.com", "eventName": "emailComplaint", "dataFields": { "recipientState": "Complaint", "templateId": 79190, "email": "user@example.com", "createdAt": "2016-12-09 18:52:19 +00:00", "campaignId": 49313, "messageId": "9c438a20d26e4e9f8ad4edea23f811cd", "emailSubject": "My subject", "campaignName": "My campaign name", "workflowId": null, "workflowName": null, "templateName": "test template", "channelId": 3420, "messageTypeId": 3866, "experimentId": null, "labels": [ "Example", "test-1", "test-2", "test-3" ], "emailId": "c123456:t456789:user@example.com" } }
# Email Open
NOTE
Location data is unavailable when Geoip lookup is disabled, and for email open events from Gmail.
Iterable does not include location data in the city, region, country, and timeZone
fields if the event's proxySource field is set to Gmail, because these
events have location data from Google image proxy, not the user's actual device
location.
{ "email": "user@example.com", "eventName": "emailOpen", "dataFields": { "userAgent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)", "city": "San Francisco", "region": "CA", "proxySource": "Gmail", "ip": "192.0.2.23", "country": "United States", "timeZone": "America/Los_Angeles", "templateId": 79190, "userAgentDevice": "Gmail", "email": "user@example.com", "createdAt": "2016-12-02 18:51:45 +00:00", "campaignId": 49313, "messageId": "9c438a20d26e4e9f8ad4edea23f811cd", "emailSubject": "My subject", "campaignName": "My campaign name", "workflowId": null, "workflowName": null, "templateName": "My template name", "locale": "en-us", "contentId": 1234567890, "isBot": false, "channelId": 3420, "messageTypeId": 3866, "experimentId": null, "labels": [ "Example", "test-1", "test-2", "test-3" ], "emailId": "c123456:t456789:user@example.com" } }
# Email Send Skip
{ "email": "user@example.com", "eventName": "emailSendSkip", "dataFields": { "createdAt": "2019-08-07 18:56:10 +00:00", "reason": "FrequencyCapping", "campaignId": 721398, "messageId": "9c438a20d26e4e9f8ad4edea23f811cd", "email": "user@example.com" } }
# Email Subscribe
These events are universal to all channels.
Optional filter available - learn more.
{ "email": "user@example.com", "eventName": "emailSubscribe", "dataFields": { "createdAt": "2020-03-20 23:12:00 +00:00", "signupSource": "UpdateSubscriptionsAPI", "emailListIds": [ // Note: This could be "userListIds" depending on project type 27449 ], "messageTypeIds": [], "channelIds": [], "email": "user@example.com", "profileUpdatedAt": "2020-03-20 23:11:58 +00:00" } }
# Email Triggered Send
{ "email": "user@example.com", "eventName": "emailSend", "dataFields": { "contentId": 274222, "email": "user@example.com", "createdAt": "2016-12-02 18:51:40 +00:00", "campaignId": 49313, "transactionalData": { "__comment": "transactionalData lists the fields contained in the dataFields property of the API call or event used to trigger the email, campaign, or journey. transactionalData must contain no more than 12k characters in total." }, "templateId": 79190, "messageId": "9c438a20d26e4e9f8ad4edea23f811cd", "emailSubject": "My subject", "campaignName": "My campaign name", "workflowId": null, "workflowName": null, "templateName": "My template name", "channelId": 3420, "messageTypeId": 3866, "experimentId": null, "labels": [ "Example", "test-1", "test-2", "test-3" ], "emailId": "c123456:t9876543:user@example.com" } }
# Email Unsubscribe
These events are universal to all channels.
Optional filter available - learn more.
{ "email": "user@example.com", "eventName": "emailUnSubscribe", "dataFields": { "campaignId": 1089024, "messageId": "9c438a20d26e4e9f8ad4edea23f811cd", "emailId": "c123456:t456789:user@example.com", "workflowName": "My test journey", "messageTypeIds": [], "locale": null, "templateId": 1526112, "emailSubject": "Upcoming events!", "labels": [ "Example", "test-1", "test-2", "test-3" ], "unsubSource": "EmailLink", "createdAt": "2020-03-20 23:34:15 +00:00", "templateName": "My test template", "emailListIds": [], // Note: This could be "userListIds" depending on project type "messageTypeId": 31082, "experimentId": null, "channelIds": [ 27447 ], "campaignName": "My test campaign", "workflowId": 76786, "email": "user@example.com", "channelId": 27447 } }
# Embedded Click
An embeddedClick event indicates that a user clicked on an embedded message
and includes details about which link was clicked.
{ "email": "user@example.com", "eventName": "embeddedClick", "dataFields": { "campaignId": 9950575, "campaignName": "Some Embedded Campaign Name", "workflowId": null, "workflowName": null, "templateName": "Some Template Name", "locale": "en-US", "channelId": 84101, "messageTypeId": 104680, "experimentId": null, "labels": [], "embeddedBodyField": "test embedded message title", "deviceInfo": { "deviceId": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", "platform": "Web", "appPackageName": "com.example.app" }, "embeddedButtonId": "", "embeddedTargetUrl": "null", "email": "user@example.com", "createdAt": "2025-03-05 00:49:55 +00:00", "templateId": 13137427, "messageId": "dXNlckBleGFtcGxlLmNvbS8xMjM0LzExMTEyMjIvMzMzNDQ0NTU1L2ZhbHNlCg==", "emailId": "c9950575:t16747897:user@example.com" } }
# Embedded Impression
An embeddedImpression event represents the number of times a given embedded
message was visible during the session, and the total amount of time the message
was visible (in seconds) across all those appearances.
{ "email": "user@example.com", "eventName": "embeddedImpression", "dataFields": { "campaignId": 9950575, "campaignName": "Some Embedded Campaign Name", "workflowId": null, "workflowName": null, "templateName": "Some Template Name", "locale": "en-US", "channelId": 11111, "messageTypeId": 104680, "experimentId": null, "labels": [], "embeddedBodyField": "test embedded message title", "deviceInfo": null, "embeddedImpressionDisplayCount": 1, "embeddedImpressionDisplayDuration": 12.675, "embeddedImpressionPlacementId": 434892, "embeddedSessionId": "fc159ed9-05f7-45f1-9eae-47b21847b7f5", "email": "user@example.com", "createdAt": "2025-03-05 00:48:41 +00:00", "templateId": 16747897, "messageId": "dXNlckBleGFtcGxlLmNvbS8xMjM0LzExMTEyMjIvMzMzNDQ0NTU1L2ZhbHNlCg==", "emailId": "c9950575:t16747897:user@example.com" } }
# Embedded Received
An embeddedReceived event indicates that a device has retrieved a message to
display for the user. (It does not mean that the message has been displayed.)
{ "email": "user@example.com", "eventName": "embeddedReceived", "dataFields": { "campaignId": 9950575, "campaignName": "Some Embedded Campaign Name", "workflowId": null, "workflowName": null, "templateName": "Some Template Name", "locale": "en-US", "channelId": 84101, "messageTypeId": 104680, "experimentId": null, "labels": [], "embeddedBodyField": "test embedded message title", "deviceInfo": { "deviceId": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", "platform": "Web", "appPackageName": "com.example.app" }, "email": "user@example.com", "createdAt": "2025-03-05 00:48:59 +00:00", "templateId": 16747897, "messageId": "dXNlckBleGFtcGxlLmNvbS8xMjM0LzExMTEyMjIvMzMzNDQ0NTU1L2ZhbHNlCg==", "emailId": "c9950575:t16747897:user@example.com" } }
# Embedded Session
An embeddedSession event represents a session in which a user interacted with
a page on your app or website that contained an embedded message.
{ "email": "user@example.com", "eventName": "embeddedSession", "deviceInfo": { "deviceId": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", "platform": "Web", "appPackageName": "com.example.app" }, "email": "user@example.com", "embeddedSessionEndTime": 1718652660218, "embeddedSessionStartTime": 1718652647592, "embeddedSessionId": "fc159ed9-05f7-45f1-9eae-47b21847b7f5", "createdAt": "2024-06-17 19:31:00 +00:00" }
# Hosted Unsubscribe Click
{ "email": "user@example.com", "userId": "1", "eventName": "hostedUnsubscribeClick", "dataFields": { "country": "United States", "city": "San Jose", "campaignId": 1074721, "ip": "192.0.2.23", "userAgentDevice": "Mac", "messageId": "9c438a20d26e4e9f8ad4edea23f811cd", "emailId": "c123456:t456789:user@example.com", "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36", "proxySource": null, "workflowName": "My journey", "locale": null, "templateId": 1506266, "emailSubject": "My email subject", "url": "my-custom-preference-center.example.com", "labels": [ "Example", "test-1", "test-2", "test-3" ], "createdAt": "2020-03-21 00:24:08 +00:00", "templateName": "My email template", "messageTypeId": 13406, "experimentId": null, "region": "CA", "campaignName": "My email campaign", "workflowId": 60102, "email": "user@example.com", "channelId": 12466 } }
# In-App Click
{ "email": "user@example.com", "eventName": "inAppClick", "dataFields": { "email": "user@example.com", "createdAt": "2018-03-27 00:44:40 +00:00", "campaignId": 269450 } }
# In-App Delete (consume)
{ "email": "user@example.com", "eventName": "inAppDelete", "dataFields": { "campaignId": 269450, "campaignName": "Example Campaign", "workflowId": null, "workflowName": null, "templateName": "Example Template", "locale": null, "channelId": 1234, "messageTypeId": 5678, "experimentId": null, "labels": [ "Example", "test-1", "test-2", "test-3" ], "inAppBody": "...", "messageContext": null, "deleteAction": "click-delete", "expiresAt": "2024-02-15 10:30:00 +00:00", "deviceInfo": null, "inboxSessionId": null, "email": "user@example.com", "createdAt": "2023-10-01 14:15:16 +00:00", "templateId": 12345678, "messageId": "9c438a20d26e4e9f8ad4edea23f811cd", "emailId": "c123456:t456789:user@example.com" } }
# In-App Recall
{ "email": "user@example.com", "eventName": "inAppRecall", "dataFields": { "total": 1, "email": "user@example.com", "createdAt": "2023-11-15 17:15:15 +00:00", "campaignId": 269450 } }
total is the total number of messages recalled for the user, for the campaign
identified by campaignId.
# In-App Open
{ "email": "user@example.com", "eventName": "inAppOpen", "dataFields": { "email": "user@example.com", "createdAt": "2018-03-27 00:44:30 +00:00", "campaignId": 269450 } }
# In-App Send
{ "email": "user@example.com", "eventName": "inAppSend", "dataFields": { "messageContext": { "saveToInbox": false, "trigger": "immediate" }, "campaignId": 732678, "contentId": 18997, "messageId": "9c438a20d26e4e9f8ad4edea23f811cd", "workflowName": null, "emailId": "c123456:t456789:user@example.com", "locale": null, "templateId": 1032729, "inAppBody": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML", "expiresAt": "2019-08-08 22:37:40 +00:00", "labels": [ "Example", "test-1", "test-2", "test-3" ], "createdAt": "2019-08-07 22:37:40 +00:00", "templateName": "My template name", "messageTypeId": 14381, "experimentId": null, "campaignName": "My campaign name", "workflowId": null, "channelId": 13353, "email": "user@example.com" } }
# In-App Send Skip
{ "email": "user@example.com", "eventName": "inAppSendSkip", "dataFields": { "createdAt": "2019-08-07 22:42:18 +00:00", "reason": "FrequencyCapping", "campaignId": 732678, "messageId": "9c438a20d26e4e9f8ad4edea23f811cd", "email": "user@example.com" } }
# Journey Exit
{ "email": "user@example.com", "eventName": "journeyExit", "dataFields": { "orgId": 12345, "projectId": 67890, "workflowId": 123456, "entranceTime": "2025-12-16 02:03:48 +00:00", "exitTime": "2025-12-16 02:03:58 +00:00", "exitNodeId": 1234567, "exitReason": "Completed", "exitRuleId": "", "nodePath": "2345678,3456789,1123456,2234567,3345678,4456789,5567890,1212345,2212345,1234567", "nodeCount": 10, "email": "user@example.com", "createdAt": "2025-12-16 02:03:58 +00:00" } }
# Push Bounce
{ "email": "user@example.com", "eventName": "pushBounce", "dataFields": { "platformEndpoint": "<Platform endpoint>", "email": "user@example.com", "createdAt": "2016-12-10 01:00:38 +00:00", "campaignId": 74768, "templateId": 113554, "pushMessage": "Push message text", "campaignName": "My campaign name", "workflowId": null, "workflowName": null, "templateName": "My template name", "channelId": 2203, "messageTypeId": 2439, "experimentId": null, "payload": { "path": "yourpath/subpath" }, "sound": "", "badge": null, "contentAvailable": false, "deeplink": null, "locale": null } }
# Push Open
{ "email": "user@example.com", "eventName": "pushOpen", "dataFields": { "appAlreadyRunning": false, "email": "user@example.com", "createdAt": "2016-12-08 01:25:22 +00:00", "campaignId": 74768, "templateId": 113554, "pushMessage": "Push message text", "campaignName": "My campaign name", "workflowId": null, "workflowName": null, "templateName": "My template name", "channelId": 2203, "messageTypeId": 2439, "experimentId": null, "payload": { "path": "shop_home" }, "sound": null, "badge": null, "contentAvailable": false, "deeplink": null, "locale": null } }
# Push Send
{ "email": "user@example.com", "eventName": "pushSend", "dataFields": { "campaignId": 74758, "campaignName": "Campaign name", "workflowId": null, "workflowName": null, "templateName": "Template name", "channelId": 1744, "messageTypeId": 1759, "experimentId": null, "pushMessage": "Message body", "payload": { "field": "value" }, "sound": null, "badge": "3", "contentAvailable": false, "deeplink": null, "attachmentUrlAndroid": "https://example.com/images/android_image.png", "attachmentUrlIos": "https://example.com/images/ios_image.png", "platformEndpoint": "...", "email": "user@example.com", "createdAt": "2016-12-08 00:53:11 +00:00", "templateId": 113541, "contentId": 6724, "messageId": "9c438a20d26e4e9f8ad4edea23f811cd", } }
# Push Send Skip
{ "email": "user@example.com", "eventName": "pushSendSkip", "dataFields": { "createdAt": "2019-08-07 22:28:51 +00:00", "reason": "FrequencyCapping", "campaignId": 732667, "messageId": "9c438a20d26e4e9f8ad4edea23f811cd", "email": "user@example.com" } }
# Push Uninstall
{ "email": "user@example.com", "eventName": "pushUninstall", "dataFields": { "isGhostPush": false, "platformEndpoint": "<Platform endpoint>", "email": "user@example.com", "createdAt": "2016-12-09 20:50:54 +00:00", "campaignId": 74768, "templateId": 113554, "messageId": "9c438a20d26e4e9f8ad4edea23f811cd", "pushMessage": "Push message text", "campaignName": "My campaign name", "workflowId": null, "workflowName": null, "templateName": "My template name", "channelId": 2203, "messageTypeId": 2439, "experimentId": null, "payload": { "path": "your_folder/30" }, "sound": "", "badge": null, "contentAvailable": false, "deeplink": null, "locale": null } }
# SMS Bounce
{ "email": "user@example.com", "eventName": "smsBounce", "dataFields": { "campaignId": 3333333, "campaignName": "Campaign name", "workflowId": null, "workflowName": null, "templateName": "Template name", "locale": null, "channelId": 11111, "messageTypeId": 22222, "experimentId": null, "labels": [ "Example", "test-1", "test-2", "test-3" ], "smsMessage": "Template SMS message body text here with an unshortened link without UTM parameters https://www.example.com/ and Handlebars unprocessed for {{firstName}}", "fromPhoneNumberId": 2072, "imageUrl": null, "messageId": "9c438a20d26e4e9f8ad4edea23f811cd", "messageStatus": "undelivered", "toPhoneNumber": "+14155550132", "errorCode": "30003", "email": "user@example.com", "createdAt": "2022-05-18 16:11:20 +00:00", "templateId": 5555555, "emailId": "c123456:t456789:user@example.com" } }
# SMS Click
Keep in mind that these fields are impacted by link shortening and UTM parameters:
clickedUrl- This is the URL that the shortlink redirects to, and reflects UTM parameters if they were added in the template settings.smsMessage- The text of the original SMS message body with the original URL without UTM parameters, and Handlebars expressions before processing.
The unique shortened URL, along with the final version of the message body sent
to an individual user, is available in the renderedSmsMessage property in the
SMS Send webhook.
{ "email": "user@example.com", "eventName": "smsClick", "dataFields": { "campaignId": 1234567, "campaignName": "My Campaign Name", "workflowId": null, "workflowName": null, "templateName": "My Template Name", "locale": "en-us", "channelId": 12345, "messageTypeId": 123456, "experimentId": null, "labels": [ "Example", "test-1", "test-2", "test-3" ], "smsMessage": "Template SMS message body text here with an unshortened link without UTM parameters https://www.example.com/ and Handlebars unprocessed for {{firstName}}", "fromPhoneNumberId": 5870, "imageUrl": null, "clickedUrl": "https://www.example.com/?parameter=value", "userAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Mobile Safari/537.36", "userAgentDevice": "Android", "isBot": false, "city": "San Francisco", "region": "CA", "country": "United States", "email": "user@example.com", "createdAt": "2024-11-08 18:27:14 +00:00", "templateId": 12345678, "messageId": "e98354206abb484da8a9a5abcde6523ef", "emailId": "c9515555:t12574400:user@example.com" } }
# SMS Received
{ "email": "user@example.com", "eventName": "smsReceived", "dataFields": { "fromPhoneNumber": "+14155550132", "toPhoneNumber": "+14155550133", "smsMessage": "Received SMS message body text here", "smsReceiveCount": 1, "mmsReceiveCount": 0, "espName": "Telnyx", "billingParty": "FirstParty", "espAccountId": "12345", "senderPhoneNumberType": "LongCode", "recipientCountryName": "United States", "recipientCountryCallingCode": "1", "email": "user@example.com", "createdAt": "2025-01-06 21:25:34 +00:00" } }
# SMS Send
Note that for SMS sends, there are multiple fields that contain the message content:
renderedSmsMessage- The final personalized version of the message that was sent to the user, with all merge tags and Handlebars replaced by their actual values, the opt-out instructions that were included (when applicable, based on your SMS Opt-Out settings), and any UTM parameters and/or shortlinks unique to themessageId.smsMessage- The message body of the template that was used to send the campaign. This text string includes raw merge tags, Handlebars expressions, and unparsed URLs (before adding UTM parameters and/or link shortening).
{ "email": "user@example.com", "eventName": "smsSend", "dataFields": { "campaignId": 4444444, "campaignName": "Campaign name", "workflowId": null, "workflowName": null, "templateName": "Template name", "locale": "en-gb", "channelId": 99999, "messageTypeId": 99999, "experimentId": null, "labels": [ "Example", "test-1", "test-2", "test-3" ], "smsMessage": "Template SMS message body text here with an unshortened link without UTM parameters https://www.example.com/ and Handlebars unprocessed for {{firstName}}", "fromPhoneNumberId": 1111, "imageUrl": null, "toPhoneNumber": "+14155550132", "fromSMSSenderId": 1111, "mmsSendCount": 0, "smsSendCount": 1, "isSMSEstimation": false, "espName": "Telnyx", "billingParty": "FirstParty", "espAccountId": "12345", "renderedSmsMessage": "Actual SMS message body text here with the shortlink sent to the user https://itbl.co/qqD~nNoDM and Handlebars processed for John", "timeZone": "America/Los_Angeles", "catalogLookupCount": 0, "catalogCollectionCount": 0, "productRecommendationCount": 0, "transactionalData": "{}", "email": "user@example.com", "createdAt": "2022-05-17 23:07:53 +00:00", "templateId": 555555, "contentId": 444444, "messageId": "9c438a20d26e4e9f8ad4edea23f811cd", "emailId": "c123456:t9876543:user@example.com" } }
# SMS Send Skip
{ "email": "user@example.com", "eventName": "smsSendSkip", "dataFields": { "createdAt": "2019-08-07 18:49:48 +00:00", "reason": "FrequencyCapping", "campaignId": 729390, "messageId": "9c438a20d26e4e9f8ad4edea23f811cd", "email": "user@example.com" } }
# Web Push Click
{ "email": "user@example.com", "userId": "some-userId-value", "eventName": "webPushClick", "dataFields": { "campaignId": 12345678, "campaignName": "Web Push campaign name", "workflowId": null, "workflowName": null, "templateName": "Template name", "locale": null, "channelId": 123456, "messageTypeId": 123456, "experimentId": null, "labels": [ "Example", "test-1", "test-2", "test-3" ], "webPushMessage": "Web Push Title", "webPushBody": "Web Push message body", "webPushIcon": "https://www.example.com/icon.png", "webPushClickAction": "https://www.example.com", "email": "user@example.com", "createdAt": "2024-10-16 22:53:52 +00:00", "templateId": 12345678, "messageId": "79cd703b9999999d8bf3bab6f27e96d5f" } }
# Web Push Send
{ "email": "user@example.com", "userId": "some-userId-value", "eventName": "webPushSend", "dataFields": { "campaignId": 12345678, "campaignName": "Web Push campaign name", "workflowId": null, "workflowName": null, "templateName": "Template name", "locale": null, "channelId": 123456, "messageTypeId": 123456, "experimentId": null, "labels": [ "Example", "test-1", "test-2", "test-3" ], "webPushMessage": "Web Push Title", "webPushBody": "Web Push message body", "webPushIcon": "https://www.example.com/icon.png", "webPushClickAction": "https://www.example.com", "browserToken": "some-browser-token", "catalogLookupCount": 0, "catalogCollectionCount": 0, "productRecommendationCount": 0, "email": "user@example.com", "createdAt": "2024-10-16 22:27:28 +00:00", "templateId": 12345678, "contentId": 123456, "messageId": "79cd703b9999999d8bf3bab6f27e96d5f" } }
# Web Push Send Skip
{ "email": "user@example.com", "userId": "some-userId-value", "eventName": "webPushSendSkip", "dataFields": { "campaignId": 12345678, "campaignName": "Web Push campaign name", "workflowId": null, "workflowName": null, "templateName": "Template name", "locale": null, "channelId": 123456, "messageTypeId": 123456, "experimentId": null, "labels": [ "Example", "test-1", "test-2", "test-3" ], "webPushMessage": "Web Push Title", "webPushBody": "Web Push message body", "webPushIcon": "https://www.example.com/icon.png", "webPushClickAction": "https://www.example.com", "email": "user@example.com", "createdAt": "2024-10-16 22:41:55 +00:00", "templateId": 12345678, "contentId": 123456, "messageId": "79cd703b9999999d8bf3bab6f27e96d5f", "reason": "MisconfiguredMessageService" } }
# WhatsApp Received
{ "attributionType": "DIRECT", "campaign": { "campaignAlertsEnabled": false, "campaignState": "Finished", "createdAt": 1746035470137, "createdByUserId": "user@fiterable.com", "dataScienceOptimizations": [], "defaultTimeZone": "America/Los_Angeles", "endedAt": 1746035573362, "expectedSendSize": 1, "id": 12345678, "ignoreFrequencyCap": false, "isArchived": false, "isDryRun": false, "isHidden": false, "labelIds": [], "listIds": [ 1234567 ], "messageMedium": "WhatsApp", "mobileAppIds": [], "name": "Fiterable iOS", "projectId": 12345, "quietHoursSendSkip": false, "schedulerMsgParams": { "defaultTimeZone": "America/Los_Angeles", "scheduleType": "ProjectTimeZone", "schedulerMsgIds": [], "startTimeZone": "America/Los_Angeles", "useCampaignQueue": false }, "startAt": 1746035572880, "suppressionListIds": [], "teamId": 12345, "templateId": 12345678, "updatedAt": 1746035572891, "updatedByUserId": "user@fiterable.com", "useCustomRateLimit": false, "wasEverRecurring": false }, "campaignId": 12345678, "channelId": 123456, "contentId": 1234, "createdAt": "2025-04-30T17:59:23.000Z", "email": "user@fiterable.com", "espAccountId": "12345", "espName": "Infobip", "eventType": "whatsAppReceived", "fromWhatsAppPhoneNumber": "15551111111", "itblInternal": { "documentCreatedAt": "2025-04-30 17:59:23 +00:00", "documentUpdatedAt": "2025-04-30 17:59:23 +00:00" }, "receivedAt": "2025-04-30 17:59:18 +00:00", "replyToMessageId": "wamid.BBeNWw2PDxlQufakjlR6PsflgwWRT21GGlircPqWEmfEgl0ths6lmqpZmpalr=", "templateId": 12345678, "toWhatsAppPhoneNumber": "15552222222", "whatsAppMessage": { "text": "Hi, friend!", "type": "TEXT" } }
# WhatsApp Seen
{ "campaign": { "campaignAlertsEnabled": false, "campaignState": "Finished", "createdAt": 1746035470137, "createdByUserId": "user@fiterable.com", "dataScienceOptimizations": [], "defaultTimeZone": "America/Los_Angeles", "endedAt": 1746035573362, "expectedSendSize": 1, "id": 12345678, "ignoreFrequencyCap": false, "isArchived": false, "isDryRun": false, "isHidden": false, "labelIds": [], "listIds": [ 1234567 ], "messageMedium": "WhatsApp", "mobileAppIds": [], "name": "Fiterable iOS App", "projectId": 12345, "quietHoursSendSkip": false, "schedulerMsgParams": { "defaultTimeZone": "America/Los_Angeles", "scheduleType": "ProjectTimeZone", "schedulerMsgIds": [], "startTimeZone": "America/Los_Angeles", "useCampaignQueue": false }, "startAt": 1746035572880, "suppressionListIds": [], "teamId": 12345, "templateId": 12345678, "updatedAt": 1746035572891, "updatedByUserId": "user@fiterable.com", "useCustomRateLimit": false, "wasEverRecurring": false }, "campaignId": 12345678, "createdAt": "2025-04-30T17:53:23.000Z", "email": "user@fiterable.com", "espAccountId": 12345, "espName": "Infobip", "eventType": "whatsAppSeen", "fromWhatsAppPhoneNumber": "15551111111", "itblInternal": { "documentCreatedAt": "2025-04-30 17:53:23 +00:00", "documentUpdatedAt": "2025-04-30 17:53:23 +00:00" }, "seenAt": "2025-04-30 17:53:05 +00:00", "seenMessageId": "dexs038qm5v1laeof34p2wpxmf295n17", "sentAt": "2025-04-30 17:52:54 +00:00", "templateId": 123455678, "toWhatsAppPhoneNumber": "15552222222" }
# WhatsApp Send
{ "email": "user@example.com", "eventName": "whatsAppSend", "dataFields": { "campaignId": 12345678, "campaignName": "WhatsApp Campaign Name", "workflowId": null, "workflowName": null, "templateName": "WhatsApp Template Name", "locale": "en_US", "channelId": 123456, "messageTypeId": 123456, "experimentId": null, "labels": [], "whatsAppBodyField": "Example message body text", "toWhatsAppPhoneNumber": "+14155550133", "fromWhatsAppSenderId": 7, "espName": "WhatsApp", "billingParty": "FirstParty", "espAccountId": "12345", "renderedWhatsAppMessage": "", "catalogLookupCount": 0, "catalogCollectionCount": 0, "productRecommendationCount": 0, "transactionalData": "{}", "email": "user@example.com", "createdAt": "2025-12-17 17:50:10 +00:00", "templateId": 12345678, "contentId": 1234, "messageId": "9c438a20d26e4e9f8ad4edea23f811cd", "emailId": "c123456:t12345678:user@example.com" }
# WhatsApp Click
{ "campaign": { "campaignAlertsEnabled": false, "campaignState": "Finished", "createdAt": 1745963898129, "createdByUserId": "user@fiterable.com", "dataScienceOptimizations": [], "defaultTimeZone": "America/Los_Angeles", "endedAt": 1745964143608, "expectedSendSize": 3, "id": 12345678, "ignoreFrequencyCap": false, "isArchived": false, "isDryRun": false, "isHidden": false, "labelIds": [], "listIds": [ 1234567 ], "messageMedium": "WhatsApp", "mobileAppIds": [], "name": "Campaign created on Tue, Apr 29, 2025 5:57 PM", "projectId": 12345, "quietHoursSendSkip": false, "schedulerMsgParams": { "defaultTimeZone": "America/Los_Angeles", "scheduleType": "ProjectTimeZone", "schedulerMsgIds": [], "startTimeZone": "America/Los_Angeles", "useCampaignQueue": false }, "startAt": 1745964142930, "suppressionListIds": [], "teamId": 12345, "templateId": 12345678, "updatedAt": 1745964142946, "updatedByUserId": "user@fiterable.com", "useCustomRateLimit": false, "wasEverRecurring": false }, "campaignId": 12345678, "clickedUrl": "https://fiterable.com?utm_source=Fiterable&utm_medium=whatsApp&utm_campaign=campaign_12345678&website=fiterable", "createdAt": "2025-04-29T22:04:44.000Z", "email": "user@fiterable.com", "eventType": "whatsAppClick", "itblInternal": { "documentCreatedAt": "2025-04-29 22:04:44 +00:00", "documentUpdatedAt": "2025-04-29 22:04:44 +00:00" }, "messageId": "dexs038qm5v1laeof34p2wpxmf295n17", "templateId": 12345678 }
# WhatsApp Bounce
{ "email": "user@example.com", "eventName": "whatsAppBounce", "dataFields": { "campaignId": 12345678, "campaignName": "WhatsApp Campaign Name", "workflowId": null, "workflowName": null, "templateName": "WhatsApp Template Name", "locale": "en_US", "channelId": 123456, "messageTypeId": 123456, "experimentId": null, "labels": [], "whatsAppBodyField": "test", "contentId": 1234, "createdAt": "2025-12-17 17:50:11 +00:00", "email": "user@example.com", "errorCode": 7081, "messageId": "9c438a20d26e4e9f8ad4edea23f811cd", "messageStatus": "UNDELIVERABLE_REJECTED_OPERATOR", "templateId": 12345678, "toWhatsAppPhoneNumber": "14155550133", "emailId": "c123456:t12345678:user@example.com" } }
# WhatsApp Send Skip
{ "campaign": { "campaignAlertsEnabled": false, "campaignState": "Finished", "createdAt": 1743037003775, "createdByUserId": "user@fiterable.com", "dataScienceOptimizations": [], "defaultTimeZone": "America/Los_Angeles", "endedAt": 1743037124628, "expectedSendSize": 1, "id": 12345678, "ignoreFrequencyCap": false, "isArchived": false, "isDryRun": false, "isHidden": false, "labelIds": [], "listIds": [ 1234567 ], "messageMedium": "WhatsApp", "mobileAppIds": [], "name": "Campaign created on Wed, Mar 26, 2025 8:56 PM", "projectId": 12345, "quietHoursSendSkip": false, "schedulerMsgParams": { "defaultTimeZone": "America/Los_Angeles", "scheduleType": "ProjectTimeZone", "schedulerMsgIds": [], "startTimeZone": "America/Los_Angeles", "useCampaignQueue": false }, "startAt": 1743037076941, "suppressionListIds": [], "teamId": 12345, "templateId": 12345678, "updatedAt": 1743037076949, "updatedByUserId": "user@fiterable.com", "useCustomRateLimit": false, "wasEverRecurring": false }, "campaignId": 12345678, "channelId": 123456, "contentId": 1234, "createdAt": "2025-03-27T00:58:47.000Z", "email": "user@fiterable.com", "eventType": "whatsAppSendSkip", "itblInternal": { "documentCreatedAt": "2025-03-27 00:58:47 +00:00", "documentUpdatedAt": "2025-03-27 00:58:47 +00:00" }, "messageId": "dexs038qm5v1laeof34p2wpxmf295n17", "messageTypeId": 123456, "reason": "MisconfiguredMessageService", "templateId": 12345678 }
# Want to learn more?
For more information about some of the topics in this article, check out this Iterable Academy course. Iterable Academy is open to everyone — you don't need to be an Iterable customer!