Building a Subscription Billing System
A comprehensive guide to implementing subscription billing with Stripe, including webhooks, trials, and plan management.
Mike Johnson
Introduction
Subscription billing is the backbone of most SaaS businesses. In this guide, we'll build a complete billing system using Stripe.
Prerequisites
Setting Up Stripe
Install the Stripe SDK
``bash`
npm install stripe @stripe/stripe-js
Configure Environment Variables
`bash`
STRIPE_SECRET_KEY=sk_test_...
STRIPE_PUBLISHABLE_KEY=pk_test_...
STRIPE_WEBHOOK_SECRET=whsec_...
Creating Products and Prices
Set up your pricing in the Stripe Dashboard or via API:
`typescript
const product = await stripe.products.create({
name: 'Pro Plan',
description: 'Full access to all features',
});
const price = await stripe.prices.create({
product: product.id,
unit_amount: 4900, // $49.00
currency: 'usd',
recurring: { interval: 'month' },
});
`
Implementing Checkout
Create a checkout session to handle subscriptions:
`typescript${origin}/success?session_id={CHECKOUT_SESSION_ID}
const session = await stripe.checkout.sessions.create({
mode: 'subscription',
payment_method_types: ['card'],
line_items: [{ price: priceId, quantity: 1 }],
success_url: ,${origin}/pricing
cancel_url: ,`
});
Handling Webhooks
Webhooks are crucial for keeping your database in sync:
`typescript``
switch (event.type) {
case 'customer.subscription.created':
// Handle new subscription
break;
case 'customer.subscription.updated':
// Handle subscription changes
break;
case 'invoice.payment_failed':
// Handle failed payments
break;
}
Conclusion
A robust billing system requires careful attention to edge cases and proper webhook handling.
Written by
Mike Johnson
Sharing insights on building modern SaaS applications.