01What do users do here — scroll a feed, search, or both?
Both: users browse and search a large, frequently changing deal catalog by category, location, and merchant — and every one of those requests is served from cache or index, never the primary database.
02A coupon has 100 uses — what is the hard rule?
It redeems exactly 100 times, ever: the global limit is enforced by an atomic conditional decrement in the datastore, so the 101st attempt fails no matter how the requests race.
03Can one user redeem the same coupon twice?
No: a per-user limit (usually one) is enforced by a unique (user_id, coupon_id) redemption record — five devices tapping at once still produce exactly one redemption.
04A merchant cuts a price — how fast must users see it?
Within seconds: every merchant write publishes a cache-invalidation event, with the TTL as backstop — because a user redeeming at yesterday’s price is a merchant dispute.
05A deal expires while a user is looking at it — what wins?
Expiry wins: redemption revalidates expires_at inside the transaction, so a deal that search still shows as live cannot be redeemed after it ends.
06A merchant disputes a redemption — what can we show them?
An append-only audit trail: who redeemed which coupon, when, from which request — every redemption is a permanent record, never an update in place.