payments · side by side
Dodo Payments vs Polar for a Next.js app
Both fill the payments slot, so a generated repo carries one or the other, never both. Every line below is read out of the two manifests.
Short answer
Pick Dodo Payments if
Founders outside the US and EU, India especially, selling software worldwide. Dodo takes local payment methods: UPI in India, cards, Apple Pay and Google Pay. It remits sales tax as the seller, so you never register for VAT abroad.
Pick Polar if
Solo founders and small teams selling digital products or SaaS worldwide, by subscription or as a one-time lifetime deal. You skip registering for VAT, GST and US sales tax before your twentieth customer.
Side by side
Price, obligations, and the surface each one adds. No row is written by hand. This is manifest.yaml, rendered.
| From the manifest | Option ADodo Payments | Option BPolar |
|---|---|---|
| In one line | Dodo Payments Merchant of record in 220+ countries and regions. Sales tax is Dodo's job. | Polar Merchant of record for developers. Polar sells to your customer, so tax is its job. |
| Pricing | Dodo Payments 4% + 40c per US card or wallet payment, no monthly fee. Non-US payments add 1.5% and subscriptions add 0.5%. Standard payouts are free, with a $5 fee under $1,000. USD SWIFT payouts for non-US businesses cost $25. Sales tax is included: Dodo is the seller. | Polar Free Starter plan at 5% + 50c per transaction. Paid plans lower the rate: Pro is $20/month at 3.8% + 40c, and Growth and Scale go lower. Non-US cards add 1.5%. Tax calculation, filing and liability are included. Organisations created before May 27, 2026 can stay on the Early Member plan: 4% + 40c, plus 0.5% on subscriptions. |
| Best for | Dodo Payments Founders outside the US and EU, India especially, selling software worldwide. Dodo takes local payment methods: UPI in India, cards, Apple Pay and Google Pay. It remits sales tax as the seller, so you never register for VAT abroad. | Polar Solo founders and small teams selling digital products or SaaS worldwide, by subscription or as a one-time lifetime deal. You skip registering for VAT, GST and US sales tax before your twentieth customer. |
| Trade-offsVerbatim from the manifest | Dodo Payments
| Polar
|
| Required companionsAdded for you, with a reason | Dodo Payments
| Polar
|
| Recommended alongsideSuggested, never added for you | Dodo Payments
| Polar
|
| Env vars you will manageEvery one documented in docs/onboard.md | Dodo Payments 9 variables · 2 required
| Polar 9 variables · 3 required
|
| Dependencies added | Dodo Payments
| Polar
|
| MCP serversWritten into .mcp.json | Dodo Payments None. No extra agent tools from this one. | Polar
|
| Footprint in your repo | Dodo Payments 14 files, plus 3 injections into shared stack files | Polar 12 files, plus 3 injections into shared stack files |
What changes in your repo
The paths each battery contributes, diffed. A path in the third list is written by both, so swapping rewrites that file rather than adding one.
Only with Dodo Payments (9)
scripts/1 file
billing/1 file
- dodo-test-webhook.ts
src/8 files
app/1 file
api/1 file
webhooks/1 file
dodo/1 file
- route.ts
lib/7 files
billing/7 files
- dodo-config.ts
- dodo-events.test.ts
- dodo-events.ts
- dodo-fixtures.ts
- dodo-objects.test.ts
- dodo-objects.ts
- dodo.ts
Only with Polar (7)
scripts/1 file
billing/1 file
- test-webhook.ts
src/6 files
app/1 file
api/1 file
webhooks/1 file
polar/1 file
- route.ts
lib/5 files
billing/5 files
- polar-objects.test.ts
- polar-objects.ts
- polar-webhooks.test.ts
- polar-webhooks.ts
- polar.ts
Same path, different implementation (5)
scripts/3 files
billing/3 files
- prune-events.ts
- reconcile.ts
- sync-plans.ts
src/1 file
lib/1 file
billing/1 file
- provider.ts
tests/1 file
e2e/1 file
- billing-webhook.spec.ts
Shared stack files Dodo Payments injects into
- env-required
- legal-processors
- verify-checks
Shared stack files Polar injects into
- env-required
- legal-processors
- verify-checks
Dodo Payments in your .env.local
# required
DODO_PAYMENTS_API_KEY=dodo_test_replace_me
DODO_PAYMENTS_WEBHOOK_KEY=whsec_replace_me
# optional
BILLING_PRICE_PRO_LIFETIME=
BILLING_PRICE_PRO_MONTHLY=
BILLING_PRICE_PRO_YEARLY=
BILLING_PRICE_TEAM_MONTHLY=
BILLING_PRICE_TEAM_YEARLY=
DODO_PAYMENTS_ENVIRONMENT=test_mode
DODO_TAX_CATEGORY=saas
Polar in your .env.local
# required
POLAR_ACCESS_TOKEN=polar_oat_replace_me
POLAR_ORGANIZATION_ID=00000000-0000-0000-0000-000000000000
POLAR_WEBHOOK_SECRET=whsec_replace_me
# optional
BILLING_PRICE_PRO_LIFETIME=
BILLING_PRICE_PRO_MONTHLY=
BILLING_PRICE_PRO_YEARLY=
BILLING_PRICE_TEAM_MONTHLY=
BILLING_PRICE_TEAM_YEARLY=
POLAR_ENVIRONMENT=sandbox
What changes for your agents
Each battery ships rules, skills, subagents and hooks that an agent loads before it touches the code that battery owns. Picking one is also picking how your agents behave in src/lib/billing/**.
Dodo Payments
2
Skills
2
Rules
6
Solution docs
Rules (2)
Dodo translates, the shared billing core writes, and nothing leaves the server
src/lib/pricing.ts · src/lib/billing/** · scripts/billing/** · src/app/api/webhooks/dodo/**
Verify every Dodo webhook, keep every handler idempotent
src/app/api/webhooks/dodo/** · src/lib/billing/provider.ts · src/lib/billing/dodo-events.ts · src/lib/billing/dodo-objects.ts · src/lib/billing/webhook.ts
Skills (2)
/add-product
Add or change a plan or price on Dodo Payments (monthly, yearly or one-time lifetime). Edit src/lib/pricing.ts, create the Dodo product, wire its env var, and prove checkout and the webhook end to end.
/test-webhook
Exercise the Dodo webhook endpoint. Send a signed fixture offline, forward real test-mode events with the Dodo CLI, buy a subscription and a one-time product, refund one, assert idempotency, and debug signature failures.
Subagents and hooks
None of its own. The foundation agents and guard hooks still ship.
Polar
2
Skills
2
Rules
6
Solution docs
1
MCP servers
Rules (2)
Polar translates, the shared billing core writes the store
src/lib/pricing.ts · src/lib/billing/** · scripts/billing/**
Verify every Polar webhook, keep every handler idempotent
src/app/api/webhooks/polar/** · src/lib/billing/provider.ts · src/lib/billing/polar-webhooks.ts · src/lib/billing/webhook.ts
Skills (2)
/add-product
Add or change a plan or price on Polar (monthly, yearly or one-time lifetime). Edit src/lib/pricing.ts, create the Polar product, wire its env var, and prove checkout and the webhook end to end.
/test-webhook
Exercise the Polar webhook endpoint locally. Forward real sandbox events with the Polar CLI, or sign a one-time order yourself; buy both kinds of price, refund one, prove replays are no-ops, and debug signature failures.
Subagents and hooks
None of its own. The foundation agents and guard hooks still ship.
What each one already knows
Solution docs land in docs/solutions/ in your repo and are published here, so you can read the failure modes before you commit.
Dodo Payments (6)
- Selling software from outside the US, and why a merchant of record solves the payout problemIf your company is registered in India, Nigeria, Brazil or most of the world, the hard part is not accepting cards. It is getting paid, and staying compliant in a hundred countries you never visit.docs/solutions/dodo/merchant-of-record-payouts-outside-the-us.md
- One-time payments and subscriptions on Dodo Payments, side by sideDodo decides one-time or recurring from the product, and payment.succeeded fires for both. Tell them apart by the payment's subscriptions, store purchases separately, and let a refund take access back.docs/solutions/dodo/one-time-payments-with-dodo.md
- Refunds and chargebacks on Dodo, and what they should do to accessA refund or dispute webhook says which payment, not what was bought. Re-read the payment, derive the status from all its refunds and disputes, and never let a late event undo a refund.docs/solutions/dodo/refunds-and-disputes-bookkeeping.md
- Verifying Standard Webhooks signatures, the three headers and the two mistakesDodo signs id.timestamp.body with HMAC-SHA256. Verify the raw bytes, pass all three headers, and never write the comparison yourself.docs/solutions/dodo/standard-webhooks-signature-verification.md
- The Dodo subscription lifecycle, which event means what and who keeps accessactive, past_due, on_hold, paused, cancelled, failed, expired. Map each to access on purpose, re-read the subscription on every event, and let a grace period decide how failed renewals feel.docs/solutions/dodo/subscription-lifecycle-events.md
- Dodo test mode and live mode are two separate worldsDifferent API keys, webhook keys, product ids and customers. Nothing carries over, and the mismatch that hurts most is silent.docs/solutions/dodo/test-mode-vs-live-mode.md
Polar (6)
- Merchant of record explained, what Polar takes on that Stripe leaves with youWith Stripe you are the seller and you owe VAT, GST and US sales tax yourself. Polar sells on your behalf and carries that liability. What actually changes, what it costs, and how little of it reaches your code.docs/solutions/polar/merchant-of-record-vs-stripe.md
- Moving from Stripe to Polar without breaking existing customersYou cannot transfer live Stripe subscriptions to Polar. Sell new customers on Polar, keep Stripe's webhook alive for the ones you have, move them at renewal, and let the provider-neutral billing rows carry access through the whole overlap.docs/solutions/polar/migrate-a-stripe-catalogue-to-polar.md
- One-time and subscription products on Polar, from lifetime deal to renewalPolar sells one price per product, so a plan sold monthly, yearly and for life is three products. How each kind checks out, which webhook proves it was paid, where it is stored, and how access resolves when a customer holds both.docs/solutions/polar/one-time-and-subscription-products-on-polar.md
- Refunds and disputes on Polar, and taking access back exactly onceA refund arrives as order.refunded with the whole order. A dispute arrives as nothing at all. How this repo revokes a lifetime deal in both cases, why partial refunds keep access, and why a late paid delivery cannot give it back.docs/solutions/polar/refunds-and-disputes-on-polar.md
- Polar sandbox to production, the checklist that stops launch-day silenceSandbox and production are separate Polar deployments with separate tokens, product ids and webhook secrets. Nothing carries over. Everything that has to be recreated, in order, and how to prove it worked.docs/solutions/polar/sandbox-to-production-checklist.md
- Polar webhooks arrive twice and sign two ways, make the handler survive bothAt-least-once delivery means duplicates and out-of-order events are normal traffic, and Polar changed its signing key format in September 2026. Verify with both keys, claim the webhook-id before any write, re-read subscriptions and let orders only move forward.docs/solutions/polar/webhook-idempotency.md
Which one to pick
From meta.bestFor and meta.tradeoffs. If a claim is not in the manifest, it is not on this page.
Pick Dodo Payments when
Founders outside the US and EU, India especially, selling software worldwide. Dodo takes local payment methods: UPI in India, cards, Apple Pay and Google Pay. It remits sales tax as the seller, so you never register for VAT abroad.
And accept that(5)
- Dodo is the seller on the customer's statement and invoice. The tax liability moves to Dodo, which is the point, but your brand is not what shows on the card line.
- Younger than Stripe or Paddle, and the SDK changes more often. The version is pinned; read the release notes before upgrading.
- The flat rate costs more than a direct card processor because it includes the tax work. At high volume, compare it with Stripe plus a tax vendor.
- Fewer billing tools than Stripe. Failed renewals are not retried unless you turn Payment Retries on. Check that the reports and dunning you need exist before you commit.
- Payouts follow a collect-then-remit cycle, not a card processor's rolling schedule. Plan your runway on the payout date, not the charge date.
Pick Polar when
Solo founders and small teams selling digital products or SaaS worldwide, by subscription or as a one-time lifetime deal. You skip registering for VAT, GST and US sales tax before your twentieth customer.
And accept that(6)
- Polar is the seller on the customer's statement and invoice. That is the point: the tax liability moves to Polar. It also means the descriptor is not your brand, and enterprise buyers sometimes ask why.
- Payouts arrive on Polar's schedule, after it has collected and remitted. Plan your runway on that, especially in the first month.
- The fee is higher than a direct card processor because tax is included. At high volume, compare it with a processor plus a tax vendor.
- One product is one price. A plan sold monthly, yearly and for life is three Polar products and three env ids.
billing:sync-planscreates them for you. - Sandbox and production are separate Polar deployments with separate tokens, products and webhook secrets. Launch day is a second setup, not a switch.
- Fewer billing knobs than Stripe. For a plain subscription or a lifetime deal that is often enough.
Questions people actually ask
- Should I choose Dodo Payments or Polar?
- Dodo Payments is best for founders outside the US and EU, India especially, selling software worldwide. Dodo takes local payment methods: UPI in India, cards, Apple Pay and Google Pay. It remits sales tax as the seller, so you never register for VAT abroad. Polar is best for solo founders and small teams selling digital products or SaaS worldwide, by subscription or as a one-time lifetime deal. You skip registering for VAT, GST and US sales tax before your twentieth customer. Both fill the payments slot, so a generated repo carries one or the other, never both.
- How much do Dodo Payments and Polar cost?
- Dodo Payments: 4% + 40c per US card or wallet payment, no monthly fee. Non-US payments add 1.5% and subscriptions add 0.5%. Standard payouts are free, with a $5 fee under $1,000. USD SWIFT payouts for non-US businesses cost $25. Sales tax is included: Dodo is the seller. Polar: Free Starter plan at 5% + 50c per transaction. Paid plans lower the rate: Pro is $20/month at 3.8% + 40c, and Growth and Scale go lower. Non-US cards add 1.5%. Tax calculation, filing and liability are included. Organisations created before May 27, 2026 can stay on the Early Member plan: 4% + 40c, plus 0.5% on subscriptions.
- What changes in my repo if I switch from Dodo Payments to Polar?
- Dodo Payments writes 14 files, 9 environment variables and 3 dependencies, and installs 2 path-scoped rules, 2 skills and 6 solution docs. Polar writes 12 files, 9 environment variables and 2 dependencies, and installs 2 path-scoped rules, 2 skills and 6 solution docs.
Decide once, then build the repo that already knows the decision.
Either way you get that choice’s rules, skills and solution docs installed, plus the guard hooks, an onboarding doc for exactly these env vars, and the Compound Engineering loop. Free and MIT.