Sites That Grow
[ Blog ]
[ ]

How to Handle Recurring Payments and Subscriptions on Your Website

Stripe Billing vs Chargebee vs custom, dunning logic, proration, churn handling, and tax automation — what actually matters when you charge customers monthly.

Cover image for How to Handle Recurring Payments and Subscriptions on Your Website
[ Article tools ]

A subscription is a promise to charge the same person every month, forever, until they tell you to stop. Easy to start. Hard to do well. Most teams underestimate the second part — the dunning, proration, tax compliance, refund logic, and churn recovery — until a customer's card expires and the system either silently loses the revenue or drops them off the service without warning. Either outcome is expensive.

The good news is that the tools available in 2026 make this far more solvable than it was even five years ago. The bad news is that picking between Stripe Billing, Chargebee, Recurly, and a fully custom implementation is not obvious, and the wrong choice locks you into a billing engine that fights you for years.

This post is a practitioner's guide to the decisions that matter when you build recurring billing on your website.

What Recurring Payments Actually Have to Do

Before comparing vendors, here is the honest list of what a real subscription system has to handle. If your chosen tool punts on more than two of these, you will end up writing custom code anyway.

  • Charge a card on a schedule (monthly, annual, custom).
  • Handle failed charges intelligently (retry on smart schedules, not just every 24 hours).
  • Notify customers before charges, after charges, and after failures.
  • Allow upgrades, downgrades, and plan changes mid-cycle with correct proration.
  • Calculate and collect tax (sales tax, VAT, GST) based on customer location.
  • Issue invoices that meet the legal requirements of the customer's jurisdiction.
  • Pause, resume, and cancel subscriptions cleanly.
  • Handle refunds, credits, and account balances.
  • Provide a customer portal where users can update payment methods and view invoices.
  • Surface clean financial data for accounting and reporting.
  • Export usable revenue recognition data (deferred revenue, MRR, ARR).

The mistake most teams make is assuming Stripe handles all of this out of the box. Stripe handles most of it well, but a few pieces — like deep churn analytics, multi-currency handling at scale, and complex usage-based billing models — sit better in dedicated billing platforms.

Stripe Billing: The Default for Most Businesses

For a US-based service business or SaaS company doing under $5M ARR, Stripe Billing is almost always the right starting point. The reasons are practical:

  • One vendor for payments, billing, and tax.
  • Strong API and SDKs in every major language.
  • Stripe Customer Portal handles plan changes, payment method updates, and invoice history with no UI work.
  • Smart Retries handle failed payment recovery automatically.
  • Native support for proration, trial periods, coupons, and metered billing.
  • Stripe Tax calculates and remits sales tax in most US states and major international jurisdictions.

The implementation pattern is well-documented. You create a Customer object, attach a Payment Method, create a Subscription, and let Stripe drive the lifecycle from there. Your application listens for webhook eventscustomer.subscription.created, invoice.paid, invoice.payment_failed, customer.subscription.deleted — and updates its own state accordingly.

The critical piece most builds get wrong: the database is the source of truth for entitlements, not Stripe. When a customer pays, Stripe sends a webhook, your app verifies it, and your database flips a flag that says "this account is active." When you check whether a user can access a feature, you check your database, not Stripe. If you query Stripe on every request you will hit rate limits and add latency.

The official Stripe webhooks best practices document is required reading: verify signatures, handle idempotency, and have a retry strategy when your endpoint is down.

When to Reach for Chargebee, Recurly, or Maxio

Stripe Billing has gotten very good, but specialized billing platforms still win in specific cases.

Chargebee is worth considering when:

  • You sell in many currencies and need true multi-entity invoicing.
  • You have complex pricing models — addons, ramps, custom contracts, mid-cycle plan switches with intricate proration rules.
  • You want native revenue recognition reporting compliant with ASC 606.
  • You need granular dunning workflows beyond Stripe's defaults.
  • Your finance team wants a billing UI separate from the engineering team's Stripe dashboard.

Recurly plays in the same space with stronger churn-recovery tooling and a more mature usage-based billing engine. Maxio (formerly Chargify + SaaSOptics) is the heavyweight for B2B SaaS that needs serious financial reporting.

The honest tradeoff: these platforms cost $1,000+/month at scale and add a billing-aware layer between your app and Stripe (or whichever processor you use). They are worth it when billing complexity itself is the bottleneck. They are overkill when Stripe Billing's defaults are 90 percent of what you need.

Custom Billing: When and Why

Custom billing in 2026 means using Stripe (or a similar processor) at the payments layer and writing your own subscription, dunning, and proration logic on top. This is appropriate in roughly three situations:

  1. Your billing model is genuinely unusual — multi-party splits, usage with hard caps, hybrid one-time-plus-recurring with custom rules, or contracts with negotiated terms.
  2. You need to integrate billing tightly with internal systems (custom dashboards, advertiser ledgers, complex revenue shares) that no off-the-shelf tool models well.
  3. The cost of subscription tooling at your scale exceeds the cost of building and maintaining it yourself.

We have built custom billing for service businesses with these requirements, usually as a layer over Stripe's PaymentIntents API. It is more work but gives full control. The longer take is in our post on Stripe integrations for service businesses.

For most teams, custom billing is the wrong answer. For a few, it is the only answer. Knowing which group you are in matters more than picking the "best" platform.

Dunning: The Quiet Revenue Killer

