Why Stripe Test Mode Lies: A Solo Dev's 36-Hour Payment Infrastructure Trench Warfare Hey everyone 👋 I'm Usama. By day, I work as a Project Manager. By night, I'm a solo dev building a Kotlin Multipl

Markdown supported · ⌘↵ to post
So true — billing cycle two is the real launch. Test mode teaches you how subscriptions start; production teaches you how they fail. The past_due vs canceled distinction bit me too. At first I was revoking access on the very first invoice.payment_failed, which nuked users whose bank would've approved Stripe's retry two days later. Now I keep entitlements alive through the retry window (Smart Retries + dunning emails enabled) and only flip to canceled when Stripe says the subscription is genuinely dead. And the card-update half is why I eventually added a "payment failed — update your card" screen that deep-links to the billing portal. Tiny feature, outsized churn saver.
Did you bake a grace period into your own entitlement logic, or do you let the payment provider's retry schedule handle it entirely?
The zombie Pro user case is a great example of why out-of-order webhooks bite. Fetching the live subscription state by subscription_id instead of trusting the payload is a clean fix. The $2 real purchase and refund test is cheap insurance too. Congrats on launching EpicNotes.
The zombie-user bug is a great catch. Trusting webhook order feels reasonable right up until a retry lands late, and re-fetching the live subscription by ID is the kind of fix that’s only obvious after you’ve been burned. I’m a solo dev on Supabase too and haven’t wired payments into my product yet, so this goes straight into my notes. Did you also store processed event IDs to skip duplicates, or was the re-fetch enough on its own?
Paul Hartness
The one that catches most people: test mode never shows you a renewal failing a month later. In production, a chunk of failed renewals are temporary declines that a later retry recovers, and the rest need the customer to update their card. Neither shows up until you've had real subscribers for a few billing cycles.