The Reluctant Guide to Shopify Migrations

Act IV: The Joinery

Markets, And The Apparatus That Wasn't Maintaining Anything (Reprise)

The meeting was supposed to take twenty minutes. Naomi had put it on the calendar with a one-line agenda—walk me through how we price across the EU markets—and a private expectation that the pricing team would talk for ten minutes, she would nod, and the requirement would go into the migration brief marked the way every such requirement gets marked: non-negotiable, preserve as-is. That was the plan. Greycott sells olive oil and vinegar and spice blends and gift sets into seven European markets, and somewhere in the eight years since the brand crossed the Atlantic, the pricing for those markets had become a thing the company did rather than a thing anyone could explain. Naomi wanted it explained. She did not, particularly, want it examined. There is a difference, and she found out what it was about forty minutes in.

The pricing lead pulled up the workbook. A tab per market, a matrix of per-category multipliers inside each tab—gift sets behaved differently from single bottles, single bottles differently from bulk, and the multipliers were not the same from France to Germany to the Netherlands. It was a careful instrument. Someone reviewed the output before it shipped. It took most of a day to run, when it ran well. And then Naomi, who is not an e-commerce person by training—she ran a healthcare ERP rollout before this and took the Greycott job on the theory that Shopify would be the easier of the two systems to wrangle, a theory she has had several private opportunities to revisit—asked the question that was not on the agenda. She asked the pricing lead to put two of the markups side by side. The markup for one product category in one market, and the markup for the same category in the market next door.

They were identical to within three tenths of a percent. So was the next pair. A third multiplier, on inspection, did nothing but round prices up to whole euros—a job a single setting could do. A fourth, nobody in the room could account for at all; it had a value, and the value was applied faithfully every week, and the reason it had that value had left the company sometime around 2019 and taken the reason with it. The twenty-minute meeting did not end on time. Nobody’s twenty-minute meeting about pricing ever does.


We have told a version of this story already, earlier in the book, about a wine retailer with seven EU markets and a spreadsheet that had become its own documentation. That was a different brand—a different country, a different catalog, a different team that built its apparatus with care and maintained it with discipline for eight years without anyone standing outside it to ask what it was for. We are not going to retell that one; it is theirs, and it has its epitaph already. We mention it only so that you understand I am not surprised. I have seen this exact shape twice now, in two unrelated companies, and would frankly bet on seeing it in yours. The requirement you inherit is not the requirement you have. You met that sentence before as a story about someone else. Here it is again, this time as a thing happening in a room with a real PM in it, who is about to discover that the most expensive part of her migration is the part she assumed she could copy across without thinking.

That is the trap of an international migration, and it has a specific gravity to it. The conversation almost always opens with the wrong question. The wrong question is what do we need to replicate?—and it is wrong not because replication is bad but because it smuggles in an assumption, namely that everything currently running is load-bearing. The better question, the one that costs nothing to ask and frequently saves a year, is the one this whole strand of the book keeps circling back to: what have we been paying to maintain that we never had to have? You ask it once, gently, in a small room with the spreadsheet open, and you find out which of your non-negotiables were negotiable all along.


There is a reason this question matters more for Markets than it used to, and the reason is that Shopify Markets has quietly become good. Not good in the marketing sense, where every release note is a revolution; good in the boring, load-bearing sense, where the thing you needed an entire separate store to accomplish three years ago is now a configuration screen. If your mental model of selling internationally on Shopify was formed in the era of Expansion Stores—one full store per country, cloned and maintained in parallel—that model is out of date, and holding onto it will cost you.

Expansion Stores worked. That is the honest thing to say about them. You stood up a store per market, and each store was complete and independent and did exactly what that market needed. The trouble was never that they failed; the trouble was the hidden ledger they ran up while succeeding. Every app you licensed, you licensed per store—the tidy two-thousand-dollar-a-year tool becomes a twenty-thousand-dollar line item the moment you have ten markets, and nobody decided that on purpose; it accreted. Themes and catalogs that should have been one thing were now ten things that had to be kept in sync by hand, which is to say they were kept in sync until the week someone was on holiday. Governance multiplied. Platform licensing stacked up past the free slots and started costing real money. None of it was visible from inside any single store. You could only see it by standing outside and adding it all up, and standing outside is precisely the thing a running operation never makes time to do—until the migration hands it the excuse.

A hand-drawn illustration of an overcomplicated network of pipes, gears, and tubes sprawling across a surface, with nearly every branch looping uselessly back on itself, while a single modest pipe quietly does the actual work at the end.
Seven tabs. Four multipliers. One of them rounded to whole euros. One of them, nobody could explain.

What Markets gives you now, in exchange for collapsing all of that back into one store, is more than most teams walking into discovery expect. You get per-market catalogs that inherit from a single source, with adjustments expressed as a flat amount or a percentage, or overridden product by product where you genuinely need to. You get legal-entity separation, which sounds like a footnote and is in fact enormous for any brand with real tax and invoicing obligations across borders. You get per-market customization of a shared theme, so the German storefront can differ from the French one without forking the whole thing. You get automatic hreflang, so you stop hand-maintaining the tags that tell Google which page is for whom. You get a subfolder structure or a separate domain, your choice. You get a robots.txt that adapts per market. And you get Translate & Adapt for the content layer. Most of what a brand thinks it needs a store-per-country to do, one Markets-enabled store now does—and it does it without the per-store ledger quietly compounding in the background.