Failed payments are the leading cause of involuntary churn. Industry research from Recurly and others puts the average failure rate at 5–10 percent of all subscription charges per month. Without active recovery, that compounds into 20–30 percent of annual revenue lost to nothing more than expired cards and insufficient funds.

A working dunning strategy includes:

  • Smart retry timing — not just every 24 hours, but based on what worked historically for similar customers.
  • Pre-dunning emails that warn customers before the charge fails (when the card is about to expire).
  • In-app banners prompting users to update payment methods.
  • Clear, non-shaming email copy when a payment fails.
  • An escalation schedule that pauses (not cancels) the subscription before fully terminating.
  • A fallback to alternate payment methods (ACH, secondary card on file) when available.

Stripe's Smart Retries and the Card Account Updater handle most of this automatically and recover a meaningful slice of failed payments without any human work. For higher-value subscriptions, layering a tool like Stunning or Churnkey on top can lift recovery further, but check whether the marginal recovery covers the tool's cost first.

Proration That Doesn't Surprise Customers

Mid-cycle plan changes are the second-largest source of billing complaints. The math is straightforward but easy to get wrong: when a customer upgrades on day 15 of a 30-day cycle, they should be charged for 15 days of the new plan and credited for 15 days of the old plan. Stripe handles this with proration_behavior on subscription updates, and the default behavior is correct for most cases.

Where it gets interesting:

  • Annual to monthly downgrades — should the credit apply immediately or at renewal?
  • Plan changes that take effect at the end of the current period vs immediately.
  • Quantity changes for seat-based pricing.
  • Trial extensions that affect the next charge date.

The right answer depends on the business, not the technology. The technology will do whatever you tell it. The hard part is deciding the policy and communicating it clearly.

A useful pattern: show customers a preview of what they will be charged before they confirm any plan change. Stripe's upcoming invoice endpoint lets you compute the exact next charge based on a hypothetical change. Most billing complaints disappear when customers can see the exact number before they click.

Tax: The Part Everyone Underestimates

Tax compliance for subscription businesses changed permanently after the 2018 South Dakota v. Wayfair ruling, which let states require tax collection from out-of-state sellers based on economic nexus alone. As of 2026, every state with a sales tax has economic nexus rules, and the thresholds are low enough that most growing SaaS businesses cross them within a year.

The practical options:

  • Stripe Tax — calculates and remits in most jurisdictions, integrates natively with Stripe Billing, and handles nexus monitoring.
  • Anrok — purpose-built for SaaS sales tax with strong multi-jurisdiction handling.
  • TaxJar and Avalara — established players, more breadth than depth on SaaS specifically.

For international, you also need to handle VAT in the EU, GST in Australia and Canada, and reverse-charge mechanisms for B2B sales. Stripe Tax covers the major jurisdictions; the specialist tools cover the rest.

Tax is one of the few areas where doing it yourself is almost never worth it. The compliance burden is real, the rules change constantly, and the penalties for getting it wrong are higher than the tool's annual cost.

Churn: The Metric That Matters Most

A subscription business with 10 percent monthly churn loses 70 percent of its customers in a year. A business with 2 percent monthly churn loses 22 percent. Same product, wildly different outcomes. Churn is the single most important metric to instrument.

Track at minimum:

  • Voluntary churn (customer canceled).
  • Involuntary churn (payment failed, no recovery).
  • Net Revenue Retention (NRR) — including upgrades and expansions.
  • Cancellation reasons, captured at the point of cancellation.
  • Time-to-cancel by cohort.

Cancellation flows are worth real design attention. A good cancel page asks why, offers a pause instead of cancellation, and surfaces a downgrade option for customers who only need less. This is the same conversion thinking we apply to acquisition flows, just on the way out — covered more broadly in our conversion-focused design work.

What to Build, What to Buy

Here is the framework most builds end up matching:

  • Payments processor: Stripe (or an equivalent like Adyen). Almost never custom.
  • Subscription engine: Stripe Billing for under $5M ARR. Chargebee or Recurly above that, or when complexity demands it.
  • Tax: Stripe Tax or Anrok. Never custom.
  • Customer portal: Stripe Customer Portal for the basic case. Custom when the portal is part of the brand or product experience.
  • Dunning beyond defaults: Custom in-app prompts plus pre-dunning emails. Specialist tools for higher-value subscriptions.
  • Reporting and revenue recognition: Custom dashboards on top of webhook data, or Maxio if compliance is a hard requirement.

Most businesses run a hybrid: Stripe Billing handles the core, custom code handles entitlements and the customer-facing UX, and a tax service handles compliance. That setup ships in weeks and scales for years.

Action Items

  • Map the full subscription lifecycle for your business, including plan changes, pauses, and cancellations. If the map has more than 12 states, you need real billing software, not a script.
  • Pick the source of truth — your database for entitlements, Stripe for billing facts. Do not mix them.
  • Implement webhook signature verification and idempotency from day one. This is non-negotiable.
  • Turn on Stripe Smart Retries and Card Account Updater. The recovery is free money.
  • Decide your tax strategy before you launch. Retroactive tax compliance is expensive.
  • Track voluntary and involuntary churn separately. They have different fixes.
  • Test your dunning emails on yourself. If they read like accusations, rewrite them.

Sites That Grow builds custom software for businesses that have outgrown the default subscription stack. If you are running into the limits of Stripe Billing or paying too much for a billing platform that does not fit, we can help you scope what comes next.

[ ]More

Keep reading?

More field notes from building modern websites and software for real businesses.