Skip to main content

Data Warehouse Feeds Specification

⬇ Download PDF

Version: 4.7 v01 Last updated: 2026-03-31


Table of contents


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.csvYYYYMMDDHHMISS contains the date and time the feed was extracted.

Snowflake data share table name: DWHF_ACCOUNT

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_ACCOUNTES_ACCOUNT
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20240617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKAccountIDString36Unique account identifierRequired
PKVersionNumberIntegerSequential number for each update in the tableRequired
VersionEffectiveTSTimestamp29The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMRequired. Example: 2024-01-26T08:14:51.903 -0800
AccountStatusEnum50The status of the account. Accepts nulls.Required. Values: ACTIVE | EXPIRED | SUSPENDED | DECEASED | CLOSED | CANCELLED | UNREGISTERED | null
CreatedTSTimestamp29The date and time the account was created. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMRequired. Example: 2024-01-26T08:14:51.903 -0800
UpdatedTSTimestamp29The date and time the account was last updated. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMRequired. Allows null. Example: 2024-01-26T08:14:51.903 -0800
RegistrationTSTimestamp29The date the account was registered. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMRequired. Allows null. Example: 2024-01-26T08:14:51.903 -0800
LoyaltyIdInteger19The current loyalty card associated with the accountRequired. Example: 524574305705714736
LoyaltyStatusEnum50The status of the default loyalty card. Accepts nulls.Required. Values: ACTIVE | SUSPENDED | LOST_OR_STOLEN | DAMAGED | FRAUD_ABUSE | CANCELLED | null
AskForEmailBooleanIndicates whether the POS should ask the customer for their email addressRequired. Values: true | false
AvailablePointBalanceIntegerThe current account balance available for redemptionRequired
PointBalanceIntegerThe current account balanceRequired
EmployeeBooleanIndicates whether the account is owned by an employeeRequired. Values: true | false
BlockRedemptionFlagBooleanIndicates whether an account is currently blocked from redemption activities due to manual or system-generated control eventsRequired. Values: true | false
CardSwipedCounterIntegerThe number of swipes by cards assigned to this accountRequired. Defaults to 0 when null.
ExternalIdentifierString36External identifier linked to the customer's account. Currently used for the Carebook identifier.May be required by client for internal purposes
RegistrationChannelStringThe registration channel of the accountOptional. Example: APP
FirstNameStringThe account holder's first nameOptional
LastNameStringThe account holder's last nameOptional
EmailStringThe account holder's email addressOptional
CityStringAddress field: the account holder's cityOptional
PostalZipCodeStringAddress field: the account holder's postal codeOptional
StreetStringAddress field: the account holder's streetOptional
ProvinceStateStringAddress field: the account holder's province or stateOptional. Two-letter state or province code.
CountryCodeStringAddress field: the account holder's countryOptional. Values: CA | US
UserAgentStringThe agent's name who made the profile updateOptional. Values: Anonymous | Loyalty_id | AgentName
ChannelStringThe channel where the profile update was performedOptional. Values: POS | SYSTEM | CLIENT | AGENT
PreferredLanguageString36The member's preferred languageOptional. Format: xx-CC (for example, en-CA)
PhoneNumberStringThe member's phone number for SMS communicationsOptional. Example: (416) 967-1212 | 4169671212
PhoneNumberSourceString50The source channel for the phone numberOptional. Values: POS | CUX | CONSOLE
PhoneNumberAddedTimestampTimestamp50The date and time the phone number was addedOptional. Example: 2024-01-26T08:14:51.903 -0800
IsReferrerBooleanIndicates whether the account is the referrer in a referral programOptional. Values: true | false
IsRefereeBooleanIndicates whether the account is the referee in a referral programOptional. Values: true | false
ReferrerAccountIdString36The referrer's account ID for the referral programOptional. Example: 345123501235
FirstReferralEnrollmentTsTimestamp29The timestamp of the first referral enrollment made for a referrerOptional. Example: 2024-01-26T08:14:51.903 -0800
LastReferralEnrollmentTsTimestamp29The timestamp of the most recent referral enrollment made for a referrerOptional. Example: 2024-01-26T08:14:51.903 -0800

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ACCOUNT_TIERACCOUNT_TIER
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20240617
Serial no.String6The serial number of the feedS1
Version no.String5The version number of the feedV2

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKAccountIDString36Unique account identifierRequired
External_IdentifierString50Unique client identifierAlways present in the feed but accepts null values
PKLoyaltyIDString50Unique loyalty card identifierRequired
TierProgramObjectObject containing tier dataOptional. Contains NextTierCode and NextTierProgress.
NextTierCodeString50The name of the next level up in the loyalty program tiersOptional. Example: Tier2
NextTierProgressObjectContains data about progress toward the next tier levelOptional. Contains Spend.
SpendObjectContains data about the spend status toward the next tier levelOptional. Contains Next, Total, and Unused.
NextNumber38,2The number of points required to achieve the next tier levelOptional. Example: 25000
TotalNumber38,2The total number of points accumulated toward the next tier levelOptional. Example: 10000
UnusedNumber38,2The number of points not yet applied toward the next tier levelOptional. Example: 15000
ProgramCodeString255The unique identifier for the loyalty programOptional. Example: BUYCO_PROGRAM
TierCodeString50The name of the current tier levelOptional. Example: Tier1
TierStartString50The date and time the current tier startsOptional. Example: 2024-01-01T03:59:59.999Z
TierEndTimestamp50The date and time the current tier expiresOptional. Example: 2025-01-01T03:59:59.999Z
TierRankNumber30The ranking of the current tier in the overall tier structure. The lowest number indicates the lowest tier.Optional. Example: 0
NextPeriodTierCodeString50The name of the next period tier levelOptional. Example: Tier2
NextPeriodTierRankNumber30The ranking of the next period tier in the overall tier structure. The lowest number indicates the lowest tier.Optional. Example: 1
NextPeriodAchievedDtTimestamp50The date and time the next period tier level is achievedOptional. Example: 2026-02-01T03:59:59.999Z
VersionNumberIntegerSequential number for each update in the tableRequired
VersionEffectiveTSTimestamp29The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMRequired. Example: 2024-01-26T08:14:51.903 -0800

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.csvYYYYMMDDHHMISS contains the date and time the feed was extracted.

Snowflake data share table name: DWHF_ACCOUNT_TIER_HISTORY

