Polar vs Stripe: fees, tax, and Stripe Managed Payments
Polar vs Stripe as of October 2026: real fee math at $20 and $100, Stripe Managed Payments vs Polar as MoR, migration notes, and when to pick each.

Most Polar vs Stripe articles still frame the choice as "Polar is a Merchant of Record, Stripe is a payment processor." That was true until Stripe shipped Managed Payments, its own merchant of record product. Polar also replaced its flat rate with tiered plans in May 2026. So the real decision now has three options: plain Stripe, Stripe with Managed Payments, or Polar.
This guide compares all three with numbers verified on the official pricing pages as of October 2026, a worked fee example at $20 and $100 per month, code for creating a checkout in each, and what actually happens when you migrate.
Short answer
Pick plain Stripe if you want the lowest fees and full control, and you can handle sales tax, VAT, and GST yourself (or only sell in a few markets). Pick Polar if you want a merchant of record that handles global sales tax, with built-in usage billing, seats, and benefits like license keys or GitHub repo access, at 5% + 50¢ on the free plan. Pick Stripe Managed Payments if you are already on Stripe Checkout, your business is in one of its 37 supported countries, and you want Stripe to become the seller for new sales without changing providers. On a domestic US card it costs more than Polar's free plan at both $20 and $100 price points.
What is Polar, and what changed at Stripe?
Polar (polar.sh) is an open-source billing platform and merchant of record for software and digital products. When a customer buys from you through Polar, Polar is the legal seller: it calculates, collects, files, and remits sales tax, VAT, and GST, then pays out your earnings. Polar itself runs on Stripe as the underlying processor (Polar MoR docs). When people search for "Polar payments", this is the product they mean.
Stripe is a payment service provider. By default your business is the seller. You can add Stripe Billing for subscriptions and Stripe Tax to calculate and collect tax, but registration, filing, and liability stay with you (Tax Complete can automate registrations and filings for a monthly fee, but you are still the merchant).
Stripe Managed Payments is the Stripe merchant of record option for digital products. With it enabled on a Checkout Session or Payment Link, Stripe (via Link) becomes the merchant of record and handles indirect tax in more than 80 countries, fraud, disputes, and transaction-level support (Stripe docs). Your customers see "Sold through Link" and a LINK.COM* statement descriptor (how it works).
That third option is why the old "Polar vs Stripe = MoR vs processor" framing is no longer enough.
Polar vs Stripe at a glance
| Dimension | Stripe (standard) | Stripe Managed Payments | Polar |
|---|---|---|---|
| Legal seller | You | Stripe (Link) | Polar |
| Sales tax, VAT, GST | You (Stripe Tax helps) | Handled in 80+ countries | Handled globally |
| What you can sell | Almost anything | Fully automated digital products with an eligible tax code | Software and digital products |
| Checkout surfaces | Checkout, Elements, Payment Links, more | Checkout and Payment Links only | Hosted checkout, checkout links, embedded checkout |
| Subscriptions | Stripe Billing | Stripe Billing (billed separately) | Built in |
| Usage-based billing | Billing Meters API | Not documented for Managed Payments | Meters + event ingestion |
| Seats | Quantity on subscriptions | Not documented | Seat-based pricing |
| Automated benefits | Build yourself | Build yourself | License keys, GitHub repo access, Discord roles, file downloads, credits |
| Customer portal | Stripe Customer Portal | Link account (plus your own portal) | Polar Customer Portal |
| Marketplaces / Connect | Yes | No | No |
| Where your business can be | Stripe-supported countries | 37 countries (US, CA, most of Europe, AU, HK, JP, SG) | Any Stripe Connect Express payout country |
| Open source | No | No | Yes, source on GitHub |
Sources: Managed Payments eligibility, Polar docs index, Polar supported countries.
Fees as of October 2026
Here is every fee that matters for a typical SaaS subscription, taken straight from the vendors.
| Item | Fee | Source |
|---|---|---|
| Stripe card processing (US domestic) | 2.9% + 30¢ | stripe.com/pricing |
| Stripe Billing (pay as you go) | 0.7% of Billing volume | Billing pricing |
| Stripe Tax Basic | 0.5% per transaction where you are registered | Tax pricing |
| Stripe Tax Complete | From $90/month (1-year contract), includes filings | Tax pricing |
| Stripe Managed Payments | +3.5% per successful transaction, on top of processing | Managed Payments FAQ |
| Stripe dispute | $15 received, $15 countered (refunded if you win) | stripe.com/pricing |
| Polar Starter (free) | 5% + 50¢ | Polar fees |
| Polar Pro / Growth / Scale | $20 / $100 / $400 per month, then 3.8% + 40¢ / 3.6% + 35¢ / 3.4% + 30¢ | Polar fees |
| Polar international cards | +1.5% (non-US cards) | Polar fees |
| Polar dispute | $15 per dispute, regardless of outcome | Polar fees |
| Polar payouts (Stripe's fees) | $2/month with active payouts, 0.25% + 25¢ per payout, 0.25% to 1% cross-border | Polar fees |
Three details most comparison pages get wrong:
- Polar's 4% + 40¢ rate is legacy. It is the "Early Member" rate for organizations created before May 27, 2026, and it carries a +0.5% subscription fee. New organizations start on Starter at 5% + 50¢ with no separate subscription fee (Polar fees).
- Polar does charge extra for international cards. The +1.5% applies on top of every plan. Polar's own example also applies the fee to the tax-inclusive total.
- Managed Payments does not include Billing. Stripe says optional products like Billing are separate, so a Managed Payments subscription stacks processing + 3.5% + 0.7%.
Polar's paid plans pay for themselves above roughly $1,379/month in sales for Pro, $5,634 for Growth, and $19,048 for Scale, according to Polar's own breakeven table.
Worked example: $20 and $100 per month
Assumptions: one subscription payment on a domestic US card, sales tax ignored so the numbers stay comparable, Stripe on standard pricing. Stripe Tax Basic only applies where you are registered to collect, so it is shown as a separate row.
| Setup | Fee on $20 | Effective | Fee on $100 | Effective |
|---|---|---|---|---|
| Stripe + Billing | $1.02 | 5.1% | $3.90 | 3.9% |
| Stripe + Billing + Tax Basic | $1.12 | 5.6% | $4.40 | 4.4% |
| Stripe + Billing + Managed Payments | $1.72 | 8.6% | $7.40 | 7.4% |
| Polar Starter | $1.50 | 7.5% | $5.50 | 5.5% |
| Polar Pro (plus $20/month plan fee) | $1.16 | 5.8% | $4.20 | 4.2% |
How the rows add up at $20: Stripe processing is $0.58 + $0.30 = $0.88, Billing adds $0.14, Tax Basic adds $0.10, Managed Payments adds $0.70. Polar Starter is $1.00 + $0.50. Polar Pro is $0.76 + $0.40.
Scale that to 200 subscribers at $20/month ($4,000 MRR) and the monthly bill is roughly $204 on Stripe + Billing, $224 if you also pay Tax Basic on every sale, $344 on Managed Payments, $300 on Polar Starter, and $252 on Polar Pro including its plan fee.
Read the table honestly
Plain Stripe is cheapest on paper, but it is the only row where you remain liable for registering, filing, and remitting tax in every jurisdiction where you owe it. The gap between plain Stripe and an MoR is what you pay to make that someone else's problem. With non-US cards, Polar adds 1.5%, and Stripe has its own international and currency conversion surcharges, so check your country's Stripe pricing page before deciding on margins.
Stripe Managed Payments: the fine print
Managed Payments is a real merchant of record, but it is narrower than Polar in ways that matter for a SaaS:
- Business location. Your company must be in one of 37 supported countries: the US, Canada, 31 European countries (including the UK, Switzerland, and Norway), Australia, Hong Kong, Japan, and Singapore. Stripe also runs an eligibility review on each account (eligibility).
- Products. Only fully automated digital products qualify: SaaS, software, games, digital media, online courses, hosting. Each product needs an eligible tax code. Consulting, design, development services, and live 1-on-1 coaching do not qualify.
- Integration. Checkout and Payment Links only. No Elements-based custom forms, no Connect, no third-party tax tools, and subscriptions must be created through Checkout or Payment Links (docs).
- Existing subscriptions stay where they are. Managed Payments only applies to new subscriptions bought through a Managed Payments Checkout Session (update guide).
- Customer experience changes. Receipts and invoices come from Link, customers manage orders in their Link account, and custom domains are not supported on Managed Payments checkouts.
- Support escalations have a clock. If Stripe needs product input and you do not respond within 48 hours, it might refund without your approval. It can also issue refunds within 60 days in certain cases (how it works).
- Tax coverage has gaps. Stripe does not take domestic tax liability for Japan-based sellers, or for B2B domestic sales of Singapore-based sellers (tax compliance).
The upside: it is the same Stripe account, API, and dashboard. You can enable it per Checkout Session, so a hybrid setup (direct processing at home, Managed Payments abroad) is a supported pattern.
Polar: the fine print
- Payouts reach more founders than Stripe does. Polar pays out through Stripe Connect Express, which covers far more countries than Stripe Payments, including India and others where standalone Stripe is invite-only (supported countries). If you cannot open a regular Stripe account, Polar is often the practical choice.
- Payouts are manual by default. You withdraw when you want, and Stripe's payout fees pass through without markup. Leave a balance untouched for several months and Polar will eventually trigger a payout for you.
- Refund and dispute policy. Polar reserves the right to refund within 60 days to prevent chargebacks, and transaction fees are not returned on refunds.
- Product features. Polar has meters for usage-based billing (count, sum, average, min, max, unique over ingested events, with a token unit for LLM pricing), seat-based pricing, checkout links, an embedded checkout, a customer portal, and automated benefits.
- One product per price. Polar treats each pricing option (monthly, yearly) as a separate product, which changes how you map plans in code.
Which one should you pick?
Run through these rules in order. The first one that matches is usually your answer.
- You are building a marketplace or paying out to other users. Stripe with Connect. Neither Managed Payments nor Polar supports platforms.
- You sell services with human involvement, or physical goods. Plain Stripe. Neither MoR covers those.
- You cannot open a Stripe account in your country. Polar, as long as Stripe Connect Express supports payouts there.
- You are already live on Stripe Checkout and only need tax off your plate for new customers. Try Managed Payments. No re-platforming, but budget for the extra 3.5% and remember that existing subscribers do not move over.
- You are pre-revenue or early, sell globally, and want tax, benefits, and usage billing handled in one place. Polar. Starter costs nothing up front, and upgrading to Pro makes sense once you pass roughly $1,379/month.
- You are US-focused or only sell in a handful of markets, and want the lowest fees and maximum control. Plain Stripe with Billing, plus Stripe Tax where you are registered.
- You need complex B2B billing (quotes, multiphase schedules, invoices outside the billing period). Plain Stripe. Managed Payments explicitly blocks one-off invoices and invoice items on subscriptions.
If you are still weighing Lemon Squeezy or Creem too, our broader Stripe vs Lemon Squeezy vs Polar vs Creem comparison covers the wider field.
Creating a checkout in each
The integration shape is similar: create a session on the server, redirect the user, and fulfill from webhooks.
import Stripe from "stripe";
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);
export async function POST() {
const user = await getCurrentUser();
const session = await stripe.checkout.sessions.create({
mode: "subscription",
line_items: [{ price: "price_123", quantity: 1 }],
client_reference_id: user.id,
success_url: "https://example.com/dashboard?checkout=success",
// Requires Managed Payments activated in the Dashboard and an eligible product tax code.
// Remove this line for a standard Stripe checkout where you stay the merchant.
managed_payments: { enabled: true },
});
return Response.redirect(session.url!, 303);
}Managed Payments needs API version 2025-03-31.basil or later, and you must drop parameters Stripe now controls, such as automatic_tax, payment_method_types, and tax_id_collection (Stripe setup guide). Fulfill on checkout.session.completed.
import { Polar } from "@polar-sh/sdk";
const polar = new Polar({
accessToken: process.env.POLAR_ACCESS_TOKEN ?? "",
});
export async function POST(request: Request) {
const user = await getCurrentUser();
const checkout = await polar.checkouts.create({
products: ["<polar-product-id>"],
externalCustomerId: user.id,
customerIpAddress:
request.headers.get("x-forwarded-for")?.split(",")[0]?.trim() ??
undefined,
});
return Response.redirect(checkout.url, 303);
}externalCustomerId links the Polar customer to your user ID. Forward the customer's IP when creating sessions from a server, otherwise Polar detects your server's country for currency and tax (Checkout API). Polar's TypeScript SDK docs also show a newer versioned client, createPolar from @polar-sh/sdk/2026-10.
import { betterAuth } from "better-auth";
import {
polar,
checkout,
portal,
usage,
webhooks,
} from "@polar-sh/better-auth";
import { createPolarCore } from "@polar-sh/sdk/2026-10";
const polarClient = createPolarCore({
accessToken: process.env.POLAR_ACCESS_TOKEN!,
});
export const auth = betterAuth({
plugins: [
polar({
client: polarClient,
createCustomerOnSignUp: true,
use: [
checkout({
products: [{ productId: "<polar-product-id>", slug: "pro" }],
successUrl: "/success?checkout_id={CHECKOUT_ID}",
authenticatedUsersOnly: true,
}),
portal(),
usage(),
webhooks({
secret: process.env.POLAR_WEBHOOK_SECRET!,
onCustomerStateChanged: async (payload) => {},
onOrderPaid: async (payload) => {},
}),
],
}),
],
});The plugin creates Polar customers on sign-up, exposes checkout at a slug like /checkout/pro, and verifies webhook signatures. It requires Better Auth 1.7+ and Node.js 22+ (Better Auth adapter).
Migrating between Stripe and Polar
Moving billing providers is mostly about two hard things: saved cards and live subscriptions.
Stripe to Polar
Polar has a documented migration flow from Stripe, rolling out gradually (contact Polar support if you don't see it under Settings → Migrations):
Move new sales to Polar. New customers check out on Polar while existing Stripe subscriptions keep renewing on Stripe. Pass your own user ID as external_customer_id.
Connect Stripe and import your catalog. Polar uses a restricted Stripe API key, then creates products, prices, and customers. Nothing is billed differently yet.
Copy saved cards. Stripe copies card data directly to Polar's processor (usually a few hours, up to 72). It never passes through your app.
Switch subscriptions. Polar cancels each selected subscription on Stripe immediately (no proration, no final invoice) and activates it in Polar with the same paid period. This step is irreversible.
Gotchas worth planning for: subscriptions with multiple items or quantity above one, past-due or paused subscriptions, and anything renewing within 24 hours stay on Stripe. Stripe Connect platforms and Stripe accounts in India can't use the automated flow. Every switched customer triggers a customer.subscription.deleted event in Stripe, so make sure your webhook handler does not revoke access, and turn off Stripe's cancellation emails first. Historical Stripe payments stay in Stripe.
Polar to Stripe
Polar's docs only describe migrations into Polar. Going the other way, expect to run both systems in parallel, send new sales to Stripe, and let Polar subscriptions run out or ask customers to resubscribe. If you need saved cards moved, talk to Polar support before you plan around it.
Stripe to Stripe Managed Payments
The easiest switch on paper: same account, one parameter. But only new subscriptions bought through a Managed Payments Checkout Session are covered. Existing subscribers stay on your current setup with you as the merchant.
How TurboStarter handles Polar and Stripe
This is where we have a stake, so here is exactly what the kit does. TurboStarter Core ships Stripe, Polar, Lemon Squeezy, and Dodo Payments behind one billing API in @workspace/billing and @workspace/billing-web (billing overview). Stripe is the default. Switching to Polar means changing two export lines in packages/billing/web/src/providers, setting POLAR_ACCESS_TOKEN, POLAR_WEBHOOK_SECRET, and POLAR_ORGANIZATION_SLUG, and pointing the webhook at /api/billing/webhook/polar (Polar setup).
Your plans live in one shared config. The only provider-specific part is each variant's id: a Stripe price ID or a Polar product ID, since Polar models each price as its own product (configuration). Subscriptions, one-time payments, credits, per-seat, and metered usage work across both, and checkout can bill either a user or an organization.
Two honest notes. Managed Payments is not a documented toggle in the kit today: the Stripe provider is built on Stripe Checkout (it fulfills on checkout.session.completed), which is the surface Managed Payments needs, but you would add the managed_payments parameter and eligible tax codes yourself. And the Edge Kit is Stripe-only.
If you want to start from a working setup, see the Next.js Polar SaaS boilerplate or the Next.js Stripe starter kit, and the Stripe setup guide.
FAQ
No, plain Stripe is cheaper per transaction: 2.9% + 30¢ plus 0.7% for Billing, versus 5% + 50¢ on Polar Starter (as of October 2026). But Polar is a merchant of record and Stripe is not, so the comparison only holds if you are fine owning tax registration, filing, and remittance yourself. Against Stripe Managed Payments, Polar Starter is cheaper on a domestic US card at both $20 and $100.
Stripe's merchant of record product for digital goods. When enabled on a Checkout Session or Payment Link, Stripe (via Link) becomes the seller and handles sales tax, VAT, and GST in 80+ countries, fraud, disputes, and transaction support. It costs 3.5% per successful transaction on top of standard processing, and Billing is charged separately.
New organizations start on the free Starter plan at 5% + 50¢ per transaction. Paid plans cost $20, $100, or $400 per month and lower the rate to 3.8% + 40¢, 3.6% + 35¢, or 3.4% + 30¢. Non-US cards add 1.5%. Organizations created before May 27, 2026 keep the Early Member rate of 4% + 40¢ plus 0.5% on subscriptions.
Yes. Polar is the reseller of your digital products, so it carries the liability for international sales taxes, registers in new markets as thresholds are reached, and handles filings and remittance. You are still responsible for your own income tax.
Usually yes. Polar charges customers itself and only uses Stripe Connect Express to pay you out, which supports many more countries than Stripe Payments, including India. Check Polar's supported countries list for your country and business type.
To Polar, yes, through Polar's migration flow: it imports your catalog, copies saved cards via Stripe, and switches selected subscriptions without charging customers again. To Managed Payments, no. Stripe only applies it to new subscriptions created through a Managed Payments Checkout Session.
Yes. You ingest events and define meters that count, sum, average, or take the min, max, or unique values of an event property. Meters can be priced per unit or per million tokens, which suits AI products.
Verdict
The Polar vs Stripe decision is no longer just "MoR or processor." If you want the lowest fees and can own tax, plain Stripe still wins. If you want a merchant of record with built-in subscriptions, usage billing, and benefits, Polar is the better value today, especially on its free Starter plan or once Pro pays for itself. Stripe Managed Payments earns its place for teams already deep in Stripe Checkout who want tax handled for new customers without switching providers, as long as the extra 3.5% and the eligibility limits fit. Whichever you choose, keep the provider behind your own billing layer so switching later is a config change, not a rewrite.
30x faster linting and formatting - ESLint and Prettier replaced with OXC
TurboStarter replaces ESLint and Prettier with OXC's Rust toolchain, cutting lint and format times from minutes to seconds across the whole monorepo.
Renovate vs Dependabot - best tool to automate your dependency updates (2026)
Which should you pick for a monorepo in 2026? Compare Renovate and Dependabot on features, monorepo support, and automation.



