← All writing
Craft · · 7 min

The checkout isn't yours

Rented constraint, owned complexity, and the question nobody wants to answer out loud.

Ecommerce Shopify

Every few months somebody asks me some version of “should we build this on Shopify or Magento,” and it always gets phrased like a question about the platforms. I don’t really think it is. My sense, for what it’s worth, is that the honest answer has almost nothing to do with feature grids and almost everything to do with a question about the company that people would rather not say out loud, which is: do you have engineers, and are you going to still have them in three years.

But let me back into that, because leading with it sounds flippant and I don’t mean it that way.

What each one is actually selling you

Shopify sells constraint. Magento sells control. Everything else downstream of that is detail.

With Shopify you’re renting a very good machine that somebody else keeps running. Uptime is theirs. PCI scope is mostly theirs. The Black Friday spike is emphatically theirs, and I cannot overstate how much that’s worth if you’ve ever spent a Q4 watching a Magento cron queue back up while the CEO is in the room. Somebody else is awake at 3 am and it is not you. What you trade for that is the ability to ever finish the sentence “well, at checkout we need to…”

With Magento you own the whole thing, including all the parts you didn’t want. The data model is genuinely good at weird commerce: customer group pricing, tier pricing, attribute sets that actually mean something, multi-source inventory, B2B quoting, 80,000 SKUs where the SKUs have opinions. If your business logic is strange in an uncompromising way, Magento will just let you have it. And in exchange you own the upgrade path, the patch cadence, the Redis config, the OpenSearch cluster, and the one person on the team who knows why the indexer is stuck.

The checkout is the real boundary

This is the part I’d actually make people sit with, because it’s where the abstract “constraint” thing turns concrete and permanent.

Shopify Scripts stopped executing at the end of last month. checkout.liquid is already gone for the information, shipping and payment steps. What you get instead is Checkout UI Extensions for interface bits, Shopify Functions for discount and shipping logic (sandboxed Wasm, with an execution budget measured in single-digit milliseconds), and Web Pixels for tracking. That’s the whole surface. If your promo logic needs to call your ERP mid-checkout to find out what this customer’s contract price is, you’re not doing that, and no amount of budget fixes it.

You're not renting a platform. You're renting a checkout, and the rest of the store comes along with it.

And look, I want to be fair here, because the framing that Shopify “took away” the checkout gets it backwards. The checkout was never on offer. It’s the thing they’re protecting, and the constraint is exactly why it converts. Shop Pay is a genuine moat. You are not going to out-build it, your agency is not going to out-build it, and roughly every team I’ve watched try has an incident channel to show for the attempt. Giving up checkout control is a real cost and it’s also, most of the time, the single best trade in the deal 🙃.

The case for Magento, which is narrower than it used to be

I don’t want to write Magento’s obituary, partly because it’s been written about six times already and the thing keeps having a pulse. Roughly 160,000-ish live stores, somewhere around 8% of the market by most counts. That’s not nothing. It’s also a fraction of what it was in the Magento 1 days, and the trajectory is what it is.

The frontend story got meaningfully better, which is the part people who bounced off it in 2019 tend not to know. Hyvä basically took Luma out back, and a Tailwind and Alpine theme with a fraction of the JS weight fixed the single most embarrassing thing about the platform. Mage-OS exists as a community fork with actual governance if you’d rather not have your roadmap set by a company that clearly wants you on a SaaS plan. Adobe’s direction of travel here is not subtle, and I’d factor that in.

So the real Magento case, as I see it, is: complicated B2B or contract pricing, a catalog whose structure is a competitive advantage rather than a spreadsheet, an integration surface deep enough that “there’s an app for that” isn’t true, and a team. Not an agency retainer. A team.

The TCO conversation is usually dishonest in both directions

The Shopify pitch says free-ish and predictable, and then you get there and you’re running 18 app subscriptions, several of which are $200 a month, plus a percentage on every transaction if you’re not on Shopify Payments, plus Plus if you need Functions doing anything serious. It adds up faster than the deck implied. The app tax is real and people underbudget it every single time.

But the Magento pitch says the license is free, and that’s true in the way that a puppy is free. You’re paying in salary. A competent Magento 2 developer plus hosting plus the patch cadence plus the quarterly “why is checkout slow now” investigation is comfortably a six-figure line item before you’ve shipped a feature. The license was never the cost. It was never even close to the cost.

I know the counter, which is that agency retainers make this a wash and you can just buy the expertise. Maybe? I’d just say two things. First, a retainer buys you hours, not continuity, and the person who understood your indexer will roll off. Second, base rates: think about how many self-hosted Magento builds you’ve seen still on a supported version four years later, versus how many are sitting two minor versions back because the upgrade keeps losing to the roadmap. That ratio has not been kind in my experience.

So, the actual question

All else equal, if your commerce is normal-shaped (products, variants, a cart, maybe a subscription), take the constraint. Take Shopify. The operational relief is worth more than the flexibility you’re giving up, and the flexibility you’re giving up is mostly flexibility to build a worse checkout.

Take Magento if your weirdness is the business, and you have or will actually fund the people to hold it up. Not “we’ll hire later.” Later doesn’t come, and then it’s 2029 and you’re on 2.4.6 with a patch backlog and everyone’s afraid of the deploy.

The thing that gets left out of all these comparisons, though, is that the platform is almost never why a store does badly. It’s merchandising. It’s the photography, the returns policy, the fact that nobody can find the size chart, the four business days before anything ships. I’ve watched a beautiful headless build lose to a stock theme because one of them had product descriptions written by a human being. Platform choice is real and it’s worth thinking about carefully and it is also, I suspect, maybe the fifth most important decision on the list.

My experience skews mid-market and I have obvious scar tissue from a couple of migrations that went badly, so weigh that in. If you already know which one you want and you’re just looking for permission: you probably know something about your own org that I don’t. Good luck out there.

Read similar posts
6 min

Liquid is not a programming language

I spent a week being annoyed that the template language wouldn't let me do a thing, and then worked out that it wouldn't let anybody do that thing, on purpose, and that the restriction is most of why the platform works at all.

7 min

Stop and ask me

Three Claude skills cover the whole life of a Shopify client repo at work, and after writing all three I'm fairly sure the steps are the least valuable thing in them. The value is the four or five places where the runbook is told to refuse.