Header

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_ACCOUNT_TIER_HISTORYES_ACCOUNT_TIER_HISTORY
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20250617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKAccountIDString36Unique account identifierRequired
ExternalIdentifierString50External account identifierAlways present in the feed but accepts null values
PKLoyaltyIDString50Loyalty ID associated with the accountRequired
TierCodeString50The tier level at the beginning of the phaseExample: SILVER
NextTierCodeString50The next tier level assigned, if anyExample: BRONZE
TierStartTimestamp29The start date of the tier phase. Format: yyyy-mm-ddExample: 2025-01-01
TierEndTimestamp29The end date of the tier phase (start of next tier or program end date). Format: yyyy-mm-ddExample: 2025-06-11
ProgramTierStartDateTimestamp29The program-defined start date of the tier year. Format: yyyy-mm-ddExample: 2025-01-01
ProgramTierEndDateTimestamp29The program-defined end date of the tier year. Format: yyyy-mm-ddExample: 2025-12-31
ProgramCodeString255The unique identifier for the loyalty programOptional. Example: BUYCO_PROGRAM
OverrideFlagString50Indicates 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
NextPeriodTierCodeString50The name of the next period tier levelOptional. Example: Tier2
NextPeriodTierRankNumber30The ranking of the next period tier in the overall tier structure. The lowest number indicates the lowest tier.Optional. Example: 1
NextPeriodAchievedDtTimestamp50The date and time the next period tier level is achievedOptional. Example: 2026-02-01T03:59:59.999Z
VersionNumberIntegerSequential number for each update in the tableRequired
VersionEffectiveTSTimestamp29The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMRequired. Example: 2024-01-26T08:14:51.903 -0800

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.csvYYYYMMDDHHMISS contains the date and time the feed was extracted.

Snowflake data share table name: DWHF_ACCOUNT_TOKEN

Header

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_ACCOUNT_TOKENES_ACCOUNT_TOKEN
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20240617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKAccountIDString36The account ID associated with the token
PKTokenString50The token
PKVersionNumberIntegerSequential number for each update in the table
VersionEffectiveTSTimestamp29The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2024-01-26T08:14:51.903 -0800
CreatedTSTimestamp29The date and time the token was created. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2024-01-26T08:14:51.903 -0800
ExpiryTSTimestamp29The date and time the token expires. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2024-01-26T08:14:51.903 -0800
ReservationAmountIntegerThe number of points reserved by this token

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.jsonYYYYMMDDHH24MISS 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

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_ACCOUNT_EXTENDED_DATAES_ACCOUNT_EXTENDED_DATA
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20240617
Extraction start timeTime6The time the feed was extracted. Format: HH24MISS (UTC)164800

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKAccountIDString36The account ID associated with the token
PKSourceStringThe source of the external member dataExample: Marketing
LoyaltyIDString50The loyalty card number
ExtendedDataObjectAdditional client data associated with the member. Contains key/value pair(s) defined by the client.Example attribute:value pair: "EnrollmentChannel": "MyPC"

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.csvYYYYMMDDHHMISS contains the date and time the feed was extracted.

Snowflake data share table name: DWHF_HOUSEHOLD

Header

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_HOUSEHOLDES_HOUSEHOLD
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20240617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKAccount_IDString36Unique account identifier
PKHousehold_IDString10Unique household identifier
PKHouseholdRoleString10The member's role in the householdValues: PRIMARY | SECONDARY
PKJoinedTSTimestampThe timestamp at which the member joined a household. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZM
Inviter_IDString24The unique identifier for the inviter
UsernameString36The user agent (username) that made the household updateValues: Member_ID | Anonymous
ChannelString36The channel where the changes were madeExample: POS

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.csvYYYYMMDDHHMISS contains the date and time the feed was extracted.

Snowflake data share table name: DWHF_LOYALTY_CARD

