Membership & Rewards
The loyalty backbone of a two-market personal-finance platform: points, cashback rules, a rewards store where points buy real products, and the wallet.
Watch the explainer: Membership & Rewards, 70 secondsWatch the 70-second narrated explainer. English captions on.Read the transcript
TL;DR
Cashback rules moved from files to a database with admin APIs, a hardened points economy, and partner gift-card fulfilment reconciled on a schedule.
01
Context
Loyalty systems are where correctness meets money. Points must expire on schedule, cashback rules must be editable by operations without deployments, partner-fulfilled gift cards must reconcile against what partners actually delivered, and every inconsistency is a user seeing a wrong balance.
02
What I built
- A cashback rules engine migrated market by market from files on object storage to a proper database model with admin APIs, then the legacy path decommissioned entirely.
- A hardened points economy: a daily expiry worker on its own queue, blocked-redemption awareness, backfill tooling and a fraud gate on the points-purchase checkout.
- End-to-end partner gift-card fulfilment: issue-order APIs, completion webhooks, background workers, refund logic and scheduled reconciliation against partner state, since webhook delivery alone cannot guarantee consistency.
- A storefront API suite of roughly 35 PRs: search, filters, recommendations that skip providers whose card the user already holds, promotional pricing and the cache-correctness fixes that come with all of it.
- The full vertical: the Rails backend, the Vue admin console and analytics across the Nuxt storefront, with identifier migrations shipped as same-day paired frontend and backend PRs.
03
Engineering judgment
Financial correctness was engineered on the assumption that every external integration eventually fails silently: reconciliation jobs compare internal state against partner records on a schedule, and production data corrections follow a strict protocol of verified backups and repeatable backfill tasks rather than ad-hoc intervention. The system is designed to notice inconsistency before a user does.
04
Outcome
More than 200 merged PRs over three-plus years across backend, admin and storefront, growing a cashback-rules service into a two-market loyalty economy with expiry, fraud controls, partner fulfilment and reconciliation.
05
Transcript
Read the 70-second explainer as text
Loyalty is where correctness meets money. Every inconsistency is a user seeing the wrong balance. Membership and Rewards is the loyalty backbone of a two-market fintech platform.
Cashback rules lived as files on object storage, but operations needed to edit them without a deploy. So, market by market, they moved into a database with admin APIs, and the legacy path was switched off. Points must expire on schedule, so a daily expiry worker runs on its own queue. And when someone buys points at checkout, a fraud gate screens the purchase first.
Gift cards: issue the order, wait for the webhook, refund on failure. But webhooks alone cannot guarantee consistency, so a scheduled reconciliation checks against the partner's records. Built on Rails, Kafka, Elasticsearch and Sidekiq, with Vue and Nuxt. Over 200 merged PRs in 3+ years, as full-stack owner.
Assume every integration fails. Notice before the user does.