There is a specific failure mode that costs more than a crash, because nothing in your logs flags it: a GraphQL mutation returns without errors, userErrors is empty, your job marks the sync as done — and the merchant's live shipping settings are exactly what they were before.
That is not a hypothetical. It is the documented behaviour of Shopify's merchant-owned delivery profile APIs on any shop that has moved to market-driven shipping, and it has been in effect since August 1, 2026.
If you maintain an app, a custom integration, or one of those quiet client scripts that keeps a rate table in sync, this is a short read with one action at the end.
The sentence that matters
From Shopify's developer changelog, on the deprecation of merchant-owned delivery profile APIs:
When a shop uses market-driven shipping, the legacy delivery profile fields and mutations in the Admin GraphQL API no longer represent the shop's live merchant-owned shipping configuration. Reads may return a stale snapshot of the legacy configuration, and writes may succeed without errors but will not update the merchant's live shipping settings.
Read that as two separate bugs, because they fail differently.
The read is a lie with a timestamp. You query deliveryProfiles, you get a well-formed response, and it describes a configuration that is no longer the one the checkout uses. Any logic that diffs "what we think the merchant has" against "what we want them to have" is now diffing against a ghost.
The write is worse, because it is silent. No error, no userErrors entry, no non-200. The mutation succeeds. Whatever safety net you built around failures — retries, alerting, a dead-letter queue — is wired to a signal that never fires.
Both of these are trigger-free from your side. Nothing changes in your code, your API version, or your scopes. The shop moves, and your integration starts being wrong.
The date on the page is not the date it took effect
Small thing, and it will bite anyone who audits by scanning changelog headers.
The changelog entry displays July 1, 2026 — that is postedAt. The page's own metadata carries effectiveAt of August 1, 2026, 12:00 ET, with effectiveApiVersion: 2026-07. Posted in July, effective in August.
If your process is "grep the changelog for dates in our maintenance window", the header date is the one you will catch, and it is a month early. Worth knowing that Shopify publishes both.
Exactly which APIs, and which are fine
The changelog names the affected surface explicitly. Merchant-owned usage of:
deliveryProfiledeliveryProfilesdeliveryProfilesCountdeliveryProfileLocationGroupdeliveryProfileLocationGroupsdeliveryProfileCreatedeliveryProfileUpdatedeliveryProfileRemove
And the carve-out, which is the half that keeps this from being a panic:
App-owned delivery profiles aren't affected and continue to function as before.
So the question to ask about your own code is not "do we touch delivery profiles" but "do we touch the merchant's delivery profiles". A carrier-service app that owns its profiles is in a different position from a script that edits the rate table the merchant built by hand.
How to tell which model a shop is on
Shopify's upgrade guide gives you a flag rather than making you infer it. The marketDrivenShipping field on ShopFeatures tells you which model the merchant is on, and the read path for that needs the read_markets scope (read_markets plus write_markets if you write). Branch on it: for shops on the new model, read from the Markets APIs; for shops still on the legacy one, keep reading deliveryProfiles. Once every merchant has moved — July 2027 — the legacy branch can go.
There is also a path with no branching at all, which is the one to look at first if rates are all you need: Contextual Product Feeds return rate information from both the merchant's market rates and app-owned delivery profiles in one response. The guide's own argument for it is that there is nothing to unwind later, because the feed behaves the same on both models.
The changelog names three destinations depending on what you are actually doing: Contextual Product Feeds, app-owned delivery profiles, or the Markets APIs.
The window, and why there is no date for a given shop
Two dates are published in one changelog sentence:
Market-driven shipping will start rolling out to merchants on October 1, 2026, and all merchants will be on it by July 1, 2027.
That bracket is the whole schedule. The rollout runs gradually over an extended period, so stores are not all upgraded at the same time, and no page we found publishes a per-store date. Plan against the window.
Two consequences for app developers specifically, from the upgrade guide's own timeline. From October 1, 2026, new installs see a compatibility warning if your app has not been upgraded, and any merchant who opts in manually will hit breakage. Submitting Shopify's compatibility form clears that warning and lets Shopify move merchants on your app automatically once you are ready — Shopify also tries to detect compatibility on its own, but the form is the deterministic route.
You can test before any of that: create a development store with the Market-driven shipping feature preview enabled and run your read and write paths against it.
What the migration does on the merchant's side
Even if your integration never touches shipping, the merchant's setup changes shape underneath it — and support tickets land on whoever built the store. The short inventory, from Shopify's Help Center page on upgrading from shipping profiles to shipping options by market:
The hierarchy inverts. Today merchants configure delivery profiles, then location groups, zones and rates inside them. Under market-driven shipping, shipping options attach directly to markets, and each option carries rate variations by product and location condition. The market becomes the container.
Rates can no longer point at individual products or variants. To price a specific set of variants, they have to be grouped into a collection. Shopify's stated reason is maintainability: collection membership shifts on its own, so a rate follows the catalogue instead of needing to be re-pointed. Existing groupings are converted for you — anything built afterwards is built on collections.
Same-named rates merge, and the highest one wins. During the upgrade, rates sharing a shipping option name are consolidated into one option, and when more than one rate in that option matches a cart, only the highest matching rate is charged rather than the rates adding up. That becomes the standing rule: highest price wins within a shipping option, prices add across options. Rate names stopped being cosmetic — the name decides the grouping.
New collections appear that nobody created. Product groupings from shipping profiles arrive as collections prefixed [Shipping], automatically assigned to the right product conditions. They are unpublished, so customers never see them. If you have tooling that reconciles collections, teach it about that prefix before someone "cleans up" the store.
Two settings change themselves. Split shipping is always on afterwards — if the merchant had it off, it is on, and an order can arrive at checkout as two shipments with separate delivery times. And the Markets permission is not granted automatically and is not part of existing staff roles, so whoever manages shipping needs it added deliberately. Expect at least one "I can't open shipping settings any more" message.
The opt-out window destroys work. Switching back to shipping profiles restores the previous setup and permanently removes every shipping change made after the upgrade, along with the collections and sub-region markets the upgrade created. After the window closes, switching back is not possible. So the window is time to test, not time to build.
The compatibility list that does not exist
The question every merchant asks first is whether their shipping apps are compatible. As of our reading in August 2026, no Shopify page we found publishes a list of apps that are or are not compatible with shipping options by market — not the upgrading page, not the other pages in the shipping-options section, not the Markets manual, not the feature preview docs.
What exists instead is per-store: Shopify surfaces incompatibility inside the merchant's own admin, and each vendor answers for its own app. Which is also why stores using rate-providing apps may be upgraded later — if an incompatible app provides rates and they do not appear at checkout, customers cannot complete orders. Delaying those stores is how that outcome is avoided by default.
The distinction that decides whether this is about a given app is narrow: does it calculate or return a rate at checkout? That is a question for the vendor, not something you can read off the app's name.
The short version
- Find every place your code touches
deliveryProfile*for merchant-owned configuration. App-owned profiles are fine. - Add a branch on
marketDrivenShippingfromShopFeatures, or move to Contextual Product Feeds and skip the branch. - Check your scopes:
read_markets, pluswrite_marketsif you write. - Stop trusting a successful mutation as proof of a saved setting on upgraded shops — read back and verify, at least until your migration lands.
- Test on a dev store with the Market-driven shipping feature preview before October 1, 2026.
- If you ship a public app that returns rates, submit the compatibility form so your merchants are not held back or warned at install.
The merchant-facing version of this — what changes in the admin, the pre-upgrade audit as a tickable checklist, and a routing quiz for which upgrade path fits a given store — is on the canonical article: Shopify Shipping Options by Market: the 2026 migration.
Our content is AI-generated and fact-checked against official Shopify sources. Every claim above was re-verified against shopify.dev and help.shopify.com on August 21, 2026.
Top comments (0)