Header

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_LOYALTY_CARDES_LOYALTY_CARD
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20240617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKLoyaltyIdInteger19The loyalty card number
PKVersionNumberIntegerSequential number for each update in the table
VersionEffectiveTSTimestamp29The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2024-01-26T08:14:51.903 -0800
AccountIDString36The account ID
LoyaltyStatusEnum50The card status. Accepts null.Values: ACTIVE | SUSPENDED | LOST_OR_STOLEN | DAMAGED | FRAUD_ABUSE | CANCELLED | null
CreatedTSTimestamp29The date and time the card was created. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2024-01-26T08:14:51.903 -0800
UpdatedTSTimestamp29The date and time the card was last updated. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2024-01-26T08:14:51.903 -0800
IssuedDateDateThe date the card was issued or registered. Format: yyyy-mm-ddExample: 2024-06-06

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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, or Cancelled
  • CardStatus = 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

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: MEMBER_MARKETINGMEMBER_MARKETING
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20240617
Extraction start timeTime6The time the feed was extracted. Format: HH24MISS (UTC)164800

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
EmailAddressString255The member's email addressRequired
LanguagePreferenceString50The member's language preferenceRequired. BCP 47 format: en-CA | fr-CA
ExternalIdentifierString50The account ID associated with the memberRequired
PKLoyaltyIDString50The ID number for identification within the loyalty programRequired
FirstNameString255The member's first nameRequired
LastNameString255The member's last nameRequired
BusinessNameString255The business name related to the memberRequired
TierProgramArrayTier program details related to the memberOptional. Contains fields and objects from ProgramCode to TierEnd.
ProgramCodeString255The tier program settingOptional. Example: MOST_VALUABLE_CUSTOMER
TierCodeString50The designation for the current member tier rankOptional. Example: SILVER
TierRankString30The numeric designator for tier rankOptional. Example: 1
NextTierProgressObjectTracks progress toward the next tier for this memberOptional. Contains SpendFormatted and PointsEarned.
SpendFormattedNumber38,2Dollars spentOptional
PointsEarnedObjectDetails about points earned toward the next tierOptional. Contains Total, Unused, and Next.
TotalNumber38,2Total progress in the programOptional
UnusedNumber38,2Progress since the previous tierOptional
NextNumber38,2The difference between the threshold for the next tier and the current totalOptional
TierStartString50The timestamp for when tier membership began. ISO-8601 format.Optional
TierEndString50The timestamp for when tier membership ends. ISO-8601 format.Optional
LoyaltyOptinDateString50The date on which the member opted in to the loyalty programRequired
LastActivityDateString50The date of the last loyalty-qualified activityRequired
RedemptionRequirementsMetObjectJSON object containing details about whether the redemption requirement has been achievedOptional. Contains LifeTimeSpend.
LifeTimeSpendBooleanIndicates whether the member's total lifetime spend has met the redemption thresholdOptional. Values: true | false
BalanceObjectTotal rewards balance available to the member for redemptionRequired. Contains Points, Tender, and TenderFormatted.
PointsObjectContains details of available and redeemable points, and the number on holdRequired. Contains Available, Redeemable, and Hold.
AvailableNumber38,2Total points associated with the memberRequired
RedeemableNumber38,2Points that can be redeemedRequired
HoldNumber38,2Points currently on hold (for example, pending achievement of a lifetime spend threshold)Required
TenderObjectContains details about available and redeemable tender amounts, and any holdRequired. Contains Available, Redeemable, and Hold.
AvailableNumber38,2Total tender points associated with the transactionRequired
RedeemableNumber38,2Tender points that can be redeemedRequired
HoldNumber38,2Tender points currently on hold, formatted to two decimal placesRequired
TenderFormattedObjectContains formatting elements to ensure tender amounts end in two decimal places, even with trailing zerosRequired. Contains a localization object for currency amount and Available, Redeemable, and Hold.
{{ll-CC}}ObjectContains formatting attributes for available, redeemable, and hold amounts, and specifies the localized currency formatRequired. Example: en-CA | fr-CA
AvailableNumber50Total available reward tender, formatted to two decimal placesRequired
RedeemableNumber50Total redeemable awards tender, formatted to two decimal placesRequired
HoldNumber50Total rewards currently on hold, formatted to two decimal placesRequired
StatisticsObjectNDJSON object containing total rewards and redemptions by month and year, in both points and tenderOptional. Contains fields from TotRedemptionMth to TenderFormatted.
TotRedemptionMthNumber38,2Total rewards redeemed by the member in a monthOptional
TotRewardsMthNumber38,2Total rewards accumulated by a member in a monthOptional
TotRedemptionQtrNumber38,2Total rewards redeemed by the member in a quarterOptional
TotRewardsQtrNumber38,2Total rewards accumulated by a member in a quarterOptional
TotRedemptionYrNumber38,2Total rewards redeemed by the member in a yearOptional
TotRewardsYrNumber38,2Total rewards accumulated by a member in a yearOptional
TenderObjectNDJSON object containing the total eligible spend for the month, quarter, and yearOptional. Contains TotEligibleSpendMth to TotEligibleSpendYr.
TotEligibleSpendMthNumber38,2Total eligible spend for monthly redemptionOptional
TotEligibleSpendQtrNumber38,2Total eligible spend for quarterly redemptionOptional
TotEligibleSpendYrNumber38,2Total eligible spend for yearly redemptionOptional
TenderFormattedObjectNDJSON object with formatting elements to ensure tender amounts end in two decimal placesOptional. Contains a localization object and eligible spend fields.
{{ll-CC}}ObjectNDJSON object containing formatting attributes for monthly, quarterly, and yearly eligible spend, and specifying the localized currency formatOptional. Example: en-CA | fr-CA
TotEligibleSpendMthString50Total monthly eligible redemption, formatted to two decimal placesOptional
TotEligibleSpendQtrString50Total quarterly eligible redemption, formatted to two decimal placesOptional
TotEligibleSpendYrString50Total yearly eligible redemption, formatted to two decimal placesOptional
IsSuspendedBooleanFlag indicating whether the account is suspendedRequired. Values: true | false
IsExpiredBooleanFlag indicating whether the account is expiredRequired. Values: true | false
LocalizationConfigObjectProvides information about whether language localization is requiredOptional
HouseholdObjectContains household membership data, populated only for members who belong to a householdOptional. Contains DateJoined, Role, and RedeemableBalance.
DateJoinedString50The date the member joined the household. ISO-8601 format.Required
RoleString50The member's role in the householdRequired. Values: PRIMARY | SECONDARY
RedeemableBalanceNumber38,2The balance of points for this member that can be redeemed within the householdOptional
TargetedOffersArrayThe list of active and future targeted offers for an accountOptional. Contains OfferCode to ExpiryTimeStamp.
OfferCodeString50The unique identifier for the targeted offerOptional
DisplayTimeStampString50The timestamp for when the offer is displayed. ISO-8601 format.Optional
EffectiveTimeStampString50The timestamp for when the offer becomes effective. ISO-8601 format.Optional
ExpiryTimeStampString50The timestamp for when the offer expires. ISO-8601 format.Optional
ExtendedDataArrayAdditional data relevant to the clientOptional. Contains key:value pairs for client's extended member data.
PartnerLinksArrayContains data about any partner link for the memberOptional. Contains PartnerID and LinkedDate.
PartnerIDString50The unique identifier for the partner the member is linked toOptional
LinkedDateString50The date the partner link was established for the memberOptional

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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"
}
]
}

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.csvYYYYMMDDHHMISS contains the date and time the feed was extracted.

Snowflake data share table name: DWHF_PARTNER_CARD_LINK

Header

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_PARTNER_CARD_LINKES_PARTNER_CARD_LINK
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20240617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKAccountIDString36The loyalty account ID linked to the partner payment card
PKPartnerIDString50The unique identifier for the partner associated with the payment cardExample: MGABNK
PKLast4Integer4The last 4 digits of the payment card number
PKVersionNumberIntegerSequential number for each update in the table
VersionEffectiveTSTimestamp29The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2024-01-26T08:14:51.903 -0800
VersionExpiryTSTimestamp29The date and time the version expired. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2024-01-27T08:14:51.903 -0800
CreatedTSTimestamp29The date and time the token was created. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2024-01-26T08:14:51.903 -0800
UpdatedTSTimestamp29The date and time the token expires. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2024-01-26T08:14:51.903 -0800
LinkedTSTimestamp29The 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
UnLinkedTSTimestamp29The date and time the link was removed. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2024-01-26T08:14:51.903 -0800
LinkTypeString13The type of link createdValues: PAYCARD_LAST4 | PAYCARD
CardHolderTypeStringThe cardholder typeValues: Retail (personal) | Business (small business)
CardTypeString1The type of payment card. Credit and debit are supported.Values: C | D
Link_IDStringA unique link ID when the link type is PAYCARD for any partner
StatusStringThe current status of the linked payment cardValues: LINKED | UNLINKED
BINIntegerA Bank Identification Number (BIN): the first 4–6 digits of a payment card that identify the card issuerExample: 1234 or 123456

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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"
}

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.csvYYYYMMDDHHMISS contains the date and time the feed was extracted.

