Why Paddle, not Stripe
Applies to The Fabrica v0.1.2. Documentation source:
1ee1bc9cb661, including post-release documentation corrections.
For European SaaS founders selling digital products, Paddle (Merchant of Record) makes the EU VAT + tax compliance problem disappear. Stripe does not. The factory’s positioning is “AI SaaS boilerplate for European Python founders” — Paddle is the right call.
The competitor pattern
Most SaaS boilerplates (ShipFast, Open SaaS, Nextbase) default to Stripe. They’re built by US founders for US-leaning audiences. The default makes sense in that market.
Where Stripe breaks for EU founders
When you sell digital products to EU consumers (the typical AI SaaS B2C / prosumer case):
- VAT MOSS registration. EU’s One-Stop-Shop mechanism requires you register for VAT in each country you sell to OR use the OSS portal. Stripe Tax can collect the right VAT rate per customer, but you still have to file the OSS return quarterly. Miss a threshold, miss a filing → audit + back-tax + penalties.
- Invoice format requirements. Each EU country has minimum invoice fields (VAT registration number, customer’s country, etc.). Stripe’s invoice template is US-centric — buyers customising for EU compliance burn engineering time on something that has nothing to do with their product.
- Reverse-charge logic for B2B. EU B2B sales between VAT- registered entities use reverse-charge — buyer pays VAT, seller doesn’t. Stripe Tax handles this if you collect the customer’s VAT number reliably + your accountant is comfortable. Mistakes here are not silently absorbed: tax authorities will recompute years of returns.
- VAT rate changes. EU VAT rates change without much notice (UK shifted in 2023; multiple Eastern European tweaks since 2024). Stripe Tax updates these; you trust the configuration. With Paddle (Merchant of Record) the responsibility moves to Paddle’s tax team.
The cost of bolting on a tax accountant + Stripe Tax + invoice template work + quarterly OSS filings: easily €5-10k/yr of operating overhead at $50k MRR. Stripe’s 2.9% + €0.30 vs Paddle’s 5% + €0.50 looks cheaper but the all-in is comparable, and you spend less of your own time.
What Paddle covers as MoR
- VAT collection + remittance to every EU country (and US sales tax, Australian GST, etc. — Paddle is the seller of record in 200+ jurisdictions).
- Invoice generation in the customer’s language + currency, compliant with each jurisdiction’s format rules.
- Refund + chargeback handling. Paddle settles disputes; you don’t argue with customer’s bank.
- 1099-K equivalent for US tax filings (if any of your customers are US-based).
- Subscription state machine + dunning + retries on failed payments.
You wire a webhook handler, an API key, and a priceId per tier.
Three days of integration work + tax disappears.
Where Stripe genuinely wins
- Marketplace flows. Stripe Connect lets you split payments between platform + sellers — Paddle doesn’t have an equivalent. If you’re building a marketplace (not a single-seller SaaS), Stripe is the right call.
- US-only B2B SaaS. If your customer base is 95% US and customers pay via wire / invoice / NetSuite integration, Stripe’s ecosystem is richer.
- Custom card-on-file flows. Stripe’s PaymentMethod abstractions
- 3DS handling are best-in-class.
What we ship + why it’s portable
The factory’s Paddle integration:
services/paddle.py— HMAC webhook verify + checkout payload signing.services/paddle_api.py— REST API client (cancel + update price).api/routers/billing.py— webhook + checkout + subscription + downgrade.- 7 webhook handlers (created / updated / activated / resumed / paused / past_due / canceled + transaction.completed).
The portability question: “what if I want to migrate to Stripe later?”. The factory’s design helps:
Subscriptionmodel uses generic columns (paddle_subscription_id→ rename toprovider_subscription_idfor a multi-provider refactor).- Webhook handlers are thin — port the dispatch + signature verify per-provider; the credit-ledger + audit-log integration stays.
- Migration recipe (
docs/migrations/payments-paddle-to-stripe.md) is on the v0.2.0 roadmap. Documents the schema rename + the Stripe-equivalent webhook handlers + the VAT-compliance warning.
The blunt summary
If you’re in Europe selling AI/SaaS: pick Paddle. The fee delta is swamped by the tax-compliance savings. If you’re in the US selling B2B with a custom finance stack: pick Stripe. Both are fine choices for the wrong audience — the factory’s audience is the first one.
Receipts
backend/src/services/paddle.pybackend/src/services/paddle_api.pybackend/src/api/routers/billing.py
Provenance. Documentation source: 1ee1bc9cb6619c19f57766731e7884b37f515dc9 (main).
Extracted from docs/recipes/why-paddle-not-stripe.md.
That commit is later than the release these pages describe: it carries documentation corrections made after thefabrica-v0.1.2 went out. Nothing that changes how the product behaves landed between the two, which is what makes naming that version honest.