Skip to content

payments · side by side

Lemon Squeezy vs Stripe 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 Stripe if

SaaS selling to businesses and consumers in many countries. Best when you need real invoices, dunning, proration and a tax story your accountant will accept.

Side by side

Price, obligations, and the surface each one adds. No row is written by hand. This is manifest.yaml, rendered.

Lemon Squeezy compared with Stripe on pricing, fit, trade-offs, required companions, environment variables, dependencies, MCP servers and repo footprint.
From the manifestOption ALemon SqueezyOption BStripe
In one lineLemon Squeezy

Merchant of record with license keys built in. VAT and sales tax are its problem.

Stripe

Hosted Checkout, a customer portal you never build, and webhooks you test locally.

PricingLemon 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.

Stripe

2.9% + 30c per successful US card charge. No setup or monthly fee. Stripe Billing adds 0.7% of billing volume. Stripe Tax is extra, charged per transaction where you are registered to collect.

Best forLemon 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.

Stripe

SaaS selling to businesses and consumers in many countries. Best when you need real invoices, dunning, proration and a tax story your accountant will accept.

Trade-offsVerbatim from the manifestLemon 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.
Stripe
  • You are the merchant of record. You owe sales tax, VAT and GST yourself. Stripe Tax calculates and files, but the liability is yours. Merchant-of-record vendors (Polar, Dodo, Lemon Squeezy) take that liability, at a higher rate.
  • Webhooks are mandatory. Every subscription change reaches you asynchronously, at least once and out of order. Skip idempotency and you will double-grant entitlements in production.
  • Stripe is not available in every country, and some business types are not allowed. Check both before you build.
  • The API is deeper than you need on day one. The failure mode is over-modelling billing before you have ten paying customers.
  • The Stripe CLI's stripe listen forwards real webhooks to localhost, so you test the full loop before you deploy.
Required companionsAdded for you, with a reasonLemon Squeezy
  • A database battery
  • An auth battery
Stripe
  • A database battery
  • An auth battery
Recommended alongsideSuggested, never added for youLemon Squeezy
  • An email battery
Stripe
  • An email battery
Env vars you will manageEvery one documented in docs/onboard.mdLemon 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
Stripe

9 variables · 3 required

  • NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY
  • STRIPE_SECRET_KEY
  • STRIPE_WEBHOOK_SECRET
  • BILLING_PRICE_PRO_LIFETIME
  • BILLING_PRICE_PRO_MONTHLY
  • BILLING_PRICE_PRO_YEARLY
  • BILLING_PRICE_TEAM_MONTHLY
  • BILLING_PRICE_TEAM_YEARLY
  • STRIPE_AUTOMATIC_TAX
Dependencies addedLemon Squeezy
  • @lemonsqueezy/lemonsqueezy.js ^4.0.0
  • server-only ^0.0.1
Stripe
  • server-only ^0.0.1
  • stripe ~22.6.2
MCP serversWritten into .mcp.jsonLemon Squeezy

None. No extra agent tools from this one.

Stripe
  • stripe: https://mcp.stripe.com
Footprint in your repoLemon Squeezy

13 files, plus 3 injections into shared stack files

Stripe

10 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 (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

Only with Stripe (5)

  • src/5 files
    • app/1 file
      • api/1 file
        • webhooks/1 file
          • stripe/1 file
            • route.ts
    • lib/4 files
      • billing/4 files
        • stripe-objects.test.ts
        • stripe-objects.ts
        • stripe-provider.test.ts
        • stripe.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 Lemon Squeezy injects into

  • env-required
  • legal-processors
  • verify-checks

Shared stack files Stripe injects into

  • env-required
  • legal-processors
  • verify-checks

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

Stripe in your .env.local

.env.localbash12 lines
# required
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_replace_me
STRIPE_SECRET_KEY=sk_test_replace_me
STRIPE_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=
STRIPE_AUTOMATIC_TAX=false

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.

Stripe

  • 2

    Skills

  • 4

    Rules

  • 6

    Solution docs

  • 1

    MCP servers

Rules (4)

Stripe translates, the shared billing core writes the store

src/lib/billing/** · scripts/billing/**

Plans live in pricing.ts, Stripe ids live in env, amounts never come from the client

src/lib/pricing.ts · src/lib/billing/** · scripts/billing/**

Stripe objects are server-only

src/lib/billing/** · src/app/api/webhooks/stripe/** · src/app/**

Verify every Stripe webhook, keep every handler idempotent

src/app/api/webhooks/stripe/** · src/lib/billing/provider.ts · src/lib/billing/webhook.ts

Skills (2)

/add-plan

Add or change a plan or price on Stripe (monthly, yearly or one-time lifetime). Edit src/lib/pricing.ts, create the Stripe price, wire its env var, and prove checkout and the webhook end to end.

/test-webhook

Exercise the Stripe webhook endpoint locally. Forward real events with the CLI, buy a subscription and a one-time price, refund one, assert idempotency, 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)

Stripe (6)

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

Pick Stripe when

SaaS selling to businesses and consumers in many countries. Best when you need real invoices, dunning, proration and a tax story your accountant will accept.

And accept that(5)
  • You are the merchant of record. You owe sales tax, VAT and GST yourself. Stripe Tax calculates and files, but the liability is yours. Merchant-of-record vendors (Polar, Dodo, Lemon Squeezy) take that liability, at a higher rate.
  • Webhooks are mandatory. Every subscription change reaches you asynchronously, at least once and out of order. Skip idempotency and you will double-grant entitlements in production.
  • Stripe is not available in every country, and some business types are not allowed. Check both before you build.
  • The API is deeper than you need on day one. The failure mode is over-modelling billing before you have ten paying customers.
  • The Stripe CLI's stripe listen forwards real webhooks to localhost, so you test the full loop before you deploy.

Questions people actually ask

Should I choose Lemon Squeezy or Stripe?
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. Stripe is best for SaaS selling to businesses and consumers in many countries. Best when you need real invoices, dunning, proration and a tax story your accountant will accept. Both fill the payments slot, so a generated repo carries one or the other, never both.
How much do Lemon Squeezy and Stripe 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. Stripe: 2.9% + 30c per successful US card charge. No setup or monthly fee. Stripe Billing adds 0.7% of billing volume. Stripe Tax is extra, charged per transaction where you are registered to collect.
What changes in my repo if I switch from Lemon Squeezy to Stripe?
Lemon Squeezy writes 13 files, 9 environment variables and 2 dependencies, and installs 2 path-scoped rules, 2 skills and 8 solution docs. Stripe writes 10 files, 9 environment variables and 2 dependencies, and installs 4 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.