📘
Attentive is a mobile-first messaging and customer engagement platform that helps brands grow revenue through personalized SMS and email experiences. It enables event-driven marketing, audience segmentation, and automated Journeys based on customer behavior and commerce activity.
Product Type: Advertising
Integration Type: Starter Kit
Event Source Type: Web
Event Scope: Full-Funnel Events
- Sends events to Attentive for marketing automation, audience segmentation, optimization, and reporting use cases.
- Supports eCommerce events (product view, add to cart, purchase) using Attentive’s eCommerce APIs.
- Supports custom events for additional behavioral tracking using Attentive’s Custom Events API.
- Supports identity resolution to link user identifiers for downstream event matching using Attentive’s Identity API.
- Supports passing custom identifiers (for example, a username) when available.
- A user must first provide at least one primary identifier (email or phone).
- If you send custom identifiers, they must be fully populated with non-empty values; empty fields are not accepted.
- Use ISO 8601 timestamps for when the action occurred. Events older than ~12 hours may be accepted but not trigger Journeys or appear in the dashboard.
- For custom events,
type is case-sensitive and must avoid certain special characters; use simple, predictable event names.
- For custom events,
properties keys are case-sensitive and must follow Attentive’s character restrictions for object keys.
- Custom event nested objects and lists are supported in emails only; nested and list objects are not supported for SMS rendering.
- URLs included in custom events may be auto-shortened when they are 1,024 characters or fewer using your brand’s link shortener.
- Custom events must be triggered by the same app/source context that created them in Attentive.
- Custom events support a maximum of 200 object keys per event; larger payloads may be accepted but not fully usable in Journeys or macros.
- Identity resolution can unintentionally link separate people if duplicate identifiers are sent; use stable, unique identifiers and avoid reuse.
- The Identity API capability is in beta and may change behavior over time.
- Avoid sending nulls or empty strings for identifiers; if an identifier is not available, omit it rather than sending an empty value.
- Some invalid or out-of-policy events (for example, timestamp-related issues) may receive a success response but still be discarded by Attentive.
-
Use Attentive’s authentication and app management documentation to generate an API token:
-
When creating the custom app, ensure the following scopes are enabled:
- eCommerce – write
- Custom Events – write
- Custom Attributes – write
- Identity – write (may require Attentive support to enable on the backend)
- From the integration library, add a Attentive integration. Then, fill out the Connection Parameters:
| Connection Parameter | Description |
|---|
API_TOKEN | Attentive API token used to authorize requests. |
- MetaRouter provides all of the event mappings that Attentive integrations typically require. You may add custom events, parameters, or mappings in accordance with Attentive’s API documentation.
- In the Pipelines tab, add your Attentive integration.
- Select the correct integration revision
- Click Add Integration to finalize deployment.
Global mappings will be applied to all events. If your parameter names do not match the Expected Inputs provided, you will need to overwrite the Inputs provided with your own.
Global Filters:
This integration applies global filters to ensure events are only sent to Attentive when a user can be identified. Events are allowed only if at least one of the following is present: traits.email, traits.phone, or userId. This aligns with Attentive’s requirement that events be associated with a known or linkable user and helps prevent events from being accepted but discarded downstream.
| Output Key | Description | Expected Input |
|---|
phone *Required | String: User phone number (E.164 recommended when available). | traits.phone |
email *Required | String: User email address. | traits.email |
clientUserId | String: Your internal user ID used as an external identifier. This should be your own system-assigned, stable unique identifier for a user (for example, an internal user ID). Do not use email addresses or phone numbers as the clientUserId, since those should be sent in their dedicated fields. | userId |
**customIdentifiers | Array: Custom identifiers (for example, username) when present. | Expression – conditionally map traits.username into name/value pairs |
*Either phone or email is required to identify a user.
**If you send custom identifiers, they must be fully populated with non-empty values; empty fields are not accepted.
| Output Key | Description | Expected Input |
|---|
user.email Required (one of) | String: User email address. | traits.email |
user.phone Required (one of) | String: User phone number. | traits.phone |
items Required | Array: Single-item product payload mapped from product properties. | Expression – map properties to Attentive item fields |
occurredAt Required | String: ISO 8601 timestamp for when the event occurred. | Expression – normalize timestamp / originalTimestamp / sentAt |
user.externalIdentifiers.clientUserId | String: Your internal user ID for external identifier matching. | userId |
user.externalIdentifiers.customIdentifiers | Array: Custom identifiers (for example, username) when present. | Expression – conditionally map traits.username into name/value pairs |
| Output Key | Description | Expected Input |
|---|
user.phone Required (one of) | String: User phone number. | traits.phone |
user.email Required (one of) | String: User email address. | traits.email |
items Required | Array: Single-item cart-add payload mapped from product properties. | Expression – map properties to Attentive item fields |
occurredAt Required | String: ISO 8601 timestamp for when the event occurred. | Expression – normalize timestamp / originalTimestamp / sentAt |
user.externalIdentifiers.clientUserId | String: Your internal user ID for external identifier matching. | userId |
user.externalIdentifiers.customIdentifiers | Array: Custom identifiers (for example, username) when present. | Expression – conditionally map traits.username into name/value pairs |
| Output Key | Description | Expected Input |
|---|
user.phone Required (one of) | String: User phone number. | traits.phone |
user.email Required (one of) | String: User email address. | traits.email |
items Required | Array: Line items mapped from the products array. | Expression – map properties.products[] into Attentive item fields |
orderId Required | String: Order identifier. | properties.order_id |
occurredAt Required | String: ISO 8601 timestamp for when the event occurred. | Expression – normalize timestamp / originalTimestamp / sentAt |
user.externalIdentifiers.clientUserId | String: Your internal user ID for external identifier matching. | userId |
user.externalIdentifiers.customIdentifiers | Array: Custom identifiers (for example, username) when present. | Expression – conditionally map traits.username into name/value pairs |
| Output Key | Description | Expected Input |
|---|
user.phone Required (one of) | String: User phone number. | traits.phone |
user.email Required (one of) | String: User email address. | traits.email |
type Required | String: Event type value passed through from the source event. | type |
occurredAt Required | String: ISO 8601 timestamp for when the event occurred. | Expression – normalize timestamp / originalTimestamp / sentAt |
user.externalIdentifiers.clientUserId | String: Your internal user ID for external identifier matching. | userId |
properties.path | String: Page path. | properties.path |
properties.referrer | String: Referrer value. | properties.referrer |
properties.search | String: Search/query string. | properties.search |
properties.title | String: Page title. | properties.title |
properties.url | String: Page URL. | properties.url |
externalEventId | String: External event ID for reference or deduplication. | messageId |
user.externalIdentifiers.customIdentifiers | Array: Custom identifiers (for example, username) when present. | Expression – conditionally map traits.username into name/value pairs |
| Output Key | Description | Expected Input |
|---|
user.phone Required (one of) | String: User phone number. | traits.phone |
user.email Required (one of) | String: User email address. | traits.email |
type Required | String: Event name passed through as the type. | event |
occurredAtRequired | String: ISO 8601 timestamp for when the event occurred. | Expression – normalize timestamp / originalTimestamp / sentAt |
user.externalIdentifiers.clientUserId | String: Your internal user ID for external identifier matching. | userId |
externalEventId | String: External event ID for reference or deduplication. | messageId |
properties.affiliation | String: Store or affiliation value. | properties.affiliation |
properties.coupon | String: Coupon code applied. | properties.coupon |
properties.currency | String: Currency code (uppercased). | properties.currency |
properties.products | Array: Products in the checkout. | properties.products |
properties.discount | Number: Discount amount. | properties.discount |
properties.order_id | String: Order identifier (if available at checkout). | properties.order_id |
properties.revenue | Number: Revenue amount. | properties.revenue |
properties.shipping | Number: Shipping amount. | properties.shipping |
properties.tax | Number: Tax amount. | properties.tax |
properties.value | Number: Total value amount. | properties.value |
user.externalIdentifiers.customIdentifiers | Array: Custom identifiers (for example, username) when present. | Expression – conditionally map traits.username into name/value pairs |
| Output Key | Description | Expected Input |
|---|
user.phone Required (one of) | String: User phone number. | traits.phone |
user.email Required (one of) | String: User email address. | traits.email |
type Required | String: Event name passed through as the type. | event |
occurredAt Required | String: ISO 8601 timestamp for when the event occurred. | Expression – normalize timestamp / originalTimestamp / sentAt |
user.externalIdentifiers.clientUserId | String: Your internal user ID for external identifier matching. | userId |
externalEventId | String: External event ID for reference or deduplication. | messageId |
properties | Object: Product list view properties passed through. | properties |
user.externalIdentifiers.customIdentifiers | Array: Custom identifiers (for example, username) when present. | Expression – conditionally map traits.username into name/value pairs |
| Output Key | Description | Expected Input |
|---|
user.phone Required (one of) | String: User phone number. | traits.phone |
user.email Required (one of) | String: User email address. | traits.email |
type Required | String: Event name passed through as the type. | event |
occurredAt Required | String: ISO 8601 timestamp for when the event occurred. | Expression – normalize timestamp / originalTimestamp / sentAt |
user.externalIdentifiers.clientUserId | String: Your internal user ID for external identifier matching. | userId |
externalEventId | String: External event ID for reference or deduplication. | messageId |
properties.cart_id | String: Cart identifier. | properties.cart_id |
properties.currency | String: Currency code (uppercased). | properties.currency |
properties.products | Array: Products currently in the cart. | properties.products |
user.externalIdentifiers.customIdentifiers | Array: Custom identifiers (for example, username) when present. | Expression – conditionally map traits.username into name/value pairs |
| Output Key | Description | Expected Input |
|---|
user.phone Required (one of) | String: User phone number. | traits.phone |
user.email Required (one of) | String: User email address. | traits.email |
type Required | String: Event name passed through as the type. | event |
occurredAt Required | String: ISO 8601 timestamp for when the event occurred. | Expression – normalize timestamp / originalTimestamp / sentAt |
user.externalIdentifiers.clientUserId | String: Your internal user ID for external identifier matching. | userId |
externalEventId | String: External event ID for reference or deduplication. | messageId |
properties.affiliation | String: Store or affiliation value. | properties.affiliation |
properties.coupon | String: Coupon code applied. | properties.coupon |
properties.currency | String: Currency code (uppercased). | properties.currency |
properties.discount | Number: Discount amount. | properties.discount |
properties.order_id | String: Order identifier. | properties.order_id |
properties.products | Array: Products included in the update. | properties.products |
properties.revenue | Number: Revenue amount. | properties.revenue |
properties.shipping | Number: Shipping amount. | properties.shipping |
properties.tax | Number: Tax amount. | properties.tax |
properties.total | Number: Total amount. | properties.total |
user.externalIdentifiers.customIdentifiers | Array: Custom identifiers (for example, username) when present. | Expression – conditionally map traits.username into name/value pairs |
| Output Key | Description | Expected Input |
|---|
user.phone Required (one of) | String: User phone number. | traits.phone |
user.email Required (one of) | String: User email address. | traits.email |
type Required | String: Event name passed through as the type. | event |
occurredAt Required | String: ISO 8601 timestamp for when the event occurred. | Expression – normalize timestamp / originalTimestamp / sentAt |
user.externalIdentifiers.clientUserId | String: Your internal user ID for external identifier matching. | userId |
properties.affiliation | String: Store or affiliation value. | properties.affiliation |
properties.checkout_id | String: Checkout identifier (if available). | properties.checkout_id |
properties.coupon | String: Coupon code applied. | properties.coupon |
properties.currency | String: Currency code (uppercased). | properties.currency |
properties.discount | Number: Discount amount. | properties.discount |
properties.order_id | String: Order identifier. | properties.order_id |
externalEventId | String: External event ID for reference or deduplication. | messageId |
properties.products | Array: Products included in the refund. | properties.products |
properties.revenue | Number: Revenue amount. | properties.revenue |
properties.shipping | Number: Shipping amount. | properties.shipping |
properties.tax | Number: Tax amount. | properties.tax |
properties.total | Number: Total amount. | properties.total |
user.externalIdentifiers.customIdentifiers | Array: Custom identifiers (for example, username) when present. | Expression – conditionally map traits.username into name/value pairs |
| Output Key | Description | Expected Input |
|---|
user.phone Required (one of) | String: User phone number. | traits.phone |
user.email Required (one of) | String: User email address. | traits.email |
type Required | String: Event name passed through as the type. | event |
occurredAt Required | String: ISO 8601 timestamp for when the event occurred. | Expression – normalize timestamp / originalTimestamp / sentAt |
user.externalIdentifiers.clientUserId | String: Your internal user ID for external identifier matching. | userId |
externalEventId | String: External event ID for reference or deduplication. | messageId |
properties | Object: Search event properties passed through. | properties |
user.externalIdentifiers.customIdentifiers | Array: Custom identifiers (for example, username) when present. | Expression – conditionally map traits.username into name/value pairs |
| Output Key | Description | Expected Input |
|---|
user.phone Required (one of) | String: User phone number. | traits.phone |
user.email Required (one of) | String: User email address. | traits.email |
type Required | String: Event name passed through as the type. | event |
occurredAt Required | String: ISO 8601 timestamp for when the event occurred. | Expression – normalize timestamp / originalTimestamp / sentAt |
user.externalIdentifiers.clientUserId | String: Your internal user ID for external identifier matching. | userId |
externalEventId | String: External event ID for reference or deduplication. | messageId |
properties | Object: Product click properties passed through. | properties |
user.externalIdentifiers.customIdentifiers | Array: Custom identifiers (for example, username) when present. | Expression – conditionally map traits.username into name/value pairs |
| Output Key | Description | Expected Input |
|---|
user.phone Required (one of) | String: User phone number. | traits.phone |
user.email Required (one of) | String: User email address. | traits.email |
type Required | String: Event name passed through as the type. | event |
occurredAt Required | String: ISO 8601 timestamp for when the event occurred. | Expression – normalize timestamp / originalTimestamp / sentAt |
user.externalIdentifiers.clientUserId | String: Your internal user ID for external identifier matching. | userId |
externalEventId | String: External event ID for reference or deduplication. | messageId |
properties | Object: Product removal properties passed through. | properties |
user.externalIdentifiers.customIdentifiers | Array: Custom identifiers (for example, username) when present. | Expression – conditionally map traits.username into name/value pairs |
| Output Key | Description | Expected Input |
|---|
user.phone Required (one of) | String: User phone number. | traits.phone |
user.email Required (one of) | String: User email address. | traits.email |
type Required | String: Event name passed through as the type. | event |
occurredAt Required | String: ISO 8601 timestamp for when the event occurred. | Expression – normalize timestamp / originalTimestamp / sentAt |
user.externalIdentifiers.clientUserId | String: Your internal user ID for external identifier matching. | userId |
externalEventId | String: External event ID for reference or deduplication. | messageId |
properties | Object: Payment step properties passed through. | properties |
user.externalIdentifiers.customIdentifiers | Array: Custom identifiers (for example, username) when present. | Expression – conditionally map traits.username into name/value pairs |
| Output Key | Description | Expected Input |
|---|
user.phone Required (one of) | String: User phone number. | traits.phone |
user.email Required (one of) | String: User email address. | traits.email |
type Required | String: Event name passed through as the type. | event |
occurredAt Required | String: ISO 8601 timestamp for when the event occurred. | Expression – normalize timestamp / originalTimestamp / sentAt |
user.externalIdentifiers.clientUserId | String: Your internal user ID for external identifier matching. | userId |
externalEventId | String: External event ID for reference or deduplication. | messageId |
properties | Object: Promotion click properties passed through. | properties |
user.externalIdentifiers.customIdentifiers | Array: Custom identifiers (for example, username) when present. | Expression – conditionally map traits.username into name/value pairs |
| Output Key | Description | Expected Input |
|---|
user.phone Required (one of) | String: User phone number. | traits.phone |
user.email Required (one of) | String: User email address. | traits.email |
type Required | String: Event name passed through as the type. | event |
occurredAt Required | String: ISO 8601 timestamp for when the event occurred. | Expression – normalize timestamp / originalTimestamp / sentAt |
user.externalIdentifiers.clientUserId | String: Your internal user ID for external identifier matching. | userId |
externalEventId | String: External event ID for reference or deduplication. | messageId |
properties | Object: Promotion view properties passed through. | properties |
user.externalIdentifiers.customIdentifiers | Array: Custom identifiers (for example, username) when present. | Expression – conditionally map traits.username into name/value pairs |
| Output Key | Description | Expected Input |
|---|
user.phone Required (one of) | String: User phone number. | traits.phone |
user.email Required (one of) | String: User email address. | traits.email |
type Required | String: Event name passed through as the type. | event |
occurredAt Required | String: ISO 8601 timestamp for when the event occurred. | Expression – normalize timestamp / originalTimestamp / sentAt |
user.externalIdentifiers.clientUserId | String: Your internal user ID for external identifier matching. | userId |
externalEventId | String: External event ID for reference or deduplication. | messageId |
properties | Object: Coupon entry properties passed through. | properties |
user.externalIdentifiers.customIdentifiers | Array: Custom identifiers (for example, username) when present. | Expression – conditionally map traits.username into name/value pairs |
| Output Key | Description | Expected Input |
|---|
user.phone Required (one of) | String: User phone number. | traits.phone |
user.email Required (one of) | String: User email address. | traits.email |
occurredAt Required | String: ISO 8601 timestamp for when the event occurred. | Expression – normalize timestamp / originalTimestamp / sentAt |
type Required | String: Event name passed through as the type. | event |
user.externalIdentifiers.clientUserId | String: Your internal user ID for external identifier matching. | userId |
externalEventId | String: External event ID for reference or deduplication. | messageId |
properties | Object: Wishlist add properties passed through. | properties |
user.externalIdentifiers.customIdentifiers | Array: Custom identifiers (for example, username) when present. | Expression – conditionally map traits.username into name/value pairs |
| Output Key | Description | Expected Input |
|---|
user.phone Required (one of) | String: User phone number. | traits.phone |
user.email Required (one of) | String: User email address. | traits.email |
type Required | String: Event name passed through as the type. | event |
occurredAt Required | String: ISO 8601 timestamp for when the event occurred. | Expression – normalize timestamp / originalTimestamp / sentAt |
user.externalIdentifiers.clientUserId | String: Your internal user ID for external identifier matching. | userId |
externalEventId | String: External event ID for reference or deduplication. | messageId |
properties.affiliation | String: Store or affiliation value. | properties.affiliation |
properties.order_id | String: Order identifier. | properties.order_id |
properties.total | Number: Total amount. | properties.total |
properties.revenue | Number: Revenue amount. | properties.revenue |
properties.shipping | Number: Shipping amount. | properties.shipping |
properties.tax | Number: Tax amount. | properties.tax |
properties.discount | Number: Discount amount. | properties.discount |
properties.coupon | String: Coupon code applied. | properties.coupon |
properties.currency | String: Currency code (uppercased). | properties.currency |
properties.products | Array: Products included in the canceled order. | properties.products |
user.externalIdentifiers.customIdentifiers | Array: Custom identifiers (for example, username) when present. | Expression – conditionally map traits.username into name/value pairs |
These identifiers must be mapped to Attentive in order for successful user matching to occur. Without these IDs, any events sent to Attentive may not be accurately reflected in reporting.
| Attribute | Example | Sync Injector Required? |
|---|
email Required (one of) | [email protected] | No |
phone Required (one of) | +14155552671 | No |
clientUserId | user_12345 | No |
customIdentifiers.username | jane_doe_92 | No |
-
Confirm events in Attentive - In the Attentive dashboard, open the custom app created for this integration, then navigate to the Performance tab and review endpoint activity to confirm that event requests are being received
-
Work with your Attentive rep - Ask your Attentive representative to validate event ingestion and identity matching on the backend.
-
Test Journey triggers - Ensure Journeys configured on these events are triggering as expected. If events appear but do not trigger, check timestamps and identifiers.
-
Validate audiences - Create an audience based on incoming events and confirm users are populating.
-
Validate conversions in analytics - In the Attentive dashboard, navigate to Analytics and confirm that conversions, revenue, or other downstream metrics tied to your events are populating as expected.
-
Work with your Attentive team - Ask your Attentive representative to validate event ingestion and identity matching on the backend.