---
title: Upgrade your app for market-driven shipping
description: Learn how to upgrade your app for Shopify's market-driven shipping model.
source_url:
  html: >-
    https://shopify.dev/docs/apps/build/orders-fulfillment/market-driven-shipping/upgrade-your-app
  md: >-
    https://shopify.dev/docs/apps/build/orders-fulfillment/market-driven-shipping/upgrade-your-app.md
---

# Upgrade your app for market-driven shipping

Shopify is introducing **market-driven shipping**, a new model that lets merchants manage shipping rates inside each [market](https://shopify.dev/docs/apps/build/markets) they sell to. Merchants get more control over how rates combine at checkout, and can configure Point of Sale and B2B shipping separately. As part of this rollout, the existing [`deliveryProfile`](https://shopify.dev/docs/api/admin-graphql/latest/objects/DeliveryProfile) and [`deliveryProfiles`](https://shopify.dev/docs/api/admin-graphql/latest/queries/deliveryProfiles) Admin API surfaces are being deprecated for merchant-owned shipping configuration.

If your app reads or writes Shopify's delivery profile APIs, you may need to update your integration before merchants move to the new model. This guide describes what's changing, who needs to take action, and the upgrade paths available to you.

The **Market-driven shipping** [feature preview](https://shopify.dev/docs/api/feature-previews) is available so you can test your integration on a dev store before existing merchants begin opting in. Select it when creating a development store, or enable it on an existing dev store from the developer dashboard.

***

## What's changing

Today, every shop has one or more delivery profiles that hold zones, locations, and rates. Apps interact with shipping through the `deliveryProfiles` / `deliveryProfile` Admin API in two ways:

* **App-owned delivery profiles.** An app creates, reads, and modifies its own delivery profile via `deliveryProfileCreate` and `deliveryProfileUpdate`.
* **Merchant delivery profiles.** An app reads from or modifies the merchant's delivery profiles — for example, to add zones and rates on the merchant's behalf.

Under market-driven shipping:

* **Merchant shipping configuration moves to Markets.** Merchants configure rates inside each market they sell to, with product and location conditions determining which products and locations each rate applies to. The merchant-facing concept of a delivery profile goes away.
* **App-owned delivery profiles still exist, and are more flexible.** Apps that create their own delivery profile keep using the existing APIs. An app's profile can now use [`coversAllItems`](https://shopify.dev/docs/api/admin-graphql/latest/input-objects/DeliveryProfileInput#fields-coversAllItems) to cover all items in the shop, rather than being limited to a specific set of products. Products in an app profile can also be included in a merchant's market rates, so the same products may receive rates from both the app and the merchant's markets.
* **Merchants can no longer edit app rates.** Merchants can enable or disable an app's rates on their store, but they can't change rate values or configuration. This prevents merchants from overwriting app rates.
* **`deliveryProfiles` and `deliveryProfile` are being deprecated** for merchant-owned shipping configuration. They continue to work during the transition for shops that haven't moved to market-driven shipping.

***

## Who needs to take action

The table below maps app behavior to recommended action. If your app spans multiple behaviors, follow the path for each.

| If your app... | Action required |
| - | - |
| Only creates and manages its own app-owned delivery profiles, and does not read merchant profiles | **No changes required.** Your integration continues to work on shops that move to market-driven shipping. |
| Reads merchant delivery profiles (for example, to surface rates or sync with external systems) | **Update your read path.** See [Upgrade path: readers](#upgrade-path-readers). |
| Creates or modifies the merchant's delivery profiles | **Update your write path.** See [Upgrade path: writers](#upgrade-path-writers). |

If you're not sure which case applies to your app, audit your app's GraphQL operations for uses of `deliveryProfile`, `deliveryProfiles`, `deliveryProfileCreate`, `deliveryProfileUpdate`, and `deliveryProfileRemove`. Anything that targets a profile not created by your app is a merchant-profile interaction.

***

## Upgrade path: readers

This section applies to apps that read **merchant** shipping configuration. If your app also reads app-owned profiles, that path is unchanged — continue to use [`deliveryProfile`](https://shopify.dev/docs/api/admin-graphql/latest/objects/DeliveryProfile) / [`deliveryProfiles`](https://shopify.dev/docs/api/admin-graphql/latest/queries/deliveryProfiles).

You have two options for reading merchant shipping configuration.

### Option A (recommended): Use Contextual Product Feeds

[Contextual Product Feeds](https://shopify.dev/docs/apps/build/sales-channels/contextual-product-feeds#delivery-option-estimates) are available to apps that operate as a [sales channel](https://shopify.dev/docs/apps/build/sales-channels). If your app is a sales channel — or can [become one](https://shopify.dev/docs/apps/build/sales-channels/channel-config-extension) — this is the recommended path for receiving rate information for the markets and contexts your app cares about, whether to display to buyers or to feed into external catalogs.

**Info:**

Delivery option estimates in Contextual Product Feeds are only available on development stores until early July 2026, when they become available on all shops.

Advantages:

* **No dependency on the merchant's shipping model.** You don't need to branch on whether a merchant is on market-driven shipping or the legacy model.
* **Single source of rates.** Contextual Product Feeds return rate information from both the merchant's market rates and app-owned delivery profiles in one response, so you don't need to query each source separately.

You should:

1. Identify the rate data your app currently reads from `deliveryProfile` / `deliveryProfiles`.
2. Switch to [Contextual Product Feeds](https://shopify.dev/docs/apps/build/sales-channels/contextual-product-feeds#delivery-option-estimates) to receive the same data.
3. Confirm coverage across the markets and contexts your app supports.

This path requires the [`read_product_listings`](https://shopify.dev/docs/api/usage/access-scopes) scope. See [Manage access scopes](https://shopify.dev/docs/apps/build/authentication-authorization/app-installation/manage-access-scopes) for how to add it to your app.

### Option B: Read from the Markets API

If you need to read the merchant's shipping configuration directly, the steady-state path is to read the [`delivery`](https://shopify.dev/docs/api/admin-graphql/latest/objects/Market#field-Market.fields.delivery) field on the `Market` object.

While some merchants are still on the legacy model, you'll need to branch on which model a merchant is on:

* For merchants on market-driven shipping, read the [`delivery`](https://shopify.dev/docs/api/admin-graphql/latest/objects/Market#field-Market.fields.delivery) field on the `Market` object.
* For merchants still on the legacy model, read from `deliveryProfiles`.

You can detect which model a merchant is on using the `marketDrivenShipping` field on [`ShopFeatures`](https://shopify.dev/docs/api/admin-graphql/latest/objects/ShopFeatures). Once all merchants are on market-driven shipping (July 2027), the `deliveryProfiles` branch is no longer needed.

This path requires the [`read_markets`](https://shopify.dev/docs/api/usage/access-scopes) scope. See [Manage access scopes](https://shopify.dev/docs/apps/build/authentication-authorization/app-installation/manage-access-scopes) for how to add it to your app.

***

## Upgrade path: writers

This section applies to apps that create or modify the **merchant's** delivery profiles. If your app also manages its own app-owned profiles, that path is unchanged — continue to use `deliveryProfileCreate` / `deliveryProfileUpdate` against your own profile.

You have two options for writing merchant shipping configuration.

### Option A (recommended): Become an app-profile integration

Rewrite your integration to create and manage an **app-owned** delivery profile instead of modifying the merchant's profiles. An app's profile can now use [`coversAllItems`](https://shopify.dev/docs/api/admin-graphql/latest/input-objects/DeliveryProfileInput#fields-coversAllItems) to cover all items in the shop, which makes this viable even for apps that create broad rates on behalf of merchants.

This option has two significant advantages:

* **No additional scopes.** You keep using the same access your app already has for its own profiles.
* **Forward-compatible.** App-owned delivery profiles continue to work on shops that move to market-driven shipping.

You should:

1. Create an app-owned delivery profile using `deliveryProfileCreate`, scoped to the products and locations your app fulfills (or [`coversAllItems`](https://shopify.dev/docs/api/admin-graphql/latest/input-objects/DeliveryProfileInput#fields-coversAllItems) if that matches your use case).
2. Run your new app-profile path alongside your existing integration and verify that rates are correct.
3. Stop writing to merchant `deliveryProfiles` and maintain rates on your own profile going forward.

### Option B: Write through the Markets API

If becoming an app-profile integration isn't viable, write merchant shipping configuration through the Markets API. The steady-state path is to write through [`marketCreate`](https://shopify.dev/docs/api/admin-graphql/latest/mutations/marketCreate) and [`marketUpdate`](https://shopify.dev/docs/api/admin-graphql/latest/mutations/marketUpdate), keeping rates in sync as merchants update their Markets configuration.

While some merchants are still on the legacy model, you'll need to branch on which model a merchant is on:

* For merchants on market-driven shipping, write through [`marketCreate`](https://shopify.dev/docs/api/admin-graphql/latest/mutations/marketCreate) / [`marketUpdate`](https://shopify.dev/docs/api/admin-graphql/latest/mutations/marketUpdate).
* For merchants still on the legacy model, write to `deliveryProfiles`.

You can detect which model a merchant is on using the `marketDrivenShipping` field on [`ShopFeatures`](https://shopify.dev/docs/api/admin-graphql/latest/objects/ShopFeatures). Once all merchants are on market-driven shipping (July 2027), the `deliveryProfiles` branch is no longer needed.

This path requires both the [`read_markets`](https://shopify.dev/docs/api/usage/access-scopes) and [`write_markets`](https://shopify.dev/docs/api/usage/access-scopes) scopes. See [Manage access scopes](https://shopify.dev/docs/apps/build/authentication-authorization/app-installation/manage-access-scopes) for how to add them to your app.

***

## Timeline

The following milestones apply to apps that touch merchant delivery profiles. Dates are targets and may shift. Your app should be upgraded before any of your merchants moves to market-driven shipping. Merchants on your app aren't moved automatically until Shopify confirms your app is compatible, so your existing merchants won't be switched onto a broken experience. Until you're confirmed compatible, two things to plan for, both starting October 1, 2026: new installs see a compatibility warning, and any merchant who opts in manually will hit breakage if your app isn't upgraded.

| Date | Milestone | What it means for your app |
| - | - | - |
| July 2026 | Feature preview available | You can enable the **Market-driven shipping** [feature preview](https://shopify.dev/docs/api/feature-previews) on a dev store and validate your integration against the new APIs. |
| October 1, 2026 | Merchant rollout begins | Two things start: newly installing merchants see a warning if your app isn't marked compatible, and existing merchants can opt in. Shopify won't move merchants on your app automatically until it confirms your app is compatible, so breakage only happens if a merchant opts in manually before you've upgraded. Aim to upgrade and confirm compatibility before this date. |
| July 1, 2027 | All merchants on market-driven shipping | Market-driven shipping is on for all shops. The legacy `deliveryProfile` / `deliveryProfiles` APIs are deprecated for merchant-owned shipping configuration. |

***

## Test your integration

1. [Create a dev store](https://shopify.dev/docs/apps/build/dev-dashboard/development-stores) with the **Market-driven shipping** [feature preview](https://shopify.dev/docs/api/feature-previews) enabled.
2. Run your app's read and write paths against the dev store and verify the expected behavior.

***

## Confirm compatibility

Once you've upgraded and verified your integration, submit the [compatibility self-attestation form](https://forms.gle/zMKAWCnZLarPogA4A) to have your app marked compatible with market-driven shipping. This clears the warning shown to merchants and lets Shopify automatically move merchants on your app to market-driven shipping, so they transition smoothly once you're ready. Shopify will also try to detect compatibility automatically, but submitting the form guarantees it.

***