Snowflake data share table name: DWHF_PAYMENT_CARD_LINK

Header

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_PAYMENT_CARD_LINKES_PAYMENT_CARD_LINK
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20140617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKAccountIDString36The loyalty account ID linked to the partner payment card
PKPartnerIDString50The unique identifier for the partner associated with the payment cardExample: MGABNK
PKLast4Integer4The last 4 digits of the payment card number
PKVersionNumberIntegerSequential number for each update in the table
VersionEffectiveTSTimestamp29The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2024-01-26T08:14:51.903 -0800
VersionExpiryTSTimestamp29The date and time the version expired. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2024-01-27T08:14:51.903 -0800
CreatedTSTimestamp29The date and time the token was created. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2024-01-26T08:14:51.903 -0800
UpdatedTSTimestamp29The date and time the token expires. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2024-01-26T08:14:51.903 -0800
LinkedTSTimestamp29The 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
UnLinkedTSTimestamp29The date and time the link was removed. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2024-01-26T08:14:51.903 -0800
LinkTypeString13The type of link createdValues: PAYCARD_LAST4 | PAYCARD
CardHolderTypeStringThe cardholder typeValues: Retail (personal) | Business (small business)
CardTypeString1The type of payment card. Credit and debit are supported.Values: C | D
Link_IDStringA unique link ID when the link type is PAYCARD for any partner
StatusStringThe current status of the linked payment cardValues: LINKED | UNLINKED
BINIntegerA Bank Identification Number (BIN): the first 4–6 digits of a payment card that identify the card issuerExample: 1234 or 123456

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.csvYYYYMMDDHHMISS 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

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_SMSES_SMS
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20240617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionSample values
PKAccountIDString36Unique account identifierRequired
PKShortCodeString255The code used to send and receive SMS messagesRequired. Example: DEFAULT
StatusString50The status of the SMS subscription for a memberRequired. Values: PENDING | DEFERRED | OPTED_IN | OPTED_OUT
OptInSourceString50The channel through which opt-in occurredOptional. Values: POS | CUX | CONSOLE
OptOutSourceString50The channel through which opt-out occurredOptional. Values: POS | CUX | CONSOLE
OptInTimestampTimestamp50The date and time when opt-in occurred. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMOptional. Example: 2024-01-26T08:14:51.903 -0800
OptOutTimestampTimestamp50The 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

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.csvYYYYMMDDHHMISS contains the date and time the feed was extracted.

Snowflake data share table name: DWHF_ACTIVITY

Header

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_ACTIVITYES_ACTIVITY
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20240617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKAccountIDString50The account ID associated with the token
PKActivityIDString50The activity ID
PKVersionNumberIntegerSequential number for each update in the table
VersionEffectiveTSTimestamp29The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2024-01-26T08:14:51.903 -0800
ActivityTypeString50The type of activityExample: FIRST_TIME_LOGIN
LoyaltyIDString50The loyalty card number
AuditDetailsVariantAudit details
StatusString50The status of the activityExample: REWARDED
TransactionIDString50The transaction ID this activity is linked to
ActivityDataVariantActivity data
ActivityTSTimestamp29The date and time of the activityExample: 2024-01-26T08:14:51.903 -0800

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.csvYYYYMMDDHHMISS 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
FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_BURN_RECONCILIATIONES_BURN_RECONCILIATION
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20240617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail
PKFieldTypeLengthDescriptionNotes/Sample values
PKCorrelationIDStringUnique identifier passed in the request body, used to identify or retrieve a transactionRequired
ExternalIdentifierStringUnique identifier used by the external systemOptional
AccountIDStringUnique identifier for the ES Loyalty accountOptional
LoyaltyIDStringThe unique loyalty ID of the member who made a transaction. Not used if TransactionType = POINTS_TRANSFER.Optional
TransactionTypeStringThe type of transactionRequired. Example: FINALIZE
TransactionDateTimestampThe date and time the transaction took placeRequired. Example: 2025-05-10T16:28:59.764Z
ProcessedDateTimestampThe date and time the transaction was processedRequired. Example: 2025-05-10T16:30:59.764Z
StoreStringReferences a store or ecommerce site from the location feedOptional
ChannelStringThe channel in which the transaction took placeOptional. Example: POS | ONLINE
MembershipTiersArrayNames all the different tier levels, such as Bronze, Silver, and Gold. The array may be empty if there are no membership tiers.Optional
MembershipTierCodeStringThe applicable membership tier, such as Bronze, Silver, or Gold. Applied to each program configured for a client.Optional
ProgramIDStringThe overall membership program the tier is related toOptional
TotalRewardRedeemedNumberThe amount of the reward redeemed for this transactionRequired
TotalRedeemDollarNumberThe dollar value of the reward redeemedRequired
Trailer
FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.csvYYYYMMDDHHMISS 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
FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_EARN_RECONCILIATIONES_EARN_RECONCILIATION
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20250617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail
PKFieldTypeLengthDescriptionNotes/Sample values
PKCorrelationIDStringUnique identifier passed in the request body, used to identify or retrieve a transactionRequired
ExternalIdentifierStringUnique identifier used by the external systemOptional
AccountIDStringUnique ES Loyalty identifier for the accountOptional
LoyaltyIDStringThe unique loyalty ID of the member who made a transactionOptional
TransactionTypeStringThe type of transactionRequired. Values: ACCOUNT_EXPIRY, ACTIVITY, ADHOC_REWARD, ADJUSTMENT, DISCRETIONARY, FINALIZE, POINTS_TRANSFER, PPE, SAF, VOID
TransactionDateTimestampThe date and time the transaction took placeRequired. Example: 2025-05-10T16:28:59.764Z
ProcessedDateTimestampThe date and time the transaction was processedRequired. Example: 2025-05-10T16:30:59.764Z
StoreStringReferences a store or ecommerce site from the location feedOptional
ChannelStringThe channel in which the transaction took placeOptional. Example: POS | ONLINE
MembershipTiersArrayDescribes all different tier levels, such as Bronze, Silver, and Gold. The array may be empty if there are no membership tiers.Optional
EarnedMapArrayContains details about offersRequired
OfferCodeStringThe unique code identifying the offerOptional
OfferDescriptionStringA description of the offerOptional. Example: Spend $10, get 100 points
RewardsEarnedNumberThe quantity of rewards earned on this transactionOptional
OfferCategoryStringThe type of offerOptional. Example: bonus | targeted
ProgramIDStringThe overall membership program the tier is related toOptional
MembershipTierCodeStringThe applicable membership tier, such as Bronze, Silver, or Gold. Applied to each program configured for a client.Optional
RewardOnHoldNumberIf 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
TotalSpendNumberThe total amount spent during this transactionRequired
TotalEligibleSpendNumberThe amount spent during this transaction that is eligible for rewardRequired
TotalRewardIssuedNumberThe amount of the reward issued for this transactionOptional
RewardIssuedRateNumberThe rate of the reward issued as a percentage of the totalEligibleSpendOptional
TotalRewardDollarNumberThe dollar value of the reward issuedOptional
Trailer
FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.jsonYYYYMMDD 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

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_REDEMPTIONES_REDEMPTION
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20250617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionSample values
PKTransactionIDStringGUID unique identifier for the transactionRequired
AccountIDString36Unique account identifierRequired
HouseholdIDStringGUID unique identifier for the householdOptional. Populated only for HOUSEHOLD_REDEEM transactions.
RedemptionUniqueIDStringUnique 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
ActionStringThe action associated with the transactionRequired. Values: REDEEM | HOUSEHOLD_REDEEM
TransactionTsTimestamp50The date and time the redemption transaction occurred. Format: yyyy-mm-dd hh:mi:ss.ff3 ZRequired. Example: 2025-01-26 08:14:51.903 Z
AmountStringThe number of points redeemed in the redemption transactionRequired
RedemptionDollarValueNumberThe dollar value of the redemption transactionRequired
RedeemerIDStringUnique identifier for the redeemerOptional. Populated for redemptions when provided in the source API call.
RedemptionIDStringThe type of redemptionOptional. Populated for redemptions when provided in the source API call.
CatalogueItemIDStringUnique identifier for a catalog item included in the transactionOptional. Populated only when a catalog item is redeemed.
CatalogueItemNameStringName used to identify the productOptional. Populated only when a catalog item is redeemed.
CatalogueItemQuantityNumberQuantity of the catalog item included in the transactionOptional. Populated only when a catalog item is redeemed.

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.csvYYYYMMDDHHMISS contains the date and time the feed was extracted.

