- Ben Makes Stuff
- Posts
- How and why you should move from Lemon Squeezy to Stripe
How and why you should move from Lemon Squeezy to Stripe
And why you're wasting your time and money with a Merchant of Record (MoR) solution as a B2B SaaS founder
Disclosure: This post contains affiliate links, meaning I get a commission if you decide to make a purchase through my links, at no cost to you.
Hey there, allow me to (re)introduce myself š
Iām Ben, a solo founder living in Thailand š¹š and originally hailing from the USA šŗšø. I quit my big tech job back in May 2023, and by July 2023 I had decided to embark on a journey of building profitable businesses on my own with a goal of getting to $10K MRR.
Starting in July, I launched several businesses, all using Lemon Squeezy as the payment processor. Iām happy to say that after 7 months and 7 launches, Watchdog started doing consistent monthly revenue that has been growing at a healthy rate each month.
And here we are in December 2024. Iām nowhere close to that $10K MRR goal yet, but Iām going to keep pushing until I get there.
With that said, I decided recently that I wanted and needed to stop using Lemon Squeezy as my payment processor (or any other merchant of record solution / āMoRā) after being a huge proponent of them in month 2 of my journey. I bet youāre asking:

Thanks Obama.
Why would you do such a thing?!
Disclaimer: The information contained in this post is provided for informational purposes only, and should not be construed as legal or financial advice on any subject matter.
The short answer is that my original line of thinking for using Lemon Squeezy (and really, any MoR) was flawed, primarily based around sales tax compliance, and I was doing too much planning for situations that may never occur or will only occur many years down the road. That was dumb.
That said, to expand on why I consider this a mistake a bit more, my main concerns and reasons for not using Stripe back in month two of my journey were related to sales tax aches and pains:
I didnāt know what kind of product would be the most successful for me, so I was trying to plan for the worst case scenario of a B2C app taking off and immediately owing tons of tax in different countries (again, a mistake to over-plan for this type of event). Instead, it turned out that my most successful product would be a B2B SaaS product where sales tax does not apply in most countries.
At the time, Stripe did not have a way to mark the VAT number - necessary to show that a transaction is B2B and therefore applicable to reverse charge rules in most countries - as a required field at checkout. Now they do.
I was wrong about sales in the UK being subject to sales tax with no threshold where I would be responsible for remitting the tax immediately. This kind of thing does not apply to B2B transactions, similar to many other countries in the EU.
Overall, while sales tax rules can be quite complex globally - and different countries enforce them in different ways - these pains mostly exist for those building B2C apps, which I am not involved with and not what this blog post is about.
As I alluded to above, B2B apps often fall under āreverse chargeā rules where the supplier (you, as the business owner) are not liable to remit sales tax in most EU countries where youād actually expect to get sales. And in the United States, roughly 50% of the states do not consider B2B SaaS transactions taxable at all.
The other US states do, but have high sales tax thresholds in the $100K-500K of sales range typically - meaning youād need to do $100K-$500K of sales in a single US state to customers living in that state to be liable for tax in that state.
When I get to that point of having so many customers that Iām exceeding these thresholds, Iāll solve that problem. Stripe will even tell me when Iām about to exceed some thresholds so I can register for sales tax. But itās not a good use of time to solve it now. I need to be marketing, building things customers are asking for, and so on.
Iād argue that even if you have a B2C app, itās still not a particularly worthwhile problem to tackle immediately. The focus should be on acquiring customers, listening to what they want, and building whatever that is for them.
To put this another way: if youāre a new business owner and your revenue is $1/month, is the government in Zimbabwe šæš¼ really going to spend the time, money, and effort going after you for whatever percentage of $1 in tax revenue?
No, of course not. Donāt try to solve this problem on day 1. Worry about this when youāre approaching $1M ARR, at which point you can certainly afford to hire a CPA to handle global tax compliance for you, which will also almost certainly be cheaper than whatever price a MoR will charge you.
So whatās right (and wrong) with Lemon Squeezy and Stripe?
Letās enumerate the major pros and cons of Lemon Squeezy. I feel confident in these pros and cons having used LS as my only payment processor for a year now, but Iād imagine many of the same pros and cons apply to other MoRs such as Paddle, Gumroad, etc:
Pros:
ā
Global sales tax compliance But if youāre doing B2B SaaS and/or especially if youāre a new business owner, you shouldnāt be overly concerned about this as I explained above
ā
Integrated affiliate program with a landing page, onboarding, and dashboard included
ā
Automated cart recovery
Cons:
ā Showstopping bugs, no visibility into low level card or customer details when bugs happen, and slow support š
ā High fees, almost double what Stripe charges on average
ā Poor interop with other tools, nothing like Stripeās extensive app marketplace
ā Their hosted checkout is ~25% slower to render than Stripeās and Iāll prove it
ā You will hit Sales tax thresholds faster than you would selling directly to customers (Iāll explain why this is problematic below)
ā Slow payouts every two weeks. But in practice, you might only get paid out monthly (Iāll explain). Stripe pays out daily.
For Stripe, the pros and cons are mostly just the inverse of the above, but it does have one extra feature I like a lot that isnāt available on Lemon Squeezy:
š² Stripe Climate: this takes an extra ~0.5-1.5% of your revenue (you get to select how much to donate), but itās for a good cause, a cool looking climate badge shows up on your checkout page, and you get a free 90+ DR do-follow backlink from Stripe since the bottom of the Climate page links back to your website.
Now letās delve (jk, Iām not a LLM) further into the cons for Lemon Squeezy, shall we?
Note: I wonāt re-cover the fee and interop points since you can just click the links above to see what I mean, but I will cover everything else.
Con #1: Slow Checkout Performance š¢
Hereās Lemon Squeezy:

