Thanks for all the insights! After thorough investigation and testing, here’s the complete solution that resolved our cross-channel redemption issues:
Root Cause Analysis:
The problem had three interconnected components that all needed to be addressed:
1. Channel Mapping Configuration:
The channel identifiers in our API requests didn’t match Adobe’s internal channel registry. We needed to query the proper channel codes:
GET /loyalty/v2/channels
Response: [
{"id": "CH_MOBILE_APP", "name": "Mobile Application"},
{"id": "CH_WEB_PORTAL", "name": "Web Portal"},
{"id": "CH_IN_STORE", "name": "Point of Sale"}
]
We were sending “mobile” but the system expected “CH_MOBILE_APP”. This mismatch caused the LYL-403 error. The in-store channel worked because our POS system was already using the correct “CH_IN_STORE” identifier.
2. Payload Validation Requirements:
Each channel has specific validation rules in AEC 2021. Mobile and web redemptions require additional fields that aren’t needed for in-store:
- transactionId: Mandatory for non-POS channels (format: TXN-{timestamp}-{random})
- deviceInfo: Required for mobile channel (deviceType, osVersion, appVersion)
- sessionToken: Required for web channel to prevent replay attacks
Our original payload was missing these channel-specific fields. Updated payload structure:
{
"memberId": "CUST-12345",
"points": 500,
"channel": "CH_MOBILE_APP",
"rewardId": "RWD-789",
"transactionId": "TXN-1234567890-ABC",
"metadata": {
"deviceType": "iOS",
"appVersion": "3.2.1"
}
}
3. Redemption Rules Configuration:
We discovered that while the admin console showed “all channels enabled” at the program level, individual rewards had channel restrictions. Reward RWD-789 was only configured for in-store redemptions. We needed to:
- Navigate to Loyalty Admin > Rewards > RWD-789 > Channel Availability
- Explicitly enable CH_MOBILE_APP and CH_WEB_PORTAL
- Set channel-specific point multipliers (mobile had 1.0x, needed to be configured)
- Configure redemption limits per channel (mobile was set to 0, blocking all redemptions)
Complete Implementation Solution:
-
Channel Registry Integration: Modified our integration layer to cache channel identifiers from the /loyalty/v2/channels endpoint (refreshed daily)
-
Dynamic Payload Construction: Built a payload builder that adds required fields based on channel:
- Mobile: adds deviceInfo from app context
- Web: adds sessionToken from user session
- All non-POS: generates unique transactionId
-
Reward Configuration Audit: Ran a script to verify all active rewards are enabled for all channels we support. Found 23 rewards that needed channel configuration updates.
-
Error Handling Enhancement: Implemented specific error handling for LYL-403 that provides clear guidance to users and logs detailed diagnostics for our team.
Results:
- Mobile redemption success rate: 0% → 98.5%
- Web redemption success rate: 0% → 97.2%
- Support tickets reduced by 85%
- Average redemption processing time: 1.2 seconds
Important Notes for AEC 2021:
- The channel validation is case-sensitive and prefix-specific (must use CH_ prefix)
- Redemption rules can override program-level channel settings - always check both levels
- The API documentation doesn’t clearly indicate which fields are channel-dependent - test thoroughly
- Consider implementing a pre-validation check before redemption attempts to provide better UX
We also built a monitoring dashboard that tracks redemption success rates by channel, which helped us identify the issue faster and verify the fix was working across all channels.