Shopify Deprecated the deliveryProfile API on August 1 — Your Shipping App's Writes Now Succeed and Do Nothing

By Milan Dhameliya · · 7 min read

Shopify quietly deprecated the merchant-owned deliveryProfile queries and mutations on August 1, 2026, for any shop with market-driven shipping enabled. Reads can return a stale snapshot and writes can return success with zero effect on live rates — no error, no webhook, nothing in the API response to tell a custom app it just shipped a no-op. Market-driven shipping starts rolling out to every merchant on October 1. Here's how to check if you're affected and what the replacement APIs actually look like.

If a custom app, a rate-automation script, or an internal tool reads or writes your store's shipping configuration through the Admin API's deliveryProfile queries and mutations, it may already be lying to you. As of August 1, 2026, Shopify deprecated those merchant-owned delivery profile APIs for any shop that has market-driven shipping enabled. The deprecation isn't a warning banner or a sunset date on the horizon — it's live now, and the failure mode is the quiet kind: a write can return a clean userErrors: [] response and change nothing about what a customer actually gets charged at checkout. There's no error to catch, no webhook to listen for, and no field in the mutation response that flags what just happened. You find out when a support ticket says a shipping rate is wrong, or you don't find out at all.

What actually changed on August 1

Shopify is moving merchant-owned shipping configuration out of legacy delivery profiles and into Markets, under a model it calls market-driven shipping. Once a shop has that enabled, the following Admin GraphQL queries and mutations stop reflecting the shop's live configuration for merchant-owned profiles:

Shopify's own changelog describes the two failure directions plainly: 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." That second sentence is the one worth re-reading. A mutation call that returns success and does nothing is worse than one that fails loudly, because every retry loop, every "it worked, move on" branch in your code, and every merchant who trusts the app's confirmation message is now wrong in a way nothing tells them about.

App-owned delivery profiles are not affected. If your app creates and manages its own profile — the kind used by third-party shipping-rate apps that inject their own rate options rather than editing the merchant's native shipping settings — this deprecation doesn't touch it. The distinction that matters is merchant-owned versus app-owned, not "does my app touch shipping at all."

Check whether your shop is actually affected before you do anything else

This only bites shops with market-driven shipping turned on. It's a feature preview being rolled out gradually — Shopify's own timeline has it reaching merchants starting October 1, 2026, with universal adoption by July 1, 2027 — so plenty of stores reading this today aren't affected yet. Check directly rather than guessing from the rollout date, because feature-preview enrollment doesn't map cleanly to shop age or plan:

query CheckMarketDrivenShipping {
  markets(first: 5) {
    nodes {
      id
      name
      delivery {
        shipping {
          countable
        }
      }
    }
  }
}

If Market.delivery.shipping resolves to real configuration rather than null across your markets, market-driven shipping is live on that shop and the legacy deliveryProfile calls in your codebase are now writing into a dead end for merchant-owned profiles. If it's null everywhere, you're not affected yet — but you will be between now and mid-2027, so this is worth fixing on your own schedule rather than Shopify's.

Why this is easy to miss in code review

Nothing about the mutation signature changed. deliveryProfileUpdate still takes the same input shape, still returns the same userErrors array, still returns 200. A test suite that asserts on the response shape rather than on the live rate a test checkout actually charges will keep passing after the shop migrates to market-driven shipping. The only way to catch this in the wild is to check outcomes, not responses — pull a live rate at checkout and compare it against what the app believes it just set, rather than trusting the mutation's own verdict on itself.

# Repo audit: find every call site touching the deprecated surface
rg 'deliveryProfile(Create|Update|Remove|LocationGroup)?|deliveryProfiles(Count)?' --type js --type ts --type liquid .

For every hit, the question isn't "does this still run" — it will, without error. It's "does this shop have market-driven shipping enabled," and if so, "is this call touching a merchant-owned profile or an app-owned one." Only the merchant-owned, market-driven combination is silently broken.

What replaces it: shipping lives on the Market object now

The new model restructures the hierarchy. Where legacy delivery profiles went delivery profile → location group → shipping zone → shipping rates, market-driven shipping goes market → shipping options → rate variations by product and location conditions. Configuration reads and writes through the Market object directly, via a new delivery field:

query MarketShippingConfig($id: ID!) {
  market(id: $id) {
    id
    name
    delivery {
      shipping {
        optionDefinitions(first: 20) {
          nodes {
            id
            name
            ... on DeliveryFlatRateOptionDefinition {
              rate {
                amount
                currencyCode
              }
            }
            ... on DeliveryWeightBasedOptionDefinition {
              rateGroups {
                rateProviders {
                  ... on DeliveryFlatRateProvider {
                    rate {
                      amount
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

Writes go through marketCreate and marketUpdate, setting or clearing shipping via MarketCreateInput.delivery.shipping or MarketUpdateInput.delivery.shipping / MarketUpdateInput.delivery.removeShipping. Four option types are supported — flat rate, value-based, weight-based, and carrier-calculated — each with its own definition input:

mutation AddFlatRateOption($marketId: ID!) {
  marketUpdate(
    id: $marketId
    input: {
      delivery: {
        shipping: {
          optionDefinitionsToCreate: [
            {
              flatRate: {
                name: "Standard Shipping"
                rate: { amount: "6.99", currencyCode: "USD" }
                estimatedTransitTime: { minDays: 3, maxDays: 7 }
              }
            }
          ]
        }
      }
    }
  ) {
    market {
      id
    }
    userErrors {
      field
      message
    }
  }
}

Two behavioral differences worth planning around rather than discovering after migration: rate variation by product now works only at the collection level — you can condition a rate on "all products" or "a specific collection," not on individual products or variants, so anything that conditioned rates on a single SKU needs its products grouped into a collection first (Shopify migrates existing delivery-profile product groupings into collections automatically during the upgrade, but a custom app managing profiles outside the admin UI won't get that automatic pass). And when multiple matching conditions would previously have stacked their rates, market-driven shipping now applies only the single highest matching rate — a fix for the double-charging some multi-location merchants hit under the old model, but a real behavior change if any current logic depends on rates additively combining.

What to actually do before October 1

This sits in the same family as the inventorySetQuantities idempotency change and the de minimis duties checkout gap — a platform-level shift under Shopify Markets that's easy to miss because nothing in the shop's storefront visibly breaks. The rates just get quietly stale until a customer or a margin report tells you otherwise. If your store or app manages shipping through custom code and you want a proper audit before the October rollout reaches you, or help rebuilding the configuration under the new Market-based model, get in touch, or see what I do for Shopify stores navigating Markets and checkout infrastructure changes.

Sources reviewed