payments · side by side
Lemon Squeezy 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 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.
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 ALemon Squeezy | Option BPolar |
|---|---|---|
| In one line | Lemon Squeezy Merchant of record with license keys built in. VAT and sales tax are its problem. | Polar Merchant of record for developers. Polar sells to your customer, so tax is its job. |
| Pricing | 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. | 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 | 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. | 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 | Lemon Squeezy
| Polar
|
| Required companionsAdded for you, with a reason | Lemon Squeezy
| Polar
|
| Recommended alongsideSuggested, never added for you | Lemon Squeezy
| Polar
|
| Env vars you will manageEvery one documented in docs/onboard.md | Lemon Squeezy 9 variables · 3 required
| Polar 9 variables · 3 required
|
| Dependencies added | Lemon Squeezy
| Polar
|
| MCP serversWritten into .mcp.json | Lemon Squeezy None. No extra agent tools from this one. | Polar
|
| Footprint in your repo | Lemon Squeezy 13 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 Lemon Squeezy (7)
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
Only with Polar (6)
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 (6)
scripts/4 files
billing/4 files
- prune-events.ts
- reconcile.ts
- sync-plans.ts
- test-webhook.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 Lemon Squeezy injects into
- env-required
- legal-processors
- verify-checks
Shared stack files Polar injects into
- env-required
- legal-processors
- verify-checks
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
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/**.
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.
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.
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
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 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.
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 Lemon Squeezy or Polar?
- 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. 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 Lemon Squeezy and Polar cost?
- 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. 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 Lemon Squeezy to Polar?
- Lemon Squeezy writes 13 files, 9 environment variables and 2 dependencies, and installs 2 path-scoped rules, 2 skills and 8 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.