Load time for Lemon Squeezyās hosted checkout for the Launch plan on https://watchdog.chat as tested by Pingdomās Washington, D.C. location.
And hereās Stripe š:

Load time for the competition: Stripeās hosted checkout for the Launch plan on https://watchdog.chat as tested by Pingdomās Washington, D.C. location.
As you can see, Stripeās page does ~3x fewer web requests and has a ~25% faster load time. Interestingly, it manages this despite having a ~3x larger page size of 4.4MB.
Overall, I expect Stripeās noticeable performance advantage and more familiar checkout UX to lead to higher conversions over time. More importantly though, how about those show stopping bugs?
Con #2: Showstopping Bugs š
Here are the two most major issues I encountered while using Lemon Squeezy for a year. Both involved failed payments and lost revenue:
I created some products in Lemon Squeezyās ātest modeā before doing the usual thing of hitting the button to copy the products to production mode:
Everything worked in test, so I hit the ācopy to productionā button. Famous last words, right? Letās just say when people started placing orders in prod, things did not work:What a helpful failure reason. Itās also [Unknown] why I didnāt switch payment processors at this point š„“
As it turned out, the LS team had shipped a bug that involved copied products having corrupt Stripe price IDs or something like that, which then caused checkouts to fail.
This was when I first discovered that Lemon Squeezy was using Stripe behind the scenes, because the error message displayed to me mentioned a price ID ofprice_1234ABC...
and some other Stripe-specific terminology.
By the way, donāt take after LSā example here: never display internal system details to a user like that.
Anyway, LS fixed the problem shortly after this, but it took some back and forth on their Slack workspace to get them to pay attention to it. Seemed like some seriously sloppy testing on their part to not catch this before deploying to real users.
Iām more forgiving for products that donāt relate to serious payment or legal concerns, but for a payment processor? This kind of bug is not acceptable.I noticed that one of my oldest customers had a repeatedly failing payment for this monthās subscription renewal:
This is literally all the info that the Lemon Squeezy dashboard gives me about failed transactions.
When I tap on the notification, it just shows the list of orders with a āfailedā tag next to each one that failed with no further detail. Unhelpful to say the least.
So I reached out to the customer thinking it was just a case of an expired credit card. Well, nope, his card details were apparently just gone:As you might imagine, itās quite scary to hear that your customerās payment details have magically disappeared out of thin air. Poof. šØ
Of course, I immediately sent anUrgent: customer credit card details deleted
email to Lemon Squeezy. I followed up on social media after I didnāt get a reply after 12h, and then again at 24h and eventually had to tag the CEO of Lemon Squeezy and the CEO of Stripe to get someone to pay attention quickly.
They then reset something on their end, I confirmed that the customerās credit card magically reappeared, and shortly after that, the payment was processed without an issue.
But, I wasnāt impressed with the relatively slow response and lack of ETA provided when I reached out to support. More critically, this issue also made me realize that the generic āfailed paymentā notification that shows up in the LS dashboard is not enough for me to understand whatās happening.
I realized that I needed low level access to transaction data (card info, charge rejection reasons, etc.) that only Stripe can provide in order to debug efficiently without needing to involve an external support team as I had to do here.
Con #3: Sales tax thresholds getting hit faster š
See, thereās this funny thing about MoRs, including Lemon Squeezy. Most of them work by using a payment processor behind the scenes like Stripe, and as such they tend to lump all of their customers into one single Stripe account.
I canāt say if Lemon Squeezy does this or not since I donāt have access to their code, but itās typically why MoR companies are so picky about who they onboard and why their onboarding needs to be so stringent: one ābad appleā merchant selling a scam product can cause their entire set of merchants to get deactivated along with them.
More importantly, this also has a negative effect for you as a normal business owner. As you might be able to imagine, companies that have multiple customers āsharingā one account at a payment processor end up showing a lot of revenue on paper.

