Skip to content

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.

Dodo Payments compared with Lemon Squeezy on pricing, fit, trade-offs, required companions, environment variables, dependencies, MCP servers and repo footprint.
From the manifestOption ADodo PaymentsOption BLemon Squeezy
In one lineDodo 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.

PricingDodo 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 forDodo 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 manifestDodo Payments
  • 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.
Lemon Squeezy
  • 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-plans checks 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.
Required companionsAdded for you, with a reasonDodo Payments
  • A database battery
  • An auth battery
Lemon Squeezy
  • A database battery
  • An auth battery
Recommended alongsideSuggested, never added for youDodo Payments
  • An email battery
Lemon Squeezy
  • An email battery
Env vars you will manageEvery one documented in docs/onboard.mdDodo Payments

9 variables · 2 required

  • DODO_PAYMENTS_API_KEY
  • DODO_PAYMENTS_WEBHOOK_KEY
  • BILLING_PRICE_PRO_LIFETIME
  • BILLING_PRICE_PRO_MONTHLY
  • BILLING_PRICE_PRO_YEARLY
  • BILLING_PRICE_TEAM_MONTHLY
  • BILLING_PRICE_TEAM_YEARLY
  • DODO_PAYMENTS_ENVIRONMENT
  • DODO_TAX_CATEGORY
Lemon Squeezy

9 variables · 3 required

  • LEMONSQUEEZY_API_KEY
  • LEMONSQUEEZY_STORE_ID
  • LEMONSQUEEZY_WEBHOOK_SECRET
  • BILLING_PRICE_PRO_LIFETIME
  • BILLING_PRICE_PRO_MONTHLY
  • BILLING_PRICE_PRO_YEARLY
  • BILLING_PRICE_TEAM_MONTHLY
  • BILLING_PRICE_TEAM_YEARLY
  • LEMONSQUEEZY_MODE
Dependencies addedDodo Payments
  • dodopayments ~2.52.0
  • server-only ^0.0.1
  • standardwebhooks ^1.1.1
Lemon Squeezy
  • @lemonsqueezy/lemonsqueezy.js ^4.0.0
  • server-only ^0.0.1
MCP serversWritten into .mcp.jsonDodo Payments

None. No extra agent tools from this one.

Lemon Squeezy

None. No extra agent tools from this one.

Footprint in your repoDodo 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

.env.localbash12 lines
# 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

.env.localbash12 lines
# 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)

Lemon Squeezy (8)

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-plans checks 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.