CDP (Optimove™) Integration Guide
Presented by Exchange Solutions | October 16, 2025
Optimove™ and ES Loyalty™ integration overview
Optimove is a Customer Data Platform (CDP) with built-in marketing campaign capabilities. This integration of Optimove™ with Exchange Solutions' ES Loyalty™ combines ES Loyalty's proven strength in offer personalization with Optimove's Email Service Provider (ESP) functions through OptiMail™ and its campaign features. Embedding loyalty data into customer journeys lets clients create highly personalized loyalty experiences at scale.
The ES Loyalty integration with Optimove allows a member's loyalty data—including account data, partner link data, and extended member data—along with personalized offers, to be sent to Optimove.
Data is synced to Optimove using one of two modes:
- Real-time updates via APIs
- Direct daily updates via batch file or Snowflake
These two modes have a combined limit of 50 custom member attributes and depend on Optimove configuring the desired attributes. This works well for a standard set of profile attributes, but requires special handling for more dynamic data such as Extended Member Data (EMD).
In addition to data syncing, certain events can be synced to Optimove in real time. These events can also directly trigger an email in response to loyalty actions performed by members. These triggered emails are called transactional emails (as opposed to marketing emails) and are sent to the member when loyalty account changes occur.
Member email messages are generated based on the following types:
- Scheduled: Sent at regular intervals, such as personalized offers, points summaries, or redemption summaries.
- Triggered: Sent in response to a member event, such as registering and obtaining a digital or physical rewards card.
- Transactional: Sent in response to member transactions, such as linking or unlinking a partner card, redeeming points, or making a purchase.
Transactional data used in all email types can be added in the Optimove backend to meet client requirements, but this must be configured at the time of Optimove setup. Any later additions are customizations subject to a Statement of Work (SOW) and additional charges due to the significant work involved. If you have questions, contact your TSA.
Purpose of the Data Integration Gateway (DIG)
ES Loyalty's Data Integration Gateway (DIG) is a generic module designed to facilitate the integration of messages sent by ES Loyalty with various external systems. It applies filtering rules to incoming messages and routes them to the appropriate connector module. It is one option for connecting to integrated systems (as an alternative to direct connections that don't involve an intermediary module).
These connectors consume the messages and interact with external vendors or providers—such as email service providers or data integration providers—by calling the appropriate APIs.
Batch updates have a latency of up to 24 hours because they're sent daily. This system also requires two sets of attributes: one for real-time updates and one for batch updates.
Member and loyalty data
This section describes what's required for data handling and processing so that the ES Loyalty/Optimove integration passes the correct data.
Optimove doesn't support localization conversion in transactional email (that is, converting content into the local language and format for elements such as currency and messaging). Ensure that all monetary values and other localized content are sent to Optimove in the format intended for the email. Marketing emails support localization through the language tag, but test to confirm that other format changes—such as currency—are also supported.
Real-time data updates
Real-time data updates cover the following categories:
- Loyalty account data changes: Transactional email (triggered email) functionality fires when there's a change in a member's account data—for example, a change in member profile data, partner link, member tier, or member household. This results in an update to Optimove for the specific change type and value. The new data is pushed to Optimove.
- Personalized offers: Promotional offers relevant to a member in targeted marketing emails.
- Partner card link information: A unique identifier along with non-sensitive card information (such as cardholder type and link status) is stored and synced to Optimove. Exchange Solutions does not store sensitive card information such as card numbers, which eliminates the risk of sensitive card data being exposed for malicious use.
- Use of Optimove's native opt-in flag: This flag is updated based on opt-in or opt-out values provided to Exchange Solutions through the extended member data payload sent via member profile updates. These updates occur when the customer updates their profile information through the client's member management web application. The key distinction between marketing (scheduled and triggered) email and transactional email is that for the former, the email opt-in/opt-out flag is stored in Optimove. Members cannot opt out of transactional email for security and fraud prevention reasons.
Real-time updates for member registration and opt-in status
Optimove can receive externally-generated events that can then be used to initiate a real-time campaign or update attributes within Optimove. ES Loyalty sends the following events:
MEMBER_REGISTRATION: Initiates a "Welcome Email." When a customer first registers as a member in the loyalty program, this event is sent to create a member record in Optimove. When an unregistered customer swipes their card at a POS terminal, a corresponding member record is also created and a registration event is sent to Optimove.OPT_IN_EMAIL: Updates Optimove's internal email opt-in flag. If a member gives consent, they opt in to receive marketing email. If consent is denied, they opt out. The opt-in/opt-out status is visible in the ES Loyalty Console under the member's Extended Member Data section.REDEMPTION: Updates member redemption transaction details and triggers the redemption email in Optimove.MEMBER_PROFILE_UPDATE: Updates member profile data in Optimove.MEMBER_TIER: Updates member tier changes in Optimove.
Member registration event
For a MEMBER_REGISTRATION event, the email is triggered when member registration data is received in ES Loyalty. The following parameters apply:
| Optimove field name | ESL field name | Data type | Description |
|---|---|---|---|
customer_id | AccountID | String | PK. Unique identification number for an individual account. Can be joined to the account table to extract various fields related to the specific ACCOUNT_ID. |
loyalty_id | LoyaltyID | String | Loyalty unique identification number, generally the customer loyalty card number. |
email | Email | String | Email address of the account holder. |
first_name | FirstName | String | First name of the account holder. |
last_name | LastName | String | Last name of the account holder. |
business_name | BusinessName | String | Business name. Blank by default. |
registration_channel | RegistrationChannel | String | Channel where the customer registered the account. Possible values: APP, WEB. |
registration_date | RegistrationTS | String | Date the account was registered, in UTC format. |
card_type | CardType | String | Card type, either physical or digital. Physical card numbers are ghost cards distributed at sites. Digital cards are generated cards loaded in ESL and assigned to members who register online without a card. Values: PHYSICAL (ghost cards), DIGITAL (digital card numbers). |
language_preference | LanguagePreference | String | Language preference of the member. Defaults to English if undefined. Values: en-CA or EN (English), en-FR or FR (French). |
Member registration is initiated through the ES Loyalty Customer Experience (CUX) API. The event is delivered to the Optimove client, which makes the appropriate API call to Optimove. A REGISTRATION_EVENT is dispatched to Optimove whenever a new registration occurs.
Sample payload:
{
"Data": {
"accountID": "a207f1a7-289b-433c-9b0d-dec7d182981a",
"businessName": "GASCORP",
"cardType": "DIGITAL",
"email": "test@gmail.com",
"externalIdentifier": "700034343223232",
"firstName": "Nathan",
"languagePreference": "en-CA",
"lastName": "Hall",
"loyaltyID": "52404569624056",
"registrationChannel": "APP",
"registrationDate": "2024-03-01T14:17:35.605Z",
"registrationDateEpoch": 1709307519000
}
}
The process for an unregistered member is similar to a registration event. An unregistered event is triggered.
Email opt-in event
The following parameters apply to a consent event, in which the member provides consent to receive email.
| Optimove field name | ESL field name | Data type | Description |
|---|---|---|---|
customer_id | AccountID | String | PK. Unique identification number for an individual account. Can be joined to the account table to extract various fields related to the specific ACCOUNT_ID. |
opt_in | isOptInEmail | Boolean | Indicates whether the account has opted in to email communication. |
identifier | email | String | Email address of the account holder. |
brand | n/a | String | Brand as per Optimove setup requirements. Hardcoded to AC01 since consent only applies to marketing emails. |
event_origin | n/a | String | Event origin as per Optimove setup requirements. Hardcoded value. |
execution_method | n/a | String | Execution method as per Optimove setup requirements. Hardcoded value. |
channel_id | n/a | Number | Channel ID as per Optimove setup requirements. Hardcoded value. |
This event is used to send member registration or email consent provision to Optimove. After a successful registration or email consent provision, the member receives a Welcome Email.
In most cases, the opt-in email preference is conveyed through a consent message that verifies—through a standard payload—that a member wants to receive marketing emails.
Sample payload:
{
"Data": {
"brand": "AC01",
"channel_id": 15,
"customer_id": "a207f1a7-289b-433c-9b0d-dec7d182981",
"event_origin": "server",
"execution_method": "email",
"identifier": "test@gmail.com",
"opt_in": true
}
}
Redemption event
The REDEMPTION event notifies a member who makes a redemption through a POS, app, or web channel via an email containing redemption details. This event can also directly trigger an email once an email template is configured in Optimove and the template ID is updated in ESL.
| Optimove field name | ESL field name | Data type | Description |
|---|---|---|---|
CUSTOMER_ID | accountID | String | PK. Unique identification number for an individual account. Can be joined to the account table to extract various fields related to the specific ACCOUNT_ID. |
BUSINESS_UNIT | businessUnit | String | Business unit of the account holder. |
CHANNEL | channel | String | Channel through which the transaction occurred. |
EMAIL | email | String | Email address of the account holder. |
LOCAL_TRANSACTION_DATE | localTransactionDate | String | Local transaction date in EST/EDT. |
LOYALTY_ID | loyaltyID | String | The loyalty unique identification number. |
PROCESSED_DATE | processedDate | String | Current system date timestamp in UTC. |
REDEMPTION_AVAILABLE_BALANCE | redemptionAvailableBalance | String | Remaining points balance after redemption. |
REDEMPTION_BALANCE | redemptionBalance | String | Total redemption points balance before redemption. |
REDEMPTION_DOLLARS | redemptionDollars | String | Redemption dollar amount in the transaction. |
REDEMPTION_POINTS | redemptionPoints | String | Redemption points amount in the transaction. |
STORE_NAME | storeName | String | Store name or address. |
STORE_NUMBER | storeNumber | String | Store number. |
TRANSACTION_DATE | transactionDate | String | Transaction date timestamp based on store province (POS/APP) or EST/EDT (WEB). |
TRANSACTION_ID | transactionID | String | Transaction identifier. |
templateID | templateID | Number | Email template ID configured in Optimove. |
Sample payload:
{
"Data": {
"BUSINESS_UNIT": "GASCORP",
"CHANNEL": "POS",
"CUSTOMER_ID": "a207f1a7-289b-433c-9b0d-dec7d182981a",
"EMAIL": "test@gmail.com",
"LOCAL_TRANSACTION_DATE": "2025-09-21T12:31:13.000",
"LOYALTY_ID": "52404569624056",
"PROCESSED_DATE": "2025-09-21T16:31:27.968Z",
"REDEMPTION_AVAILABLE_BALANCE": 3,
"REDEMPTION_BALANCE": 153,
"REDEMPTION_DOLLARS": 0.15,
"REDEMPTION_POINTS": 150,
"STORE_NAME": "100 Main Street",
"STORE_NUMBER": "2378",
"TRANSACTION_DATE": "2025-09-21T10:31:13-06:00",
"TRANSACTION_ID": "20250921-1031-027790101-215930-2222"
}
}
Member profile update event
The MEMBER_PROFILE_UPDATE event triggers an update of the member's profile details through an API call to Optimove with the following information:
| Optimove field name | ESL field name | Data type | Description |
|---|---|---|---|
CUSTOMER_ID | accountID | String | PK. Unique identification number for an individual account. Can be joined to the account table to extract various fields related to the specific ACCOUNT_ID. |
EMAIL | email | String | Email address of the account holder. |
ACCOUNT_STATUS | AccountStatus | String | Defines the account activity status. |
CARD_STATUS | LoyaltyStatus | String | Card status of the account. An account may have more than one loyalty card due to card replacements. |
IS_BLOCKED | IsSuspended | String | Indicates whether the account is in a suspended state. |
LANGUAGE_PREFERENCE | languagePreference | String | Language preference of the member. Defaults to English if undefined. |
AVAILABLE_POINT_BALANCE | AvailablePointBalance | String | Redeemable points balance, excluding limit restrictions. |
AVAILABLE_POINT_VALUE | AvailablePointValue | String | Dollar value of the available points. |
POINT_BALANCE | PointBalance | String | Total points balance after redemption. |
POINT_BALANCE_VALUE | PointBalanceValue | String | Dollar value of the points balance. |
Sample payload:
{
"Data": {
"ACCOUNT_STATUS": "ACTIVE",
"AVAILABLE_POINT_BALANCE": "0",
"AVAILABLE_POINT_VALUE": "0",
"CARD_STATUS": "ACTIVE",
"CustomerID": "a207f1a7-289b-433c-9b0d-dec7d182981a",
"EMAIL": "test@gmail.com",
"IS_BLOCKED": false,
"LANGUAGE_PREFERENCE": "en-CA",
"POINT_BALANCE": "0",
"POINT_BALANCE_VALUE": "0"
}
}
Member tier event
The MEMBER_TIER event triggers an update of the member's tier details through an API call to Optimove. This event can also directly trigger an email once an email template is configured in Optimove and the template ID is updated in ESL.
| Optimove field name | ESL field name | Data type | Description |
|---|---|---|---|
CUSTOMER_ID | accountID | String | PK. Unique identification number for an individual account. Can be joined to the account table to extract various fields related to the specific ACCOUNT_ID. |
BENEFIT_START_DATE_EPOCH | benefitStartDateEpoch | String | Benefit start date in epoch format. |
BENEFIT_START_DATE_ISO | benefitStartDateISO | String | Benefit start date in UTC format. |
BUSINESS_UNIT | businessUnits | String | Business unit. Defaults to a set value. |
COUNTRY_CODE | CountryCode | String | The 2-character country code for the account. |
EMAIL | email | String | Email address of the account holder. |
PHONE_NUMBER | PhoneNumber | String | Phone number of the account holder. |
EVENT_TYPE | eventType | String | System event type. Values: INSERT (new event), MODIFY (existing event). |
MEMBERSHIP_PROGRAM_CODE | ProgramCode | String | Current loyalty program code. |
MEMBERSHIP_TIER_CODE | TierCode | String | Current loyalty tier code. |
MEMBERSHIP_TIER_NAME | Tiers.displayName | String | Current loyalty tier name. |
MEMBERSHIP_TIER_RANK | TierRank | String | Current loyalty tier rank. |
NEXT_TIER_ID | NextTierCode | String | Next loyalty tier code. |
NEXT_TIER_RANK | TierRank (of NextTierCode) | String | Next loyalty tier rank. |
NEXT_TIER_NAME | Tiers.displayName (of NextTierCode) | String | Next loyalty tier name. |
templateID | templateID | Number | Email template ID configured in Optimove. |
Sample payload:
{
"Data": {
"accountID": "a207f1a7-289b-433c-9b0d-dec7d182981",
"benefitStartDateEpoch": 1753333200000,
"benefitStartDateISO": "2025-07-24T05:00:00.000Z",
"businessUnits": [
"GASCORP"
],
"contactDetails": {
"countryCode": "CA",
"email": "test@gmail.com"
},
"contributionType": "UNIT",
"eventType": "INSERT",
"membershipProgramCode": "PLATINUM",
"membershipTierCode": "TIER2",
"membershipTierName": "SILVER",
"membershipTierRank": 2,
"nextTier": {
"id": "TIER1",
"rank": 1,
"tierName": "GOLD"
}
}
}
Bulk or batch data updates
Bulk or batch updates provide periodic (daily or nightly) customer profile updates from specified tables through Snowflake. These tables include each member's attributes, which enable customers to be segmented across a variety of dimensions. This lets Optimove track customer behavior and target groups, which is the foundation of Optimove's approach.
Once Optimove has successfully received all historical data, a daily data update process is required to keep Optimove's data warehouse current. This data extraction process is similar to the initial historical data delivery, but includes only incremental (new or changed) data unless otherwise requested. Data is sent daily using Snowflake Data Sharing and includes ES Loyalty account data (from the Customers table), partner link status, personalized offers (customer promotions), transactional data (from the Orders and Order Items tables), and extended member data (from the Customer Extended Data table). The database schema tables are described below.
1. Customers
Synchronizes ES Loyalty member account data to Optimove.
| Optimove field name | ESL field name | Data type | Description |
|---|---|---|---|
CUSTOMERID | AccountID | TEXT | PK. Unique identification number for an individual account. Can be joined to the account table to extract various fields related to the specific ACCOUNT_ID. |
REGISTRATIONDATE | RegistrationTS | DATE | Date the account was registered. |
EMAIL | Email | TEXT | Email address of the account holder. |
MOBILENUMBER | PhoneNumber | TEXT | Phone number of the account holder. |
FIRSTPURCHASEDATE | FirstPurchaseTS | DATE | Date of the first purchase performed on the account. |
DATEOFBIRTH | DateOfBirth | DATE | Date of birth of the account holder. |
ISBLOCKED | IsSuspended | BOOLEAN | Indicates whether the account is in a suspended state. |
ISTEST | isTest | BOOLEAN | Indicates whether the member is Regular (false) or Test (true). Static value, defaults to false. Currently unused. |
ISOPTINEMAIL | isOptInEmail | BOOLEAN | Indicates whether the account has opted in to email communication. |
ISOPTINSMS | isOptInSMS | BOOLEAN | Indicates whether the account has opted in to SMS messages. |
FIRSTNAME | FirstName | TEXT | First name of the account holder. |
LASTNAME | LastName | TEXT | Last name of the account holder. |
COUNTRY | CountryCode | TEXT | The 2-character country code for the account. |
CITY | City | TEXT | City of the member address. |
GENDER | Gender | TEXT | Gender of the member. |
LASTLOGINDATE | LastActivityDate | DATE | Date of the most recent activity on the account. |
REGISTEREDPLATFORM | RegistrationChannel | TEXT | Channel where the customer registered the account. |
REFERRALTYPE | n/a | TEXT | The method by which the customer was referred (for example, SEO, Affiliate, Advertising, Marketing). Defaults to null. |
CURRENCY | n/a | TEXT | Payment currency of the customer. Defaults to CAD. |
UPDATEDDATE | UpdatedTS | DATE | Date of the most recent update or modification to the account. |
LOYALTYID | LoyaltyID | TEXT | The loyalty unique identification number, generally the customer loyalty card number. |
ACCOUNTSTATUS | AccountStatus | TEXT | Defines the account activity status. |
CREATEDDATE | CreatedTS | DATE | Date the account was created. |
EXTERNALIDENTIFIER | ExternalIdentifier | TEXT | The account identifier for an external system outside of ES Loyalty. Same value as LoyaltyID. |
BUSINESSNAME | BusinessName | TEXT | The business name. Blank by default. |
POSTALZIPCODE | PostalZipCode | TEXT | The postal code of the customer's address. |
STREET | Street | TEXT | Street name and number of the member address. |
PROVINCESTATE | ProvinceState | TEXT | Province or state of the account. |
ISEMPLOYEE | Employee | BOOLEAN | Indicates whether the account belongs to an employee. |
ISEXPIRED | IsExpired | BOOLEAN | Indicates whether the account is expired. |
CARDSTATUS | LoyaltyStatus | TEXT | Card status of the account. An account may have more than one loyalty card due to card replacements. |
AVAILABLEPOINTBALANCE | AvailablePointBalance | DECIMAL | Redeemable points balance, excluding limit restrictions. |
AVAILABLEPOINTVALUE | AvailablePointValue | DECIMAL | Dollar value of the available points. |
POINTBALANCE | PointBalance | DECIMAL | Total points balance after redemption. |
POINTBALANCEVALUE | PointBalanceValue | DECIMAL | Dollar value of the points balance. |
HOUSEHOLDPOINTBALANCE | householdAvailablePointBalance | DECIMAL | Total household points balance after redemption. |
HOUSEHOLDPOINTVALUE | householdPointValue | DECIMAL | Dollar value of the household points. |
PROGRAMCODE | ProgramCode | TEXT | Loyalty program code. |
TIERCODE | TierCode | TEXT | Loyalty tier code. |
TIERNAME | Tiers.displayName | TEXT | Loyalty tier name. |
TIERRANK | TierRank | TEXT | Loyalty tier rank. |
NEXTTIER | NextTierCode | TEXT | Next tier code. |
CONTRIBUTIONS | Contributions | VARIANT | Member contribution data indicating whether the tier is configured in dollars spent or units (litres), including current state and remaining contribution to the next tier. |
LANGUAGEPREFERENCE | PreferredLanguage | TEXT | Language preference of the member. Defaults to English if undefined. |
2. Partner link status
Contains partner card information, such as payment and non-payment cards linked to a loyalty account.
| Optimove field name | ESL field name | Data type | Description |
|---|---|---|---|
CUSTOMERID | AccountID | TEXT | PK. Unique identification number for an individual account. Can be joined to the account table to extract various fields related to the specific ACCOUNT_ID. |
PARTNERID | PartnerID | TEXT | PK. Unique identifier for the partner. |
LAST4 | Last4 | NUMBER | The last 4 digits of the payment card number. |
UPDATEDDATE | UpdatedTS | DATE | Date of the most recent update to the partner link data. |
LINKEDDATE | LinkedTS | DATE | Date the card was linked. |
UNLINKEDDATE | UnLinkedTS | DATE | Date the link was removed. |
LINKTYPE | LinkType | TEXT | The type of link created. |
CARDHOLDERTYPE | CardHolderType | TEXT | Possible values: Retail (personal) or Business (small business). |
CARDTYPE | CardType | TEXT | The type of payment card. Supported values: credit, debit. |
LINKID | Link_ID | TEXT | A unique link ID when the link type is PAYCARD for any partner. |
STATUS | Status | TEXT | The current status of the linked payment card. |
BIN | Bin | TEXT | A BIN (Bank Identification Number) is the first 4–6 digits of a payment card that identifies the card issuer. |
3. Customer promotions
Optimove facilitates the integration of promotions, enabling campaign execution. Offer data is determined based on the sort value configured in ES Loyalty's offer management module (1 being the highest priority, 10 the lowest), with the earliest display date taking precedence. The current capability supports up to 10 offers targeted to members.
| Optimove field name | ESL field name | Data type | Description |
|---|---|---|---|
CUSTOMERID | AccountID | TEXT | PK. Unique identification number for an individual account. Can be joined to the account table to extract various fields related to the specific ACCOUNT_ID. |
ROW_UPDATED_TS | UpdatedTS | TIMESTAMP_NTZ | Timestamp in UTC format of the last customer update. |
OFFER_1_CODE | offer_1_code | TEXT | Offer 1 code. |
OFFER_1_NAME | offer_1_name | TEXT | Offer 1 name. |
OFFER_1_EXPIRY_TS | offer_1_expiry_ts | TIMESTAMP_NTZ | Offer 1 expiry timestamp in UTC format. A year greater than 3000 indicates no expiry date. |
OFFER_1_EFFECTIVE_TS | offer_1_effective_ts | TIMESTAMP_NTZ | Offer 1 effective timestamp in UTC format. |
OFFER_1_REWARD_AMOUNT | offer_1_reward_amount | NUMBER | Offer 1 reward amount in EN format without comma separator. Apply FR formatting in the email template. |
OFFER_1_SHORT_DESCRIPTION1 | offer_1_short_description1 | TEXT | Offer 1 short description. |
OFFER_1_PROMOTION_HEADLINE | offer_1_promotion_headline | TEXT | Offer 1 promotion headline. |
OFFER_1_LONG_DESCRIPTION | offer_1_long_description | TEXT | Offer 1 long description. |
OFFER_1_SPEND_NEXT | offer_1_spend_next | NUMBER | Spend amount needed to meet the offer 1 requirement, in EN format without comma separator. Apply FR formatting in the email template. |
OFFER_1_QUANTITY_NEXT | offer_1_quantity_next | NUMBER | Quantity (items or litres) needed to meet the offer 1 requirement, in EN format without comma separator. Apply FR formatting in the email template. |
The same set of fields (code, name, expiry timestamp, effective timestamp, reward amount, short description, promotion headline, long description, spend next, quantity next) repeats for offers 2 through 10, following the same naming pattern (for example, OFFER_2_CODE, OFFER_3_NAME, and so on).
4. Extended member data
In addition to core customer attributes, ES Loyalty delivers an extended set of member metadata. These attributes are flattened and mapped to Optimove's table using the pattern <SOURCE>__<ATTRIBUTE_NAME>. This data provides additional data points that can be used to segment the member population in the Optimove CDP. Other than CUSTOMERID, which is a fixed field, all other fields are dynamically generated based on the Extended Member Data (EMD) setup by the client.
| Optimove field name | ESL field name | Data type | Description |
|---|---|---|---|
CUSTOMERID | AccountID | TEXT | PK. Unique identification number for an individual account. Can be joined to the account table to extract various fields related to the specific ACCOUNT_ID. |
DEFAULT__TITLE | DEFAULT__TITLE | TEXT | Dynamic column created based on extendedDataSource + extendedDataName. |
DEFAULT__CASL | DEFAULT__CASL | TEXT | Dynamic column created based on extendedDataSource + extendedDataName. |
5. Order data
Contains member transaction or order details.
Orders:
| Optimove field name | ESL field name | Data type | Description |
|---|---|---|---|
Order_ID | TransactionID | String | Transaction identifier. |
Customer_ID | AccountID | String | PK. Unique identification number for an individual account. Can be joined to the account table to extract various fields related to the specific ACCOUNT_ID. |
Store_ID | StoreNumber | String | Unique store number. |
Number_of_Items | Total of Cart.saleLineItems.quantity + Cart:tender | Decimal (3) | The number of items purchased in the order. |
Payment_Method | Primary tender (Cart:tender) as defined in reports | String | The method of payment (for example, credit card, PayPal). |
Total_Refund_Amount | Total of Cart.reversedLineItems.finalSaleAmount::float * -1 | Decimal (2) | The total amount refunded in the order. |
Total_Item_Price | Total of Cart.saleLineItems.originalSaleAmount | Decimal (2) | The total price of all items in the order, before deductions. |
Discount | Total of Cart.saleLineItems.itemDiscount | Decimal (2) | Total discount granted. |
Shipping_Cost | N/A | Decimal (2) | Shipping costs. Defaults to null. |
Total_Tax | Cart.saleLineItems.itemTax | Decimal (2) | Total tax amount of the order. |
Total_Payment | Cart.saleLineItems.finalSaleAmount | Decimal (2) | Final payment amount made by the customer, after refunds and cancellations. |
Order_Date | TransactionTs | Date | Date the order was placed, in UTC. |
Store_Type | N/A | String | Type of store associated with the order. Defaults to null. |
Promo_Code | N/A | String | ID of the promo code used for the purchase. Defaults to null. |
Updated_Date | UpdatedTS | Date | Date the record was updated or added, in UTC. |
Order items:
| Optimove field name | ESL field name | Data type | Description |
|---|---|---|---|
Order_Item_ID | TransactionId + {line item Id} | String | Unique identifier of an item within a transaction. |
Order_ID | TransactionId | String | Transaction identifier. |
Product_ID | Cart.saleLineItems.sku | String | Unique product identifier. |
SKU | Cart.saleLineItems.sku | String | SKU of the purchased item. |
Number_of_Items | Cart.saleLineItems.quantity | Decimal (3) | The number of items purchased of this product. |
Item_Price | Cart.saleLineItems.originalSaleAmount / Cart.saleLineItems.quantity | Decimal (8) | The price of a single item. |
Discount | Cart.saleLineItems.itemDiscount | Decimal (2) | The discount applied to the item. |
Refund_Amount | Cart.reversedLineItems.finalSaleAmount::float * -1 | Decimal (2) | The amount refunded for items. |
Return_Date | TransactionTs | Date | Date of the item return, in UTC. |
Email templates and personalization
This section describes email templates, how email sends are initiated, and how personalization is applied.
Types of templates in Optimail
Optimove supports three types of email templates across two categories: marketing emails (scheduled and triggered) and transactional emails.
-
Scheduled: Sent on a defined schedule. Scheduled emails can include welcome messages to household members, regular personalized offers, points summaries, redemption summaries, and household balance updates. This type is subject to the member's email opt-in/opt-out status.
-
Triggered: Sent in response to trigger events in ES Loyalty, such as a member's first visit to the website or app, or a welcome email upon registration for a digital or physical loyalty card. Both scheduled and triggered emails are categorized as marketing emails in Optimove and are subject to the member's email opt-in status. Members who haven't opted in won't receive this type of email.
-
Transactional: Sent when a specified type of transaction occurs, such as linking a partner card, transferring points, making a purchase or redemption, updating a household balance, changing tier membership, or qualifying for gameplay. Transactional email overrides the opt-in flag, as it's important that members receive information about their transactions.
Scheduled email and offer email personalization tags
Personalized offer emails are a type of scheduled email. They include attributes or offer personalization tags that are populated from member data to create emails personalized to each member. Marketers can use the following attributes—along with other data in Optimove not sourced from ES Loyalty—as offer personalization tags in email templates to support their email campaigns.
Synchronization of updates, opt-ins, and promotions
The following synchronizations support the integration:
- Member account update: The Update Customer Attributes API is designed for making real-time updates to a member's account.
- Syncing opt-in preference to ESP: Executed following the initial implementation of Optimove.
- Promotion template: Optimove facilitates the integration of promotions for campaign execution. The Add Promotions API exclusively supports the synchronization of
PromotionCodeandPromotionName. The promotion template, targeted offers, and reward tracking can be managed efficiently through Snowflake.
Triggered email configurations
Triggered emails, such as sending a welcome email to a new member, result from a server-side event and are therefore handled differently in Optimove than transactional emails. For trigger configuration, a templateID is required, which refers to the Optimove template triggered from ES Loyalty. All attributes included in the template must be added to attributeMappings in the Optimove configuration. Attribute mappings and templates are set up in Optimove.
Transactional email personalization options
Data sent from ES Loyalty as a result of a transaction can initiate one of six different types of transactional email, depending on the client's needs and the criteria for sending the email. Each transactional email has its own personalization options based on member actions.
Need additional resources? Supporting documentation for this integration is available through your TSA. Reach out to them if you need reference materials beyond what's covered here.