Stripe Billing → Lemon Squeezy
Move Stripe products, customers, payment methods, invoices, subscriptions, and coupons into Lemon Squeezy through their two-phase, vendor-run PCI transfer. You send a Stripe account ID and a restricted read-only key. Indian subscription migrations are not supported. Link, SEPA, Bacs, and ACH methods may not copy. Cancel Stripe subscriptions only after Lemon Squeezy recreates them.
Should you make this move?
Both platforms have a case. Compare what you gain with what you give up before scheduling the cutover.
Stripe Billing
- Flexible APIs, pricing models, and ecosystem integrations support sophisticated billing
- Checkout, subscriptions, tax, and customer records are consolidated
- The seller retains tax, compliance, fraud, and substantial implementation responsibility
- Billing state and compliance responsibilities make switching unusually sensitive
Lemon Squeezy
- Merchant-of-record handling simplifies global tax and digital-product sales
- Checkout, subscriptions, tax, and customer records are consolidated
- Platform eligibility, payout control, and customization are more constrained than direct billing
- Billing state and compliance responsibilities make switching unusually sensitive
Lemon Squeezy: Merchant-of-record handling simplifies global tax and digital-product sales. This removes a major source-side concern: The seller retains tax, compliance, fraud, and substantial implementation responsibility.
What you lose: Flexible APIs, pricing models, and ecosystem integrations support sophisticated billing. What you inherit: Platform eligibility, payout control, and customization are more constrained than direct billing.
Jump to a section
Know the shape of the move.
This timeline assumes
- Up to 100,000 customers and 50,000 subscriptions that Lemon Squeezy agrees to migrate
- Lemon Squeezy, not your app, runs the PCI customer and payment-method transfer.
- Finance and legal accept merchant-of-record invoices, tax, and customer notices.
- The store is created and activated on Lemon Squeezy before phase 1.
- You agree an import date so phase 2 and customer comms happen together.
What survives the move.
“Partial” and “manual” are not footnotes. They are work that must be scheduled and verified.
| Item | Outcome | Impact | What happens | Mitigation |
|---|---|---|---|---|
| Products, prices, customers, payment methods, invoices, subscriptions, and coupons | partial | critical | Lemon Squeezy lists those Stripe objects as supported. They map products and prices to products and variants, invoices to orders, coupons to discounts. | Ask Lemon Squeezy for a written object list for your account before you send the key. |
| Indian subscription accounts | lost | critical | Lemon Squeezy says regulatory rules block subscription migration for Indian-based Stripe accounts. One-time purchases can still import. | Confirm account country first. Plan a re-subscribe path if subscriptions cannot move. |
| Link, SEPA, Bacs, and ACH payment methods | lost | critical | Lemon Squeezy quotes Stripe: those methods stored as payment method objects do not copy between accounts today. | Count those methods. Plan reauthorization for those customers. |
| Product description, media, files, and variants | manual | high | After phase 1 you must add description, media, files, and variants by hand. Those fields are not in the Stripe import. | Add them and test checkout before phase 2. |
| Phase 2 import date | manual | critical | Phase 2 starts new sales on Lemon Squeezy, imports recent Stripe data, recreates subscriptions, then you cancel Stripe subscriptions so people are not billed twice. | Agree the import date in writing. Do not let either side charge until that sequence is done. |
| Merchant of record, tax, and invoices | manual | critical | Lemon Squeezy becomes the seller on the receipt. Tax, invoice legal entity, and customer terms change. | Get legal and finance sign-off. Update terms before the first live charge. |
| Stripe IDs, webhooks, and entitlements | lost | critical | cus_, sub_, and price IDs do not remain the app's source of truth. Lemon Squeezy events and IDs start fresh. | Build an ID map. Make webhooks idempotent before phase 2. |
| Restricted API key | manual | critical | You create a read-only restricted key with core and billing read scopes Lemon Squeezy lists, then delete it after the move. | Send the key only through the channel they specify. Delete it when they finish. |
| Customer portal and invoices history | partial | high | Customers may need a new Lemon Squeezy order-access path. Stripe hosted invoice URLs stay in Stripe. | Tell customers how to reach past orders on both sides. |
| Trials, schedules, and grandfathered prices | partial | high | Complex Stripe schedules and custom prices may not recreate with the same next-bill date. | Pilot every lifecycle state. Reconcile the first renewal. |
| Refunds, disputes, and credit notes | partial | high | Historical Stripe disputes stay in Stripe. New refunds go through Lemon Squeezy. | Keep Stripe open for in-flight disputes. |
| App entitlements | manual | critical | Your app must grant access from Lemon Squeezy events, not leftover Stripe status. | Ship and test the new entitlement path before phase 2. |
Where each thing goes.
| Source | Destination | Method | Notes |
|---|---|---|---|
| Stripe product and price | Lemon Squeezy product and variant | transform | Add description, media, files, and variants after phase 1. |
| Stripe customer | Lemon Squeezy customer | automatic | Keep the Stripe customer id in your map. |
| Card payment method | Transferred method if Stripe copies it | transform | Link, SEPA, Bacs, and ACH may not move. |
| Stripe invoice | Lemon Squeezy order | transform | Legal entity on the PDF changes. |
| Stripe subscription | Recreated Lemon Squeezy subscription | transform | Cancel the Stripe copy only after recreate. |
| Stripe coupon | Lemon Squeezy discount | transform | Check duration and redemption limits. |
| Stripe webhook and app entitlement | Lemon Squeezy webhook and new IDs | manual | Do not read Stripe status after cutover. |
| Stripe account ID acct_ | Lemon Squeezy migration request | manual | Required with the restricted key. |
| Indian Stripe subscriptions | No destination | unsupported | One-time purchases only for those accounts. |
Make the move recoverable.
Create the source-of-truth backup
Keep a Stripe financial snapshot and a written Lemon Squeezy import date before anyone charges on the new store.
- Export customers, subscriptions, prices, coupons, and invoices from Stripe.
- Count payment-method types, including Link, SEPA, Bacs, and ACH.
- Record the Stripe account ID and country.
- Activate the Lemon Squeezy store.
- Store exports with checksums and the agreed import date.
Proof to capture: Dated Stripe exports, method counts, account country, and a signed import date.
Phase 1 data migration
Let Lemon Squeezy copy supported Stripe objects.
- Create the read-only key with the scopes they list.
- Send the acct_ id and the key through their channel.
- Add product media, files, and variants when they finish.
- Test checkout. Do not announce go-live yet.
Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.
Phase 2 go-live
Switch new sales and recreate subscriptions on one date.
- Point new checkout at Lemon Squeezy.
- Let them import the Stripe delta.
- Confirm recreated subscriptions and first renewals.
- Cancel the Stripe subscriptions they replaced.
Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.
The things most likely to hurt.
These are operating limits. Treat every “Stop if” condition as a blocked migration, not a suggestion.
Both sides charge
Stripe subscriptions stay active after Lemon Squeezy recreates them.
- Consequence
- Customers are billed twice.
- Mitigation
- Cancel Stripe only after the recreate report. Watch the first cycle.
Stop if: Any mapped subscription is active in both systems.
Vendor starts charging before the agreed date
Lemon Squeezy emails that everyone is migrated and charging.
- Consequence
- Customers see a new merchant with no notice.
- Mitigation
- Put the import date in writing. Pause if they move early.
Stop if: Charges start without the signed date and customer notice.
ACH or SEPA customers cannot renew
Those methods did not copy.
- Consequence
- Renewals fail.
- Mitigation
- Reauthorize those customers before the next bill.
Stop if: A material cohort has no transferable method.
App still trusts Stripe subscription status
Entitlements read Stripe after phase 2.
- Consequence
- Paid users lose access or keep access after cancel.
- Mitigation
- Switch the entitlement source first.
Stop if: Production still reads Stripe for access.
Do the work in this order.
- Days 1–5 · inventory
Inventory Stripe and legal change
8–16 hours active3–5 days elapsedLegal and finance waiting- Count objects and method types.
- Confirm account country.
- Approve merchant-of-record notices.
Stop / go checkpointRequest the migration?
Go when: Country, methods, and legal notices are signed.
Stop when: Indian subscriptions are in scope with no re-subscribe plan.
- Days 5–8 · backup
Export Stripe and open the store
4–8 hours active2–3 days elapsedStore activation waiting- Export Stripe objects.
- Activate Lemon Squeezy.
- Create the restricted key.
Depends on: inventory
Stop / go checkpointSend the key?
Go when: Exports hash and the store is active.
Stop when: The key scopes are wrong.
- Days 8–25 · phase1
Vendor copy and catalog repair
10–24 hours active10–20 days elapsedLemon Squeezy PCI transfer waiting- Send acct_ and the key.
- Add media, files, and variants.
- Test checkout. Wire webhooks.
Depends on: backup
Stop / go checkpointAgree an import date?
Go when: Catalog, webhooks, and checkout pass on a test purchase.
Stop when: Supported objects are missing or entitlements still read Stripe.
- Agreed import date · cutover
Phase 2 switch
8–16 hours active1–3 days elapsedVendor recreate waiting- Start new sales on Lemon Squeezy.
- Import the Stripe delta.
- Cancel replaced Stripe subscriptions.
Depends on: phase1
Stop / go checkpointLemon Squeezy owns recurring revenue?
Go when: No dual-active subscription and entitlements match.
Stop when: Any customer is charged twice.
- Days after import · observe
Watch the first renewal cycle
10–20 hours active7–20 days elapsedFirst renewals waiting- Watch failed payments and entitlements.
- Keep Stripe for disputes.
- Delete the restricted key.
Depends on: cutover
Stop / go checkpointClose rollback?
Go when: The first cycle completes without a trigger.
Stop when: Renewals or access fail.
Cut over with a way back.
Cutover
Make Lemon Squeezy the only place that charges for the moved catalog.
- Confirm the written import date and customer notice.
- Point new checkout at Lemon Squeezy.
- Let Lemon Squeezy import the Stripe delta and recreate subscriptions.
- Cancel the Stripe subscriptions they replaced.
- Reconcile active counts and a renewal sample.
Proof to capture: One active subscription per customer. Entitlements read Lemon Squeezy. Stripe is not charging those items.
Rollback
Return charging to Stripe without a second merchant taking money.
- Pause Lemon Squeezy checkout and subscription renewals.
- Restore Stripe checkout and do not leave both charging.
- Export Lemon Squeezy-era orders.
- Keep Stripe as the dispute venue for older charges.
- Tell customers which merchant will appear next.
Proof to capture: Stripe is the only charger for the catalog. Lemon Squeezy is paused.
- Dual-active subscriptions
- Charges on an unsigned import date
- A material non-card cohort cannot renew
- Entitlements still read the wrong provider
- A blocking check cannot be fixed before the next renewal batch
Prove the migration worked.
Every blocking check must pass. Capture the evidence before cleanup begins.
| Pass | ID | Check | Method | Expected result | Evidence |
|---|---|---|---|---|---|
V-01Blocking | Product and price map | Compare Stripe products with Lemon Squeezy products and variants. | Every live price has an approved variant. | Price ledger. | |
V-02Blocking | Customer count | Compare Stripe customers with Lemon Squeezy customers. | Counts match or variances are signed. | Customer sheet. | |
V-03Blocking | Method coverage | Count Link, SEPA, Bacs, ACH, and cards on both sides. | Non-copying methods have a reauth plan. | Method report. | |
V-04Blocking | No dual charge | Join active Stripe and Lemon Squeezy subscriptions by customer. | No overlapping active item. | Join report. | |
V-05Blocking | Entitlements | Test new purchase, renewal, cancel, and past-due. | Access follows Lemon Squeezy events. | Webhook and access log. | |
V-06Blocking | Merchant on the receipt | Complete a live test purchase. | The receipt matches the approved merchant-of-record notice. | Test receipt. | |
V-07Blocking | Restricted key removed | Inspect Stripe API keys after phase 2. | The migration key is deleted. | Key list. | |
V-08Blocking | First cycle | Watch the first renewal batch. | Approved success and failure rates. No surprise merchant change mid-cycle without notice. | Renewal report. |
Remove the scaffolding safely.
Safe after: One full renewal cycle, no dual-active subscriptions, and a signed report.
- Archive Stripe exports, the ID map, and receipts.
- Delete the restricted Stripe key.
- Keep Stripe open for disputes and the rollback window.
- Cancel unused Stripe billing only after finance sign-off.
- Update customer billing FAQ and terms.
- Schedule the next Lemon Squeezy catalog and webhook review.
When the plan met reality.
First-hand accounts are preferred. Vendor case studies are labeled, and every note below is an editorial paraphrase—follow the link for the full context.
Miha Rekar moved Visualizer Premium from Stripe to Lemon Squeezy in February 2025 so a merchant of record could handle tax. After nine days of silence, Lemon Squeezy emailed at 8 PM to say they had migrated everyone and started charging. Not all data arrived correctly. After three days of debugging with Lemon Squeezy's lead developer, he reported the issues fixed on 5 February. Bank statements now show Lemon Squeezy or LEMSQZY* STORE. He asked users to report double charges or lost Premium status.
- Treat the vendor-run Stripe transfer as a date they pick, and have support ready the hour they flip charges.
- Watch for missing entitlements and double charges until you reconcile every paid customer against Stripe.
- A merchant-of-record move can start charging before your app and their data agree.
- Statement descriptors change to Lemon Squeezy, so tell customers what they will see on the card.
Verify against the primary material.
Platform behavior changes. Check these sources and the review dates above before executing a production migration.
- Lemon Squeezy: migrating from StripeAccessed 2026-10-30
- Stripe: Billing customersAccessed 2026-10-30
- Stripe: import subscriptions toolAccessed 2026-10-30
- Lemon Squeezy: importing subscriptionsAccessed 2026-10-30