Data Warehouse Feeds Specification
Version: 4.7 v01 Last updated: 2026-03-31
Table of contents
- Entity-relationship diagram
- Outbound feed specifications
- Account and loyalty card feeds
- Transactional data feeds
- Fulfillment feeds
- Promotion and targeted offer data feeds
Entity-relationship diagram
The following diagram provides an overview of the feeds in the ES Loyalty platform.
Outbound feed specifications
The following sections provide a detailed list of feeds available from the ES Loyalty data warehouse. The feeds are organized into the following categories:
- Account and loyalty card feeds
- Transactional data feeds
- Promotion and targeted offer data feeds
Each feed contains incremental data—only data changed since the last extraction is included. The feeds are designed to run at least daily, though frequency may change. Analytical data feeds are an exception and run on a different cadence, which is noted alongside those feeds.
All attributes in the feeds follow the Pascal case standard (capitalized first letter, with each subsequent word also capitalized).
Snowflake data sharing
If data is shared directly from Snowflake using data sharing, reference the Snowflake table name provided for each feed. These tables appear in your Snowflake account once data sharing is enabled. Column names in these tables use underscores between words instead of Pascal case. All data is available in the tables and refreshed on an agreed-upon schedule—daily refreshes are typically sufficient.
Converting data to CSV with escape scenario
The value of any given data type must be converted to a string before being included in a comma-separated values (CSV) file. The generate_delimited_row function is typically used to format or convert data into a delimited format like CSV. This function compiles an array of values from the source table and formats it into a comma-separated (,) and optionally enclosed (") string.
Nested ARRAY_CONSTRUCT functions build arrays of values by concatenating each element to ensure ordered inclusion in the final output. This is a feature found in SQL-based systems like Snowflake and is not directly related to CSV files. However, it can be used in conjunction with CSV data processing when working with databases that support the function.
The following is an example output of an Account feed comprising string, timestamp, number, and text values:
6168e8ea-c801-4082-be69-f50a3fabd4c5,6,2024-01-04T15:15:12.089 +0000,ACTIVE,2023-12-11T15:04:34.320
+0000,2024-01-04T15:15:12.089 +0000,2023-12-11T15:04:34.225
+0000,76510000003685,ACTIVE,false,0,0,false,0, ,*********,*********,*********,*********,*********,
,TX,US,ANONYMOUS,SYSTEM
JSON fields often contain nested data and special characters ({, }, :, ", etc.). The following is an example output of an account_extended_data feed comprising account_id, loyalty_id, extended_data_source, and extended_data:
7623a3e9-286c-4d50-a45c20e60e399c0e,6105700001998079141,DEFAULT,"{""bonusPointSegmentation"":""Yes"",
""cherryPicker"":""No"",""frequencySegmentation"":""Yes"",""industry"":""Consulting"",
""monetarySegementation"":""Yes"",""recencySegmentation"":""No"",""rfmSegmentation"":""Yes"",
""trade"":""Raconteur"",""tradeUnion"":""Rush 2112""}"
This is the JSON field extended_data:
{
"bonusPointSegmentation": "Yes",
"cherryPicker": "No",
"frequencySegmentation": "Yes",
"industry": "Consulting",
"monetarySegementation": "Yes",
"recencySegmentation": "No",
"rfmSegmentation": "Yes",
"trade": "Raconteur",
"tradeUnion": "Rush 2112"
}
The output with JSON-like data "{""trade"":""plumber"",""tradeAssociation"":""Loyal Order of Water Buffalos"",""tradeLocal"":""Local 993""}" uses double quotes ("") around each character because the function treats the {...} structure as a standard string containing both commas and double quotes. Each " character is therefore escaped with an additional ".
"{""bonusPointSegmentation"":""Yes"",""cherryPicker"":""No"",""frequencySegmentation"":""Yes"",
""industry"":""Consulting"",""monetarySegementation"":""Yes"",""recencySegmentation"":""No"",
""rfmSegmentation"":""Yes"",""trade"":""Raconteur"",""tradeUnion"":""Rush Jobs 2112""}"
The following is an example of an Activity feed comprising account_id, activity_id, version_num, version_effective_TS, activity_type, loyalty_id, audit_details, status, transaction_id, activity_data, and activity_ts:
de9c7bcb-46ed-469d-8933-d71e281ecf40,932fa428-7553-43c6-ac99-8fee43e0930b,1,2024-11-08T01:50:40.827
+0000,MEMBER_REGISTRATION,,,,,"{""ACCOUNT"":{""REGISTRATION"":{""registrationChannel"":""APP"",
""registrationDate"":""2024-11-08T01:50:38.635Z"",""registrationDateEpoch"":1731030638635}}}",
2024-11-08T01:50:40.821 +0000
Account and loyalty card feeds
Account feed
Description
The Account feed stores customer state for each card account.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_ACCOUNT_YYYYMMDDHHMISS.csv — YYYYMMDDHHMISS contains the date and time the feed was extracted.
Snowflake data share table name: DWHF_ACCOUNT
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_ACCOUNT | ES_ACCOUNT |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20240617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | AccountID | String | 36 | Unique account identifier | Required |
| PK | VersionNumber | Integer | Sequential number for each update in the table | Required | |
| VersionEffectiveTS | Timestamp | 29 | The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Required. Example: 2024-01-26T08:14:51.903 -0800 | |
| AccountStatus | Enum | 50 | The status of the account. Accepts nulls. | Required. Values: ACTIVE | EXPIRED | SUSPENDED | DECEASED | CLOSED | CANCELLED | UNREGISTERED | null | |
| CreatedTS | Timestamp | 29 | The date and time the account was created. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Required. Example: 2024-01-26T08:14:51.903 -0800 | |
| UpdatedTS | Timestamp | 29 | The date and time the account was last updated. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Required. Allows null. Example: 2024-01-26T08:14:51.903 -0800 | |
| RegistrationTS | Timestamp | 29 | The date the account was registered. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Required. Allows null. Example: 2024-01-26T08:14:51.903 -0800 | |
| LoyaltyId | Integer | 19 | The current loyalty card associated with the account | Required. Example: 524574305705714736 | |
| LoyaltyStatus | Enum | 50 | The status of the default loyalty card. Accepts nulls. | Required. Values: ACTIVE | SUSPENDED | LOST_OR_STOLEN | DAMAGED | FRAUD_ABUSE | CANCELLED | null | |
| AskForEmail | Boolean | Indicates whether the POS should ask the customer for their email address | Required. Values: true | false | ||
| AvailablePointBalance | Integer | The current account balance available for redemption | Required | ||
| PointBalance | Integer | The current account balance | Required | ||
| Employee | Boolean | Indicates whether the account is owned by an employee | Required. Values: true | false | ||
| BlockRedemptionFlag | Boolean | Indicates whether an account is currently blocked from redemption activities due to manual or system-generated control events | Required. Values: true | false | ||
| CardSwipedCounter | Integer | The number of swipes by cards assigned to this account | Required. Defaults to 0 when null. | ||
| ExternalIdentifier | String | 36 | External identifier linked to the customer's account. Currently used for the Carebook identifier. | May be required by client for internal purposes | |
| RegistrationChannel | String | The registration channel of the account | Optional. Example: APP | ||
| FirstName | String | The account holder's first name | Optional | ||
| LastName | String | The account holder's last name | Optional | ||
| String | The account holder's email address | Optional | |||
| City | String | Address field: the account holder's city | Optional | ||
| PostalZipCode | String | Address field: the account holder's postal code | Optional | ||
| Street | String | Address field: the account holder's street | Optional | ||
| ProvinceState | String | Address field: the account holder's province or state | Optional. Two-letter state or province code. | ||
| CountryCode | String | Address field: the account holder's country | Optional. Values: CA | US | ||
| UserAgent | String | The agent's name who made the profile update | Optional. Values: Anonymous | Loyalty_id | AgentName | ||
| Channel | String | The channel where the profile update was performed | Optional. Values: POS | SYSTEM | CLIENT | AGENT | ||
| PreferredLanguage | String | 36 | The member's preferred language | Optional. Format: xx-CC (for example, en-CA) | |
| PhoneNumber | String | The member's phone number for SMS communications | Optional. Example: (416) 967-1212 | 4169671212 | ||
| PhoneNumberSource | String | 50 | The source channel for the phone number | Optional. Values: POS | CUX | CONSOLE | |
| PhoneNumberAddedTimestamp | Timestamp | 50 | The date and time the phone number was added | Optional. Example: 2024-01-26T08:14:51.903 -0800 | |
| IsReferrer | Boolean | Indicates whether the account is the referrer in a referral program | Optional. Values: true | false | ||
| IsReferee | Boolean | Indicates whether the account is the referee in a referral program | Optional. Values: true | false | ||
| ReferrerAccountId | String | 36 | The referrer's account ID for the referral program | Optional. Example: 345123501235 | |
| FirstReferralEnrollmentTs | Timestamp | 29 | The timestamp of the first referral enrollment made for a referrer | Optional. Example: 2024-01-26T08:14:51.903 -0800 | |
| LastReferralEnrollmentTs | Timestamp | 29 | The timestamp of the most recent referral enrollment made for a referrer | Optional. Example: 2024-01-26T08:14:51.903 -0800 |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"AccountID": "5205246052952340",
"VersionNumber": 5,
"VersionEffectiveTS": "2024-04-26T08:14:51:903 -0800",
"AccountStatus": "ACTIVE",
"CreatedTS": "2024-01-26T08:14:51:903 -0800",
"UpdatedTS": "2024-02-26T08:14:51:903 -0800",
"RegistrationTS": "2024-03-26T08:14:51:903 -0800",
"LoyaltyID": "4520465245026",
"LoyaltyStatus": "ACTIVE",
"AskForEmail": true,
"AvailablePointBalance": 2800000,
"PointBalance": 3200000,
"Employee": false,
"CardSwipedCounter": 8,
"ExternalIdentifier": "A5335BB5405257",
"RegistrationChannel": "APP",
"FirstName": "Roland",
"LastName": "Thompson",
"Email": "rthompson@esmail.com",
"City": "Philadelphia",
"PostalZipCode": "19120",
"Street": "418 E. Eleanor St.",
"ProvinceState": "PA",
"CountryCode": "US",
"UserAgent": "nrockefeller",
"Channel": "POS",
"PreferredLanguage": "en-us",
"PhoneNumber": "2156678304",
"PhoneNumberSource": "POS",
"PhoneNumberAddedTimestamp": "2024-06-26T08:14:51:903 -0800",
"IsReferrer": true,
"IsReferee": false,
"ReferrerAccountId": "524950249520",
"FirstReferralEnrollmentTs": "2024-02-26T08:14:51:903 -0800",
"LastReferralEnrollmentTs": "2024-06-26T08:14:51:903 -0800"
}
Account tier feed
Description
This feed provides tier information for an account.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_ACCOUNT_TIER_<YYYYMMDD>_<SerialNo>_<VersionNo>.json
Example: ES_ACCOUNT_TIER_20241231_S1_V1.json
Snowflake data share table name: DWHF_ACCOUNT_TIER
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ACCOUNT_TIER | ACCOUNT_TIER |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20240617 |
| Serial no. | String | 6 | The serial number of the feed | S1 |
| Version no. | String | 5 | The version number of the feed | V2 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | AccountID | String | 36 | Unique account identifier | Required |
| External_Identifier | String | 50 | Unique client identifier | Always present in the feed but accepts null values | |
| PK | LoyaltyID | String | 50 | Unique loyalty card identifier | Required |
| TierProgram | Object | Object containing tier data | Optional. Contains NextTierCode and NextTierProgress. | ||
| NextTierCode | String | 50 | The name of the next level up in the loyalty program tiers | Optional. Example: Tier2 | |
| NextTierProgress | Object | Contains data about progress toward the next tier level | Optional. Contains Spend. | ||
| Spend | Object | Contains data about the spend status toward the next tier level | Optional. Contains Next, Total, and Unused. | ||
| Next | Number | 38,2 | The number of points required to achieve the next tier level | Optional. Example: 25000 | |
| Total | Number | 38,2 | The total number of points accumulated toward the next tier level | Optional. Example: 10000 | |
| Unused | Number | 38,2 | The number of points not yet applied toward the next tier level | Optional. Example: 15000 | |
| ProgramCode | String | 255 | The unique identifier for the loyalty program | Optional. Example: BUYCO_PROGRAM | |
| TierCode | String | 50 | The name of the current tier level | Optional. Example: Tier1 | |
| TierStart | String | 50 | The date and time the current tier starts | Optional. Example: 2024-01-01T03:59:59.999Z | |
| TierEnd | Timestamp | 50 | The date and time the current tier expires | Optional. Example: 2025-01-01T03:59:59.999Z | |
| TierRank | Number | 30 | The ranking of the current tier in the overall tier structure. The lowest number indicates the lowest tier. | Optional. Example: 0 | |
| NextPeriodTierCode | String | 50 | The name of the next period tier level | Optional. Example: Tier2 | |
| NextPeriodTierRank | Number | 30 | The ranking of the next period tier in the overall tier structure. The lowest number indicates the lowest tier. | Optional. Example: 1 | |
| NextPeriodAchievedDt | Timestamp | 50 | The date and time the next period tier level is achieved | Optional. Example: 2026-02-01T03:59:59.999Z | |
| VersionNumber | Integer | Sequential number for each update in the table | Required | ||
| VersionEffectiveTS | Timestamp | 29 | The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Required. Example: 2024-01-26T08:14:51.903 -0800 |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"AccountID": "5205246052952340",
"ExternalIdentifier": "X397ORT41351570",
"LoyaltyID": "52436527362602",
"TierProgram": {
"NextTierCode": "GOLD",
"NextTierProgress": {
"Spend": {
"Total": 500,
"Unused": 500,
"Next": 1000
}
},
"ProgramCode": "BUYCO_PROGRAM",
"TierCode": "SILVER",
"TierStart": "2024-01-01T00:00:01:001 -0800",
"TierEnd": "2024-12-31T23:59:59:999 -0800",
"TierRank": 3,
"NextPeriodTierCode": false,
"NextPeriodTierRank": false,
"NextPeriodAchievedDt": "2026-02-01T03:59:59.999Z"
}
}
Account tier history feed
Description
This feed tracks all tier changes and enables analysis of tier transitions and their timing—for example, member promotions or downgrades within a program period or year.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_ACCOUNT_TIER_HISTORY_YYYYMMDDHHMISS.csv — YYYYMMDDHHMISS contains the date and time the feed was extracted.
Snowflake data share table name: DWHF_ACCOUNT_TIER_HISTORY
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_ACCOUNT_TIER_HISTORY | ES_ACCOUNT_TIER_HISTORY |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20250617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | AccountID | String | 36 | Unique account identifier | Required |
| ExternalIdentifier | String | 50 | External account identifier | Always present in the feed but accepts null values | |
| PK | LoyaltyID | String | 50 | Loyalty ID associated with the account | Required |
| TierCode | String | 50 | The tier level at the beginning of the phase | Example: SILVER | |
| NextTierCode | String | 50 | The next tier level assigned, if any | Example: BRONZE | |
| TierStart | Timestamp | 29 | The start date of the tier phase. Format: yyyy-mm-dd | Example: 2025-01-01 | |
| TierEnd | Timestamp | 29 | The end date of the tier phase (start of next tier or program end date). Format: yyyy-mm-dd | Example: 2025-06-11 | |
| ProgramTierStartDate | Timestamp | 29 | The program-defined start date of the tier year. Format: yyyy-mm-dd | Example: 2025-01-01 | |
| ProgramTierEndDate | Timestamp | 29 | The program-defined end date of the tier year. Format: yyyy-mm-dd | Example: 2025-12-31 | |
| ProgramCode | String | 255 | The unique identifier for the loyalty program | Optional. Example: BUYCO_PROGRAM | |
| OverrideFlag | String | 50 | Indicates whether the tier change resulted from a manual override by a user (feed or Console) | When Assessment_Type = UPGRADE, value is true; when Assessment_Type = FEED, value is false; otherwise false | |
| NextPeriodTierCode | String | 50 | The name of the next period tier level | Optional. Example: Tier2 | |
| NextPeriodTierRank | Number | 30 | The ranking of the next period tier in the overall tier structure. The lowest number indicates the lowest tier. | Optional. Example: 1 | |
| NextPeriodAchievedDt | Timestamp | 50 | The date and time the next period tier level is achieved | Optional. Example: 2026-02-01T03:59:59.999Z | |
| VersionNumber | Integer | Sequential number for each update in the table | Required | ||
| VersionEffectiveTS | Timestamp | 29 | The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Required. Example: 2024-01-26T08:14:51.903 -0800 |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"accountID": "5205246052952340",
"externalIdentifier": "5205246052952340",
"loyaltyID": "301851038",
"tierCode": "SILVER",
"programCode": "PLATINUM",
"nextTierCode": "BRONZE",
"tierStart": "2025-01-01",
"tierEnd": "2025-06-11",
"programTierStartDate": "2025-01-01",
"programTierEndDate": "2025-12-31",
"overrideFlag": false,
"nextPeriodTierCode": false,
"nextPeriodTierRank": false,
"nextPeriodAchievedDt": "2026-02-01T03:59:59.999Z"
}
Account token feed
Description
This table contains point reservation tokens associated with an account. Points are reserved in a separate API call from the point redemption.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_ACCOUNT_TOKEN_YYYYMMDDHHMISS.csv — YYYYMMDDHHMISS contains the date and time the feed was extracted.
Snowflake data share table name: DWHF_ACCOUNT_TOKEN
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_ACCOUNT_TOKEN | ES_ACCOUNT_TOKEN |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20240617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | AccountID | String | 36 | The account ID associated with the token | |
| PK | Token | String | 50 | The token | |
| PK | VersionNumber | Integer | Sequential number for each update in the table | ||
| VersionEffectiveTS | Timestamp | 29 | The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2024-01-26T08:14:51.903 -0800 | |
| CreatedTS | Timestamp | 29 | The date and time the token was created. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2024-01-26T08:14:51.903 -0800 | |
| ExpiryTS | Timestamp | 29 | The date and time the token expires. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2024-01-26T08:14:51.903 -0800 | |
| ReservationAmount | Integer | The number of points reserved by this token |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"AccountID": "5205246052952340",
"Token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9JV_adQssw5c",
"VersionNumber": "3",
"VersionEffectiveTS": "2024-02-26T08:14:51:903 -0800",
"CreatedTS": "2024-01-26T08:14:51:903 -0800",
"ExpiryTS": "2025-01-26T08:14:51:903 -0800",
"ReservationAmount": "5000"
}
Extended member data feed
Description
This table lets clients add extended member data (EMD) relevant to them to member accounts. The table includes unique account identifiers (accountId and loyaltyId), the source of the EMD (such as Marketing), and details of the extended member data.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_ACCOUNT_EXTENDED_DATA_YYYYMMDDHH24MISS.json — YYYYMMDDHH24MISS contains the date and time the feed was extracted in 24-hour format. This feed is also available in CSV or Snowflake data sharing format.
Snowflake data share table name: DWHF_ACCOUNT_EXTENDED_DATA
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_ACCOUNT_EXTENDED_DATA | ES_ACCOUNT_EXTENDED_DATA |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20240617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HH24MISS (UTC) | 164800 |
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | AccountID | String | 36 | The account ID associated with the token | |
| PK | Source | String | The source of the external member data | Example: Marketing | |
| LoyaltyID | String | 50 | The loyalty card number | ||
| ExtendedData | Object | Additional client data associated with the member. Contains key/value pair(s) defined by the client. | Example attribute:value pair: "EnrollmentChannel": "MyPC" |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"AccountID": "5205246052952340",
"Source": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9JV_adQssw5c",
"LoyaltyID": "3",
"ExtendedData": {
"EnrollmentChannel": "WEB_FORM",
"ClubMember": true,
"SegmentIdentifier": "5205224052940"
}
}
Household feed
Description
This feed provides daily changes made to a household account by any household member.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_HOUSEHOLD_YYYYMMDDHHMISS.csv — YYYYMMDDHHMISS contains the date and time the feed was extracted.
Snowflake data share table name: DWHF_HOUSEHOLD
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_HOUSEHOLD | ES_HOUSEHOLD |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20240617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | Account_ID | String | 36 | Unique account identifier | |
| PK | Household_ID | String | 10 | Unique household identifier | |
| PK | HouseholdRole | String | 10 | The member's role in the household | Values: PRIMARY | SECONDARY |
| PK | JoinedTS | Timestamp | The timestamp at which the member joined a household. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | ||
| Inviter_ID | String | 24 | The unique identifier for the inviter | ||
| Username | String | 36 | The user agent (username) that made the household update | Values: Member_ID | Anonymous | |
| Channel | String | 36 | The channel where the changes were made | Example: POS |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"Account_ID": "5205246052952340",
"Household_ID": "523452",
"HouseholdRole": "PRIMARY",
"JoinedTS": "2024-01-01T00:00:01:001 -0800",
"Inviter_ID": "5205308965321687",
"Username": "Anonymous",
"Channel": "POS"
}
Loyalty card feed
Description
The loyalty card table lists each historical loyalty card associated with an account, including the current card number.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_LOYALTY_CARD_YYYYMMDDHHMISS.csv — YYYYMMDDHHMISS contains the date and time the feed was extracted.
Snowflake data share table name: DWHF_LOYALTY_CARD
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_LOYALTY_CARD | ES_LOYALTY_CARD |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20240617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | LoyaltyId | Integer | 19 | The loyalty card number | |
| PK | VersionNumber | Integer | Sequential number for each update in the table | ||
| VersionEffectiveTS | Timestamp | 29 | The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2024-01-26T08:14:51.903 -0800 | |
| AccountID | String | 36 | The account ID | ||
| LoyaltyStatus | Enum | 50 | The card status. Accepts null. | Values: ACTIVE | SUSPENDED | LOST_OR_STOLEN | DAMAGED | FRAUD_ABUSE | CANCELLED | null | |
| CreatedTS | Timestamp | 29 | The date and time the card was created. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2024-01-26T08:14:51.903 -0800 | |
| UpdatedTS | Timestamp | 29 | The date and time the card was last updated. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2024-01-26T08:14:51.903 -0800 | |
| IssuedDate | Date | The date the card was issued or registered. Format: yyyy-mm-dd | Example: 2024-06-06 |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"LoyaltyId": "60734823493134",
"VersionNumber": "3",
"VersionEffectiveTS": "2024-02-26T08:14:51:903 -0800",
"AccountID": "5205246052952340",
"LoyaltyStatus": "ACTIVE",
"CreatedTS": "2024-01-26T08:14:51:903 -0800",
"UpdatedTS": "2025-03-26T08:14:51:903 -0800",
"IssuedDate": "2025-10-26"
}
Member marketing feed
Description
This feed is for communicating member data to a client email service provider or for other customer messaging purposes.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_MEMBER_MARKETING_<YYYYMMDD>_<SerialNo>_<VersionNo>.json — this is an NDJSON feed.
Example: ES_MEMBER_MARKETING_20231231_S1_V1.json
Snowflake data share table name: DWHF_MEMBER_MARKETING
Frequency
This feed can be sent at any frequency requested by the client, with a minimum interval of daily. The file is always sent as a complete list.
Additional notes
If a spend threshold exists and has not been met, the on-hold amount equals the current account balance. If there is no spend threshold, or it has been met, then the on-hold amount equals the number of points on hold.
Only accounts in good standing with a LoyaltyID appear in the Member marketing feed. The following are filtered out:
AccountStatus=Closed,Deceased, orCancelledCardStatus=NON_LOYALTY- Accounts without an
emailAddress
Feed configuration
Fields marked as optional are configurable per client and can be enabled or disabled as needed. There may be small cost and complexity implications if all fields are enabled, so only data required by the client should be exposed.
{
"feature_control": {
"dw_feed": {
"member_marketing:extendedData": {"is_enabled": "TRUE", "config_value": "null"},
"member_marketing:targetedOffers": {"is_enabled": "TRUE", "config_value": "null"},
"member_marketing:partnerLinks": {"is_enabled": "FALSE", "config_value": "null"}
}
}
}
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: MEMBER_MARKETING | MEMBER_MARKETING |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20240617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HH24MISS (UTC) | 164800 |
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| EmailAddress | String | 255 | The member's email address | Required | |
| LanguagePreference | String | 50 | The member's language preference | Required. BCP 47 format: en-CA | fr-CA | |
| ExternalIdentifier | String | 50 | The account ID associated with the member | Required | |
| PK | LoyaltyID | String | 50 | The ID number for identification within the loyalty program | Required |
| FirstName | String | 255 | The member's first name | Required | |
| LastName | String | 255 | The member's last name | Required | |
| BusinessName | String | 255 | The business name related to the member | Required | |
| TierProgram | Array | Tier program details related to the member | Optional. Contains fields and objects from ProgramCode to TierEnd. | ||
| ProgramCode | String | 255 | The tier program setting | Optional. Example: MOST_VALUABLE_CUSTOMER | |
| TierCode | String | 50 | The designation for the current member tier rank | Optional. Example: SILVER | |
| TierRank | String | 30 | The numeric designator for tier rank | Optional. Example: 1 | |
| NextTierProgress | Object | Tracks progress toward the next tier for this member | Optional. Contains SpendFormatted and PointsEarned. | ||
| SpendFormatted | Number | 38,2 | Dollars spent | Optional | |
| PointsEarned | Object | Details about points earned toward the next tier | Optional. Contains Total, Unused, and Next. | ||
| Total | Number | 38,2 | Total progress in the program | Optional | |
| Unused | Number | 38,2 | Progress since the previous tier | Optional | |
| Next | Number | 38,2 | The difference between the threshold for the next tier and the current total | Optional | |
| TierStart | String | 50 | The timestamp for when tier membership began. ISO-8601 format. | Optional | |
| TierEnd | String | 50 | The timestamp for when tier membership ends. ISO-8601 format. | Optional | |
| LoyaltyOptinDate | String | 50 | The date on which the member opted in to the loyalty program | Required | |
| LastActivityDate | String | 50 | The date of the last loyalty-qualified activity | Required | |
| RedemptionRequirementsMet | Object | JSON object containing details about whether the redemption requirement has been achieved | Optional. Contains LifeTimeSpend. | ||
| LifeTimeSpend | Boolean | Indicates whether the member's total lifetime spend has met the redemption threshold | Optional. Values: true | false | ||
| Balance | Object | Total rewards balance available to the member for redemption | Required. Contains Points, Tender, and TenderFormatted. | ||
| Points | Object | Contains details of available and redeemable points, and the number on hold | Required. Contains Available, Redeemable, and Hold. | ||
| Available | Number | 38,2 | Total points associated with the member | Required | |
| Redeemable | Number | 38,2 | Points that can be redeemed | Required | |
| Hold | Number | 38,2 | Points currently on hold (for example, pending achievement of a lifetime spend threshold) | Required | |
| Tender | Object | Contains details about available and redeemable tender amounts, and any hold | Required. Contains Available, Redeemable, and Hold. | ||
| Available | Number | 38,2 | Total tender points associated with the transaction | Required | |
| Redeemable | Number | 38,2 | Tender points that can be redeemed | Required | |
| Hold | Number | 38,2 | Tender points currently on hold, formatted to two decimal places | Required | |
| TenderFormatted | Object | Contains formatting elements to ensure tender amounts end in two decimal places, even with trailing zeros | Required. Contains a localization object for currency amount and Available, Redeemable, and Hold. | ||
{{ll-CC}} | Object | Contains formatting attributes for available, redeemable, and hold amounts, and specifies the localized currency format | Required. Example: en-CA | fr-CA | ||
| Available | Number | 50 | Total available reward tender, formatted to two decimal places | Required | |
| Redeemable | Number | 50 | Total redeemable awards tender, formatted to two decimal places | Required | |
| Hold | Number | 50 | Total rewards currently on hold, formatted to two decimal places | Required | |
| Statistics | Object | NDJSON object containing total rewards and redemptions by month and year, in both points and tender | Optional. Contains fields from TotRedemptionMth to TenderFormatted. | ||
| TotRedemptionMth | Number | 38,2 | Total rewards redeemed by the member in a month | Optional | |
| TotRewardsMth | Number | 38,2 | Total rewards accumulated by a member in a month | Optional | |
| TotRedemptionQtr | Number | 38,2 | Total rewards redeemed by the member in a quarter | Optional | |
| TotRewardsQtr | Number | 38,2 | Total rewards accumulated by a member in a quarter | Optional | |
| TotRedemptionYr | Number | 38,2 | Total rewards redeemed by the member in a year | Optional | |
| TotRewardsYr | Number | 38,2 | Total rewards accumulated by a member in a year | Optional | |
| Tender | Object | NDJSON object containing the total eligible spend for the month, quarter, and year | Optional. Contains TotEligibleSpendMth to TotEligibleSpendYr. | ||
| TotEligibleSpendMth | Number | 38,2 | Total eligible spend for monthly redemption | Optional | |
| TotEligibleSpendQtr | Number | 38,2 | Total eligible spend for quarterly redemption | Optional | |
| TotEligibleSpendYr | Number | 38,2 | Total eligible spend for yearly redemption | Optional | |
| TenderFormatted | Object | NDJSON object with formatting elements to ensure tender amounts end in two decimal places | Optional. Contains a localization object and eligible spend fields. | ||
{{ll-CC}} | Object | NDJSON object containing formatting attributes for monthly, quarterly, and yearly eligible spend, and specifying the localized currency format | Optional. Example: en-CA | fr-CA | ||
| TotEligibleSpendMth | String | 50 | Total monthly eligible redemption, formatted to two decimal places | Optional | |
| TotEligibleSpendQtr | String | 50 | Total quarterly eligible redemption, formatted to two decimal places | Optional | |
| TotEligibleSpendYr | String | 50 | Total yearly eligible redemption, formatted to two decimal places | Optional | |
| IsSuspended | Boolean | Flag indicating whether the account is suspended | Required. Values: true | false | ||
| IsExpired | Boolean | Flag indicating whether the account is expired | Required. Values: true | false | ||
| LocalizationConfig | Object | Provides information about whether language localization is required | Optional | ||
| Household | Object | Contains household membership data, populated only for members who belong to a household | Optional. Contains DateJoined, Role, and RedeemableBalance. | ||
| DateJoined | String | 50 | The date the member joined the household. ISO-8601 format. | Required | |
| Role | String | 50 | The member's role in the household | Required. Values: PRIMARY | SECONDARY | |
| RedeemableBalance | Number | 38,2 | The balance of points for this member that can be redeemed within the household | Optional | |
| TargetedOffers | Array | The list of active and future targeted offers for an account | Optional. Contains OfferCode to ExpiryTimeStamp. | ||
| OfferCode | String | 50 | The unique identifier for the targeted offer | Optional | |
| DisplayTimeStamp | String | 50 | The timestamp for when the offer is displayed. ISO-8601 format. | Optional | |
| EffectiveTimeStamp | String | 50 | The timestamp for when the offer becomes effective. ISO-8601 format. | Optional | |
| ExpiryTimeStamp | String | 50 | The timestamp for when the offer expires. ISO-8601 format. | Optional | |
| ExtendedData | Array | Additional data relevant to the client | Optional. Contains key:value pairs for client's extended member data. | ||
| PartnerLinks | Array | Contains data about any partner link for the member | Optional. Contains PartnerID and LinkedDate. | ||
| PartnerID | String | 50 | The unique identifier for the partner the member is linked to | Optional | |
| LinkedDate | String | 50 | The date the partner link was established for the member | Optional |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"EmailAddress": "hwallen@esmail.com",
"LanguagePreference": "en-CA",
"ExternalIdentifier": "X397ORT41351570",
"LoyaltyID": "52436527362602",
"FirstName": "Helen",
"LastName": "Wallen",
"BusinessName": "Wallen Print Shop",
"TierProgram": [
{
"ProgramCode": "MOST_VALUABLE_CUSTOMER",
"TierCode": "SILVER",
"TierRank": "3",
"NextTierProgress": {
"SpendFormatted": "100.00",
"PointsEarned": {
"Total": 500,
"Unused": 500,
"Next": 1000
}
},
"TierStart": "2024-01-01T00:00:01:001 -0800",
"TierEnd": "2024-12-31T23:59:59:999 -0800"
}
],
"LoyaltyOptInDate": "2021-07-07T10:53:13:001 -0800",
"LastActivityDate": "2024-01-01T13:46:05:099 -0800",
"RedemptionRequirementsMet": {
"LifeTimeSpend": true
},
"Balance": {
"Points": {
"Available": "100000",
"Redeemable": "40000",
"Hold": "60000"
},
"Tender": {
"Available": "100.00",
"Redeemable": "40.00",
"Hold": "60.00"
},
"TenderFormatted": {
"en-CA": {
"Available": "80000",
"Redeemable": "30000",
"Hold": "50000"
},
"fr-CA": {
"Available": "20000",
"Redeemable": "10000",
"Hold": "10000"
}
}
},
"Statistics": {
"TotRedemptionMth": 5000,
"TotRewardsMth": 5000,
"TotRedemptionQtr": 20000,
"TotRewardsQtr": 20000,
"TotRedemptionYr": 80000,
"TotRewardsYr": 80000
},
"Tender": {
"TotEligibleSpendMth": 50.00,
"TotEligibleSpendQtr": 50.00,
"TotEligibleSpendYr": 200.00
},
"TenderFormatted": {
"en-CA": {
"TotEligibleSpendMth": "5000",
"TotEligibleSpendQtr": "5000",
"TotEligibleSpendYr": "20000"
},
"fr-CA": {
"TotEligibleSpendMth": "5000",
"TotEligibleSpendQtr": "5000",
"TotEligibleSpendYr": "20000"
}
},
"IsSuspended": false,
"IsExpired": false,
"LocalizationConfig": {},
"Household": {
"DateJoined": "2024-05-01T00:00:01:001 -0800",
"Role": "SECONDARY",
"RedeemableBalance": 100000
},
"TargetedOffers": [
{
"OfferCode": "AF5-23452-4T",
"DisplayTimeStamp": "2024-05-01T00:00:01:001 -0800",
"EffectiveTimeStamp": "2024-05-01T00:00:01:001 -0800",
"ExpiryTimeStamp": "2024-05-01T00:00:01:001 -0800"
}
],
"ExtendedData": [
{
"EnrollmentChannel": "WEB_FORM",
"ClubMember": true,
"SegmentIdentifier": "5205224052940"
}
],
"PartnerLinks": [
{
"PartnerID": "A5240-35116",
"LinkedDate": "2024-02-01T00:00:01:001 -0800"
}
]
}
Partner card link feed
Description
This table contains partner payment cards linked to loyalty accounts, along with the status and metadata of each partner payment card.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_PARTNER_CARD_LINK_YYYYMMDDHHMISS.csv — YYYYMMDDHHMISS contains the date and time the feed was extracted.
Snowflake data share table name: DWHF_PARTNER_CARD_LINK
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_PARTNER_CARD_LINK | ES_PARTNER_CARD_LINK |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20240617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | AccountID | String | 36 | The loyalty account ID linked to the partner payment card | |
| PK | PartnerID | String | 50 | The unique identifier for the partner associated with the payment card | Example: MGABNK |
| PK | Last4 | Integer | 4 | The last 4 digits of the payment card number | |
| PK | VersionNumber | Integer | Sequential number for each update in the table | ||
| VersionEffectiveTS | Timestamp | 29 | The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2024-01-26T08:14:51.903 -0800 | |
| VersionExpiryTS | Timestamp | 29 | The date and time the version expired. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2024-01-27T08:14:51.903 -0800 | |
| CreatedTS | Timestamp | 29 | The date and time the token was created. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2024-01-26T08:14:51.903 -0800 | |
| UpdatedTS | Timestamp | 29 | The date and time the token expires. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2024-01-26T08:14:51.903 -0800 | |
| LinkedTS | Timestamp | 29 | The date and time the current link was created. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM. Usually equals CreatedTS, but if a card was unlinked and re-linked, CreatedTS stores the original linked timestamp and this field contains the current linked timestamp. | Example: 2024-01-26T08:14:51.903 -0800 | |
| UnLinkedTS | Timestamp | 29 | The date and time the link was removed. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2024-01-26T08:14:51.903 -0800 | |
| LinkType | String | 13 | The type of link created | Values: PAYCARD_LAST4 | PAYCARD | |
| CardHolderType | String | The cardholder type | Values: Retail (personal) | Business (small business) | ||
| CardType | String | 1 | The type of payment card. Credit and debit are supported. | Values: C | D | |
| Link_ID | String | A unique link ID when the link type is PAYCARD for any partner | |||
| Status | String | The current status of the linked payment card | Values: LINKED | UNLINKED | ||
| BIN | Integer | A Bank Identification Number (BIN): the first 4–6 digits of a payment card that identify the card issuer | Example: 1234 or 123456 |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"AccountID": "5205246052952340",
"PartnerID": "MGABANK",
"Last4": 3681,
"VersionNumber": 3,
"VersionEffectiveTS": "2024-01-01T00:00:01:001 -0800",
"VersionExpiryTS": "2028-12-31T00:00:01:001 -0800",
"CreatedTS": "2024-01-03T00:00:01:001 -0800",
"UpdatedTS": "2024-06-01T00:00:01:001 -0800",
"LinkedTS": "2024-07-01T00:00:01:001 -0800",
"UnLinkedTS": "2024-12-01T00:00:01:001 -0800",
"LinkType": "PAYCARD",
"CardHolderType": "Business",
"CardType": "D",
"Link_ID": "524362-34",
"Status": "UNLINKED",
"BIN": "1234"
}
Payment card link feed
Description
This table contains partner payment cards linked to loyalty accounts, along with the status and metadata of each partner payment card.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_PAYMENT_CARD_LINK_YYYYMMDDHHMISS.csv — YYYYMMDDHHMISS contains the date and time the feed was extracted.
Snowflake data share table name: DWHF_PAYMENT_CARD_LINK
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_PAYMENT_CARD_LINK | ES_PAYMENT_CARD_LINK |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20140617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | AccountID | String | 36 | The loyalty account ID linked to the partner payment card | |
| PK | PartnerID | String | 50 | The unique identifier for the partner associated with the payment card | Example: MGABNK |
| PK | Last4 | Integer | 4 | The last 4 digits of the payment card number | |
| PK | VersionNumber | Integer | Sequential number for each update in the table | ||
| VersionEffectiveTS | Timestamp | 29 | The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2024-01-26T08:14:51.903 -0800 | |
| VersionExpiryTS | Timestamp | 29 | The date and time the version expired. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2024-01-27T08:14:51.903 -0800 | |
| CreatedTS | Timestamp | 29 | The date and time the token was created. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2024-01-26T08:14:51.903 -0800 | |
| UpdatedTS | Timestamp | 29 | The date and time the token expires. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2024-01-26T08:14:51.903 -0800 | |
| LinkedTS | Timestamp | 29 | The date and time the current link was created. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM. Usually equals CreatedTS, but if a card was unlinked and re-linked, CreatedTS stores the original linked timestamp and this field contains the current linked timestamp. | Example: 2024-01-26T08:14:51.903 -0800 | |
| UnLinkedTS | Timestamp | 29 | The date and time the link was removed. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2024-01-26T08:14:51.903 -0800 | |
| LinkType | String | 13 | The type of link created | Values: PAYCARD_LAST4 | PAYCARD | |
| CardHolderType | String | The cardholder type | Values: Retail (personal) | Business (small business) | ||
| CardType | String | 1 | The type of payment card. Credit and debit are supported. | Values: C | D | |
| Link_ID | String | A unique link ID when the link type is PAYCARD for any partner | |||
| Status | String | The current status of the linked payment card | Values: LINKED | UNLINKED | ||
| BIN | Integer | A Bank Identification Number (BIN): the first 4–6 digits of a payment card that identify the card issuer | Example: 1234 or 123456 |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"AccountID": "5205246052952340",
"PartnerID": "MGABANK",
"Last4": 3681,
"VersionNumber": 3,
"VersionEffectiveTS": "2024-01-01T00:00:01:001 -0800",
"VersionExpiryTS": "2028-12-31T00:00:01:001 -0800",
"CreatedTS": "2024-01-03T00:00:01:001 -0800",
"UpdatedTS": "2024-06-01T00:00:01:001 -0800",
"LinkedTS": "2024-07-01T00:00:01:001 -0800",
"UnLinkedTS": "2024-12-01T00:00:01:001 -0800",
"LinkType": "PAYCARD",
"CardHolderType": "Business",
"CardType": "D",
"Link_ID": "524362-34",
"Status": "UNLINKED",
"BIN": "1234"
}
SMS subscription feed
Description
The SMS subscription feed supports providing data for multiple short codes in a single feed.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_SMS_SUBSCRIPTION_YYYYMMDDHHMISS.csv — YYYYMMDDHHMISS contains the date and time the feed was extracted. The file can also be JSON or Snowflake data share.
Snowflake data share table name: DWHF_SMS_SUBSCRIPTION
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_SMS | ES_SMS |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20240617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Sample values |
|---|---|---|---|---|---|
| PK | AccountID | String | 36 | Unique account identifier | Required |
| PK | ShortCode | String | 255 | The code used to send and receive SMS messages | Required. Example: DEFAULT |
| Status | String | 50 | The status of the SMS subscription for a member | Required. Values: PENDING | DEFERRED | OPTED_IN | OPTED_OUT | |
| OptInSource | String | 50 | The channel through which opt-in occurred | Optional. Values: POS | CUX | CONSOLE | |
| OptOutSource | String | 50 | The channel through which opt-out occurred | Optional. Values: POS | CUX | CONSOLE | |
| OptInTimestamp | Timestamp | 50 | The date and time when opt-in occurred. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Optional. Example: 2024-01-26T08:14:51.903 -0800 | |
| OptOutTimestamp | Timestamp | 50 | The date and time when opt-out occurred. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM. Populated only if status is OPTED_OUT; resets if the status changes from OPTED_OUT. | Optional. Example: 2024-06-26T08:14:51.903 -0800 |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"AccountID": "5205246052952340",
"ShortCode": "DEFAULT",
"Status": "OPTED_OUT",
"OptInSource": "POS",
"OptOutSource": "POS",
"OptInTimestamp": "2024-02-26T08:14:51:903 -0800",
"OptOutTimestamp": "2025-03-26T08:14:51:903 -0800"
}
Transactional data feeds
Activity feed
Description
The Activity table lists account activity.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_ACTIVITY_YYYYMMDDHHMISS.csv — YYYYMMDDHHMISS contains the date and time the feed was extracted.
Snowflake data share table name: DWHF_ACTIVITY
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_ACTIVITY | ES_ACTIVITY |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20240617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | AccountID | String | 50 | The account ID associated with the token | |
| PK | ActivityID | String | 50 | The activity ID | |
| PK | VersionNumber | Integer | Sequential number for each update in the table | ||
| VersionEffectiveTS | Timestamp | 29 | The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2024-01-26T08:14:51.903 -0800 | |
| ActivityType | String | 50 | The type of activity | Example: FIRST_TIME_LOGIN | |
| LoyaltyID | String | 50 | The loyalty card number | ||
| AuditDetails | Variant | Audit details | |||
| Status | String | 50 | The status of the activity | Example: REWARDED | |
| TransactionID | String | 50 | The transaction ID this activity is linked to | ||
| ActivityData | Variant | Activity data | |||
| ActivityTS | Timestamp | 29 | The date and time of the activity | Example: 2024-01-26T08:14:51.903 -0800 |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"AccountID": "5205246052952340",
"ActivityID": "301851038",
"VersionNumber": "3",
"VersionEffectiveTS": "2024-02-26T08:14:51:903 -0800",
"ActivityType": "FIRST_TIME_LOGIN",
"LoyaltyID": "60734823493134",
"AuditDetails": "",
"Status": "REWARDED",
"TransactionID": "",
"ActivityData": "",
"ActivityTS": "2024-01-26T08:14:51:903 -0800"
}
Enhanced validation rewards (Earn) and redemptions (Burn) feeds
Purpose of feeds
The ES Loyalty system can generate two types of transaction-based reconciliation feeds: a rewards (earn) feed and a redemptions (burn) feed. At a high level, these feeds contain a list of all transactions along with the number of points earned or burned.
The purpose of the "enhanced validation" for these feeds is to verify critical data against other reliable sources of the same data. This ensures that data for these vital loyalty program functions is accurate. Because Exchange Solutions is not the System of Record (SoR) for many clients, an internal reconciliation process is required to confirm that the reconciliation feeds contain accurate data.
There is a risk that the internal data reconciliation process may result in duplicate transactions in Snowflake. Snowflake does not enforce data uniqueness, so duplicates are possible. Ongoing checks are in place to detect duplicates and fail a data transfer process if any are found.
Due to the enhanced validation process, validated data may not be available for several days or longer. In addition, these feeds are designed to operate within specified performance characteristics to carry out interactions with the loyalty platform within defined parameters.
Schedule burn reconciliation feed
Description
This feed provides transaction-based aggregated point reconciliation reporting for redemptions. Note that the current handler only looks for TRANSFER_OUT, REDEEM, or HOUSEHOLD_REDEEM transaction parts to determine burn transactions.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_BURN_RECONCILIATION_YYYYMMDDHHMISS.csv — YYYYMMDDHHMISS contains the date and time the feed was extracted. The file can also be JSON or Snowflake data share.
Snowflake data share table name: DWHF_BURN_RECONCILIATION
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_BURN_RECONCILIATION | ES_BURN_RECONCILIATION |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20240617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | CorrelationID | String | Unique identifier passed in the request body, used to identify or retrieve a transaction | Required | |
| ExternalIdentifier | String | Unique identifier used by the external system | Optional | ||
| AccountID | String | Unique identifier for the ES Loyalty account | Optional | ||
| LoyaltyID | String | The unique loyalty ID of the member who made a transaction. Not used if TransactionType = POINTS_TRANSFER. | Optional | ||
| TransactionType | String | The type of transaction | Required. Example: FINALIZE | ||
| TransactionDate | Timestamp | The date and time the transaction took place | Required. Example: 2025-05-10T16:28:59.764Z | ||
| ProcessedDate | Timestamp | The date and time the transaction was processed | Required. Example: 2025-05-10T16:30:59.764Z | ||
| Store | String | References a store or ecommerce site from the location feed | Optional | ||
| Channel | String | The channel in which the transaction took place | Optional. Example: POS | ONLINE | ||
| MembershipTiers | Array | Names all the different tier levels, such as Bronze, Silver, and Gold. The array may be empty if there are no membership tiers. | Optional | ||
| MembershipTierCode | String | The applicable membership tier, such as Bronze, Silver, or Gold. Applied to each program configured for a client. | Optional | ||
| ProgramID | String | The overall membership program the tier is related to | Optional | ||
| TotalRewardRedeemed | Number | The amount of the reward redeemed for this transaction | Required | ||
| TotalRedeemDollar | Number | The dollar value of the reward redeemed | Required |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example: Finalize
{
"CorrelationID": "98127389172414",
"TransactionType": "FINALIZE",
"ExternalIdentifier": "879182739871938",
"TransactionDate": "2025-05-10T16:28:59.764Z",
"ProcessedDate": "2025-05-10T16:28:59.764Z",
"AccountID": "82739187239183",
"LoyaltyID": "72631872631237",
"Store": "7231876",
"Channel": "POS",
"MembershipTiers": [
{
"ProgramID": "SPEND_TIER_PROGRAM",
"MembershipTierCode": "TIER2"
},
{
"ProgramID": "EARNED_TIER_PROGRAM",
"MembershipTierCode": "TIER2"
}
],
"TotalRewardRedeemed": 1000,
"TotalRedeemedDollar": 10
}
JSON example: Points transfer
{
"CorrelationID": "78bf8a38-afd7-467e-bb81-199106bac6bf",
"TransactionType": "POINTS_TRANSFER",
"ExternalIdentifier": "21eef39b-0f43-4eff-a1f1-7b9916362ea2",
"TransactionDate": "2022-09-07T12:57:07.234Z",
"ProcessedDate": "2022-09-07T12:57:07.234Z",
"AccountID": "b7f7e416-284a-4700-a74c-befb53661822",
"Channel": "SYSTEM",
"MembershipTiers": [],
"TotalRewardRedeemed": 2000,
"TotalRedeemedDollar": 0.8
}
Schedule earn reconciliation feed
Description
This feed provides transaction-based aggregated point reconciliation reporting for rewards.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_EARN_RECONCILIATION_YYYYMMDDHHMISS.csv — YYYYMMDDHHMISS contains the date and time the feed was extracted. The file can also be JSON or Snowflake data share.
Snowflake data share table name: DWHF_EARN_RECONCILIATION
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_EARN_RECONCILIATION | ES_EARN_RECONCILIATION |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20250617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | CorrelationID | String | Unique identifier passed in the request body, used to identify or retrieve a transaction | Required | |
| ExternalIdentifier | String | Unique identifier used by the external system | Optional | ||
| AccountID | String | Unique ES Loyalty identifier for the account | Optional | ||
| LoyaltyID | String | The unique loyalty ID of the member who made a transaction | Optional | ||
| TransactionType | String | The type of transaction | Required. Values: ACCOUNT_EXPIRY, ACTIVITY, ADHOC_REWARD, ADJUSTMENT, DISCRETIONARY, FINALIZE, POINTS_TRANSFER, PPE, SAF, VOID | ||
| TransactionDate | Timestamp | The date and time the transaction took place | Required. Example: 2025-05-10T16:28:59.764Z | ||
| ProcessedDate | Timestamp | The date and time the transaction was processed | Required. Example: 2025-05-10T16:30:59.764Z | ||
| Store | String | References a store or ecommerce site from the location feed | Optional | ||
| Channel | String | The channel in which the transaction took place | Optional. Example: POS | ONLINE | ||
| MembershipTiers | Array | Describes all different tier levels, such as Bronze, Silver, and Gold. The array may be empty if there are no membership tiers. | Optional | ||
| EarnedMap | Array | Contains details about offers | Required | ||
| OfferCode | String | The unique code identifying the offer | Optional | ||
| OfferDescription | String | A description of the offer | Optional. Example: Spend $10, get 100 points | ||
| RewardsEarned | Number | The quantity of rewards earned on this transaction | Optional | ||
| OfferCategory | String | The type of offer | Optional. Example: bonus | targeted | ||
| ProgramID | String | The overall membership program the tier is related to | Optional | ||
| MembershipTierCode | String | The applicable membership tier, such as Bronze, Silver, or Gold. Applied to each program configured for a client. | Optional | ||
| RewardOnHold | Number | If the transaction has a confirmation request, this field shows how many points related to the transaction are on hold. If there is no confirmation request, no hold is found, or confirmed = true, the value is 0. | Required | ||
| TotalSpend | Number | The total amount spent during this transaction | Required | ||
| TotalEligibleSpend | Number | The amount spent during this transaction that is eligible for reward | Required | ||
| TotalRewardIssued | Number | The amount of the reward issued for this transaction | Optional | ||
| RewardIssuedRate | Number | The rate of the reward issued as a percentage of the totalEligibleSpend | Optional | ||
| TotalRewardDollar | Number | The dollar value of the reward issued | Optional |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"CorrelationID": "98127389172414",
"TransactionType": "FINALIZE",
"ExternalIdentifier": "879182739871938",
"TransactionDate": "2021-05-10T16:28:59.764Z",
"ProcessedDate": "2021-05-10T16:28:59.764Z",
"AccountID": "82739187239183",
"LoyaltyID": "72631872631237",
"Store": "7231876",
"Channel": "POS",
"MembershipTiers": [
{
"ProgramID": "SPEND_TIER_PROGRAM",
"MembershipTierCode": "TIER2"
},
{
"ProgramID": "EARNED_TIER_PROGRAM",
"MembershipTierCode": "TIER2"
}
],
"EarnedMap": [
{
"OfferCode": "offer1",
"OfferDescription": "An Offer",
"RewardsEarned": 1,
"OfferCategory": "targeted"
},
{
"OfferCode": "offer2",
"OfferDescription": "Another offer",
"RewardsEarned": 2,
"OfferCategory": "bonus"
}
],
"TotalSpend": 5000,
"TotalEligibleSpend": 2000,
"TotalRewardIssued": 20,
"RewardIssuedRate": 0.01,
"TotalRewardDollar": 0.2
}
Redemption feed
Description
The Redemption feed provides catalog and redemption data from redemption transactions.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_REDEMPTION_YYYYMMDD_Sx_Vx.json — YYYYMMDD contains the extraction date, Sx is the serial number (such as S1), and Vx is the version number (such as V1). The file can also be CSV (ES_REDEMPTION_YYMMDDHHMMSS.csv) or a Snowflake data share.
Snowflake data share table name: DWHF_REDEMPTION
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_REDEMPTION | ES_REDEMPTION |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20250617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Sample values |
|---|---|---|---|---|---|
| PK | TransactionID | String | GUID unique identifier for the transaction | Required | |
| AccountID | String | 36 | Unique account identifier | Required | |
| HouseholdID | String | GUID unique identifier for the household | Optional. Populated only for HOUSEHOLD_REDEEM transactions. | ||
| RedemptionUniqueID | String | Unique identifier for the redemption transaction. For household redemptions, this field can be used to uniquely count each redemption or group a set of redemption transactions into a single redemption. | Required | ||
| Action | String | The action associated with the transaction | Required. Values: REDEEM | HOUSEHOLD_REDEEM | ||
| TransactionTs | Timestamp | 50 | The date and time the redemption transaction occurred. Format: yyyy-mm-dd hh:mi:ss.ff3 Z | Required. Example: 2025-01-26 08:14:51.903 Z | |
| Amount | String | The number of points redeemed in the redemption transaction | Required | ||
| RedemptionDollarValue | Number | The dollar value of the redemption transaction | Required | ||
| RedeemerID | String | Unique identifier for the redeemer | Optional. Populated for redemptions when provided in the source API call. | ||
| RedemptionID | String | The type of redemption | Optional. Populated for redemptions when provided in the source API call. | ||
| CatalogueItemID | String | Unique identifier for a catalog item included in the transaction | Optional. Populated only when a catalog item is redeemed. | ||
| CatalogueItemName | String | Name used to identify the product | Optional. Populated only when a catalog item is redeemed. | ||
| CatalogueItemQuantity | Number | Quantity of the catalog item included in the transaction | Optional. Populated only when a catalog item is redeemed. |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"TransactionID": "d17cc98f-0427-44a5-9a66-ff88e9ab36d12",
"AccountID": "5205246052952340",
"HouseholdID": "3d8ed0c4-50a7-41c1-a2b3-273cb5a848e0",
"RedemptionUniqueID": "RESERVATION_9cd8705f-2bc0-4482-8d73-25265664b35a",
"Action": "HOUSEHOLD_REDEEM",
"TransactionTs": "2025-03-26 08:14:51:903 Z",
"Amount": "15000",
"RedemptionDollarValue": 15,
"RedeemerId": "MEGABANK",
"RedemptionID": "REDEMPTION_MEGABANK",
"CatalogueItemID": "BRANDED_COFFEE_CUP_5245",
"CatalogueName": "BRANDED_COFFEE_CUP_5245",
"CatalogueQuantity": 1
}
Session feed
Description
A session is a series of API calls made for a single customer. For example, a customer checkout at the POS represents a single session, which may involve several API calls to complete. In a web or mobile application, a customer may make several queries to the API within the context of a single login session. The primary key is provided by the system initiating the session.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_SESSION_YYYYMMDDHHMISS.csv — YYYYMMDDHHMISS contains the date and time the feed was extracted.
Snowflake data share table name: DWHF_SESSION
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_SESSION | ES_SESSION |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20240617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | SessionID | String | 36 | A primary key set by the calling system | |
| PK | VersionNumber | Integer | Sequential number for each update in the table | ||
| VersionEffectiveTS | Timestamp | 29 | The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2024-01-26T08:14:51.903 -0800 | |
| AccountID | String | 36 | The account related to this session | ||
| LoyaltyID | Integer | 19 | The loyalty card associated with this session | ||
| CardSwiped | Boolean | Indicates whether the loyaltyId (if provided) was swiped (true) or keyed in (false) | Values: true | false | ||
| Channel | Enum | 50 | The source channel of the session. Accepts null. | Values: POS | MOBILE | WEB | CONSOLE | SYSTEM | APP | null | |
| PointsBurned | Integer | The points redeemed in the session | |||
| PointsEarned | Integer | The points earned in the session | |||
| PointBalanceAtSessionStart | Integer | The account's point balance at the time the session started | |||
| PointsNet | Integer | The net difference in points that occurred in this session | |||
| SessionStatus | Enum | 50 | The status of the session | Values: OPEN | CLOSED | |
| StartTS | Timestamp | 29 | The date and time the session started. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2024-01-26T08:14:51.903 -0800 |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"SessionID": "73321216-d03d-4fbb-ad8d-bacc9a188678",
"VersionNumber": "524502452502",
"VersionEffectiveTS": "2025-02-26T08:14:49:903 -0800",
"AccountId": "524502452502",
"LoyaltyId": "907087045023",
"CardSwiped": true,
"Channel": "POS",
"PointsBurned": 10000,
"PointsEarned": 20000,
"PointBalanceAtSessionStart": 30000,
"PointsNet": 10000,
"SessionStatus": "CLOSED",
"StartTS": "2025-03-26T08:14:49:903 -0800"
}
Transaction feed
Description
A transaction represents any point-earning or point-spending event. Think of it as a customer's point banking statement.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_TRANSACTION_YYYYMMDDHHMISS.csv — YYYYMMDDHHMISS contains the date and time the feed was extracted.
Snowflake data share table name: DWHF_TRANSACTION
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_TRANSACTION | ES_TRANSACTION |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20140617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | TransactionID | String | 36 | A primary key set by ES Loyalty | Required |
| AccountID | String | 36 | The account associated with the transactions | Required | |
| Channel | Enum | 50 | The channel this transaction occurred in. Accepts nulls. | Required. Values: POS | MOBILE | WEBSITE | CONSOLE | SYSTEM | APP | WEB | null | |
| StoreNumber | String | 50 | The store number | Required. Example: 0034 | |
| EligibleTransactionAmount | Number | The amount eligible to earn base points | Required | ||
| IsAudit | Boolean | For transactions that awarded zero points, so the reason can be reviewed. Not returned by Transaction History API calls. | Required. Values: true | false | ||
| AccountStatus | Enum | 50 | The status of the account. Accepts nulls. | Required. Values: ACTIVE | EXPIRED | SUSPENDED | DECEASED | CLOSED | CANCELLED | UNREGISTERED | null | |
| EligibleToEarn | Boolean | Flag indicating whether the transaction is eligible to earn points | Required. Values: true | false | ||
| LoyaltyStatus | Enum | 50 | The status of the default loyalty card. Accepts nulls. | Required. Values: ACTIVE | SUSPENDED | LOST_OR_STOLEN | DAMAGED | FRAUD_ABUSE | CANCELLED | null | |
| ProcessedTS | Timestamp | The date and time the transaction was processed. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Required. Example: 2024-01-26T08:14:51.903 -0800 | ||
| RequestAction | Enum | The API call that triggered the reward calculation | Required. Values: ADJUSTMENT, FINALIZE, PPE, SAF, VOID, EXCHANGE, DISCRETIONARY, BEHAVIOR_ACTIVITY | ||
| TransactionAmount | Number | The dollar amount of the basket | Required | ||
| TransactionTS | Timestamp | 29 | The date and time of the POS transaction itself (may be delayed if SAF). Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Required. Example: 2024-01-26T08:14:51.903 -0800 | |
| NetAmount | Integer | The net points amount of the transaction | Required | ||
| NewPointBalance | Integer | The point balance after the transaction | Required | ||
| OriginalPointBalance | Integer | The point balance before the transaction | Required | ||
| SessionId | String | 36 | The session ID associated with the transaction | Required | |
| Agent | String | The agent username who awarded discretionary points | Required | ||
| Reason | String | The reason for awarding discretionary points | Required | ||
| OriginalTransactionId | String | 36 | The TransactionID of the original transaction in the case of an adjustment or return. Equals the TransactionID if this is the original transaction. | Required | |
| OptinPromptResult | Enum | 10 | The result from the opt-in prompt at the point of sale. Accepts nulls. | Required. Values: deferred | declined | accepted | null | |
| EmailPromptResult | Enum | 10 | The result from the email address prompt at the point of sale. Accepts nulls. | Required. Values: deferred | declined | accepted | null | |
| BasePointsEarned | Integer | Total loyalty base points earned in the transaction, excluding partner base points | Required | ||
| BonusPointsEarned | Integer | Total loyalty bonus points earned in the transaction, excluding partner bonus points | Required | ||
| TargetedPointsEarned | Integer | Total loyalty targeted points earned in the transaction, excluding partner targeted points | Required | ||
| DiscretionaryPointsEarned | Integer | Total discretionary points earned in the transaction | Required | ||
| RedeemedPoints | Integer | Total points redeemed in the transaction | Required | ||
| RedemptionDollarValue | Float | The dollar value of the points redeemed in the transaction | Required | ||
| PartnerId | String | The partner ID associated with the transaction. Set to the partner ID even if no points are earned. | Optional | ||
| PartnerBasePointsEarned | Integer | Total partner base points earned in the transaction | Optional | ||
| PartnerBonusPointsEarned | Integer | Total partner bonus points earned in the transaction | Optional | ||
| PartnerTargetedPointsEarned | Integer | Total partner targeted points earned in the transaction | Optional | ||
| CallId | String | Unique identifier for the transaction, different from transactionId and sessionId. Generated by the source system or internally for transactions missing this field. | Optional | ||
| UserAgent | String | The agent's name who made the profile update | Optional. Values: Anonymous | Loyalty_id | AgentName | ||
| LinkedTransferTransactionID | String | 36 | Stores the TransactionID associated with the transfer points | Optional | |
| LinkedTransferAccountID | String | 36 | Stores the AccountID associated with the transfer points | Optional | |
| PriceMatrix | String | 50 | Contains an identifier for the price matrix used | Optional | |
| ExtendedData | Object | Contains additional attributes used by the client | Optional | ||
| SessionIdentifierType | String | 50 | Helps clients track the identifiers used to initiate a transaction | Optional. Values: LOYALTY_ID | PARTNER_LINK_ID | EMAIL | ACCOUNT_ID | EXTERNAL_ID | PHONE_NUMBER | |
| SessionIdentifierValue | String | 50 | Provides the value of the session identifier | Optional | |
| RewardID | String | 50 | Used to associate the transaction with an existing reward identifier | Optional | |
| BusinessUnit | String | 50 | The business unit associated with these promotions | Optional. Currently enabled for one client. |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
Headers can alternatively be configured to display column names to meet client requirements.
JSON example
{
"TransactionID": "73321216-d03d-4fbb-ad8d-bacc9a188678",
"AccountId": "524502452502",
"Channel": "POS",
"StoreNumber": "0034",
"EligibleTransactionAmount": 100,
"IsAudit": false,
"AccountStatus": "ACTIVE",
"EligibleToEarn": true,
"LoyaltyStatus": "ACTIVE",
"ProcessedTS": "2025-02-26T08:14:51:903 -0800",
"RequestAction": "DISCRETIONARY",
"TransactionAmount": 100,
"TransactionTS": "2025-02-26T08:14:49:903 -0800",
"NetAmount": 100,
"NewPointBalance": 10000,
"OriginalPointBalance": 9900,
"SessionId": "3852727d-3192-4c8c-be43-ccb410ea7361",
"Agent": "sstar",
"Reason": "Missing MGABNK Bonus Points",
"OriginalTransactionId": "9a30bc43-41e9-49c6-9770-25cb13aeb4d8",
"OptinPromptResult": "declined",
"EmailPromptResult": "accepted",
"BasePointsEarned": 0,
"BonusPointsEarned": 0,
"TargetedPointsEarned": 0,
"DiscretionaryPointsEarned": 100,
"RedeemedPoints": 0,
"RedemptionDollarValue": 0.00,
"PartnerId": "4524902",
"PartnerBasePointsEarned": 0,
"PartnerBonusPointsEarned": 100,
"PartnerTargetedPointsEarned": 0,
"CallId": "5243052350-52340562340",
"UserAgent": "sstar",
"SessionIdentifierType": "ACCOUNT_ID",
"SessionIdentifierValue": "524502452502",
"RewardId": "MISSING_BONUS_POINTS_REWARD",
"BusinessUnit": "BUYCO"
}
Transaction promo audit feed
Description
This feed contains details about the promotions recognized in a transaction.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_TRANSACTION_PROMO_AUDIT_YYYYMMDDHHMISS.csv — YYYYMMDDHHMISS contains the date and time the feed was extracted.
Snowflake data share table name: DWHF_TRANSACTION_PROMO_AUDIT
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 100 | Constant value: ES_TRANSACTION_PROMO_AUDIT | ES_TRANSACTION_PROMO_AUDIT |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20240617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | TransactionPromoAuditID | String | 100 | Used to join this table with associated details | |
| TransactionID | String | 36 | The transaction ID this audit is linked to | ||
| PromotionSubCategory | String | 50 | Client-specific reporting identifier | Values: BASE | BONUS | |
| PromotionDescription | String | 500 | Description of the promotion | Example: Get 500 bonus points on spend over $20 | |
| OfferCode | String | 500 | Unique promotion name (also known as the offer code) | Example: Get500 | |
| PromotionVersion | Integer | The version of the promotion used in this transaction | |||
| PromotionTierName | String | The unique name of the promotion tier, if applicable | |||
| Reward | Number | The number of points rewarded | |||
| Spend | Number | The customer's spend. If only a portion of the spend is used in the reward calculation for a particular offer, this is set to the eligible payment amount rather than the full purchase value. | |||
| Message | Document | The message associated with the audit | Example: "EXCLUSION": "User is not targeted for this promotion" | ||
| NumberOfItems | Integer | The number of items recognized by the promotion | |||
| Category | String | The promotion category | Values: BASE | BONUS | TARGETTED | ||
| PartnerID | String | The partner identifier associated with this promotion | Example: MGABNK | ||
| CallId | String | Unique identifier for the transaction, different from transactionId and sessionId. Generated by the source system or internally for transactions missing this field. |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"TransactionPromoAuditID": "95913051601650",
"TransactionID": "GOLD_STATUS_MEMBER_OFFER",
"PromotionSubCategory": "BONUS",
"PromotionDescription": "Get 500 bonus points if you spend more than $20.",
"OfferCode": "Get500",
"PromotionVersion": 1,
"PromotionTierName": "Obsidian",
"Reward": 500,
"Spend": 2000,
"Exclusion": "User is not targeted for this promotion.",
"NumberOfItems": 1,
"Category": "BONUS",
"PartnerID": "MGABNK",
"CallId": "5243052350-52340562340"
}
Transaction promo audit detail feed
Description
This table contains further details about a specific transaction promo audit.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_TRANSACTION_PROMO_AUDIT_DETAIL_YYYYMMDDHHMISS.csv — YYYYMMDDHHMISS contains the date and time the feed was extracted.
Snowflake data share table name: DWHF_TRANSACTION_PROMO_AUDIT_DETAIL
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 100 | Constant value: ES_TRANSACTION_PROMO_AUDIT_DETAIL | ES_TRANSACTION_PROMO_AUDIT_DETAIL |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20240617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | TransactionPromoAuditDetailID | String | 100 | Used to join this table with the parent | |
| TransactionID | String | 36 | The transaction ID this audit detail is linked to | ||
| Amount | Number | The spend associated with this item | |||
| Count | Integer | The number of items considered | |||
| Id | String | 500 | The identifier of the item considered | ||
| Type | String | 50 | The type of item considered | Example: SKU | |
| DisbursedPoints | Float | The number of points disbursed to an individual SKU for an individual offer. If multiple SKUs apply to an offer, points are distributed proportionally based on each product's contribution to the offer. The data type is float because an individual point can be split between products in the basket. | |||
| CallId | String | Unique identifier for the transaction, different from transactionId and sessionId. Generated by the source system or internally for transactions missing this field. |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"TransactionPromoAuditID": "95913051601650",
"TransactionID": "GOLD_STATUS_MEMBER_OFFER",
"Amount": 100,
"Count": 3,
"Id": "PAT-M-BLU-MED-13",
"Type": "SKU",
"DisbursedPoints": 150.5,
"CallId": "5243052350-52340562340"
}
Transaction tender feed
Description
A transaction represents any point-earning or point-spending event. Think of it as a customer's point banking statement.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_TRANSACTION_TENDER_YYYYMMDDHHMISS.csv — YYYYMMDDHHMISS contains the date and time the feed was extracted.
Snowflake data share table name: DWHF_TRANSACTION_TENDER
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_TRANSACTION_TENDER | ES_TRANSACTION_TENDER |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20240617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | TransactionID | String | 36 | A primary key set by ES Loyalty | Required |
| PK | TenderId | String | Unique identifier for each tender object | Required | |
| TenderType | String | The type of tender used | Required. Values: VISA | CASH | DEBIT | COUPON | MSTCARD | AMEX | ||
| PaymentCardPrefix | Integer | 6 | The first 6 digits of the payment card number. NULL if not sent in the transaction. | Required. Example: 604291 | |
| PaymentCardLast4 | Integer | 4 | The last 4 digits of the payment card number. NULL if not sent in the transaction. | Required. Example: 5876 | |
| CardHolderType | String | The cardholder type | Required. Values: Retail (personal) | Business (small business) | ||
| CardType | String | 1 | The type of payment card. Credit and debit are supported. | Required. Values: C | D | |
| Amount | Float | The amount paid with this payment card | Required. Example: 60.00 | ||
| LinkedPartner | String | The partner linked to this payment card, if applicable to the program. NULL if no partner applies. | Optional. Example: MGABNK | ||
| CallId | String | Unique identifier for the transaction, different from transactionId and sessionId. Generated by the source system or internally for transactions missing this field. | Optional | ||
| payment_link_id_flag | Boolean | Indicates whether the account is associated with a link_id | Required. Values: true | false |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"TransactionID": "73321216-d03d-4fbb-ad8d-bacc9a188678",
"TenderId": "524502452502",
"TenderType": "AMEX",
"PaymentCardPrefix": 604291,
"PaymentCardLast4": 5876,
"CardHolderType": "Retail",
"CardType": "C",
"Amount": 60.00,
"LinkedPartner": "MGABNK",
"CallId": "5243052350-52340562340",
"payment_link_id_flag": true
}
Fulfillment feeds
Fulfillment feeds provide the means to direct member redemptions to various payment methods.
Blackhawk Network™ direct deposit feed
Description
Clients may have loyalty programs that let members redeem points for cash. The cash can be applied as a direct deposit configured for loyalty program members. The payments are provided to the client through a direct deposit feed containing the information required to deposit the cash payment into the member's account.
Supported formats
Only CSV format is supported for this feed.
Upload folder: businessUnit/{{businessUnit}}/fulfillment
File name
ES_FULFILLMENT_DIRECT_DEPOSIT_YYYYMMDDHH24MISS.csv — YYYYMMDDHH24MISS contains the date and time the feed was extracted, with HH in 24-hour format.
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_FULFILLMENT_DIRECT_DEPOSIT | ES_FULFILLMENT_DIRECT_DEPOSIT |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20250617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | ETID | String | 36 | Unique email template identifier. Specifies which email template is used to send out a reward. | Required. Retrieved from program configuration. |
| RecipientEmail | String | The member's email address | Required | ||
| RecipientFirstName | String | 36 | The member's first name | Required | |
| RecipientLastName | String | 36 | The member's last name | Optional. Populated if available. | |
| UTID | String | Blackhawk Network reward identifier | Required. Retrieved from program configuration. | ||
| RewardAmount | Number | The ad hoc redemption transaction amount in dollars in the currency being sent (USD). Some cards have fixed denominations and some variable. | Required. Specified as an integer with two decimal places when needed. Example: 50 | ||
| CustomerNotes | String | The ad hoc redemption transaction identifier | Optional. Map the ad hoc transaction identifier to this field. | ||
| DoNotComplete | String | Required for card system processing | Required. Leave empty. | ||
| Message | String | The message to the member. Maps to a dynamic tag if one exists in the email template. | Optional. Leave empty. | ||
| FromName | String | The client company name. Maps to a dynamic tag if one exists in the email template. | Optional. Leave empty. |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"ETID": "E6052952340",
"RecipientEmail": "hwolf@esmail.com",
"RecipientFirstName": "Hieronymus",
"RecipientLastName": "Wolf",
"UTID": "E6052952340",
"RewardAmount": 50,
"CustomerNotes": "EOY Campaign 2024",
"DoNotComplete": "",
"Message": "",
"FromName": ""
}
Fulfillment direct deposit feed
Description
Clients may have loyalty programs that let members redeem points for cash. The cash can be applied as a direct deposit configured for loyalty program members. The payments are provided to the client through a direct deposit feed containing the information required to deposit the cash payment into the member's account.
Supported formats
- JSON
- CSV
Download folder: businessUnit/{{businessUnit}}/fulfillment
File name
ES_FULFILLMENT_DIRECT_DEPOSIT_YYYYMMDDHH24MISS.csv — YYYYMMDDHH24MISS contains the date and time the feed was extracted, with HH in 24-hour format. The format is CSV or JSON depending on client configuration.
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_FULFILLMENT_DIRECT_DEPOSIT | ES_FULFILLMENT_DIRECT_DEPOSIT |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20250617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | AccountID | String | 36 | Unique internal account identifier | Required |
| PK | LoyaltyID | String | 10 | Unique Exchange Solutions card number | Required |
| ExternalID | String | 10 | Unique account or member identifier used by the client | Optional | |
| EmailAddress | String | The member's email address | Required | ||
| AdHocRedemptionTransactionId | String | 24 | Internal unique identifier for the transaction | Required. GUID. | |
| FirstName | String | 36 | The member's first name | Required | |
| LastName | String | 36 | The member's last name | Required | |
| BusinessName | String | The member's business name | Optional | ||
| Points | Integer | The number of points redeemed | Required | ||
| FulfillmentType | String | The type of fulfillment requested | Required. Always set to: DIRECT_DEPOSIT | ||
| RedemptionAmount | Decimal | The dollar value of the statement credit in the currency provided. May have two decimal places when required. | Required. Example: 50 | ||
| TransactionTS | Timestamp | The redemption transaction date and time stamp | Required. Example: 2025-01-02T08:51:57.828+0000 | ||
| AccountNumber | String | The member's bank account number | Required. Example: 1234566777 | ||
| AccountHolderType | String | The member's bank account holder type | Required. Example: Savings | ||
| BankName | String | The member's bank name | Required. Example: MEGABANK | ||
| BankInstitutionNumber | String | 3 | The member's bank institution number | Required. Example: 045 | |
| TransitNumber | String | 5 | The member's bank transit number | Required. Example: 12345 |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"AccountID": "5205246052952340",
"LoyaltyID": "67252345245",
"EmailAddress": "hwolf@esmail.com",
"AdHocRedemptionTransactionId": "2025-01-01T00:00:01:001 -0800",
"FirstName": "Hieronymus",
"LastName": "Wolf",
"BusinessName": "Hieronymus Sources, Inc.",
"Points": 500,
"FulfillmentType": "DIRECT_DEPOSIT",
"RedemptionAmount": 5,
"TransactionTS": "2025-01-02T08:51:57.828+0000",
"AccountNumber": "1234566777",
"AccountHolderType": "Savings",
"BankName": "MEGABANK",
"BankInstitutionNumber": "045",
"TransitNumber": "12345"
}
Fulfillment statement credit feed
Description
B2B clients may have loyalty programs that let members redeem points for cash. The cash can be applied as a statement credit to reduce the payment required for purchased products. The payments are provided to the client through a statement credit file.
Supported formats
- JSON
- CSV
File name
ES_FULFILLMENT_STATEMENT_CREDIT_YYYYMMDDHH24MISS.csv — YYYYMMDDHH24MISS contains the date and time the feed was extracted, with HH in 24-hour format. The format is CSV or JSON depending on client configuration.
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_FULFILLMENT_STATEMENT_CREDIT | ES_FULFILLMENT_STATEMENT_CREDIT |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20250617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | AccountID | String | 36 | Unique internal account identifier | Required |
| PK | LoyaltyID | String | 10 | Unique Exchange Solutions card number | Required |
| ExternalID | String | 10 | Unique account or member identifier used by the client | Optional | |
| EmailAddress | String | The member's email address | Required | ||
| AdHocRedemptionTransactionId | String | 24 | Exchange Solutions internal unique identifier for the transaction | Required. GUID. | |
| FirstName | String | 36 | The member's first name | Required | |
| LastName | String | 36 | The member's last name | Required | |
| BusinessName | String | The member's business name | Optional | ||
| Points | Integer | The number of points redeemed | Required | ||
| FulfillmentType | String | The type of fulfillment requested | Required. Always set to: STATEMENT_CREDIT | ||
| RedemptionAmount | Decimal | The dollar value of the statement credit. May have two decimal places when required. | Required. Example: 500 | ||
| TransactionTS | Timestamp | The redemption transaction date and time stamp | Required. Example: 2025-01-02T08:51:57.828+0000 |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"AccountID": "5205246052952340",
"LoyaltyID": "67252345245",
"EmailAddress": "hwolf@esmail.com",
"AdHocRedemptionTransactionId": "2024-01-01T00:00:01:001 -0800",
"FirstName": "Hieronymus",
"LastName": "Wolf",
"BusinessName": "Hieronymus Sources, Inc.",
"Points": 500,
"FulfillmentType": "STATEMENT_CREDIT",
"RedemptionAmount": 5,
"TransactionTS": "2025-01-02T08:51:57.828+0000"
}
Promotion and targeted offer data feeds
Frequency offer progress feed
Description
This feed displays the daily progress and completion percentage of frequency offers.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_FREQUENCY_OFFER_PROGRESS_YYYYMMDDHHMISS.csv — YYYYMMDDHHMISS contains the date and time the feed was extracted.
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_FREQUENCY_OFFER_PROGRESS | ES_FREQUENCY_OFFER_PROGRESS |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20240617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | Account_ID | String | 36 | Unique account identifier | Example: 224ca9eb-46c8-4bc2-9f61-1abee621b830 |
| PK | AccountIdentifierType | String | 10 | Account identifier type, unique per client | Values: ACCOUNT_ID | LOYALTY_ID |
| PK | OfferCode | String | 36 | Unique promotion code | Example: TIER_PROGRESSION_OFFER_TIER2 |
| PK | OfferName | String | 36 | Description of the promotion code | Example: Spend $100 to get 3000 points |
| VersionEffectiveTS | Timestamp | 29 | The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2020-01-26T08:14:51.903 -0800 | |
| VersionExpiryTS | Timestamp | 29 | The date and time the version expired. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2024-01-26T08:14:51.903 -0800 | |
| CompletionEarned | Integer | The number of times an offer has been completed | Example: 1, 2 | ||
| CompletionIsLimitReached | Boolean | Flag indicating whether the completion limit has been met | Values: TRUE | FALSE | ||
| CompletionLimit | Integer | The maximum number of times a reward can be completed | Example: 1 or 2 | ||
| CompletionReward | Integer | The count of rewards earned for each completion | Example: 1 or 2 | ||
| ContributionType | String | The offer type | Values: Spend | Quantity | ||
| ContributionNext | Integer | Based on the amount spent, this shows the remaining amount needed to reach the threshold | Example: 23, 40 | ||
| ContributionTotal | Integer | The total amount spent on an offer | Example: 90, 80 | ||
| ContributionUnused | Integer | The amount spent above the threshold for an offer code | Example: 2, 8 | ||
| ContributionTransactions | String | The list of transactions associated with the offer | Example: [mck-8ba27f9c-5e3c-b1f8-37ce704cf7d, mck-8ba28f8c-5e3c-b1f8-37ce7uyuy619] | ||
| ContributionPercentage | Integer | The completion percentile for an offer based on the contribution type | Example: 100, 50 |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"Account_ID": "224ca9eb-46c8-4bc2-9f61-1abee621b830",
"AccountIdentifierType": "ACCOUNT_ID",
"OfferCode": "TIER_PROGRESSION_OFFER_TIER2",
"OfferName": "Spend $120 to get 3000 points",
"VersionEffectiveTimestamp": "2025-01-26T08:14:51:903 -0800",
"VersionExpiryTimestamp": "2025-03-26T08:14:51:903 -0800",
"CompletionEarned": 2,
"CompletionIsLimitReached": true,
"CompletionLimit": 2,
"CompletionReward": 2,
"ContributionType": "Spend",
"ContributionNext": 40,
"ContributionTotal": 80,
"ContributionUnused": 80,
"ContributionTransactions": "[mck-8ba27f9c-5e3c-b1f8-37ce704cf7d, mck-8ba28f8c-5e3c-b1f8-37ce7uyuy619]",
"ContributionPercentage": 67
}
Live promotion feed
Description
This feed represents a list of promotions that are currently active—that is, whose EffectiveDate and ExpiryDate bracket the current date.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_LIVE_PROMOTION_YYYYMMDDHHMISS.csv — YYYYMMDDHHMISS contains the date and time the feed was extracted.
Snowflake data share table name: DWHF_PROMOTION
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_LIVE_PROMOTION | ES_LIVE_PROMOTION |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20240617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | OfferCode | String | 500 | Unique identifier for the offer | Required |
| PK | PromotionVersion | String | 10 | The version of the promotion | Required. Example: v2 |
| PK | VersionNum | Integer | Sequential number for each update in the table | Required | |
| VersionEffectiveTS | Timestamp | 29 | The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Required. Example: 2024-01-26T08:14:51.903 -0800 | |
| ActivationTS | Timestamp | 29 | The date and time of activation. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Required. Example: 2024-01-26T08:14:51.903 -0800 | |
| ApprovalTS | Timestamp | 29 | The date and time of approval. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Required. Example: 2024-01-26T08:14:51.903 -0800 | |
| ApprovedBy | String | 50 | The user who approved the promotion | Required. Note: MVP requires no offer approvals. | |
| BasedOn | String | 10 | The version of the promotion this was based on | Required. Example: v1 | |
| BusinessUnit | String | 50 | The business unit associated with these promotions | Optional. Currently enabled for one client. | |
| Channel | Enum | 50 | The valid channel for the offer. May contain nulls. | Required. Values: POS, MOBILE, WEBSITE, CONSOLE, SYSTEM, APP, WEB, null | |
| EffectiveTS | Timestamp | 29 | The date and time the promotion is valid. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Required. Example: 2024-01-26T08:14:51.903 -0800 | |
| ExpiryTS | Timestamp | 29 | The expiry date and time of the promotion. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Required. Example: 2024-01-26T08:14:51.903 -0800 | |
| Status | Enum | 50 | The status of the promotion | Required. Values: ACTIVE | EXPIRED | |
| SubmissionTS | Timestamp | 29 | The date and time the promotion was submitted for approval. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Required. Example: 2024-01-26T08:14:51.903 -0800 | |
| SubmittedBy | String | 50 | The user who submitted the promotion | Required | |
| Category | String | The promotion category | Required. Example: PROMO | ||
| SubCategory | String | The promotion sub-category | Required. Example: BONUS | ||
| ActivationMethod | String | The method of activating the promotion | Required. Values: MASS | LTC | ||
| DisableGlobalExclusion | Boolean | Flag to disable the global exclusion rules for a promotion | Required. Values: true | false | ||
| LongDescription | String | The long description of the promotion | Required | ||
| OfferName | String | The name of the promotion | Required | ||
| Rank | Integer | The rank of the promotion compared to other promotions | Required | ||
| RewardGroup | Array | The reward group | Required | ||
| ShortDescription1 | String | The first section of the promotion description | Required | ||
| ShortDescription2 | String | The second section of the promotion description | Required | ||
| IsVendorFunded | Boolean | Flag indicating whether the promotion is vendor funded | Required. Values: true | false | ||
| IsDynamic | Boolean | Flag indicating whether the promotion is dynamic | Required. Values: true | false | ||
| IsEmployeeDiscountCompatible | Boolean | Flag indicating whether the promotion is compatible with an employee discount | Optional. Values: true | false | ||
| MultiBehaviorFlag | Boolean | Flag indicating whether the promotion is multi-behavioral | Optional. Values: true | false | ||
| PromotionHeadline | String | The headline used with the offer | Optional | ||
| SmallImageURI | String | A URL pointing to a CDN containing a small standard-resolution image for this offer | Optional | ||
| SmallHDImageURI | String | A URL pointing to a CDN containing a small high-resolution image for this offer | Optional | ||
| LargeImageURI | String | A URL pointing to a CDN containing a large standard-resolution image for this offer | Optional | ||
| LargeHDImageURL | String | A URL pointing to a CDN containing a large high-resolution image for this offer | Optional | ||
| DisplayDate | Timestamp | The date the offer can be displayed to users. ISO format. | Optional |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"OfferCode": "FIRST_NEW_MEMBER_OFFER",
"PromotionVersion": "v1",
"VersionNum": 1,
"VersionEffectiveTS": "2025-02-26T08:14:51:903 -0800",
"ActivationTS": "2025-02-26T08:14:51:903 -0800",
"ApprovalTS": "2025-01-26T08:14:51:903 -0800",
"BasedOn": "v1",
"BusinessUnit": "BUYCO",
"Channel": "WEBSITE",
"EffectiveTS": "2025-02-26T08:14:51:903 -0800",
"ExpiryTS": "2025-12-26T08:14:51:903 -0800",
"Status": "ACTIVE",
"SubmissionTS": "2025-02-26T08:14:51:903 -0800",
"SubmittedBy": "SSTAR",
"Category": "PROMO",
"SubCategory": "BASE",
"ActivationMethod": "MASS",
"DisableGlobalExclusion": false,
"LongDescription": "First offer for new members who just enrolled.",
"OfferName": "Base offer madness",
"Rank": 2,
"ShortDescription1": "First offer",
"ShortDescription2": "New members",
"IsVendorFunded": false,
"IsDynamic": false,
"IsEmployeeDiscountCompatible": false,
"MultiBehaviorFlag": false,
"PromotionHeadline": "Special_Offer_for_You",
"SmallImageURI": "",
"SmallHDImageURI": "",
"LargeImageURI": "",
"LargeHDImageURI": "",
"DisplayDate": ""
}
Product spotlighting feed
Description
The purpose of this feed is to link individual products to offers. The feed is extracted alongside the regular data warehouse feeds and contains the list of eligible SKUs for a given promotion.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_PRODUCT_SPOTLIGHTING_YYYYMMDDHHMISS.csv — YYYYMMDDHHMISS contains the date and time the feed was extracted.
Snowflake data share table name: DWHF_PRODUCT_SPOTLIGHTING
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_PRODUCT_SPOTLIGHTING | ES_PRODUCT_SPOTLIGHTING |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20240617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | OfferCode | String | 36 | Unique promotion code | Example: TIER_PROGRESSION_OFFER_TIER2 |
| PK | ProductCode | String | The product code of the product targeted by the offer | Example: 068780000108 | |
| OfferName | String | 36 | Description of the promotion code | Example: Spend $100 to get 3000 points | |
| EffectiveTS | Timestamp | 29 | The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2025-01-26T08:14:51.903 -0800 | |
| ExpiryTS | Timestamp | 29 | The date and time the version expired. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2025-01-26T08:14:51.903 -0800 | |
| RedemptionOffer | Boolean | Flag indicating whether the offer is a redemption offer | Values: TRUE | FALSE | ||
| AllProducts | Boolean | If there is no cart selector, the promotion targets all products. If true, product_code_type and product_code are NULL. | Values: TRUE | FALSE | ||
| ProductCodeType | String | The type of product codes. These are configurable values. | Values: GTIN | UPC | Product_id |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"OfferCode": "TIER_PROGRESSION_OFFER_TIER2",
"OfferName": "Spend $100 to get 300 points.",
"EffectiveTimestamp": "2024-02-26T08:14:51:903 -0800",
"ExpiryTimestamp": "2025-03-26T08:14:51:903 -0800",
"RedemptionOffer": false,
"AllProducts": false,
"ProductCodeType": "GTIN",
"ProductCode": "068780000108"
}
Promotion metadata feed
Description
This table contains client-provided reporting metadata for a given promotion.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_PROMOTION_METADATA_YYYYMMDDHHMISS.csv — YYYYMMDDHHMISS contains the date and time the feed was extracted.
Snowflake data share table name: DWHF_PROMOTION_METADATA
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_PROMOTION_METADATA | ES_PROMOTION_METADATA |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20240617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | OfferCode | String | 500 | Unique promotion identifier | |
| PK | PromotionVersion | String | 10 | The promotion version | Example: v1 |
| PK | VersionNum | Integer | Sequential number for each update in the table | ||
| VersionEffectiveTS | Timestamp | 29 | The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Example: 2024-01-26T08:14:51.903 -0800 | |
| EventNumber | String | 500 | A tag grouping promotions together | ||
| ReportingIdentifier | String | 500 | Client-specific reporting identifier | ||
| VehicleDescription | String | 500 | Description of a promotion grouping event | ||
| VehicleNumber | String | 500 | A tag grouping promotions together | ||
| Duration | Integer | The number of days this offer should be active for each user | |||
| Cardinality | Integer | The number of times this offer can target a user | |||
| ActivityAction | String | 500 | The activity action | Example: MEMBER_REGISTRATION |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"OfferCode": "TIER_PROGRESSION_OFFER_TIER2",
"PromotionVersion": "v1",
"VersionNumber": 1,
"VersionEffectiveTimestamp": "2025-03-26T08:14:51:903 -0800",
"EventNumber": "v1",
"ReportingIdentifier": "v1",
"VehicleDescription": "GTIN",
"VehicleNumber": "068780000108",
"Duration": false,
"Cardinality": "GTIN",
"ActivityAction": "068780000108"
}
Promotion tier feed
Description
This feed represents the reward tiers applicable to a given promotion.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_PROMOTION_TIER_YYYYMMDDHHMISS.csv — YYYYMMDDHHMISS contains the date and time the feed was extracted.
Snowflake data share table name: DWHF_PROMOTION_TIER
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_PROMOTION_TIER | ES_PROMOTION_TIER |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20240617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | OfferCode | String | 500 | Link back to the promotion table | Required |
| PK | PromotionVersion | String | 10 | The promotion version | Required. Example: v1 |
| PK | VersionNum | Integer | Sequential number for each update in the table | Required | |
| PK | TierName | String | 50 | Unique name for the tier | Required |
| VersionEffectiveTS | Timestamp | 29 | The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Required | |
| Precedence | Number | Tiers are evaluated in ascending order based on their precedence values | Required | ||
| RewardAmount | Number | The number of points or point multiplier | Required | ||
| RewardType | Enum | 50 | The type of reward | Required. Values: MULTIPLIER | FLAT | |
| ThresholdType | Enum | 50 | The threshold type | Required. Values: MIN/MAX | PER | |
| ThresholdValue | Number | The actual value of the threshold | Required | ||
| ThresholdCategory | Enum | 50 | The category of the threshold | Required. Values: SPEND | UNIT | |
| ThresholdSubCategory | Enum | 50 | The sub-category of the threshold | Required. Values: AMOUNT | COUNT | |
| ThresholdID | String | Unique identifier for the threshold | Optional | ||
| ProductSelectorID | String | Unique identifier for a product attached to this tier | Optional |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"OfferCode": "TIER_PROGRESSION_OFFER_TIER2",
"PromotionVersion": "v1",
"VersionNum": 1,
"TierName": "PLATINUM",
"VersionEffectiveTS": "2025-03-26T08:14:51:903 -0800",
"Precedence": 3,
"RewardAmount": 500,
"RewardType": "FLAT",
"ThresholdType": "MIN/MAX",
"ThresholdValue": 100,
"ThresholdCategory": "SPEND",
"ThresholdSubCategory": "AMOUNT",
"ThresholdID": "45234",
"ProductSelectorID": "068780000108"
}
Targeted offer feed
Description
A list of available targeted offers attached to an account.
Supported formats
- JSON
- CSV
- Snowflake data sharing
File name
ES_TARGETED_OFFER_YYYYMMDDHHMISS.csv — YYYYMMDDHHMISS contains the date and time the feed was extracted.
Snowflake data share table name: DWHF_TARGETED_OFFER
Header
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| File identifier | String | 50 | Constant value: ES_TARGETED_OFFER | ES_TARGETED_OFFER |
| Extraction start date | Date | 8 | The date the feed was extracted. Format: YYYYMMDD | 20240617 |
| Extraction start time | Time | 6 | The time the feed was extracted. Format: HHMISS (UTC) | 164800 |
Headers can alternatively be configured to display column names to meet client requirements.
Detail
| PK | Field | Type | Length | Description | Notes/Sample values |
|---|---|---|---|---|---|
| PK | AccountID | String | 36 | The targeted account ID | Required |
| PK | OfferCode | String | 500 | The promotion this offer is part of | Required |
| VersionNumber | Integer | Sequential number for each update in the table | Required | ||
| VersionEffectiveTS | Timestamp | 29 | The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Required. Example: 2024-01-26T08:14:51.903 -0800 | |
| OfferVersion | Integer | The version of the offer | Required | ||
| AcceptedOfferVersion | Integer | The version of the offer being accepted | Required | ||
| AcceptanceState | Enum | 50 | The current acceptance state of the targeted offer | Required. Values: NONE | COMPLETED | DECLINED | ACCEPTED | |
| AcceptanceTS | Timestamp | 29 | The date and time the offer was accepted. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Required. Example: 2024-01-26T08:14:51.903 -0800 | |
| EffectiveTS | Timestamp | 29 | The date and time the targeted offer becomes active. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Required. Example: 2024-01-26T08:14:51.903 -0800 | |
| ExpiryTS | Timestamp | 29 | The expiry date and time for the targeted offer. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Required. Example: 2024-01-26T08:14:51.903 -0800 | |
| MaxCompletions | Integer | The maximum number of times this offer may be completed | Required | ||
| CompletionCount | Integer | The number of times the offer has been completed | Required | ||
| CompletedTS | Timestamp | 29 | The date and time the offer was last completed. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM | Required. Example: 2024-01-26T08:14:51.903 -0800 | |
| TreatmentType | String | Descriptor for the purpose of this offer | Optional. Example: Test | Program |
Trailer
| Field | Type | Length | Description | Sample values |
|---|---|---|---|---|
| Trailer identifier | String | 7 | Constant value: TRAILER | TRAILER |
| Record count | Integer | The number of rows in the file |
JSON example
{
"AccountID": "95913051601650",
"OfferCode": "GOLD_STATUS_MEMBER_OFFER",
"VersionNum": 1,
"VersionEffectiveTS": "2025-02-26T08:14:51:903 -0800",
"OfferVersion": 1,
"AcceptedOfferVersion": 1,
"AcceptanceState": "ACCEPTED",
"AcceptanceTS": "2025-03-26T08:14:51:903 -0800",
"EffectiveTS": "2025-03-26T08:14:51:903 -0800",
"ExpiryTS": "2025-03-26T08:14:51:903 -0800",
"MaxCompletions": 2,
"CompletionCount": 1,
"CompletedTS": "2025-03-26T08:14:51:903 -0800",
"TreatmentType": "Program"
}