Engineering5/22/2026
How to Build a Billing System That Doesn't Break as You Scale
S
Sam Taylor
Shift2Dynamic Team
The Hidden Complexity of Getting Paid
It sounds easy: listen for a successful Stripe webhook, flip a boolean in your database, done. But what happens when Stripe goes down? What happens when a user upgrades, downgrades, and then has a card declined all within 5 minutes?
Without a resilient architecture, you will end up manually fixing database rows at 2 AM.
How to build it right
- Idempotency is mandatory: Stripe will send the same webhook multiple times. If your code isn't idempotent, you will credit an account three times for one payment.
- Stripe is the source of truth: Stop trying to keep your database perfectly synced with Stripe's state machine. Treat your local database as a cache.
- Fail gracefully: If your billing service crashes, your app shouldn't lock out all users. Restrict features, but don't take down the core product.
Treat billing as a standalone, event-driven service. It's the most important code you will write.