Merchant of record for SaaS (2026): MoR vs Stripe, fees, and switching providers
What a merchant of record handles vs a payment processor, when Stripe plus Stripe Tax is enough, developer-friendly MoRs for indie SaaS, and what switching billing providers means in code.

If you sell software online, merchant of record (MoR) is the label on the receipt that decides who owes VAT, who answers chargebacks, and whether your weekend goes to tax filings or shipping features. Most founders still compare MoR vs Stripe as if they were two checkout buttons. They are not. Stripe is usually a payment processor (you stay the seller). A MoR is the legal seller on the invoice.
This guide explains what a merchant of record actually does, when Stripe plus Stripe Tax is enough without a MoR, which developer-friendly MoRs indie SaaS teams shortlist in 2026, and what switching billing providers changes in your codebase. Numbers below are from each vendor's official pricing or docs last checked October 27, 2026. For head-to-head fee tables, use our dedicated comparisons instead of repeating them here: Stripe vs Lemon Squeezy vs Polar vs Creem vs Dodo, Lemon Squeezy vs Stripe, Polar vs Stripe, and Creem vs Stripe.
Short answer
A merchant of record is the company that sells to your customer, collects indirect tax (US sales tax, VAT, GST), handles refunds and chargebacks as the liable party, and pays you out after its fee. Stripe Payments moves money but you remain the seller; Stripe Tax can calculate and collect tax where you are registered, but registration and filing stay with you unless you add separate filing products. Pick Stripe (processor) when you want the lowest per-transaction cost and full checkout control, and your sales are mostly domestic or you can own compliance. Pick a MoR (Lemon Squeezy, Polar, Creem, Dodo Payments, Paddle, or Stripe Managed Payments) when global indirect tax would otherwise eat your calendar. In TurboStarter, Stripe is the default web provider; Lemon Squeezy, Polar, and Dodo Payments ship behind the same billing API (billing overview).
What is a merchant of record?
Merchant of record (MoR) means the entity on the customer's card statement and tax invoice. The MoR:
- Calculates, collects, files, and remits indirect tax in the jurisdictions it covers
- Owns refunds and chargebacks as the seller of record
- Pays you as a supplier or partner after platform fees and holds
A payment processor (standard Stripe Payments, Adyen, Braintree, and similar) authorizes and settles card payments. You remain the merchant. The processor does not make you exempt from registering for VAT or US state sales tax when you cross economic nexus thresholds.
Creem's MoR documentation frames it cleanly: a processor handles moving money; a MoR takes legal responsibility for being the seller. Polar's MoR intro adds an important limit: a MoR handles indirect tax, not your income or corporate tax in your home country.
- You appear on receipts and statements (your brand, your Stripe account)
- You register, monitor thresholds, file, and remit sales tax / VAT / GST (or hire accountants and filing services)
- You carry dispute and fraud policy decisions; Stripe gives tools, not liability transfer
- Lower headline fees and the widest APIs (Connect, custom Elements, marketplaces)
- The MoR is the seller on invoices and many card descriptors
- The MoR handles indirect tax in covered countries (scope varies by provider)
- The MoR processes refunds and chargebacks as the liable party
- Higher fees and narrower checkout surfaces, traded for compliance offload
What a merchant of record handles (vs what Stripe alone does)
Use this checklist when you read vendor marketing. "We handle payments globally" is not the same as "we are your MoR."
| Responsibility | Stripe Payments (processor) | Stripe Tax (add-on) | Typical MoR (Lemon Squeezy, Polar, Creem, Dodo, Paddle) |
|---|---|---|---|
| Card processing | Yes | No (Tax is not processing) | Yes (bundled in platform fee) |
| Legal seller on invoice | You | You | MoR |
| Tax calculation | You build or use Stripe Tax | Yes, where you are registered | MoR (covered jurisdictions) |
| Tax registration & filing | You | You (Tax does not file for you on Basic) | MoR |
| Refunds / chargebacks (liable party) | You | You | MoR |
| Subscription billing | Stripe Billing (0.7% pay-as-you-go) | N/A | Included in MoR fee (provider-specific) |
| Custom checkout / Connect | Yes | N/A | Usually limited or no |
Stripe Managed Payments is Stripe's MoR layer: Stripe becomes seller on eligible new Checkout and Payment Link sales, with an extra 3.5% per successful transaction on top of standard Stripe processing, plus separate Billing fees. Eligibility, product type, and country lists are stricter than plain Stripe; see Managed Payments eligibility and Polar vs Stripe for fine print.
When Stripe plus Stripe Tax is enough (no MoR)
You do not need a merchant of record for every SaaS. Stripe plus tax tooling is the right default when:
- Most revenue is domestic or from a small set of countries where you can register once and maintain filings.
- You want Connect, marketplaces, or fully custom checkout that MoR products rarely support.
- Your effective rate matters more than outsourcing compliance and you have (or will hire) ops for tax.
- You sell B2B with valid VAT IDs in Europe and can rely on reverse charge for many invoices (still document correctly; this is not "no VAT ever").
A practical Stripe-only stack for subscriptions often looks like:
- Stripe Payments for cards (US domestic 2.9% + 30¢ on the published US pricing page, October 27, 2026)
- Stripe Billing for renewals (0.7% of Billing volume on pay-as-you-go)
- Stripe Tax Basic where you are registered (0.5% per transaction on the Tax pricing page) to calculate and collect
- Your accountant or a filing partner for returns and remittance
Stripe Tax is not a MoR
Stripe Tax automates calculation and collection in places you register. On Tax Basic, Stripe documents that you remain responsible for registration and filing unless you use separate filing products. That is the gap MoRs sell into: not "can we charge VAT at checkout," but "who registers in the EU, US states, and Canada provinces when thresholds hit."
Signals you have outgrown processor-only Stripe
- You crossed economic nexus in multiple US states or VAT OSS complexity in the EU and filings are slipping
- Chargebacks and refund policy for global buyers consume support time you do not have
- You need one global price with tax handled on the receipt without maintaining rate tables
- Investors or enterprise customers ask who is the seller of record and your answer is uncomfortably vague
If several of those are true, compare MoR headline fees against accounting time and registration costs, not just the difference between 2.9% and 5%.
Developer-friendly merchant of record options (2026)
"Developer-friendly" here means: documented REST APIs, webhooks, test mode, subscription primitives, and a path that does not trap you in a no-code-only UI. For TurboStarter users, first-class web providers are Stripe, Lemon Squeezy, Polar, and Dodo Payments (configuration). Creem and Paddle are common MoR choices in the wild but are not built-in TurboStarter providers today; you would integrate them yourself or stay on a comparison post's migration path.
| Provider | Model | Published US card-style fee (Oct 27, 2026) | Notes for builders |
|---|---|---|---|
| Stripe Managed Payments | MoR on Stripe | Stripe processing + 3.5% MoR fee | Checkout / Payment Links only; same Stripe account |
| Lemon Squeezy | MoR | 5% + 50¢ (+ surcharges) | License keys, hosted checkout; owned by Stripe; TurboStarter docs |
| Polar | MoR (open source) | 5% + 50¢ Starter; paid plans down to 3.4% + 30¢ | GitHub benefits, usage billing; Polar setup |
| Creem | MoR | 3.9% + 40¢ | Low published MoR rate; see Creem vs Stripe |
| Dodo Payments | MoR | 4% + 40¢ (+ surcharges) | Usage billing, license keys; Dodo review and Dodo docs |
| Paddle | MoR | 5% + 50¢ all-inclusive | Mature MoR, buyer support bundled; no TurboStarter provider yet |
Paddle vs Stripe is a common search pairing for founders comparing MoR bundles to processor pricing: Paddle is MoR-first at 5% + 50¢; Stripe is processor-first with optional Managed Payments. Compare total cost including tax labor, not logo preference.
Creem, Polar, and Dodo target the same indie SaaS MoR intent as Lemon Squeezy with different fee math and APIs. Do not re-derive every surcharge here; the four-way payments guide keeps the October 2026 table current.
Mobile: MoR on web, RevenueCat on iOS and Android
App Store and Google Play subscriptions are a separate stack. RevenueCat (or Superwall in TurboStarter) manages store billing; your web MoR or Stripe account does not replace that. Plan one entitlement layer in your backend so web and mobile unlock the same features (mobile billing docs).
What switching billing providers means in code
Switching from processor to MoR (or between MoRs) is rarely a database migration alone. Expect:
| Area | What changes |
|---|---|
| Legal seller | Refund policy, invoice branding, and support routing |
| Product / price IDs | New variant IDs in Lemon Squeezy, Polar, Dodo, or Paddle dashboards; map them in billing config |
| Checkout flow | Hosted MoR checkout vs Stripe Checkout / Elements |
| Webhooks | Different event names, signing secrets, and idempotency keys |
| Customer portal | Stripe Customer Portal vs MoR customer area vs Link (Managed Payments) |
| Active subscriptions | Usually no automatic port; dual-run or ask customers to re-subscribe |
TurboStarter: swap provider exports, env vars, and config IDs
TurboStarter keeps checkout, webhooks, portal, and plan gating behind @workspace/billing and @workspace/billing-web. The active web provider is selected by exports in packages/billing/web/src/providers:
// Default: Stripe
export * from "./stripe";
// MoR examples (also update env.ts export):
// export * from "./lemon-squeezy";
// export * from "./polar";
// export * from "./dodo-payments";export * from "./stripe/env";
// export * from "./lemon-squeezy/env";Then align environment variables and dashboard objects with the provider docs:
- Stripe:
STRIPE_SECRET_KEY,STRIPE_WEBHOOK_SECRET, Stripe Price IDs in billing configuration - Lemon Squeezy:
LEMON_SQUEEZY_API_KEY,LEMON_SQUEEZY_SIGNING_SECRET,LEMON_SQUEEZY_STORE_ID, variant IDs in config - Polar:
POLAR_ACCESS_TOKEN,POLAR_WEBHOOK_SECRET,POLAR_ORGANIZATION_SLUG - Dodo Payments: API key, webhook key, environment flag per docs
Webhook routes stay under your app's billing API (for example /api/billing/webhook/*); only the handler implementation and signing secret change. Feature gating still reads the same internal subscription state once webhooks update your database (subscriptions).
Do not hard-code one vendor in product code
Keep createCheckout, getSubscription, and portal links on the billing package API. New customers can use the new provider while legacy subscribers finish on the old stack. That pattern is how you survive Lemon Squeezy to Stripe Managed Payments roadmap uncertainty without a rewrite.
Moving to Creem or Paddle (not built into TurboStarter)
If you choose Creem or Paddle, plan a custom provider module implementing the same @workspace/billing provider interface, or run MoR checkout outside the kit until you add one. Technically that means new REST clients, webhook parsers, and mapping MoR subscription statuses to your internal subscription table. Product-wise it is the same cutover problem: export catalog, recreate prices, migrate or dual-bill subscribers. Start from Creem vs Stripe for API shape and fee expectations.
How to choose (decision flow)
flowchart TD
A[Selling digital SaaS online] --> B{Need Connect or marketplace?}
B -->|Yes| C[Stripe processor]
B -->|No| D{Comfortable registering and filing tax globally?}
D -->|Yes| E[Stripe + Billing + Tax]
D -->|No| F{Already all-in on Stripe Checkout?}
F -->|Yes, eligible| G[Stripe Managed Payments]
F -->|No| H[Compare MoRs: Creem, Polar, Dodo, Lemon Squeezy, Paddle]
H --> I[Keep billing behind abstraction in app code]- Marketplace or custom payments UI → Stripe processor only.
- Domestic or low-jurisdiction sales, cost-sensitive → Stripe + Billing (+ Tax where registered).
- Want MoR but stay on Stripe → Managed Payments if you pass eligibility.
- Want lowest published MoR rate → Creem (3.9% + 40¢, October 27, 2026).
- Want open-source MoR and dev tooling → Polar (pricing).
- Usage or credit billing for AI → Dodo (review).
- Already on Lemon Squeezy and it works → Stay, but keep TurboStarter's provider swap path for later.
FAQ
The merchant of record is whoever legally sells the product to your customer. They handle indirect tax collection and remittance in covered countries, own chargebacks as the seller, and pay you after fees. You are not the name on the tax invoice in those flows.
Stripe Payments is a payment processor: you are the merchant. Stripe Managed Payments is Stripe acting as MoR on supported Checkout and Payment Link sales for an extra 3.5% on top of standard processing (pricing page last checked October 27, 2026). Plain Stripe plus Stripe Tax does not make Stripe your MoR.
When you only need calculation and collection in jurisdictions where you are already registered, your buyer base is manageable, and you have a process to file and remit. Stripe Tax Basic charges 0.5% per transaction on the published pricing page; registration and filing remain your responsibility. If you need someone else to register and file across many countries, compare MoR fees to that operational cost.
There is no single winner. Polar emphasizes open-source tooling and transparent pricing tiers. Creem publishes a low flat MoR rate (3.9% + 40¢). Dodo Payments targets usage-based products. Lemon Squeezy is mature and integrated in TurboStarter. Stripe Managed Payments fits teams committed to Stripe Checkout. Use the four-way comparison for fees and the decision sections above for fit.
Stripe (processor) wins on flexibility and lowest processing rates when you handle tax. Paddle wins when you want an all-in MoR at 5% + 50¢ with buyer support bundled (October 27, 2026). Stripe Managed Payments is the middle path if you are already on Stripe. See Lemon Squeezy vs Stripe for Managed Payments math.
Usually yes for existing subscriptions unless the provider offers a managed migration. You create new products or variants, send customers through new checkout, and run dual billing until old subscriptions churn. Plan webhook handlers for both providers during the transition.
TurboStarter ships Lemon Squeezy, Polar, and Dodo Payments as MoR-capable web providers alongside Stripe, all behind one billing API. Switch exports in packages/billing/web/src/providers, set env vars, and map variant IDs in billing configuration. Creem and Paddle are not built-in; add a provider module or integrate externally. Mobile uses RevenueCat separately from web MoR.
With a processor, you set policy and absorb dispute costs (Stripe provides evidence tools). With a MoR, the MoR is the liable seller on covered transactions, which is part of why MoR fees run higher than raw card rates.
Merchant of record is a liability and tax choice first and a API choice second. Stripe plus Stripe Tax stays the right default when you can own compliance and want control. MoRs trade margin for calendar time when you sell digital products globally. Whichever you pick, keep billing behind an abstraction so the next switch is configuration, webhooks, and price IDs—not a rewrite. TurboStarter ships that layer for Stripe, Lemon Squeezy, Polar, and Dodo on web, with RevenueCat on mobile, from one monorepo.
Make your TypeScript smarter - with ONE line of code
Make TypeScript inference sharper with ts-reset. This one-line setup fixes built-in typings and improves type safety across your entire JavaScript monorepo.
Migrate from Clerk to Better Auth
How to migrate Clerk to Better Auth: bcrypt passwords, user export, cutover vs dual-run, middleware, and what breaks (sessions, orgs).