A recent invoice that one of my customers paid on Lemon Squeezy with sales tax included. I would have never had to charge him sales tax had I sold him the product directly, because I wasnāt over the sales tax threshold in his country on my own.
That relatively high, $100,000+ threshold for having to remit sales tax in the US for example? That gets hit a lot faster when you have ānoisy neighborsā doing $50,000 MRR even though youāre only at $50 MRR on your own, for example.
As the above screenshot shows, customers buying a product through a MoR will often see an extra line item on their bill for sales tax, which can then disappoint people into leaving the page just as theyāre getting ready to pull the trigger and purchase your product for the first time.
Of course, your customers going to see that line item eventually anyway when you start doing serious revenue and exceed sales tax thresholds on your own, therefore triggering Stripe Tax, but you might as well delay that as long as possible.
Con #4: Slow payouts š¦
This one is pretty clear.
Lemon Squeezy is only able to pay out every two weeks, but realistically youāll only get paid once per month when youāre getting started.
Why? Lemon Squeezy has a two week period for each payment to clear, which will then exceed the first payout deadline for the month - which again means youāre only going to get paid out once per month in practice until youāre doing at least a few hundred bucks of MRR.
Not great. On the other hand, Stripe pays out fast for everyone: on a daily basis, except for your very first payment.
āļø Tip: if you sign up with my favorite business bank, Novo (ā affiliate link), thereās a unique Stripe benefit where they pay you out instantly, for free depending on how much balance is available in your Stripe account:
Time to Move
Once I decided that the benefits of using a MoR werenāt offsetting the downsides involved anymore, I started researching how I would go about replacing Lemon Squeezy.
The first thing I did is attempt to find replacements for the three features I knew Iād need to migrate from Lemon Squeezy:
Affiliate marketing integration:
Lemon Squeezyās affiliate program is quite nice. It includes a landing page, an onboarding form (i.e. to qualify leads with how much traffic they have), and a dashboard to manage affiliates.
I only have a handful of affiliates right now, so I couldnāt justify the cost of most paid affiliate programs to replace it. I only found two promising options with good free tiers, and only one of them actually worked:
PromoteKit ā (ā affiliate link; 3 referred customers for free, then $29/mo)
The PromoteKit Dashboard
I found PromoteKit with the help of ChatGPT. Sleek dashboard, nice and simple UX, mass payouts supported, and their tracking script worked without any issues. Winner winner chicken dinner, despite the strict limits on number of customers referred on the free plan.
I first integrated PromoteKitās tracking script with my landing page, then I created a simple form with YouForm to create an onboarding experience that gates people from becoming affiliates if I reject their submissions. This replaces Lemon Squeezyās onboarding experience since PromoteKitās free tier doesnāt include an onboarding page (their paid plan does). I only send people an invite through PromoteKit after Iāve reviewed their submission.
I emailed all of my affiliates to tell them to use the new affiliate program instead of Lemon Squeezy. Since PromoteKit supports the same URL format that LS does and affiliates are able to customize their URL, they didnāt have to make any changes to the links theyāve already shared
TrackDesk (free tier without mass payouts and $1K/mo in affiliate rev, then $67/mo)
Their dashboard had a sloppy UX, and more importantly the product was fully broken, at least for me.
I added their tracking script to my website, no errors appeared in the console, yet clicks were not being recorded even with a disabled ad blocker. I gave up after debugging for a bit. Wasnāt about to unminify their JS to get this working.
They then spammed me with āgot time for a quick call???ā emails and I wrote them off completely.
ā ļø Another negative: they donāt support mass payouts on their free tier, so youād have to manually pay affiliates out. Would be very annoying to have to do this with multiple people to pay out.
2. Automated cart recovery:
I didnāt bother replacing this right now because I looked at my last year of payments, and while cart recovery triggered a few times and emails were sent, it never actually recovered any carts. So itās not the most critical thing to replace right now.
The Stripe recommendation is to simply consume their checkout.session.expired
webhook and send an email via SES or whatever your email provider of choice is, so Iāll prioritize that for later if I see a lot of abandoned checkouts over the next few months.
3. Webhooks:
Ok, so both Stripe and Lemon Squeezy include a webhook integration. However, Stripeās is significantly different than Lemon Squeezyās and arguably a bit more complex.
Hereās a code sample I found which explains how to properly implement Stripe webhooks in your backend application:

