Loyalty Reward Redemption
Also known as: loyalty_redeem, Points Redemption, Reward Redemption, Member Offer Redemption, Loyalty Points Burn
Fires when the loyalty ledger confirms a points debit or reward application. It records the immutable redemption ID and benefit without treating reward value as revenue.
Event Serialization
always
Business Use Case
1️⃣ The CRM & Loyalty Manager (Marketing) reviews the weekly redemption mix by loyalty_tier and reward_type; when free-shipping redemptions in a tier climb above plan while points burn stays flat, they re-price that reward in the catalogue and shift the tier's featured offer.,2️⃣ Revenue Accounting (Finance) uses points_redeemed and points_balance_after at month-end to release deferred loyalty liability, and cross-checks reward_value against the discount lines on the matching purchase transaction_ids so the benefit is recognised once rather than double-counted as revenue.,3️⃣ The Lifecycle Marketing lead builds a segment of enrolled members with zero redemptions in the last 90 days and a positive balance, and triggers the points-expiry reminder journey ahead of the programme's expiry run.,4️⃣ The Merchandising planner joins redemption transaction_ids to order contribution margin to identify which reward types dilute margin most by category, and caps the highest-dilution reward before the peak trading window.
Business Criticality
High
Journey / Navigation Area
Engagement
Owning Function
Marketing
Calculation Notes
1️⃣ Implemented as the GA4 recommended event `spend_virtual_currency`, fired on the loyalty platform's confirmation of the points debit or reward application — not on the reward-selection click and not on the confirmation page render; `loyalty_redeem` is retained as an alias only and must never be sent as the event name.,2️⃣ points_redeemed carries the virtual-currency debit (mapped to the GA4 `value` parameter alongside virtual_currency_name) and reward_value carries the fiat face value of the benefit paired with an ISO-4217 `currency`; the two are never interchangeable and are never summed together. reward_value is excluded from revenue, GMV and AOV because the matching `purchase` event already reports the discounted order value under the same transaction_id.,3️⃣ Serialization is `always`: a member may redeem several times per order (for example points plus a free-shipping offer), so one event fires per reward with a shared transaction_id. Deduplicate on reward_id + transaction_id when a member refreshes or re-enters the confirmation step, and apply the standard 30-minute inactivity session timeout — a redemption resumed after a lapse is attributed to the new session while transaction_id preserves the order-level join.,4️⃣ Excluded: reward previews and balance simulators, points expiring under programme rules with no member action, member pricing applied automatically without a reward object (measured as a member price benefit in promotion reporting), goodwill points issued by service agents, and employee, test and internal QA accounts identified by the loyalty account flag (GA4 user property loyalty_account_flag, ACDL/XDM loyalty.member.accountFlag, W3 profileInfo.loyaltyAccountFlag; values employee, test, internal).,5️⃣ Cancellations and returns re-credit the points in the loyalty ledger — never delete or retro-edit the original event. Net redemption is derived by joining the re-credit to the original reward_id and transaction_id, and every report that publishes net figures must state the reversal window in force (typically the 30-day return window).,6️⃣ Non-order redemptions (partner point exchanges, charity donations, tier benefits) carry a null transaction_id and, where no monetary benefit exists, reward_value = 0 with currency still populated; these rows must be filtered out of any checkout-attach or basket-level analysis rather than being treated as zero-value orders.,7️⃣ Timing and reconciliation: client events land within normal digital-analytics intraday latency while the loyalty ledger remains the system of record for balances. Reconcile points_redeemed against ledger debits daily, use points_balance_after as the tie-breaker on disputes, and treat a variance above 2% as a tagging defect rather than a business movement.
Platform Events
| Platform | Event |
|---|---|
| Google Analytics 4 | spend_virtual_currency |
| Adobe | spend_virtual_currency |
Data Mappings
W3 Data Layer
{
"digitalData": {
"page": {
"pageInfo": {
"pageName": "Loyalty | Reward Redemption Confirmation"
},
"category": {
"primaryCategory": "Loyalty",
"subCategory1": "Reward Redemption"
}
},
"user": [
{
"profile": [
{
"attributes": {
"customerLoyaltyTier": "gold",
"loyaltyAccountFlag": "member"
}
}
]
}
],
"event": [
{
"eventInfo": {
"eventName": "spend_virtual_currency",
"eventAction": "loyalty reward redemption",
"timeStamp": "{{event_timestamp}}"
},
"attributes": {
"virtualCurrencyName": "points",
"value": 2500,
"pointsBalanceAfter": 4250,
"redemptionID": "LRD-20260929-000123",
"rewardID": "RWD-FREESHIP-STD",
"rewardType": "free_shipping",
"rewardValue": 12.5,
"currency": "USD",
"customerLoyaltyTier": "gold",
"redemptionChannel": "web",
"transactionID": "ORD-10045872",
"rewardValueExcludedFromRevenue": true
}
}
]
}
}GA4 Data Layer
{
"event": "spend_virtual_currency",
"virtual_currency_name": "points",
"value": 2500,
"points_balance_after": 4250,
"redemption_id": "LRD-20260929-000123",
"reward_id": "RWD-FREESHIP-STD",
"reward_type": "free_shipping",
"reward_value": 12.5,
"currency": "USD",
"customer_loyalty_tier": "gold",
"redemption_channel": "web",
"transaction_id": "ORD-10045872",
"reward_value_excluded_from_revenue": true
}Adobe Client Data Layer
[
{
"_openkpis": {
"loyalty": {
"member": {
"customerLoyaltyTier": "gold",
"accountFlag": "member"
}
}
}
},
{
"event": "spend_virtual_currency",
"eventInfo": {
"timestamp": "{{event_timestamp}}"
},
"_openkpis": {
"loyalty": {
"redemption": {
"virtualCurrencyName": "points",
"value": 2500,
"pointsBalanceAfter": 4250,
"redemptionID": "LRD-20260929-000123",
"rewardID": "RWD-FREESHIP-STD",
"rewardType": "free_shipping",
"rewardValue": 12.5,
"currency": "USD",
"redemptionChannel": "web",
"transactionID": "ORD-10045872",
"rewardValueExcludedFromRevenue": true
}
}
}
}
]XDM Mapping
{
"eventType": "spend_virtual_currency",
"timestamp": "{{event_timestamp}}",
"identityMap": {
"loyaltyId": [
{
"id": "{{hashed_loyalty_member_id}}",
"authenticatedState": "authenticated",
"primary": true
}
]
},
"_openkpis": {
"loyalty": {
"member": {
"customerLoyaltyTier": "gold",
"accountFlag": "member"
},
"redemption": {
"virtualCurrencyName": "points",
"value": 2500,
"pointsBalanceAfter": 4250,
"redemptionID": "LRD-20260929-000123",
"rewardID": "RWD-FREESHIP-STD",
"rewardType": "free_shipping",
"rewardValue": {
"amount": 12.5,
"currencyCode": "USD"
},
"redemptionChannel": "web",
"transactionID": "ORD-10045872",
"rewardValueExcludedFromRevenue": true
}
}
}
}Source Data
Digital + Loyalty CRM (Salesforce Loyalty Management)
Dependencies
Prerequisite: List the dependencies required for this Event
Dimensions:
Report Attributes
Customer Loyalty Tier Reward Type Redemption Channel Points Redeemed Band Programme Currency Customer Status Device Category
Segment Eligibility
true
Governance
Dimensions
Derived Dimensions
Derived Entities
Derived Metrics
Derived KPIs
Governance & Metadata
GitHub
catalog/events/loyalty-reward-redemption.yml