payments · side by side
Dodo Payments vs Lemon Squeezy 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 Lemon Squeezy if
Solo founders and small teams selling SaaS, desktop apps or digital downloads worldwide. You get checkout, tax, license keys and a customer portal on day one, with no VAT registration anywhere. Strong fit for software sold with license keys, because Lemon Squeezy issues and validates them itself.
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 BLemon Squeezy |
|---|---|---|
| In one line | Dodo Payments Merchant of record in 220+ countries and regions. Sales tax is Dodo's job. | Lemon Squeezy Merchant of record with license keys built in. VAT and sales tax are its problem. |
| 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. | Lemon Squeezy 5% + 50c per transaction, no monthly fee. Non-US payments and PayPal each add 1.5%, and subscriptions add 0.5%. Tax calculation, filing and remittance are included. |
| 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. | Lemon Squeezy Solo founders and small teams selling SaaS, desktop apps or digital downloads worldwide. You get checkout, tax, license keys and a customer portal on day one, with no VAT registration anywhere. Strong fit for software sold with license keys, because Lemon Squeezy issues and validates them itself. |
| Trade-offsVerbatim from the manifest | Dodo Payments
| Lemon Squeezy
|
| Required companionsAdded for you, with a reason | Dodo Payments
| Lemon Squeezy
|
| Recommended alongsideSuggested, never added for you | Dodo Payments
| Lemon Squeezy
|
| Env vars you will manageEvery one documented in docs/onboard.md | Dodo Payments 9 variables · 2 required
| Lemon Squeezy 9 variables · 3 required
|
| Dependencies added | Dodo Payments
| Lemon Squeezy
|
| MCP serversWritten into .mcp.json | Dodo Payments None. No extra agent tools from this one. | Lemon Squeezy None. No extra agent tools from this one. |
| Footprint in your repo | Dodo Payments 14 files, plus 3 injections into shared stack files | Lemon Squeezy 13 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 Lemon Squeezy (8)
scripts/1 file
billing/1 file
- test-webhook.ts
src/7 files
app/1 file
api/1 file
webhooks/1 file
lemonsqueezy/1 file
- route.ts
lib/6 files
billing/6 files
- lemonsqueezy-fixtures.ts
- lemonsqueezy-objects.test.ts
- lemonsqueezy-objects.ts
- lemonsqueezy-provider.test.ts
- lemonsqueezy-signature.ts
- lemonsqueezy.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 Lemon Squeezy 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
Lemon Squeezy in your .env.local
# required
LEMONSQUEEZY_API_KEY=replace_me_with_a_test_mode_api_key
LEMONSQUEEZY_STORE_ID=replace_me_with_the_numeric_store_id
LEMONSQUEEZY_WEBHOOK_SECRET=replace_me_6_to_40_chars
# optional
BILLING_PRICE_PRO_LIFETIME=
BILLING_PRICE_PRO_MONTHLY=
BILLING_PRICE_PRO_YEARLY=
BILLING_PRICE_TEAM_MONTHLY=
BILLING_PRICE_TEAM_YEARLY=
LEMONSQUEEZY_MODE=test
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.
Lemon Squeezy
2
Skills
2
Rules
8
Solution docs
Rules (2)
Lemon Squeezy translates, the shared billing core writes
src/lib/billing/** · scripts/billing/**
Verify X-Signature on the raw body, and key every delivery without a delivery id
src/app/api/webhooks/lemonsqueezy/** · src/lib/billing/provider.ts · src/lib/billing/lemonsqueezy-objects.ts · src/lib/billing/lemonsqueezy-signature.ts · src/lib/billing/webhook.ts
Skills (2)
/add-plan
Add or change a plan or price on Lemon Squeezy (monthly, yearly or one-time lifetime). Edit src/lib/pricing.ts, create the variant, wire its env var, and prove checkout and the webhook end to end.
/test-webhook
Exercise the Lemon Squeezy webhook endpoint. Signed one-time purchases and refunds on localhost, forged requests, duplicates, mode and store guards, subscriptions and failed renewals.
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
Lemon Squeezy (8)
- Idempotent Lemon Squeezy webhooks when there is no delivery idLemon Squeezy signs the raw body with X-Signature, sends no event id, and retries three times. Build your own idempotency key, verify in constant time, and know what to re-read.docs/solutions/lemonsqueezy/idempotent-webhooks-without-a-delivery-id.md
- Lemon Squeezy license keys for desktop apps, CLIs and pluginsTurn on license keys per variant, activate and validate from the client with the public License API, and tie key expiry to the subscription. What to cache and what never to ship.docs/solutions/lemonsqueezy/license-keys.md
- What "merchant of record" means for your taxes on Lemon SqueezyLemon Squeezy sells to your customer and you sell to Lemon Squeezy. What that moves off your plate, what it does not, and how to show prices honestly.docs/solutions/lemonsqueezy/merchant-of-record-tax.md
- One-time purchases on Lemon Squeezy, from lifetime deal to refundA lifetime deal is a single-payment variant, and order_created fires for subscriptions too. How to tell them apart, find the buyer, show the purchase, and take access back on a refund.docs/solutions/lemonsqueezy/one-time-purchases-with-lemon-squeezy.md
- Lemon Squeezy orders, invoices and partial refunds, and what each does to accessThe first payment arrives as an order and an invoice, refunded_amount is a running total, and chargebacks send no event. How to record each once and revoke access on the right one.docs/solutions/lemonsqueezy/orders-invoices-and-partial-refunds.md
- Recovering from missed Lemon Squeezy webhooksThree retries over about two and a half minutes, then the event is gone. A nightly reconcile from the API, what it can and cannot rebuild, and how to fix the rows it cannot.docs/solutions/lemonsqueezy/recovering-from-missed-webhooks.md
- The Lemon Squeezy subscription state machine, and who keeps accesson_trial, active, past_due, unpaid, paused, cancelled, expired. Which unlock your product, how to normalize them, and the two states people get wrong.docs/solutions/lemonsqueezy/subscription-states-and-access.md
- Moving a Lemon Squeezy integration from test mode to live modeTest and live are separate worlds with separate keys, webhooks and variant ids. The checklist, and the silent mismatch that sells nothing.docs/solutions/lemonsqueezy/test-mode-to-live-mode.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 Lemon Squeezy when
Solo founders and small teams selling SaaS, desktop apps or digital downloads worldwide. You get checkout, tax, license keys and a customer portal on day one, with no VAT registration anywhere. Strong fit for software sold with license keys, because Lemon Squeezy issues and validates them itself.
And accept that(5)
- Lemon Squeezy is the seller on the statement and the invoice. Tax liability moves to it, which is the point. Your brand is not what the customer sees on their card line.
- The base rate, 5% + 50c, is above Dodo's 4% + 40c and matches Polar's free plan. Run the numbers against both before you launch.
- Owned by Stripe since 2024. In January 2026 it said its goal is an easy migration to Stripe Managed Payments. Read that plan before you build on it.
- The API cannot create products or prices. You create the variants in the dashboard;
billing:sync-planschecks them against src/lib/pricing.ts and finds their ids for you. - Webhooks carry no delivery id and retry only three times (5s, 25s, 125s). A handler that is down for three minutes loses events, so a nightly reconcile from the API ships with it.
Questions people actually ask
- Should I choose Dodo Payments or Lemon Squeezy?
- 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. Lemon Squeezy is best for solo founders and small teams selling SaaS, desktop apps or digital downloads worldwide. You get checkout, tax, license keys and a customer portal on day one, with no VAT registration anywhere. Strong fit for software sold with license keys, because Lemon Squeezy issues and validates them itself. Both fill the payments slot, so a generated repo carries one or the other, never both.
- How much do Dodo Payments and Lemon Squeezy 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. Lemon Squeezy: 5% + 50c per transaction, no monthly fee. Non-US payments and PayPal each add 1.5%, and subscriptions add 0.5%. Tax calculation, filing and remittance are included.
- What changes in my repo if I switch from Dodo Payments to Lemon Squeezy?
- Dodo Payments writes 14 files, 9 environment variables and 3 dependencies, and installs 2 path-scoped rules, 2 skills and 6 solution docs. Lemon Squeezy writes 13 files, 9 environment variables and 2 dependencies, and installs 2 path-scoped rules, 2 skills and 8 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.