Snowflake data share table name: DWHF_SESSION

Header

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_SESSIONES_SESSION
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20240617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKSessionIDString36A primary key set by the calling system
PKVersionNumberIntegerSequential number for each update in the table
VersionEffectiveTSTimestamp29The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2024-01-26T08:14:51.903 -0800
AccountIDString36The account related to this session
LoyaltyIDInteger19The loyalty card associated with this session
CardSwipedBooleanIndicates whether the loyaltyId (if provided) was swiped (true) or keyed in (false)Values: true | false
ChannelEnum50The source channel of the session. Accepts null.Values: POS | MOBILE | WEB | CONSOLE | SYSTEM | APP | null
PointsBurnedIntegerThe points redeemed in the session
PointsEarnedIntegerThe points earned in the session
PointBalanceAtSessionStartIntegerThe account's point balance at the time the session started
PointsNetIntegerThe net difference in points that occurred in this session
SessionStatusEnum50The status of the sessionValues: OPEN | CLOSED
StartTSTimestamp29The date and time the session started. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2024-01-26T08:14:51.903 -0800

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.csvYYYYMMDDHHMISS contains the date and time the feed was extracted.

Snowflake data share table name: DWHF_TRANSACTION

Header

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_TRANSACTIONES_TRANSACTION
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20140617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKTransactionIDString36A primary key set by ES LoyaltyRequired
AccountIDString36The account associated with the transactionsRequired
ChannelEnum50The channel this transaction occurred in. Accepts nulls.Required. Values: POS | MOBILE | WEBSITE | CONSOLE | SYSTEM | APP | WEB | null
StoreNumberString50The store numberRequired. Example: 0034
EligibleTransactionAmountNumberThe amount eligible to earn base pointsRequired
IsAuditBooleanFor transactions that awarded zero points, so the reason can be reviewed. Not returned by Transaction History API calls.Required. Values: true | false
AccountStatusEnum50The status of the account. Accepts nulls.Required. Values: ACTIVE | EXPIRED | SUSPENDED | DECEASED | CLOSED | CANCELLED | UNREGISTERED | null
EligibleToEarnBooleanFlag indicating whether the transaction is eligible to earn pointsRequired. Values: true | false
LoyaltyStatusEnum50The status of the default loyalty card. Accepts nulls.Required. Values: ACTIVE | SUSPENDED | LOST_OR_STOLEN | DAMAGED | FRAUD_ABUSE | CANCELLED | null
ProcessedTSTimestampThe date and time the transaction was processed. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMRequired. Example: 2024-01-26T08:14:51.903 -0800
RequestActionEnumThe API call that triggered the reward calculationRequired. Values: ADJUSTMENT, FINALIZE, PPE, SAF, VOID, EXCHANGE, DISCRETIONARY, BEHAVIOR_ACTIVITY
TransactionAmountNumberThe dollar amount of the basketRequired
TransactionTSTimestamp29The date and time of the POS transaction itself (may be delayed if SAF). Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMRequired. Example: 2024-01-26T08:14:51.903 -0800
NetAmountIntegerThe net points amount of the transactionRequired
NewPointBalanceIntegerThe point balance after the transactionRequired
OriginalPointBalanceIntegerThe point balance before the transactionRequired
SessionIdString36The session ID associated with the transactionRequired
AgentStringThe agent username who awarded discretionary pointsRequired
ReasonStringThe reason for awarding discretionary pointsRequired
OriginalTransactionIdString36The TransactionID of the original transaction in the case of an adjustment or return. Equals the TransactionID if this is the original transaction.Required
OptinPromptResultEnum10The result from the opt-in prompt at the point of sale. Accepts nulls.Required. Values: deferred | declined | accepted | null
EmailPromptResultEnum10The result from the email address prompt at the point of sale. Accepts nulls.Required. Values: deferred | declined | accepted | null
BasePointsEarnedIntegerTotal loyalty base points earned in the transaction, excluding partner base pointsRequired
BonusPointsEarnedIntegerTotal loyalty bonus points earned in the transaction, excluding partner bonus pointsRequired
TargetedPointsEarnedIntegerTotal loyalty targeted points earned in the transaction, excluding partner targeted pointsRequired
DiscretionaryPointsEarnedIntegerTotal discretionary points earned in the transactionRequired
RedeemedPointsIntegerTotal points redeemed in the transactionRequired
RedemptionDollarValueFloatThe dollar value of the points redeemed in the transactionRequired
PartnerIdStringThe partner ID associated with the transaction. Set to the partner ID even if no points are earned.Optional
PartnerBasePointsEarnedIntegerTotal partner base points earned in the transactionOptional
PartnerBonusPointsEarnedIntegerTotal partner bonus points earned in the transactionOptional
PartnerTargetedPointsEarnedIntegerTotal partner targeted points earned in the transactionOptional
CallIdStringUnique identifier for the transaction, different from transactionId and sessionId. Generated by the source system or internally for transactions missing this field.Optional
UserAgentStringThe agent's name who made the profile updateOptional. Values: Anonymous | Loyalty_id | AgentName
LinkedTransferTransactionIDString36Stores the TransactionID associated with the transfer pointsOptional
LinkedTransferAccountIDString36Stores the AccountID associated with the transfer pointsOptional
PriceMatrixString50Contains an identifier for the price matrix usedOptional
ExtendedDataObjectContains additional attributes used by the clientOptional
SessionIdentifierTypeString50Helps clients track the identifiers used to initiate a transactionOptional. Values: LOYALTY_ID | PARTNER_LINK_ID | EMAIL | ACCOUNT_ID | EXTERNAL_ID | PHONE_NUMBER
SessionIdentifierValueString50Provides the value of the session identifierOptional
RewardIDString50Used to associate the transaction with an existing reward identifierOptional
BusinessUnitString50The business unit associated with these promotionsOptional. Currently enabled for one client.

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.csvYYYYMMDDHHMISS contains the date and time the feed was extracted.

