Dsquares Loyalty: Transparent Wallet & Earning Engine
Users were logging in at scale but converting at only 70% — and support was drowning in expired-voucher tickets. Rebuilt the rewards layer as a utility-first transaction companion with explicit state, real-time criteria, and graceful cart validation.
- My role
- Delivery Product Owner — wrote the PRD, ran RICE prioritization, owned the Gherkin acceptance criteria, sequenced releases across multi-brand partners
- Team
- Delivery Product Owner (author) · Mobile — iOS & Android · Backend · QA · Compliance · Retail brand partners
- Stack
- PostgreSQL · Metabase · Mixpanel / Amplitude · Push notifications · POS webhooks · ISO 8601 UTC time normalization
70% → 85%
Activation target
Login → first transaction conversion
−40%
Support overhead
Tickets tagged 'Expired Benefits' / 'Invalid Codes'
< 200ms
API latency
Cart validation p95
Init. 2
RICE winner
Real-Time Wallet & State Engine
The Problem
The loyalty app had strong reach — most logged-in users browsed for extended sessions — yet only 70% of them converted into an actual transaction. The application behaved like a passive catalog, leaving users in a state of decision paralysis when faced with high-value but abstract offers.
In parallel, support was spending an outsized share of its week answering the same two questions: why is my voucher expired, and why is this code already used. Both complaints traced back to the same root cause — users could not see the rules that governed their benefits, and the cart validation API failed loudly on edge cases rather than recovering gracefully.
- 30% drop-off between login and first transaction — the activation chasm
- No structural urgency or transparent earning logic to nudge browsing toward action
- Users unaware of voucher expiration windows and minimum-spend criteria until failure at checkout
- Cart validation API hitting race conditions during peak traffic and disconnected retail POS states
- Repeated support tickets that the application itself could have prevented
The Architecture
The redesign shifted the app from a passive catalog into an active, utility-focused transaction companion. Instead of rebuilding the catalog, three initiatives were evaluated against the RICE framework and sequenced by impact, not by elegance.
- Initiative 1 — Transparent Earning Ledger: a clean, tabular UI on the home screen detailing exactly how points are computed across different retail brands, removing calculation confusion during browsing.
- Initiative 2 — Real-Time Wallet & State Engine (the chosen focus): a full wallet overhaul replacing static lists with explicit utility-driven states ('Active,' 'Expiring in X Hours,' 'Criteria Not Met'), paired with time-sensitive push alerts before vouchers lapse.
- Initiative 3 — Proactive Cart Error Guard: enhanced cart validation API that gracefully degrades on edge-case failures — caching token states locally and surfacing clear, actionable error messages instead of generic crashes.
- API synchronization via webhooks between retail brand POS networks and the loyalty core, so an offline redemption propagates to the app database instantly and prevents 'already used code' replay attacks.
- ISO 8601 UTC timestamp normalization across multi-brand databases, so a user's app and a brand's backend agree on whether a voucher is still active.
- Intelligent local caching of voucher criteria rules for sub-200ms cart validation feedback, even during partner-server micro-downtimes.
| Initiative | Reach | Impact | Confidence | Effort (pw) | RICE |
|---|---|---|---|---|---|
| 1 — Earning Ledger | 8 | 1.5 | 80% | 2 | 4.8 |
| 2 — Real-Time Wallet Engine 🏆 | 9 | 2.5 | 90% | 4 | 5.06 |
| 3 — Cart Error Guard | 4 | 2.0 | 70% | 3 | 1.86 |
The Execution
Initiative 2 was selected first because it directly addressed the activation drop-off while systematically clearing the support ticket backlog — high reach combined with straightforward backend logic. The work was scoped from a single user story, expressed in Gherkin syntax that engineering could split into Linear/Jira epics.
- User story: 'As a loyalty app user, I want to view the exact expiration countdown and required purchasing criteria of my vouchers directly inside my wallet, so that I can confidently complete my transaction before my benefits expire without encountering cart errors.'
- Scenario — Active voucher near expiry: given the user is in 'My Wallet,' when a voucher is within 48 hours of expiration, then a high-visibility countdown renders (e.g., 'Expires in 23h 14m') alongside brand criteria (e.g., 'Valid on online orders over 500 EGP').
- Scenario — Unfulfilled criteria at cart: given the cart totals 300 EGP, when the user applies a voucher requiring a minimum spend of 500 EGP, then the API returns 'Add 200 EGP more to unlock this voucher' and blocks an invalid payload from reaching the partner POS.
- Three Amigos alignment sessions (PO, QA Lead, Tech Lead) before sprint planning ensured edge cases in the data layer were accounted for before any code was written.
- Phased rollout isolated the new wallet engine to a single retail brand ecosystem first to monitor technical stability before wide-scale release.
The Impact
The wallet stopped being a list and became a decision surface. Browsing users could see exactly what to do next, and the cart stopped being a place where benefits died.
- Primary KPI — Login → first transaction conversion moving from the 70% baseline toward an 85% target.
- Operational KPI — 40% reduction in support tickets tagged 'Expired Benefits' or 'Invalid Codes' within the first 30 days of full release.
- System KPI — Cart code validation latency held under 200ms at p95, even during peak traffic.
- Trust KPI — 'Already used code' complaints replaced by proactive push alerts before vouchers lapse.
Why Initiative 2 over Initiative 1
- Higher reach — most logged-in users already visited this surface daily.
- Directly addresses both the activation chasm and the support backlog in a single release.
- Cleaner backend contract — state-machine validation rather than visual redesign work.
Cross-system blockers cleared
- POS webhook propagation delays — solved with real-time push endpoints and idempotent redemption tokens.
- Multi-brand time-zone drift — normalized to ISO 8601 UTC across databases.
- Partner-server latency on cart validation — cached criteria rules locally with explicit fallback states.
Source: Strategic PRD — Loyalty Application Optimization, Yamama, 2024