From account creation to your first paid subscription, with the choices that matter long-term.
Most Stripe setup tutorials show you the happy path and skip the decisions that bite later: tax behaviour, proration mode, trial design, webhook architecture. This guide walks through a production-ready Stripe setup for a B2B SaaS in about 30 minutes of work, including the choices we'd recommend and the ones to avoid.
Step 1
Create a Stripe account and complete activation
Go to dashboard.stripe.com and sign up with your business email. Stripe will ask for company details, beneficial owners, a business bank account, and tax IDs. Don't skip activation — you can use test mode immediately, but you cannot accept real payments until your account is fully activated. This typically takes 1–2 business days.
Tip
Use a dedicated email alias like billing@yourcompany.com — Stripe sends critical notifications (disputes, failed payouts) and you don't want them lost in personal inboxes.
Step 2
Configure your products and prices
In Stripe, a Product represents a thing you sell (e.g. 'FlowMRR Starter') and a Price is how much it costs in a specific configuration (monthly $29, yearly $299, in EUR, etc.). Create one Product per plan tier, and one Price per billing interval and currency you support. Don't reuse Prices across plans — once a Price is attached to a subscription, you can't easily change its amount; you create a new Price and migrate.
Watch out
Never delete a Price that has ever been used — Stripe forbids it, and active subscriptions reference it. Archive instead.
Step 3
Pick the right tax behaviour
Under Settings → Tax, choose how prices are presented: 'Inclusive' (tax included in the displayed price) or 'Exclusive' (tax added at checkout). For B2B, exclusive is standard. For B2C in EU jurisdictions, inclusive is required. Enable Stripe Tax if you sell in multiple countries — it handles VAT, GST, and US sales tax automatically and saves a colossal amount of accounting pain.
Tip
Stripe Tax costs 0.5% per transaction in registered jurisdictions but typically saves 10–50× that in compliance work and accountant fees.
Step 4
Choose your proration policy
When a customer upgrades mid-cycle, Stripe can either prorate (charge the difference for the remaining days) or wait until the next cycle. Default is 'create_prorations'. For most SaaS, you want 'always_invoice' so upgrades generate an immediate invoice — clean accounting, instant cash, no surprise charges later. Set this on the subscription itself, not globally.
Step 5
Enable Smart Retries and Card Account Updater
Under Settings → Subscriptions and emails → Recovery, turn on Smart Retries. This uses Stripe's ML model to time payment retries when they're most likely to succeed instead of fixed intervals. Then enable Card Account Updater (Settings → Billing → Subscriptions) — for ~$0.25 per update, Stripe automatically refreshes expired or replaced cards without bothering the customer. Together these typically recover 30–50% of involuntary churn for free.
Tip
Card Account Updater alone often pays for itself in the first month for any SaaS with > $10K MRR.
Step 6
Set up the customer portal
The Stripe customer portal lets your customers update payment methods, view invoices, change plans, and cancel — all without involving you. Enable it under Settings → Billing → Customer portal. Decide what customers can do (cancel? change plans? pause?) based on your support load and your willingness to make cancellation easy. Don't make cancellation impossible — it generates chargebacks.
Watch out
Hiding the cancel button increases dispute rates measurably. Make cancellation easy and invest in retention instead.
Step 7
Configure webhooks
Webhooks are how Stripe tells your server about events (subscription created, invoice paid, payment failed). Without webhooks, your database will drift from Stripe's reality. Add a webhook endpoint under Developers → Webhooks pointing to https://your-app.com/api/webhooks/stripe, and subscribe to at minimum: customer.subscription.created/updated/deleted, invoice.payment_succeeded/failed, customer.created/updated. We have a separate guide on getting webhook handling right.
Step 8
Test end-to-end with test cards
Before going live, run a full subscription lifecycle in test mode: create a customer, attach card 4242 4242 4242 4242, start a subscription, force a payment failure with 4000 0000 0000 0341, trigger a renewal with the time-skip API, and cancel. Verify your database reflects each step accurately. Then switch keys to live mode and do one $1 real subscription on your own card to make sure production works.
Once Stripe is connected, FlowMRR turns subscription events into MRR, retention, recovery, and forecast views.
Tip
Stripe's CLI (stripe listen --forward-to localhost:3000/api/webhooks/stripe) lets you test webhooks against a local server. Use it.
That's the foundation. With Smart Retries, Card Updater, the customer portal, and clean webhooks, you've eliminated 90% of the operational pain that hits SaaS founders six months in. The remaining 10% is dunning copy and pricing — both of which you can iterate on.
Checkout is faster to ship (a hosted page with one redirect) and PCI-compliant out of the box. Elements gives more control for embedding payment forms in your own UI. For a v1 SaaS, Checkout is almost always the right answer — switch to Elements when you have a specific design or flow constraint.
How do I handle EU VAT correctly?+
Enable Stripe Tax. It auto-collects the correct VAT for B2C and uses the customer's tax ID for B2B reverse-charge. For US sales tax, the same setting handles state-by-state rules.
What if a customer disputes a charge?+
Stripe will deduct the disputed amount immediately and ask you to submit evidence. Always respond — winning a dispute requires invoices, IP logs, terms of service acceptance, and email correspondence. Plan to keep all of that searchable.