Snowflake data share table name: DWHF_TRANSACTION_PROMO_AUDIT

Header

FieldTypeLengthDescriptionSample values
File identifierString100Constant value: ES_TRANSACTION_PROMO_AUDITES_TRANSACTION_PROMO_AUDIT
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20240617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKTransactionPromoAuditIDString100Used to join this table with associated details
TransactionIDString36The transaction ID this audit is linked to
PromotionSubCategoryString50Client-specific reporting identifierValues: BASE | BONUS
PromotionDescriptionString500Description of the promotionExample: Get 500 bonus points on spend over $20
OfferCodeString500Unique promotion name (also known as the offer code)Example: Get500
PromotionVersionIntegerThe version of the promotion used in this transaction
PromotionTierNameStringThe unique name of the promotion tier, if applicable
RewardNumberThe number of points rewarded
SpendNumberThe 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.
MessageDocumentThe message associated with the auditExample: "EXCLUSION": "User is not targeted for this promotion"
NumberOfItemsIntegerThe number of items recognized by the promotion
CategoryStringThe promotion categoryValues: BASE | BONUS | TARGETTED
PartnerIDStringThe partner identifier associated with this promotionExample: MGABNK
CallIdStringUnique identifier for the transaction, different from transactionId and sessionId. Generated by the source system or internally for transactions missing this field.

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.csvYYYYMMDDHHMISS contains the date and time the feed was extracted.

Snowflake data share table name: DWHF_TRANSACTION_PROMO_AUDIT_DETAIL

Header

FieldTypeLengthDescriptionSample values
File identifierString100Constant value: ES_TRANSACTION_PROMO_AUDIT_DETAILES_TRANSACTION_PROMO_AUDIT_DETAIL
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20240617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKTransactionPromoAuditDetailIDString100Used to join this table with the parent
TransactionIDString36The transaction ID this audit detail is linked to
AmountNumberThe spend associated with this item
CountIntegerThe number of items considered
IdString500The identifier of the item considered
TypeString50The type of item consideredExample: SKU
DisbursedPointsFloatThe 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.
CallIdStringUnique identifier for the transaction, different from transactionId and sessionId. Generated by the source system or internally for transactions missing this field.

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.csvYYYYMMDDHHMISS contains the date and time the feed was extracted.

Snowflake data share table name: DWHF_TRANSACTION_TENDER

Header

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_TRANSACTION_TENDERES_TRANSACTION_TENDER
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20240617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKTransactionIDString36A primary key set by ES LoyaltyRequired
PKTenderIdStringUnique identifier for each tender objectRequired
TenderTypeStringThe type of tender usedRequired. Values: VISA | CASH | DEBIT | COUPON | MSTCARD | AMEX
PaymentCardPrefixInteger6The first 6 digits of the payment card number. NULL if not sent in the transaction.Required. Example: 604291
PaymentCardLast4Integer4The last 4 digits of the payment card number. NULL if not sent in the transaction.Required. Example: 5876
CardHolderTypeStringThe cardholder typeRequired. Values: Retail (personal) | Business (small business)
CardTypeString1The type of payment card. Credit and debit are supported.Required. Values: C | D
AmountFloatThe amount paid with this payment cardRequired. Example: 60.00
LinkedPartnerStringThe partner linked to this payment card, if applicable to the program. NULL if no partner applies.Optional. Example: MGABNK
CallIdStringUnique 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_flagBooleanIndicates whether the account is associated with a link_idRequired. Values: true | false

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.csvYYYYMMDDHH24MISS contains the date and time the feed was extracted, with HH in 24-hour format.

