04 · The calls
Five decisions, each with the road not taken.
This is the part of product management that does not screenshot well: what got chosen, what got rejected, and the tradeoff each call accepted.
01
The server owns the match.
Rejected: comparing swipe lists in the browser
A match must be true on both phones at once, exactly once, and impossible to fake. The client cannot even insert a match. One atomic database function records the swipe, enforces the daily limit, verifies the friendship, and creates the match. The database is the referee.
02
No subscription, on principle.
Rejected: the default SaaS monthly plan
A movie night is a per day event, and once people find what to watch, they leave. Charging monthly punishes the product for doing its job. So: ₹49 for a day pass, ₹499 lifetime. Charge for the moment it saves, not the habit it creates.
03
A free tier calibrated to a real session.
Rejected: a crippled teaser that nags upgrades
50 swipes a day is roughly what a natural session consumes, so a free user gets a full, genuinely valuable session daily. The counter lives in the database, not the browser, so clearing localStorage refills nothing. Premium removes the ceiling instead of unlocking the product.
04
Swipes are global, matches are per friendship.
Rejected: a separate swipe deck per friend
Your taste is yours. A film you right swiped last month still matches the moment a new friend likes it today, so switching partners reuses your whole history instead of starting from zero. Solo swiping silently pre-builds future matches.
05
Login is one email and one code.
Rejected: passwords, and social login too
No password storage, no reset flows, no OAuth consent screens. The trade: when login itself is an email, delivery becomes the front door, so a small app got a serious email system, a queue with retries, backoff, a dead letter queue, and a suppression list.