Every "leave Shopify" pitch talks about what you gain: no revenue share, no extension ceiling, full control.
Fewer talk about what you lose, because what you lose is invisible. Shopify's best feature is all the work you never see it doing.
When we moved Increddy, a license-key storefront, onto a self-hosted Medusa v2 backend, three of those invisible jobs became ours overnight. If you're about to make the same move, here's the bill.
Job #1: Currency, all of it
On Shopify, a merchant can sell in a dozen currencies without making a single decision about rounding, conversion or display.
Self-hosted, everything is a decision. Which currencies? What price does a product get in a currency nobody set a price for? What happens to the cart when a shopper switches currency halfway through?
Then there's the one that nearly got us:
Medusa's core cart-update API resets the cart's currency to the store default on any cart mutation.
Read that again. Add a coupon, update a line item, and your "cart follows your currency" feature quietly breaks. Nothing errors. The cart just changes currency on its own.
The fix was narrow: avoid that endpoint for most updates and set currency-sensitive data when the cart is created. Finding it took reading what the framework actually does, not what the endpoint name suggests it does.
Job #2: Payments that misbehave
Shopify treats authorization, capture, retries and webhook delivery as solved. You never think about it.
Self-hosted, "the payment webhook retried" becomes your problem. So does the webhook that arrives twice, and the one that turns up after your system has already moved on.
For a store where every successful payment has to produce exactly one license key, that's not a side quest. It's the main event. Increddy ended up with two independent triggers and a reconciliation sweep. (That design gets its own post.)
Job #3: Inventory that isn't a number
Shopify's inventory model is roughly "a count goes down when someone buys."
A license-key business needs something else entirely: a pool of unique keys, each assigned exactly once, plus a defined plan for when the pool runs dry mid-checkout.
Plot twist: Shopify doesn't give you that either. It needed custom logic on any platform, which was part of why moving the backend made sense in the first place.
So... should you leave?
Here's the honest trade:
- Shopify's invisibility costs a revenue share forever and a ceiling on custom logic.
- Self-hosting's visibility costs the engineering hours to build and maintain all three jobs above.
For Increddy, the key-reservation logic is the product, so owning it was worth it. For a simple catalogue with nothing unusual going on at checkout, it probably isn't.
Know which one you are before you sign up.
See what we actually built for Increddy (the key engine, the fraud layer, the currency model) in the full case study on kryeo.com →
The longer write-up of this post, including a side-by-side of what Shopify provides vs. what we had to build, is on the Kryeo blog.
We're Kryeo. We help teams make exactly this call, and then build it, through our Medusa development work.
Top comments (0)