Header

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_FULFILLMENT_DIRECT_DEPOSITES_FULFILLMENT_DIRECT_DEPOSIT
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20250617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKETIDString36Unique email template identifier. Specifies which email template is used to send out a reward.Required. Retrieved from program configuration.
RecipientEmailStringThe member's email addressRequired
RecipientFirstNameString36The member's first nameRequired
RecipientLastNameString36The member's last nameOptional. Populated if available.
UTIDStringBlackhawk Network reward identifierRequired. Retrieved from program configuration.
RewardAmountNumberThe 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
CustomerNotesStringThe ad hoc redemption transaction identifierOptional. Map the ad hoc transaction identifier to this field.
DoNotCompleteStringRequired for card system processingRequired. Leave empty.
MessageStringThe message to the member. Maps to a dynamic tag if one exists in the email template.Optional. Leave empty.
FromNameStringThe client company name. Maps to a dynamic tag if one exists in the email template.Optional. Leave empty.

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.csvYYYYMMDDHH24MISS 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

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_FULFILLMENT_DIRECT_DEPOSITES_FULFILLMENT_DIRECT_DEPOSIT
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20250617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKAccountIDString36Unique internal account identifierRequired
PKLoyaltyIDString10Unique Exchange Solutions card numberRequired
ExternalIDString10Unique account or member identifier used by the clientOptional
EmailAddressStringThe member's email addressRequired
AdHocRedemptionTransactionIdString24Internal unique identifier for the transactionRequired. GUID.
FirstNameString36The member's first nameRequired
LastNameString36The member's last nameRequired
BusinessNameStringThe member's business nameOptional
PointsIntegerThe number of points redeemedRequired
FulfillmentTypeStringThe type of fulfillment requestedRequired. Always set to: DIRECT_DEPOSIT
RedemptionAmountDecimalThe dollar value of the statement credit in the currency provided. May have two decimal places when required.Required. Example: 50
TransactionTSTimestampThe redemption transaction date and time stampRequired. Example: 2025-01-02T08:51:57.828+0000
AccountNumberStringThe member's bank account numberRequired. Example: 1234566777
AccountHolderTypeStringThe member's bank account holder typeRequired. Example: Savings
BankNameStringThe member's bank nameRequired. Example: MEGABANK
BankInstitutionNumberString3The member's bank institution numberRequired. Example: 045
TransitNumberString5The member's bank transit numberRequired. Example: 12345

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.csvYYYYMMDDHH24MISS 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

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_FULFILLMENT_STATEMENT_CREDITES_FULFILLMENT_STATEMENT_CREDIT
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20250617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKAccountIDString36Unique internal account identifierRequired
PKLoyaltyIDString10Unique Exchange Solutions card numberRequired
ExternalIDString10Unique account or member identifier used by the clientOptional
EmailAddressStringThe member's email addressRequired
AdHocRedemptionTransactionIdString24Exchange Solutions internal unique identifier for the transactionRequired. GUID.
FirstNameString36The member's first nameRequired
LastNameString36The member's last nameRequired
BusinessNameStringThe member's business nameOptional
PointsIntegerThe number of points redeemedRequired
FulfillmentTypeStringThe type of fulfillment requestedRequired. Always set to: STATEMENT_CREDIT
RedemptionAmountDecimalThe dollar value of the statement credit. May have two decimal places when required.Required. Example: 500
TransactionTSTimestampThe redemption transaction date and time stampRequired. Example: 2025-01-02T08:51:57.828+0000

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.csvYYYYMMDDHHMISS contains the date and time the feed was extracted.

Header

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_FREQUENCY_OFFER_PROGRESSES_FREQUENCY_OFFER_PROGRESS
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20240617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKAccount_IDString36Unique account identifierExample: 224ca9eb-46c8-4bc2-9f61-1abee621b830
PKAccountIdentifierTypeString10Account identifier type, unique per clientValues: ACCOUNT_ID | LOYALTY_ID
PKOfferCodeString36Unique promotion codeExample: TIER_PROGRESSION_OFFER_TIER2
PKOfferNameString36Description of the promotion codeExample: Spend $100 to get 3000 points
VersionEffectiveTSTimestamp29The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2020-01-26T08:14:51.903 -0800
VersionExpiryTSTimestamp29The date and time the version expired. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2024-01-26T08:14:51.903 -0800
CompletionEarnedIntegerThe number of times an offer has been completedExample: 1, 2
CompletionIsLimitReachedBooleanFlag indicating whether the completion limit has been metValues: TRUE | FALSE
CompletionLimitIntegerThe maximum number of times a reward can be completedExample: 1 or 2
CompletionRewardIntegerThe count of rewards earned for each completionExample: 1 or 2
ContributionTypeStringThe offer typeValues: Spend | Quantity
ContributionNextIntegerBased on the amount spent, this shows the remaining amount needed to reach the thresholdExample: 23, 40
ContributionTotalIntegerThe total amount spent on an offerExample: 90, 80
ContributionUnusedIntegerThe amount spent above the threshold for an offer codeExample: 2, 8
ContributionTransactionsStringThe list of transactions associated with the offerExample: [mck-8ba27f9c-5e3c-b1f8-37ce704cf7d, mck-8ba28f8c-5e3c-b1f8-37ce7uyuy619]
ContributionPercentageIntegerThe completion percentile for an offer based on the contribution typeExample: 100, 50

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.csvYYYYMMDDHHMISS contains the date and time the feed was extracted.

Snowflake data share table name: DWHF_PROMOTION

Header

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_LIVE_PROMOTIONES_LIVE_PROMOTION
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20240617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKOfferCodeString500Unique identifier for the offerRequired
PKPromotionVersionString10The version of the promotionRequired. Example: v2
PKVersionNumIntegerSequential number for each update in the tableRequired
VersionEffectiveTSTimestamp29The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMRequired. Example: 2024-01-26T08:14:51.903 -0800
ActivationTSTimestamp29The date and time of activation. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMRequired. Example: 2024-01-26T08:14:51.903 -0800
ApprovalTSTimestamp29The date and time of approval. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMRequired. Example: 2024-01-26T08:14:51.903 -0800
ApprovedByString50The user who approved the promotionRequired. Note: MVP requires no offer approvals.
BasedOnString10The version of the promotion this was based onRequired. Example: v1
BusinessUnitString50The business unit associated with these promotionsOptional. Currently enabled for one client.
ChannelEnum50The valid channel for the offer. May contain nulls.Required. Values: POS, MOBILE, WEBSITE, CONSOLE, SYSTEM, APP, WEB, null
EffectiveTSTimestamp29The date and time the promotion is valid. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMRequired. Example: 2024-01-26T08:14:51.903 -0800
ExpiryTSTimestamp29The expiry date and time of the promotion. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMRequired. Example: 2024-01-26T08:14:51.903 -0800
StatusEnum50The status of the promotionRequired. Values: ACTIVE | EXPIRED
SubmissionTSTimestamp29The date and time the promotion was submitted for approval. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMRequired. Example: 2024-01-26T08:14:51.903 -0800
SubmittedByString50The user who submitted the promotionRequired
CategoryStringThe promotion categoryRequired. Example: PROMO
SubCategoryStringThe promotion sub-categoryRequired. Example: BONUS
ActivationMethodStringThe method of activating the promotionRequired. Values: MASS | LTC
DisableGlobalExclusionBooleanFlag to disable the global exclusion rules for a promotionRequired. Values: true | false
LongDescriptionStringThe long description of the promotionRequired
OfferNameStringThe name of the promotionRequired
RankIntegerThe rank of the promotion compared to other promotionsRequired
RewardGroupArrayThe reward groupRequired
ShortDescription1StringThe first section of the promotion descriptionRequired
ShortDescription2StringThe second section of the promotion descriptionRequired
IsVendorFundedBooleanFlag indicating whether the promotion is vendor fundedRequired. Values: true | false
IsDynamicBooleanFlag indicating whether the promotion is dynamicRequired. Values: true | false
IsEmployeeDiscountCompatibleBooleanFlag indicating whether the promotion is compatible with an employee discountOptional. Values: true | false
MultiBehaviorFlagBooleanFlag indicating whether the promotion is multi-behavioralOptional. Values: true | false
PromotionHeadlineStringThe headline used with the offerOptional
SmallImageURIStringA URL pointing to a CDN containing a small standard-resolution image for this offerOptional
SmallHDImageURIStringA URL pointing to a CDN containing a small high-resolution image for this offerOptional
LargeImageURIStringA URL pointing to a CDN containing a large standard-resolution image for this offerOptional
LargeHDImageURLStringA URL pointing to a CDN containing a large high-resolution image for this offerOptional
DisplayDateTimestampThe date the offer can be displayed to users. ISO format.Optional

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.csvYYYYMMDDHHMISS contains the date and time the feed was extracted.