This is the part where an honest guide stops selling and starts naming the ceilings, because Markets is not magic and the ceilings are real. There are four worth knowing precisely, because the cost of discovering them mid-project is measured in months.

The first is rule-based pricing. If your pricing logic is category X carries a different markup than category Y, and that relationship varies by market—the very thing Greycott’s spreadsheet was doing every week—Markets will not do it for you. Markets does flat and percentage adjustments and per-product overrides; it does not run a rules engine. If your category differentiation is genuinely load-bearing, the answer is a PIM or an external pricing engine that computes the fixed prices and pushes them in. That is a real tool for a real need. The question—and you know the question by now—is whether your need is real or inherited.

The second ceiling is fully separate themes per market. Markets gives you customization within a shared theme, not divergent visual identities. If France and Japan are meant to look like different brands, not the same brand wearing different translations, you are back in Expansion Stores territory for those markets. Most brands discover they wanted consistency anyway. Some genuinely don’t, and for them the ceiling is a wall.

The third is per-market team access. Staff permissions in Shopify are not scoped by market. If your operating model has siloed regional teams who must only see and touch their own market, the platform cannot partition them that way, and a separate store becomes the mechanism for the partition—not because the market needs its own store commercially, but because your org chart does. This is the ceiling that surprises people, because it is not a commerce limitation at all. It is an organizational one wearing a technical costume.

The fourth ceiling is the app ecosystem, and it is the one that surfaces last and costs the most to find late.

The failure modes here are specific, and they are quiet, which is what makes them expensive. A search tool indexes your product data correctly and then misses your translated pages entirely, so a German customer searching in German finds nothing, and no error is logged, because from the app’s point of view nothing went wrong. A wishlist app stores a snapshot of a product when the customer saves it—and stores it without market context—so when the customer comes back, the wishlist cheerfully shows them the wrong market’s price, and the first you hear of it is a support ticket. Neither of these announces itself. Both of these are the kind of thing that “Markets-compatible” was supposed to have ruled out, and didn’t.


Now hold the four ceilings and the discovery question in the same hand at once, because that is where the chapter actually lives.

Here is how the international architecture conversation goes wrong, and it goes wrong in a way that feels like diligence the whole time it is happening. You list your requirements. Each requirement hits a ceiling. For each ceiling, there is a workaround—a real one, recommended in good faith by people who know the platform. Rule-based pricing hits the wall, so you bring in a PIM. The app stack has compatibility gaps, so you scope custom feed work to close them. Regional teams need isolation, so you stand up an Expansion Store for that. Each of these is individually defensible. You could write the business case for any one of them and it would pass review. And then you look at what you have built—a PIM, plus a custom feed pipeline, plus an Expansion Store, plus the Markets store they all orbit—and you realize you have assembled something more fragile than the thing you were migrating away from. The workarounds compounded. They always do. And the maintenance overhead for the whole contraption does not stay behind in the project; it follows you forward, year after year, renamed but intact.

A hand-drawn illustration of a chair repaired so many times with incompatible materials—tape, wire, planks, a broom-handle leg—that it now looks more fragile and complicated than the chair it was originally meant to be.
A PIM, plus a custom feed pipeline, plus an Expansion Store, plus the Markets store they all orbit. More fragile than the thing you were migrating away from.

The way out is not cleverness. It is the unglamorous discipline of asking, before each workaround gets greenlit, whether the requirement that summoned it was ever yours to begin with. The PIM is the right call if your category pricing is genuinely differentiated. It is an expensive monument to a precision that does not exist if your multipliers turn out, on inspection, to be identical to within three tenths of a percent and rounding to whole euros and one number nobody can explain. The only way to tell the two situations apart is to do what Naomi did in that meeting she thought would take twenty minutes: open the spreadsheet, put two numbers side by side, and ask out loud whether the difference between them has ever, even once, changed what a customer did.

She found that it hadn’t. Most of it, anyway. There was one category—gift sets, as it happened, which carry genuinely different margins and genuinely different supplier terms by market—where the differentiation was real, and for that one category the team will likely need a small external pricing step, and that is fine. That is the system telling the truth. The point was never that complexity is always fake. The point is that you cannot know which of your complexity is real until someone stands outside it and asks, and the migration is very possibly the only time in a decade that anyone will. Shopify Markets has real limitations. But some of the complexity it can’t accommodate was never as necessary as it appeared.


So the work, when you reach the international surface of your migration, is not to inventory what you have and reproduce it. It is to stand in front of each non-negotiable and ask it to prove it is one. Some will. The legal entity separation is real. The one genuinely differentiated product category is real. And some will fail the test gracefully, the way a held breath fails when you finally let it out—the third multiplier that only rounded, the fourth that nobody could name, the regional store you were about to stand up to satisfy an org chart that the migration is also, conveniently, a chance to question.

The requirement you inherit is not the requirement you have. You have now heard it as someone else’s story and watched it happen in someone else’s meeting. The third time you encounter it, it will be in a room of your own, with a spreadsheet of your own open on the screen, and someone will ask you to put two numbers side by side. Ask the question early. Ask it gently. Ask it while it is still cheap to be wrong about the answer.

Here lies the fourth multiplier. Nobody knew what it did. It did it every week, without fail, for years.