Building dual-platform SaaS on nights and weekends. No fluff, just code, Stripe nightmares, and the reality of shipping
I'm Usama, a PM and solo dev building EpicNotes (a native KMP app for the Android+Mac combo). I write about the unglamorous side of shipping: wiring webhooks at 2 AM, fighting app store compliance, and the code that actually survives.
Markdown supported · ⌘↵ to post
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.