payments · tutorial · webhooks
Next.js LemonSqueezy: Delete VAT Homework in 1 Switch
Merchant-of-record billing without the tax paperwork: LemonSqueezy behind the same provider interface, one env switch. Setup inside.

Your first global sale comes with homework
A customer in Berlin buys your $199 lifetime deal.
Congratulations.
You now owe German VAT homework.
Registration.
Collection.
Remittance.
Records.
Then France. Then a US state with opinions about digital goods.
Stripe processes the card beautifully and leaves the tax entirely to you. For US-only sellers, that is fine. For everyone selling worldwide from day one, the first global month becomes a compliance project wearing a revenue costume.
A merchant of record is the other answer. LemonSqueezy sells on your behalf, handles VAT and GST worldwide, and pays you out.
You trade a fee margin for weekends back.
Direct processor or merchant of record
| Concern | Stripe, direct | LemonSqueezy, MoR |
|---|---|---|
| Card processing | Excellent, global | Excellent, global |
| VAT, GST, sales tax | You register, file and remit | Them, handled everywhere |
| Payout shape | Rolling, about two days | Check the current schedule |
| Fee level | A lower percentage | Higher, the tax service is inside |
| Webhook control | The full event firehose | Curated order events |
| Lock-in | Your tax setup everywhere | Switchable through one interface |
Three details decide it for indies.
Tax registration has no minimum. One €199 sale to the EU can trigger obligations no solo founder has time to learn. A merchant of record turns unknown unknowns into a line on the fee.
Payout timing matters at small scale. Rolling payouts fund ads and servers weekly. Slower merchant-of-record payouts need a cash buffer. Price the float honestly before you switch.
Webhooks are simpler, not weaker. Order created. Refunded. Subscription updated. Fewer event types cover the indie surface fully, and less firehose means less code.
Neither rail is "better". Stripe wins on control and payout speed. LemonSqueezy wins on freedom from tax offices.
What to do
Flip one setting. Add the provider's keys.
Set LemonSqueezy as the active provider. Add your store details and webhook signing secret to your production settings.
The switch is deployment config, not a code change. Staging can run one provider and production another. Nothing in the app has to know.
Verify every webhook. Record every order once.
Each incoming event is checked against its signature before anything is written. An unsigned or tampered request is rejected, and nothing is saved.
Each order is stored under a reference that includes the provider's name, so a Stripe event and a LemonSqueezy event never collide. The price comes from your own product row, never from what a request claims.
The same event arriving twice records one order.
Grant access through the same paid-access check.
A successful LemonSqueezy order and a Stripe payment grant access through the same switch on the user. Removing access works the same way.
Access logic never branches on the provider.
The rail-switch drill
| Check | Action | Pass looks like |
|---|---|---|
| Signature enforced | Send an unsigned test request | Rejected, nothing written |
| Order once | Replay the same event twice | One order recorded |
| Switch works | Change the setting on staging | Checkout and webhook both work |
| Payout reconciles | Compare payouts to orders monthly | Totals match to the cent |
Rehearse the switch on staging before tax season forces it. Ten minutes that de-risks the quarter where global sales outrun your tolerance for paperwork.
The other column
Higher fees and slower payouts fund the tax service. At small revenue that difference is real money, and slower cash flow takes a buffer.
The kit does not reconcile payouts for you, so the monthly comparison is a manual habit.
Know this first
LemonSqueezy costs more than Stripe and pays out on its own schedule. It does not remove income tax or bookkeeping.
BoringPush runs one provider at a time.
Why BoringPush is the way to do this
VAT, off your plate.
LemonSqueezy is a merchant of record. BoringPush wires it behind the same interface as Stripe. One setting switches it on.
Every event is verified. Every order records once.
FAQ
Is LemonSqueezy enough for EU VAT?
That is the merchant-of-record promise: LemonSqueezy is the seller, so VAT collection and remittance sit with them. Verify the current terms for your product type, because digital-goods rules shift. You still handle income tax on your payouts.
A merchant of record removes the VAT registration spiral. It does not remove accountants.
How do subscription upgrades and prorations work?
Proration is calculated on LemonSqueezy's side. Test the upgrade, downgrade and cancel paths on staging in test mode before you offer them, because billing state machines deserve rehearsals, not hopes.
Can I run Stripe and LemonSqueezy at the same time?
One provider is active at a time, selected by a setting. Running two in parallel for different products or regions is possible with extra work on your side, and BoringPush does not route between them for you.
What happens to webhooks during a switch?
Keep both providers' signing secrets configured through the transition week so late events from the old provider still verify. Switches are additive until proven, and destructive never.
Do I still need the drill if I start here?
Yes, adapted. Signature rejection, replay protection and amount-from-the-product-row threaten every provider identically. Run the checklist for each one you operate.
When is Dodo the better merchant of record?
For founders selling mostly one-time lifetime deals with global and India coverage. LemonSqueezy is mature on subscriptions, while Dodo leans toward one-time global checkout. Same interface and same access check, so pick by catalog shape and switch by quarter.
Keep reading
- Next.js Stripe Trap: The Retry That Double-Charges You — the dedupe pattern this rail reuses
- Take Money 3 Ways, Write Checkout Once — the architecture all three rails share
- Your Paywall Is 47 ifs. It Should Be 1 Boolean. — the access side every rail feeds
+ all the boring stuff (analytics, auth, SQLite ↔ Supabase, full marketplace, webhooks)
Command from your phone.
Built so autonomous AI agents build what you want without breaking what's already paying you.
- Built-in analytics — cookie-free mode, $0 forever, no PostHog bill
- SQLite ↔ Supabase: one setting, same field names
- Full digital marketplace & feedback boards included
- 3 payment rails: Stripe, LemonSqueezy & Dodo Payments
- Agent fences: lint gate, read-only data access, auto-rollback
- Ship from your phone via SSH & WireGuard/Tailscale in under a minute
$199
Get BoringPushOne-time payment · Lifetime updates · Unlimited projects.
Keep reading