Code is credit to https://x.com/miguelsarenas. I havenāt tested this code directly as I write my backend code in Golang and not JavaScript, but found it to be a helpful explainer for different checkout states you might need to account for.
The dreaded payment data migration š°
This part took the longest (really, only a few days) because I was waiting on email replies and the process is slightly involved, but was overall easier than expected.
Just as a note: thereās misinformation out there saying that itās an impossible process, you canāt transfer customer payment details, only customer emails will be transferred, etc - I can confirm none of that is true because Iāve just gone through the process.
Itās very possible to transfer customer details and associated payment instruments because Lemon Squeezy is using Stripe behind the scenes, so they effectively export data from one Stripe account to another using built-in tooling in Stripe when they get one of these requests.
The migration process involves several steps:
Set up a Stripe account and switch all of your links on your website from Lemon Squeezy to Stripe. This is important to do first as it allows new customers to use Stripe while old ones remain on Lemon Squeezy, and it avoids you having to do the migration to Stripe multiple times in case new customers sign up while youāre mid-migration.
First, create your Products, and associate one or more Prices to the product. Note: Prices are the same concept as Lemon Squeezy Variants.
Then create a Payment Link for each Price.Hereās how my payment links are set up. The āNameā is just an internal name that isnāt shown to customers.
Each payment link will have a URL that will look like this provided youāre using Stripeās hosted checkout on the Stripe domain: https://buy.stripe.com/aEU7uJ6xS2BG1WMaEH
Next, make sure to set up the Customer Portal by enabling it in Settings ā Billing in Stripe:Note the āCustomer portal link.ā
You should now replace your Lemon Squeezy billing portal links (For example, billing portal links starting with: yourstore.lemonsqueezy.com) with the above Customer Portal Link.Contact Lemon Squeezy with your Stripe account ID (destination) and ask them to copy over all of the customer data and payment info from your existing Lemon Squeezy store (source). Hereās an email template you can copy and paste to accomplish this:
Hello, I'd like to copy all of my customer + payment details to my Stripe account as I am migrating from Lemon Squeezy to Stripe.
I'm currently following the guide here as recommended by Stripe support: https://docs.stripe.com/get-started/data-migrations/pan-copy-self-serve
Here's the information you should need to get this going:
Lemon Squeezy store (source): https://yourstore.lemonsqueezy.com/
Stripe account ID (destination): acct_YourAccountIDGoesHere
Stripe account Name (destination): Your Account Name Goes Here
Please copy all customer *and* payment data as I will need to resubscribe all of my customers using their existing payment instruments without their intervention.
Additionally: please send me a 1-1 mapping of each customer to their most recent payment method so I can recreate subscriptions using the right payment method selected.
I will need you all to initiate this process on your end as I can only approve the data to be copied once you've initiated it.
Thank you,
YOUR NAME
Then, once Lemon Squeezy gets back to you, log into Stripe and hit āacceptā on the notification telling you that you have a data import pending:

What the Customers page looks like after Lemon Squeezy initiates the export from their account to yours. Note the āLemon Squeezy Appā notification at the top.
(Optional, if youāre selling subscriptions) Recreate all subscriptions and schedule them to start on the right dates, then cancel the old Lemon Squeezy subscriptions to avoid double charges.
āļø Tip: if you have a lot of customers to migrate, say 100+ subscriptions, then itās worth it to use Stripeās CSV import tool instead of using the Stripe UI to create Subscriptions. Check out the documentation for that tool here.
First, head over to the āCreate Subscriptionā UI under Subscriptions. Make sure you pay attention to customers that have already paid for the month (have them start next month on whichever day-of-month they signed up initially) vs. ones that have not (have them start this month instead):Hereās where you select the customer and the duration (you will only need to set the start date)
On the same screen, make sure to select the last card that the customer used under subscription settings. Remember, this mapping is in the file Lemon Squeezy sent you.
Hereās a subset of my subscriptions after I completed the migration process so you can see roughly what it looks like:You will have to click āScheduledā to see upcoming Subscriptions as they wonāt show up by default.
Now that youāve scheduled all your subscriptions in Stripe, the last step is to cancel the old subscriptions in Lemon Squeezy to prevent your customers from getting double charged on their renewal date.
Very simple, just log into LS and hit cancel next to each subscription, or use their cancel subscription API if you have a lot of customers.
When youāre done with this, double check that all Subscriptions in Lemon Squeezy showCancelled
:
If so, youāre all done!
Conclusion: Just use Stripe ā
I wish I had used Stripe from the beginning, but ābetter late than neverā applies to moving payment processors, and if youāre considering it: the best time to move is now, before your customer count increases. These things get exponentially painful as you acquire more customers after all.
I hope this guide helped you move your account from Lemon Squeezy (or another MoR, it should be a similar process) to Stripe and/or that you can avoid some of my mistakes.
If you enjoyed the post, click here to Buy Me a Coffee. Your support really does motivate me to continue to write.
Either way, happy Stripe-ing!
Reply