Snowflake data share table name: DWHF_PRODUCT_SPOTLIGHTING

Header

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_PRODUCT_SPOTLIGHTINGES_PRODUCT_SPOTLIGHTING
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20240617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKOfferCodeString36Unique promotion codeExample: TIER_PROGRESSION_OFFER_TIER2
PKProductCodeStringThe product code of the product targeted by the offerExample: 068780000108
OfferNameString36Description of the promotion codeExample: Spend $100 to get 3000 points
EffectiveTSTimestamp29The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2025-01-26T08:14:51.903 -0800
ExpiryTSTimestamp29The date and time the version expired. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2025-01-26T08:14:51.903 -0800
RedemptionOfferBooleanFlag indicating whether the offer is a redemption offerValues: TRUE | FALSE
AllProductsBooleanIf there is no cart selector, the promotion targets all products. If true, product_code_type and product_code are NULL.Values: TRUE | FALSE
ProductCodeTypeStringThe type of product codes. These are configurable values.Values: GTIN | UPC | Product_id

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.csvYYYYMMDDHHMISS contains the date and time the feed was extracted.

Snowflake data share table name: DWHF_PROMOTION_METADATA

Header

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_PROMOTION_METADATAES_PROMOTION_METADATA
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20240617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKOfferCodeString500Unique promotion identifier
PKPromotionVersionString10The promotion versionExample: v1
PKVersionNumIntegerSequential number for each update in the table
VersionEffectiveTSTimestamp29The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMExample: 2024-01-26T08:14:51.903 -0800
EventNumberString500A tag grouping promotions together
ReportingIdentifierString500Client-specific reporting identifier
VehicleDescriptionString500Description of a promotion grouping event
VehicleNumberString500A tag grouping promotions together
DurationIntegerThe number of days this offer should be active for each user
CardinalityIntegerThe number of times this offer can target a user
ActivityActionString500The activity actionExample: MEMBER_REGISTRATION

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.csvYYYYMMDDHHMISS contains the date and time the feed was extracted.

Snowflake data share table name: DWHF_PROMOTION_TIER

Header

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_PROMOTION_TIERES_PROMOTION_TIER
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20240617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKOfferCodeString500Link back to the promotion tableRequired
PKPromotionVersionString10The promotion versionRequired. Example: v1
PKVersionNumIntegerSequential number for each update in the tableRequired
PKTierNameString50Unique name for the tierRequired
VersionEffectiveTSTimestamp29The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMRequired
PrecedenceNumberTiers are evaluated in ascending order based on their precedence valuesRequired
RewardAmountNumberThe number of points or point multiplierRequired
RewardTypeEnum50The type of rewardRequired. Values: MULTIPLIER | FLAT
ThresholdTypeEnum50The threshold typeRequired. Values: MIN/MAX | PER
ThresholdValueNumberThe actual value of the thresholdRequired
ThresholdCategoryEnum50The category of the thresholdRequired. Values: SPEND | UNIT
ThresholdSubCategoryEnum50The sub-category of the thresholdRequired. Values: AMOUNT | COUNT
ThresholdIDStringUnique identifier for the thresholdOptional
ProductSelectorIDStringUnique identifier for a product attached to this tierOptional

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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.csvYYYYMMDDHHMISS contains the date and time the feed was extracted.

Snowflake data share table name: DWHF_TARGETED_OFFER

Header

FieldTypeLengthDescriptionSample values
File identifierString50Constant value: ES_TARGETED_OFFERES_TARGETED_OFFER
Extraction start dateDate8The date the feed was extracted. Format: YYYYMMDD20240617
Extraction start timeTime6The time the feed was extracted. Format: HHMISS (UTC)164800

Headers can alternatively be configured to display column names to meet client requirements.

Detail

PKFieldTypeLengthDescriptionNotes/Sample values
PKAccountIDString36The targeted account IDRequired
PKOfferCodeString500The promotion this offer is part ofRequired
VersionNumberIntegerSequential number for each update in the tableRequired
VersionEffectiveTSTimestamp29The date and time the version took effect. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMRequired. Example: 2024-01-26T08:14:51.903 -0800
OfferVersionIntegerThe version of the offerRequired
AcceptedOfferVersionIntegerThe version of the offer being acceptedRequired
AcceptanceStateEnum50The current acceptance state of the targeted offerRequired. Values: NONE | COMPLETED | DECLINED | ACCEPTED
AcceptanceTSTimestamp29The date and time the offer was accepted. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMRequired. Example: 2024-01-26T08:14:51.903 -0800
EffectiveTSTimestamp29The date and time the targeted offer becomes active. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMRequired. Example: 2024-01-26T08:14:51.903 -0800
ExpiryTSTimestamp29The expiry date and time for the targeted offer. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMRequired. Example: 2024-01-26T08:14:51.903 -0800
MaxCompletionsIntegerThe maximum number of times this offer may be completedRequired
CompletionCountIntegerThe number of times the offer has been completedRequired
CompletedTSTimestamp29The date and time the offer was last completed. Format: yyyy-mm-ddThh:mi:ss.ff3 TZHTZMRequired. Example: 2024-01-26T08:14:51.903 -0800
TreatmentTypeStringDescriptor for the purpose of this offerOptional. Example: Test | Program

Trailer

FieldTypeLengthDescriptionSample values
Trailer identifierString7Constant value: TRAILERTRAILER
Record countIntegerThe 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"
}