> Note:
> We're no longer publishing API release notes. Instead, you can find the latest updates on Shopify APIs in our [developer changelog](https://shopify.dev/changelog). You can filter updates by area. For example, you can filter API updates by the API name and version, such as GraphQL Admin API changes in version 2025-04.


<table>
  <caption>The API version release date and the date that the version is no longer supported</caption>
  <thead>
    <tr>
      <th scope="col">Release date</th>
      <th scope="col">Date version is no longer supported</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td scope="row">July 1, 2024</td>
      <td scope="row">July 1, 2025</td>
   </tr>
  </tbody>
</table>

## Highlights

Here are some highlights of version 2024-07 of Shopify's APIs:

- [Apply discount codes to a draft order](/docs/api/admin-graphql/latest/input-objects/DraftOrderInput) and decide whether to accept automatic discounts when a [draft order is calculated](/docs/api/admin-graphql/latest/mutations/draftOrderCalculate).
- Identify fulfillment orders containing deliveries to [pickup point locations](/docs/api/admin-graphql/latest/enums/DeliveryMethodType).
- The [`PRODUCTS_CREATE`](/docs/api/admin-graphql/latest/enums/WebhookSubscriptionTopic#value-productscreate) and [`PRODUCTS_UPDATE`](/docs/api/admin-graphql/latest/enums/WebhookSubscriptionTopic#value-productsupdate) webhook payloads now contain information about the media on a product.
- Use the `metafields` and `metafieldDefinitions` connections on the [`OnlineStoreArticle`](/docs/api/admin-graphql/latest/objects/OnlineStoreArticle#connections), [`OnlineStoreBlog`](/docs/api/admin-graphql/latest/objects/OnlineStoreBlog#connections), and [`OnlineStorePage`](/docs/api/admin-graphql/latest/objects/OnlineStorePage#connections) objects. Metafields are also now supported on the [`SellingPlan`](/docs/api/admin-graphql/latest/objects/SellingPlan) object.
- Use the [`files`](/docs/api/admin-graphql/latest/queries/files) query to retrieve 3D models and external videos.
- The [`MobilePlatformApplication`](/docs/api/admin-graphql/latest/unions/MobilePlatformApplication) type facilitates the development and operational integration of shared web credentials and app link systems for Shopify mobile apps on both iOS and Android platforms.
- Use the Storefront API to [manage gift cards on a cart](#storefront-api-changes).
- Use the payment customization function to more easily [hide](/docs/api/functions/reference/payment-customization/graphql/common-objects/hideoperation?api%5Bversion%5D=2024-07) accelerated checkout methods.

## Breaking changes

These changes require special attention. If your app uses these API resources, and you don’t adjust your usage of the resources according to the following instructions, then your app might break when you update to this API version.


### Billing attempts

Similar to creating a new order through checkout, the availability of inventory is now checked during the billing attempt process.

If product variants are configured to [prevent overselling](https://help.shopify.com/manual/products/inventory/getting-started-with-inventory/selling-when-out-of-stock) and one or more items in the subscription contract are out of stock, then the billing attempt will fail with the [`INSUFFICIENT_INVENTORY`](/docs/api/admin-graphql/latest/enums/SubscriptionBillingAttemptErrorCode#value-insufficientinventory) error code.

Learn more about [subscription contracts and billing attempts](/docs/apps/build/purchase-options/subscriptions/contracts/build-a-subscription-contract#step-4-create-a-billing-attempt).

### Cart-level discounts

The `discountedPriceSet` and `discountedPrice` fields on the [`ShippingLine`](/docs/api/admin-graphql/2023-07/objects/ShippingLine) object now include cart-level discounts applied to an order, including the free shipping discount, when calculating the discounted price.

In API versions prior to 2024-07, you needed to subtract the `discountAllocations` from `discountedPriceSet` or `discountedPrice` fields to get an accurate value. If you do this in API version 2024-07 and higher, then you'll subtract the same discount twice.

### Cart wallet preferences

We've deprecated the following types in the Storefront API:

- `walletPreferences` argument on the [`CartBuyerIdentityInput`](/docs/api/storefront/latest/input-objects/CartBuyerIdentityInput) input object
- `walletPreferences` field on the [`CartBuyerIdentity`](/docs/api/storefront/latest/objects/CartBuyerIdentity) object

Use [`CartBuyerIdentityInput.preferences.wallet`](/docs/api/storefront/latest/input-objects/CartBuyerIdentityInput#field-cartbuyeridentityinput-preferences) instead.

### Checkout types removed

We've removed checkout types from the Storefront API, following their [deprecation in the 2024-04 API version](/docs/api/release-notes/2024-04#deprecations-storefront-api-and-rest-admin-api).

For more information, refer to the [developer changelog](/changelog/deprecation-of-checkout-apis).

### Deprecation of REST resources

The [`Checkout`](/docs/api/admin-rest/latest/resources/checkout) resource is now deprecated. For more information, refer to the [Developer changelog](/changelog/deprecation-of-checkout-apis).

We've also deprecated all endpoints on the [`Country`](/docs/api/admin-rest/latest/resources/country) and [`Province`](/docs/api/admin-rest/latest/resources/province) resources. For a complete list of affected endpoints, and the GraphQL type equivalents to use instead, refer to the [Developer changelog](/changelog/deprecation-notice-country-and-province-endpoints-in-admin-rest-api).

### Filtering customers

The following [`customer`](/docs/api/customer/latest/queries/customer) query filters in the [search syntax](/docs/api/usage/search-syntax) have been deprecated:

- `accepts_marketing`
- `city`
- `company`
- `country`
- `customer_date`
- `email_marketing_state`
- `last_abandoned_order_date`
- `order_date`
- `orders_count`
- `province`
- `sms_marketing_state`
- `state`
- `tag`
- `tag_note`
- `territory_code`
- `total_spent`

You can filter customers by these attributes using [segments](/docs/apps/build/marketing-analytics/customer-segments) instead.

### Inventory item data

Prior to API version 2024-07, you could send inventory item data using [`ProductVariant`](/docs/api/admin-graphql/2024-04/objects/ProductVariant#mutations) mutations or on the [`InventoryItemUpdate`](/docs/api/admin-graphql/2024-04/mutations/inventoryItemUpdate) mutation. Each of these places has a different input object type with very similar fields, and with some fields showing up in one mutation instead of the other.

As of API version 2024-07, the two input types are unified. [`InventoryItemInput`](/docs/api/admin-graphql/latest/input-objects/InventoryItemInput) is now the input object type on the [`inventoryItemUpdate`](/docs/api/admin-graphql/latest/mutations/inventoryItemUpdate) mutation instead of the [`InventoryItemUpdateInput`](/docs/api/admin-graphql/latest/input-objects/InventoryItemUpdateInput) input object.

### Location object

The [`Location`](/docs/api/admin-graphql/latest/objects/Location) object is now gated by the `read_locations` access scope. If you attempt to read the `Location` object without the `read_locations` access scope, then an access denied error is returned.

### Marketing activity improvements

You can now use the `urlParameterValue` field as a tracking parameter in the [`marketingActivityCreateInput`](/docs/api/admin-graphql/latest/input-objects/MarketingActivityCreateInput#field-marketingactivitycreateinput-urlparametervalue) and [`marketingActivityUpdateInput`](/docs/api/admin-graphql/latest/input-objects/MarketingActivityUpdateInput#field-marketingactivityupdateinput-urlparametervalue) input objects. This field is currently only available to select partners. Most partners should continue to use UTMs for tracking parameters.

Additionally, the [`MarketingActivityUserError`](/docs/api/admin-graphql/latest/objects/MarketingActivityUserError) enum is now a required type on the `userError` field for the `marketingEngagementCreate` mutation.

### Metafield access controls

Apps can now query the [`access`](/docs/api/admin-graphql/latest/objects/MetafieldDefinition#field-metafielddefinition-access) field of metafield definitions that [they have access to but don't own](/docs/apps/build/custom-data/ownership). Previously, an `AuthorizationError` error was returned when accessing the field for metafield definitions that an app didn't have permissions to manage.

> Note:
> Querying the [`grants`](/docs/api/admin-graphql/latest/objects/MetafieldAccess#field-metafieldaccess-grants) field on the `MetafieldAccess` object still requires permissions to manage the metafield definition and an error is returned if an app queries the field with insufficient permissions.

The `admin` and `storefront` fields on the [`MetafieldAccess`](/docs/api/admin-graphql/latest/objects/MetafieldAccess#field-metafieldaccess-grants) object now return values in more cases instead of `null`. For example, metafields that don't have associated access grants return `PUBLIC_READ_WRITE` for `admin` access and `LEGACY_LIQUID_ONLY` for `storefront`. In addition, definitions that were created with a storefront access of `NONE` now return `NONE` instead of `null`. As of API version 2024-07, you can set `PUBLIC_READ_WRITE` as the `admin` access control.

Additionally, the `admin` and `storefront` fields on the [`MetafieldAccessInput`](/docs/api/admin-graphql/latest/input-objects/MetafieldAccessInput) input object now use dedicated input enum types, [`MetafieldAdminAccessInput`](/docs/api/admin-graphql/latest/enums/MetafieldAdminAccessInput) and [`MetafieldStorefrontAccessInput`](/docs/api/admin-graphql/latest/enums/MetafieldStorefrontAccessInput), respectively.

The following new types are available:

<table>
  <caption>New types associated with metafield access controls</caption>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Type</th>
    <th scope="col">Change</th>
  </tr>
  <tr>
    <td scope="row"><code>PUBLIC_READ_WRITE</code></td>
    <td>Value</td>
    <td>Added to the <code>MetafieldAdminAccess</code> enum</td>
  </tr>
  <tr>
    <td scope="row"><code>LEGACY_LIQUID_ONLY</code></td>
    <td>Value</td>
    <td>Added to the <code>MetafieldStorefrontAccess</code> enum</td>
  </tr>
  <tr>
    <td scope="row"><code>MetafieldAdminAccessInput</code></td>
    <td>Enum</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code>MetafieldStorefrontAccessInput</code></td>
    <td>Enum</td>
    <td>Added</td>
  </tr>
</table>

### Payment method names

Previously, the [`PaymentCustomizationPaymentMethod`](/docs/api/functions/reference/payment-customization/graphql/common-objects/paymentcustomizationpaymentmethod?api%5Bversion%5D=2024-07) object returned multiple payment methods with the name "Shopify Payments" when a store has wallets enabled through Shopify Payments (for example, Apple Pay or Google Pay). This made it impossible for app developers to target the credit card or a specific wallet option for hide, rename, or move operations.

To fix this issue, we've changed the `name` value for wallets to the following values:

| Payment method      | API version 2024-04 and lower | API version 2024-07 and higher |
| ----------- | ----------- |  ----------- |
| Credit card      | `"Shopify Payments"`       | `"Shopify Payments"`  |
| Apple Pay      | `"Shopify Payments"`       | `"Apple Pay"`  |
| Google Pay      | `"Shopify Payments"`       | `"Google Pay"`  |
| Meta Pay      | `"Shopify Payments"`       | `"Meta Pay"`  |
| Shop Pay      | `"Shopify Payments"`       | `"Shop Pay"`  |

### Product feed variant images

As of API version 2024-07, the variant image field in the `PRODUCT_FEEDS_INCREMENTAL_SYNC` and `PRODUCT_FEEDS_FULL_SYNC` [webhook subscription topics](/docs/api/admin-graphql/latest/enums/WebhookSubscriptionTopic) won't return an image unless one has been set. Previously, the variant image field would return the product's first image when an image wasn't explicitly set for the variant.

If this change doesn't work for your use case, then you can replicate the old behavior by assigning the first product image to the variant.

### Product variants

We've removed several fields on product variants that are duplicates of linked inventory items. For a complete list of changes to the GraphQL Admin API, and to learn more about the types that you can use instead, refer to the [developer changelog](/changelog/product-variant-field-cleanup).

### Product taxonomy

We've deprecated the `allProductCategories` field on the `Shop` object. Use the [`allProductCategoriesList`](/docs/api/admin-graphql/latest/objects/Shop#field-shop-allproductcategorieslist) field on the `Shop` object instead.

### Refunds

Shopify's suggestion for a refund is now inclusive of payable charges, such as exchange items and fees, alongside returns.

The [`Return.suggestedRefund`](/docs/api/admin-graphql/latest/objects/Return#field-return-suggestedrefund) query and [`ReturnRefund`](/docs/api/admin-graphql/latest/mutations/returnRefund) mutation now have a different expectation on the refund amount. The refund amount considers exchange line items and fees on the return, as well as any outstanding amount owed by the buyer on an order. Previously, the refund amount logic only accounted for return line items.

### Removals of types and fields

We've removed the following types and fields from the GraphQL Admin API:

<table>
  <caption>Removals of types and fields from the GraphQL Admin API</caption>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Type</th>
    <th scope="col">Change</th>
  </tr>
  <tr>
    <td scope="row"><code>ShippingLabel</code></td>
    <td>Object</td>
    <td><a href="/docs/api/admin-graphql/latest/objects/ShippingLabel">Removed</a>.</td>
  </tr>
  <tr>
    <td scope="row"><code>location</code> field</td>
    <td><code>Order</code> object</td>
    <td>Removed. Use the <code><a href="/docs/api/admin-graphql/latest/objects/Order#field-order-retaillocation">retailLocation</a></code> field on the <code>Order</code> object instead.</td>
  </tr>
  <tr>
    <td scope="row"><code>order</code> field</td>
    <td><code>CalculatedOrder</code> object</td>
    <td>Removed. Use the <code><a href="/docs/api/admin-graphql/latest/objects/calculatedorder#field-calculatedorder-originalorder">originalOrder</a></code> field on the <code>CalculatedOrder</code> object instead.</td>
  </tr>
  <tr>
    <td scope="row"><code>productBased</code> field</td>
    <td><code>FulfillmentService</code> object</td>
    <td><a href="/docs/api/admin-graphql/latest/objects/FulfillmentService">Removed</a>. Non-product based fulfillment services are no longer supported.</td>
  </tr>
</table>

We've removed the following types and fields from the Storefront API:

<table>
  <caption>Removals of types and fields from the Storefront API</caption>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Type</th>
    <th scope="col">Change</th>
  </tr>
  <tr>
    <td scope="row"><code>ShopPayPaymentRequestContactFieldInput</code></td>
    <td>Input object</td>
    <td>Removed. Shipping address is now read from the payment method.</td>
  </tr>
  <tr>
    <td scope="row"><code>shippingAddress</code> field</td>
    <td><code>ShopPayPaymentRequestInput</code> input object</td>
    <td>Removed. Shipping address is now read from the payment method. </td>
  </tr>
  <tr>
    <td scope="row"><code>amount</code> field</td>
    <td><code>ShopPayPaymentRequestLineItemInput</code> input object</td>
    <td>Removed. Use the <code><a href="/docs/api/storefront/latest/input-objects/ShopPayPaymentRequestLineItemInput#field-shoppaypaymentrequestlineiteminput-finalitemprice">finalLinePrice</a></code> field instead.</td>
  </tr>
  <tr>
    <td scope="row"><code>amount</code> field</td>
    <td><code>ShopPayPaymentRequestLineItem</code> object</td>
    <td>Removed. Use the <code><a href="/docs/api/storefront/latest/input-objects/ShopPayPaymentRequestLineItemInput#field-shoppaypaymentrequestlineiteminput-finalitemprice">finalLinePrice</a></code> field instead.</td>
  </tr>
</table>

### ShopifyQL

We've deprecated the [`shopifyqlQuery`](/docs/api/admin-graphql/latest/queries/shopifyqlQuery) query. Use the [GraphQL Admin API](/docs/api/admin-graphql) instead to extract data for your use cases.

### Sorting customers

The following [`CustomerSortKeys`](/docs/api/admin-graphql/latest/enums/CustomerSortKeys) are now deprecated:

- `LAST_ORDER_DATE`
- `ORDERS_COUNT`
- `TOTAL_SPENT`

You can order customers by these attributes if you filter customers using [segments](/docs/apps/build/marketing-analytics/customer-segments).

### Synchronous input improvements for `productSet` mutation

The [`productSet`](/docs/api/admin-graphql/latest/mutations/productSet) mutation now defaults to running synchronously unless the input parameter `synchronous` is set to `false`.

We've also increased the input limit on product variants to the existing asynchronous limit. API versions prior to 2024-07 had a limit of 100 variants. You should set `synchronous` to `false` if you need to consider input complexity / size, or are experiencing timeouts.

### Webhook sub-topics

The `subTopic` field has been removed from the [`WebhookSubscription`](/docs/api/admin-graphql/latest/objects/WebhookSubscription) object. Use the [`filter`](/docs/api/admin-graphql/latest/objects/WebhookSubscription#field-webhooksubscription-filter) field instead.

### Writing metafield values

You can now use the [`metafieldsSet`](/docs/api/customer/latest/mutations/metafieldsSet) mutation to assign metafield values on [`Customer`](/docs/api/customer/latest/objects/Customer), [`Order`](/docs/api/customer/latest/objects/Order), [`Company`](/docs/api/customer/latest/objects/Company), and [`CompanyLocation`](/docs/api/customer/latest/objects/CompanyLocation) objects.

As part of this change, the Customer Account API needs to be granted explicit read or read/write access to metafield definitions to have access to metafield values. This represents a breaking change because as of API version 2024-07, metafield definitions without [access permissions](#metafield-access-controls) will not be available to the Customer Account API.

## GraphQL Admin API changes

Version 2024-07 of the GraphQL Admin API introduces the following changes:

<div class="accordion-container">
  <div class="accordion-controls">
    <button class="accordion-control" data-accordion-control-type="expand-all" type="button">Expand all</button>
  </div>
  <div class="accordion-content-container">
    <div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Billing attempts <span id="billing-attempts" class="heading-flag breaking"</h3>
  </div>
  <div class="accordion-content">
    <p>Similar to creating a new order through checkout, the availability of inventory is now checked during the billing attempt process.</p>
<p>Where product variants are configured to <a rel="external noreferrer noopener" target="_blank" href="https://help.shopify.com/manual/products/inventory/getting-started-with-inventory/selling-when-out-of-stock">prevent overselling</a> and one or more items in the contract are out of stock, then the billing attempt will fail with the new <a href="/docs/api/admin-graphql/latest/enums/SubscriptionBillingAttemptErrorCode#value-insufficientinventory"><code class="text-highlight text-highlight--grey">INSUFFICIENT_INVENTORY</code></a> error code.</p>
<p>Learn more about <a href="/docs/apps/build/purchase-options/subscriptions/contracts/build-a-subscription-contract#step-4-create-a-billing-attempt">subscription contracts and billing attempts</a>.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Cart-level discounts <span id="cart-level-discounts" class="heading-flag breaking"</h3>
  </div>
  <div class="accordion-content">
    <p>The <code class="text-highlight text-highlight--grey">discountedPriceSet</code> and <code class="text-highlight text-highlight--grey">discountedPrice</code> fields on the <a href="/docs/api/admin-graphql/2023-07/objects/ShippingLine"><code class="text-highlight text-highlight--grey">ShippingLine</code></a> object now include cart-level discounts applied to an order, including the free shipping discount, when calculating the discounted price.</p>
<p>In API versions prior to 2024-07, you needed to subtract the <code class="text-highlight text-highlight--grey">discountAllocations</code> from <code class="text-highlight text-highlight--grey">discountedPriceSet</code> or <code class="text-highlight text-highlight--grey">discountedPrice</code> fields to get an accurate value. If you do this in API version 2024-07 and higher, then you&#39;ll subtract the same discount twice.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Cash transactions</h3>
  </div>
  <div class="accordion-content">
    <p>You can now query the cash transactions that are associated with each cash tracking session. The new <a href="/docs/api/admin-graphql/latest/objects/CashTrackingSession#connection-cashtransactions"><code class="text-highlight text-highlight--grey">cashTransactions</code></a> connection returns all of the cash order transactions that affected the amount in the cash drawer during a cash tracking session.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Checkout branding</h3>
  </div>
  <div class="accordion-content">
    <p>You can use the <a href="/docs/api/admin-graphql/latest/mutations/checkoutBrandingUpsert"><code class="text-highlight text-highlight--grey">checkoutBrandingUpsert</code></a> mutation to configure the styling and visibility of dividers in checkout.</p>
<p>With this change, the dividers below the header, above the footer, between the main and order summary columns, and between sections in the main column can now be customized with visibility, style, and width controls.</p>
<p>The following new types are available:</p>
<table>
  <caption>New types related to checkout branding</caption>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Type</th>
    <th scope="col">Change</th>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/CheckoutBrandingFooterInput#field-checkoutbrandingfooterinput-divided">divided</a></code></td>
    <td>Field</td>
    <td>Added to <code>CheckoutBrandingFooterInput</code> input object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/CheckoutBrandingFooter#field-checkoutbrandingfooter-divided">divided</a></code></td>
    <td>Field</td>
    <td>Added to <code>CheckoutBrandingFooter</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/CheckoutBrandingHeaderInput#field-checkoutbrandingheaderinput-divided">divided</a></code></td>
    <td>Field</td>
    <td>Added to <code>CheckoutBrandingHeaderInput</code> input object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/CheckoutBrandingHeader#field-checkoutbrandingheader-divided">divided</a></code></td>
    <td>Field</td>
    <td>Added to <code>CheckoutBrandingHeader</code> object</td>
  </tr>
</table>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Checkout profiles</h3>
  </div>
  <div class="accordion-content">
    <p>You can now query the <a href="/docs/api/admin-graphql/latest/objects/CheckoutProfile#field-checkoutprofile-typosppagesactive"><code class="text-highlight text-highlight--grey">typOspPagesActive</code></a> field on the <code class="text-highlight text-highlight--grey">CheckoutProfiles</code> object. The <code class="text-highlight text-highlight--grey">typOspPagesActive</code> field returns the status of the <a href="/docs/apps/build/checkout/thank-you-order-status">Thank You page (TYP) and Order Status page (OSP)</a>  on a checkout profile, providing insight as to whether the pages have enabled <a rel="external noreferrer noopener" target="_blank" href="https://help.shopify.com/manual/checkout-settings/customize-checkout-configurations/checkout-extensibility">checkout extensibility</a>.</p>
<p>If <code class="text-highlight text-highlight--grey">typOspPagesActive</code> is <code class="text-highlight text-highlight--grey">true</code>, then both the Thank You and Order Status pages are using checkout extensibility, and render the appropriate <a href="/docs/api/checkout-ui-extensions">checkout UI extensions</a> while also making use of <a href="/docs/apps/build/marketing-analytics/pixels">pixels</a>, and <a href="/docs/apps/build/functions">Functions</a>. If <code class="text-highlight text-highlight--grey">typOspPagesActive</code> is <code class="text-highlight text-highlight--grey">false</code>, then the Thank You and Order Status pages still use scripts and other deprecated features.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Combined listings</h3>
  </div>
  <div class="accordion-content">
    <p><a href="/docs/apps/build/product-merchandising/combined-listings">Combined listings</a> bring together products that are merchandised by an option, such as color, model, or dimension, for enhanced display in the product details page.</p>
<p>As of API version 2024-07, you can use the GraphQL Admin API to <a href="/docs/apps/build/product-merchandising/combined-listings/build-for-combined-listings">manage combined listings</a>.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Data sales and sharing opt-outs</h3>
  </div>
  <div class="accordion-content">
    <p>We&#39;ve added the <a href="/docs/api/admin-graphql/latest/mutations/dataSaleOptOut"><code class="text-highlight text-highlight--grey">dataSaleOptOut</code></a> mutation, which opts a customer out of data sales and sharing, and supports compliance with US state laws like CCPA and CPRA. The <code class="text-highlight text-highlight--grey">dataSaleOptOut</code> mutation also applies the opt-out to the <a href="/docs/api/customer-privacy">Customer Privacy API</a>.</p>
<p>We&#39;ve also added the <a href="/docs/api/admin-graphql/latest/objects/Customer#field-customer-datasaleoptout"><code class="text-highlight text-highlight--grey">dataSaleOptOut</code></a> field to the <code class="text-highlight text-highlight--grey">Customer</code> object.</p>
<p>To learn more about data sales and sharing opt-outs, refer to <a rel="external noreferrer noopener" target="_blank" href="https://help.shopify.com/manual/privacy-and-security/privacy/customer-privacy-settings/privacy-settings">Configuring customer privacy settings</a>.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Delivery promise</h3>
  </div>
  <div class="accordion-content">
    <p>We&#39;ve added the <a href="/docs/api/admin-graphql/latest/objects/DeliveryPromiseProvider"><code class="text-highlight text-highlight--grey">DeliveryPromiseProvider</code></a> object, which represents an entity, such as a third-party service, that can provide delivery estimates on behalf of a store.</p>
<p>Each <code class="text-highlight text-highlight--grey">DeliveryPromiseProvider</code> object is associated with a shop <a href="/docs/api/admin-graphql/latest/objects/Location"><code class="text-highlight text-highlight--grey">Location</code></a>.</p>
<p>A <code class="text-highlight text-highlight--grey">DeliveryPromiseProvider</code> object can be created or updated using the <a href="/docs/api/admin-graphql/latest/mutations/deliveryPromiseProviderUpsert"><code class="text-highlight text-highlight--grey">deliveryPromiseProviderUpsert</code></a> mutation, and retrieved using the <a href="/docs/api/admin-graphql/latest/queries/deliveryPromiseProvider"><code class="text-highlight text-highlight--grey">deliveryPromiseProvider</code></a> query.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Discounts</h3>
  </div>
  <div class="accordion-content">
    <p><a href="/docs/api/admin-graphql/latest/input-objects/DraftOrderInput"><code class="text-highlight text-highlight--grey">DraftOrderInput</code></a> now accepts <a href="/docs/api/admin-graphql/latest/input-objects/DraftOrderInput#field-draftorderinput-discountcodes"><code class="text-highlight text-highlight--grey">discountCodes</code></a>, <a href="/docs/api/admin-graphql/latest/input-objects/DraftOrderInput#field-draftorderinput-acceptautomaticdiscounts"><code class="text-highlight text-highlight--grey">acceptAutomaticDiscounts</code></a>, and <a href="/docs/api/admin-graphql/latest/input-objects/DraftOrderInput#field-draftorderinput-allowdiscountcodesincheckout"><code class="text-highlight text-highlight--grey">allowDiscountCodesInCheckout</code></a>. These optional input fields allow you to apply discount codes to a draft order and decide whether to accept automatic discounts when a <a href="/docs/api/admin-graphql/latest/mutations/draftOrderCalculate">draft order is calculated</a>.</p>
<p>We&#39;ve also added the <a href="/docs/api/admin-graphql/latest/objects/DraftOrder#field-draftorder-platformdiscounts"><code class="text-highlight text-highlight--grey">platformDiscounts</code></a> field which provides details about how the platform discount has been allocated across the draft order line items, the discount type, its name, and more.</p>
<p>The following new types are available:</p>
<table>
  <caption>New types related to discounts</caption>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Type</th>
    <th scope="col">Change</th>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/DraftOrder#field-draftorder-platformdiscounts">platformDiscounts</a></code></td>
    <td>Field</td>
    <td>Added to <code>DraftOrder</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/DraftOrder#field-draftorder-discountCodes">discountCodes</a></code></td>
    <td>Field</td>
    <td>Added to <code>DraftOrder</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/DraftOrder#field-draftorder-acceptAutomaticDiscounts">acceptAutomaticDiscounts</a></code></td>
    <td>Field</td>
    <td>Added to <code>DraftOrder</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/DraftOrder#field-draftorder-allowDiscountCodesInCheckout">allowDiscountCodesInCheckout</a></code></td>
    <td>Field</td>
    <td>Added to <code>DraftOrder</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/DraftOrder#field-draftorder-warnings">warnings</a></code></td>
    <td>Field</td>
    <td>Added to <code>DraftOrder</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/DraftOrderDiscountNotAppliedWarning">DraftOrderDiscountNotAppliedWarning</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/DraftOrderPlatformDiscountAllocation">DraftOrderPlatformDiscountAllocation</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/DraftOrderPlatformDiscount">DraftOrderPlatformDiscount</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/DraftOrderWarning">DraftOrderWarning</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/CalculatedDraftOrder#field-calculateddraftorder-platformdiscounts">platformDiscounts</a></code></td>
    <td>Field</td>
    <td>Added to <code>CalculatedDraftOrder</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/CalculatedDraftOrder#field-calculateddraftorder-discountCodes">discountCodes</a></code></td>
    <td>Field</td>
    <td>Added to <code>CalculatedDraftOrder</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/CalculatedDraftOrder#field-calculateddraftorder-acceptAutomaticDiscounts">acceptAutomaticDiscounts</a></code></td>
    <td>Field</td>
    <td>Added to <code>CalculatedDraftOrder</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/CalculatedDraftOrder#field-calculateddraftorder-warnings">warnings</a></code></td>
    <td>Field</td>
    <td>Added to <code>CalculatedDraftOrder</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/DraftOrderLineItem#field-draftorderlineitem-approximatediscountedunitpriceset">approximateDiscountedUnitPriceSet</a></code></td>
    <td>Field</td>
    <td>Added to <code>DraftOrderLineItem</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/unions/DraftOrderPlatformDiscountAllocationTarget">DraftOrderPlatformDiscountAllocationTarget</a></code></td>
    <td>Union</td>
    <td>Added</td>
  </tr>
</table>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Duplicate product variant values</h3>
  </div>
  <div class="accordion-content">
    <p>The <a href="/docs/api/admin-graphql/latest/enums/ProductSetUserErrorCode#value-duplicatedvalue"><code class="text-highlight text-highlight--grey">DUPLICATE_VALUE</code></a> error code has been added to the <code class="text-highlight text-highlight--grey">ProductSetUserErrorCode</code> enum.</p>
<p>The <code class="text-highlight text-highlight--grey">id</code> field on the <a href="/docs/api/admin-graphql/latest/input-objects/ProductVariantSetInput"><code class="text-highlight text-highlight--grey">ProductVariantSetInput</code></a> input object now has validation support to prevent duplicate values. This enhancement ensures that there are no collisions when updating variants.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Exchanges</h3>
  </div>
  <div class="accordion-content">
    <p>You can now use the GraphQL Admin API to interact with exchanges.</p>
<p>The <a href="/docs/api/admin-graphql/latest/mutations/returnCreate"><code class="text-highlight text-highlight--grey">returnCreate</code></a> mutation can now take exchange line items with optional discounts, return shipping fees, and restocking fees to be applied to return lines. A return with exchange line items will also create a new <a href="/docs/api/admin-graphql/latest/objects/FulfillmentOrder"><code class="text-highlight text-highlight--grey">FulfillmentOrder</code></a> for the new items to be sent to the customer.</p>
<aside class="note">
  <h4>Note</h4>
  <p>
Canceling a return does affect the fulfillment of exchange items. <a rel="external noreferrer noopener" target="_blank" href="https://help.shopify.com/manual/orders/refunds-returns/creating-returns#restock-and-fulfill">Learn more about how exchanges are processed</a>.</p>
</aside>
<p>You can use the <a href="/docs/api/admin-graphql/latest/mutations/returnLineItemRemoveFromReturn"><code class="text-highlight text-highlight--grey">returnLineItemRemoveFromReturn</code></a> mutation to remove return lines from a return. With <a href="https://shopify.dev/changelog/return-mutation-will-update-sales-previously-unchanged-until-time-of-refund">returns creating sales</a>, removing a return line from a return will also reversely impact return sales.</p>
<p>Additionally, you can use the <a href="/docs/api/admin-graphql/latest/queries/returnCalculate"><code class="text-highlight text-highlight--grey">returnCalculate</code></a> query to calculate financials before return creation, including inputs for return lines, exchange lines, fees and discounts. <a href="/docs/apps/build/orders-fulfillment/returns-apps/build-return-management#step-2-optional-calculate-return-financials">Learn how to use the <code class="text-highlight text-highlight--grey">returnCalculate</code> query</a>.</p>
<p>The following new types are available:</p>
<table>
  <caption>New types related to exchanges</caption>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Type</th>
    <th scope="col">Change</th>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/CalculateExchangeLineItemInput">CalculateExchangeLineItemInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/CalculateReturnInput">CalculateReturnInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/CalculateReturnLineItemInput">CalculateReturnLineItemInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/ExchangeLineItemAppliedDiscountInput">ExchangeLineItemAppliedDiscountInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/ExchangeLineItemAppliedDiscountValueInput">ExchangeLineItemAppliedDiscountValueInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/ExchangeLineItemInput">ExchangeLineItemInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/RestockingFeeInput">RestockingFeeInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/ReturnEditSetRestockingFeeInput">ReturnEditSetRestockingFeeInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/ReturnLineItemRemoveFromReturnInput">ReturnLineItemRemoveFromReturnInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/ReturnShippingFeeInput">ReturnShippingFeeInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/ReturnInput#field-returninput-exchangelineitems">exchangeLineItems</a></code></td>
    <td>Field</td>
    <td>Added to <code>ReturnInput</code> input object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/ReturnInput#field-returninput-returnShippingFee">returnShippingFee</a></code></td>
    <td>Field</td>
    <td>Added to <code>ReturnInput</code> input object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/ReturnLineItemInput#field-returnlineiteminput-restockingFee">restockingFee</a></code></td>
    <td>Field</td>
    <td>Added to <code>ReturnLineItemInput</code> input object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/CalculatedExchangeLineItem">CalculatedExchangeLineItem</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/CalculatedRestockingFee">CalculatedRestockingFee</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/CalculatedReturnFee">CalculatedReturnFee</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/CalculatedReturnLineItem">CalculatedReturnLineItem</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/CalculatedReturnShippingFee">CalculatedReturnShippingFee</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/CalculatedReturn">CalculatedReturn</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/mutations/ReturnLineItemRemoveFromReturn">ReturnLineItemRemoveFromReturn</a></code></td>
    <td>Mutation</td>
    <td>Added</td>
  </tr>
</table>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Filtering customers <span id="filtering-customers" class="heading-flag breaking"</h3>
  </div>
  <div class="accordion-content">
    <p>The following <a href="/docs/api/customer/latest/queries/customer"><code class="text-highlight text-highlight--grey">customer</code></a> query filters in the <a href="/docs/api/usage/search-syntax">search syntax</a> have been deprecated:</p>
<ul>
<li><code class="text-highlight text-highlight--grey">accepts_marketing</code></li>
<li><code class="text-highlight text-highlight--grey">city</code></li>
<li><code class="text-highlight text-highlight--grey">company</code></li>
<li><code class="text-highlight text-highlight--grey">country</code></li>
<li><code class="text-highlight text-highlight--grey">customer_date</code></li>
<li><code class="text-highlight text-highlight--grey">email_marketing_state</code></li>
<li><code class="text-highlight text-highlight--grey">last_abandoned_order_date</code></li>
<li><code class="text-highlight text-highlight--grey">order_date</code></li>
<li><code class="text-highlight text-highlight--grey">orders_count</code></li>
<li><code class="text-highlight text-highlight--grey">province</code></li>
<li><code class="text-highlight text-highlight--grey">sms_marketing_state</code></li>
<li><code class="text-highlight text-highlight--grey">state</code></li>
<li><code class="text-highlight text-highlight--grey">tag</code></li>
<li><code class="text-highlight text-highlight--grey">tag_note</code></li>
<li><code class="text-highlight text-highlight--grey">territory_code</code></li>
<li><code class="text-highlight text-highlight--grey">total_spent</code></li>
</ul>
<p>You can filter customers by these attributes using <a href="/docs/apps/build/marketing-analytics/customer-segments">segments</a> instead.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Filter parameters for webhook subscriptions</h3>
  </div>
  <div class="accordion-content">
    <p>When you create, update, or query a webhook subscription, you can now include a filter parameter. Filter parameters, which are specified using <a href="/docs/api/usage/search-syntax">Shopify search syntax</a>, allow you to specify conditions as to when webhooks should be emitted for a subscription.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Fulfillment constraint rules</h3>
  </div>
  <div class="accordion-content">
    <p>We&#39;ve added the <a href="/docs/api/admin-graphql/latest/enums/FulfillmentConstraintRuleCreateUserErrorCode#value-maximumfulfilllmentconstraintrulesreached"><code class="text-highlight text-highlight--grey">MAXIMUM_FULFILLMENT_CONSTRAINT_RULES_REACHED</code></a> error code to the <code class="text-highlight text-highlight--grey">fulfillmentConstraintRuleCreate</code> mutation. The error code is returned when you add more than a maximum of ten fulfillment constraint rules to a store.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Fulfillment orders</h3>
  </div>
  <div class="accordion-content">
    <p>You can now access assigned fulfillment orders from the <a href="/docs/api/admin-graphql/latest/objects/queryroot#connection-assignedfulfillmentorders"><code class="text-highlight text-highlight--grey">assignedFulfillmentOrders</code></a> connection on the <code class="text-highlight text-highlight--grey">QueryRoot</code> object instead of from the pre-existing <a href="/docs/api/admin-graphql/latest/objects/Shop#connection-assignedfulfillmentorders"><code class="text-highlight text-highlight--grey">assignedFulfillmentOrders</code></a> connection on the <code class="text-highlight text-highlight--grey">Shop</code> object. This change includes the deprecation of the <code class="text-highlight text-highlight--grey">Shop.assignedFulfillmentOrders</code> query in favour of the newly added <code class="text-highlight text-highlight--grey">QueryRoot.assignedFulfillmentOrders</code> query.</p>
<p>The <a href="/docs/api/admin-graphql/latest/enums/DeliveryMethodType"><code class="text-highlight text-highlight--grey">DeliveryMethodType</code></a> enum also now includes the <code class="text-highlight text-highlight--grey">PICKUP_POINT</code> value to identify <a href="/docs/api/admin-graphql/latest/objects/FulfillmentOrder#field-fulfillmentorder-deliverymethod">fulfillment orders</a> containing deliveries to pickup point locations.</p>
<p><a href="/docs/apps/build/checkout/delivery-shipping/delivery-methods/generate-pickup-points">Learn how to generate pickup point options</a>.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Fulfillment order line items</h3>
  </div>
  <div class="accordion-content">
    <p>The <a href="/docs/api/admin-graphql/latest/objects/FulfillmentOrderLineItem#field-fulfillmentorderlineitem-variant"><code class="text-highlight text-highlight--grey">variant</code></a> field has been added to the <code class="text-highlight text-highlight--grey">FulfillmentOrderLineItem</code> object.</p>
<p>The field enables order management apps to reference the specific product details that are related to each fulfillment order line item without needing to directly compare SKUs in the order line items.</p>
<p><a href="/docs/apps/build/orders-fulfillment#order-management-apps">Learn more about order management apps</a>.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>GraphQL completeness</h3>
  </div>
  <div class="accordion-content">
    <p>We&#39;ve added new types to the GraphQL Admin API to provide parity with the following REST resources: <a href="/docs/api/admin-rest/latest/resources/carrierservice"><code class="text-highlight text-highlight--grey">CarrierService</code></a>, <a href="/docs/api/admin-rest/latest/resources/customer"><code class="text-highlight text-highlight--grey">Customer</code></a>, <a href="/docs/api/admin-rest/latest/resources/fulfillment"><code class="text-highlight text-highlight--grey">Fulfillment</code></a>, <a href="/docs/api/admin-rest/latest/resources/fulfillmentevent"><code class="text-highlight text-highlight--grey">FulfillmentEvent</code></a>, <a href="/docs/api/admin-rest/latest/resources/fulfillmentservice"><code class="text-highlight text-highlight--grey">FulfillmentService</code></a>, <a href="/docs/api/admin-rest/latest/resources/inventoryitem"><code class="text-highlight text-highlight--grey">InventoryItem</code></a>, <a href="/docs/api/admin-rest/latest/resources/location"><code class="text-highlight text-highlight--grey">Location</code></a>, <a href="/docs/api/admin-rest/latest/resources/order"><code class="text-highlight text-highlight--grey">Order</code></a>, and <a href="/docs/api/admin-rest/latest/resources/product"><code class="text-highlight text-highlight--grey">Product</code></a>.</p>
<p>The following new types are available:</p>
<table>
  <caption>New types on the GraphQL Admin API</caption>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Type</th>
    <th scope="col">Change</th>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/DeliveryCarrierServiceCreateInput">DeliveryCarrierServiceCreateInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/DeliveryCarrierServiceUpdateInput">DeliveryCarrierServiceUpdateInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/mutations/carrierServiceCreate">carrierServiceCreate</a></code></td>
    <td>Mutation</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/mutations/carrierServiceUpdate">carrierServiceUpdate</a></code></td>
    <td>Mutation</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/mutations/carrierServiceDelete">carrierServiceDelete</a></code></td>
    <td>Mutation</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/DeliveryCarrierService#field-deliverycarrierservice-active">active</a></code></td>
    <td>Field</td>
    <td>Added to the <code>DeliveryCarrierService</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/DeliveryCarrierService#field-deliverycarrierservice-supportsServiceDiscovery">supportsServiceDiscovery</a></code></td>
    <td>Field</td>
    <td>Added to the <code>DeliveryCarrierService</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/DeliveryCarrierService#field-deliverycarrierservice-callbackUrl">callbackUrl</a></code></td>
    <td>Field</td>
    <td>Added to the <code>DeliveryCarrierService</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/QueryRoot#connection-carrierservices">carrierServices</a></code></td>
    <td>Field</td>
    <td>Added to <code>QueryRoot</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/queries/customersCount">customersCount</a></code></td>
    <td>Query</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/Order#field-order-fulfillmentscount">fulfillmentsCount</a></code></td>
    <td>Field</td>
    <td>Added to <code>Order</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/FulfillmentEvent#field-fulfillmentevent-createdat">createdAt</a></code></td>
    <td>Field</td>
    <td>Added to <code>FulfillmentEvent</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/FulfillmentService#field-fulfillmentservice-trackingsupport">trackingSupport</a></code></td>
    <td>Field</td>
    <td>Added to <code>FulfillmentService</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/InventoryQuantityInput">InventoryQuantityInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/InventorySetQuantitiesInput">InventorySetQuantitiesInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/mutations/inventorySetQuantities">inventorySetQuantities</a></code></td>
    <td>Mutation</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/queries/locationsCount">locationsCount</a></code></td>
    <td>Query</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/queries/ordersCount">ordersCount</a></code></td>
    <td>Query</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/Order#field-order-staffmember">staffMember</a></code></td>
    <td>Field</td>
    <td>Added to <code>Order</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/Order#field-order-sourcename">sourceName</a></code></td>
    <td>Field</td>
    <td>Added to <code>Order</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/mutations/OrderDelete">orderDelete</a></code></td>
    <td>Mutation</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/OrderDeleteUserError">OrderDeleteUserError</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/queries/publishedProductsCount">publishedProductsCount</a></code></td>
    <td>Query</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/queries/webhookSubscriptionsCount">webhookSubscriptionsCount</a></code></td>
    <td>Query</td>
    <td>Added</td>
  </tr>
</table>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Included fields on webhook subscriptions</h3>
  </div>
  <div class="accordion-content">
    <p>The <a href="/docs/api/admin-graphql/latest/objects/WebhookSubscription#field-webhooksubscription-includefields"><code class="text-highlight text-highlight--grey">includeFields</code></a> that are specified on a webhook subscription are now available for all webhook topics. Previously, some webhook topics weren&#39;t respecting the <code class="text-highlight text-highlight--grey">includeFields</code> configuration.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Improvements to ShopPolicy object</h3>
  </div>
  <div class="accordion-content">
    <p>We&#39;ve added new fields to the <a href="/docs/api/admin-graphql/latest/objects/ShopPolicy"><code class="text-highlight text-highlight--grey">ShopPolicy</code></a> object. A <code class="text-highlight text-highlight--grey">ShopPolicy</code> is a policy that a merchant has configured for their store, such as their refund or privacy policy.</p>
<table>
  <caption>New fields on the ShopPolicy object</caption>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Type</th>
    <th scope="col">Change</th>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/ShopPolicy#field-shoppolicy-title">title</a></code></td>
    <td>Field</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/ShopPolicy#field-shoppolicy-createdat">createdAt</a></code></td>
    <td>Field</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/ShopPolicy#field-shoppolicy-updatedat">updatedAt</a></code></td>
    <td>Field</td>
    <td>Added</td>
  </tr>
</table>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Improvements to Shopify Payments payouts and balance transactions</h3>
  </div>
  <div class="accordion-content">
    <p>We&#39;ve made several improvements to Shopify Payments payouts and balance transactions in the GraphQL Admin API to provide parity with the REST Admin API:</p>
<ul>
<li><p>You can now use <a href="/docs/api/usage/search-syntax">Shopify&#39;s API search syntax</a> to filter and sort payouts using the <code class="text-highlight text-highlight--grey">sortKey</code> and <code class="text-highlight text-highlight--grey">savedSearchId</code> parameters. This functionality allows you to efficiently search and organize payouts based on specific criteria such as <code class="text-highlight text-highlight--grey">ledger_type</code>, <code class="text-highlight text-highlight--grey">status</code>, <code class="text-highlight text-highlight--grey">amount</code>, <code class="text-highlight text-highlight--grey">currency</code>, and <code class="text-highlight text-highlight--grey">issued_at</code>.</p></li>
<li><p>You can now use the following new fields on the <a href="/docs/api/admin-graphql/latest/objects/ShopifyPaymentsBalanceTransaction"><code class="text-highlight text-highlight--grey">ShopifyPaymentsBalanceTransaction</code></a> object:</p>
<ul>
<li><code class="text-highlight text-highlight--grey">sourceID</code>: Represents the ID of the object that led to the transaction.</li>
<li><code class="text-highlight text-highlight--grey">sourceOrderTransactionID</code>: Indicates the ID of the order transaction that triggered the balance transaction. If the <code class="text-highlight text-highlight--grey">sourceType</code> is an adjustment, then this value is <code class="text-highlight text-highlight--grey">null</code>.</li>
<li><code class="text-highlight text-highlight--grey">adjustmentOrderTransactions</code>: An array of associated order transactions that resulted in the balance transaction. If the <code class="text-highlight text-highlight--grey">sourceType</code> is not an adjustment, then this array is null. Each object in the array includes <code class="text-highlight text-highlight--grey">adjustmentReason</code>, which specifies the reason for the adjustment associated with the transaction. If the <code class="text-highlight text-highlight--grey">sourceType</code> is not an adjustment, then value is <code class="text-highlight text-highlight--grey">null</code>.</li>
</ul></li>
</ul>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Inventory error code</h3>
  </div>
  <div class="accordion-content">
    <p>The <a href="/docs/api/admin-graphql/latest/enums/InventorySetScheduledChangesUserErrorCode#value-ledgerdocumentinvalid"><code class="text-highlight text-highlight--grey">LEDGER_DOCUMENT_INVALID</code></a> error code has been added to the <a href="/docs/api/admin-graphql/latest/mutations/inventorySetScheduledChanges"><code class="text-highlight text-highlight--grey">inventorySetScheduledChanges</code></a> mutation.
The error code is returned when the <code class="text-highlight text-highlight--grey">ledgerDocumentUri</code> provided is not a valid URI.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Inventory item data <span id="inventory-item-data" class="heading-flag breaking"</h3>
  </div>
  <div class="accordion-content">
    <p>Prior to API version 2024-07, you could send inventory item data using <a href="/docs/api/admin-graphql/2024-04/objects/ProductVariant#mutations"><code class="text-highlight text-highlight--grey">ProductVariant</code></a> mutations or on the <a href="/docs/api/admin-graphql/2024-04/mutations/inventoryItemUpdate"><code class="text-highlight text-highlight--grey">InventoryItemUpdate</code></a> mutation. Each of these places has a different input object type with very similar fields, and with some fields showing up in one mutation instead of the other.</p>
<p>As of API version 2024-07, the two input types are unified. <a href="/docs/api/admin-graphql/latest/input-objects/InventoryItemInput"><code class="text-highlight text-highlight--grey">InventoryItemInput</code></a> is now the input object type on the <a href="/docs/api/admin-graphql/latest/mutations/inventoryItemUpdate"><code class="text-highlight text-highlight--grey">inventoryItemUpdate</code></a> mutation instead of the <a href="/docs/api/admin-graphql/latest/input-objects/InventoryItemUpdateInput"><code class="text-highlight text-highlight--grey">InventoryItemUpdateInput</code></a> input object.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Location object <span id="location-object" class="heading-flag breaking"</h3>
  </div>
  <div class="accordion-content">
    <p>The <a href="/docs/api/admin-graphql/latest/objects/Location"><code class="text-highlight text-highlight--grey">Location</code></a> object is now gated by the <code class="text-highlight text-highlight--grey">read_locations</code> access scope. If you attempt to read the <code class="text-highlight text-highlight--grey">Location</code> object without the <code class="text-highlight text-highlight--grey">read_locations</code> access scope, then an access denied error is returned.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Marketing activity improvements <span id="marketing-activity-improvements" class="heading-flag breaking"</h3>
  </div>
  <div class="accordion-content">
    <p>You can now use the <code class="text-highlight text-highlight--grey">urlParameterValue</code> field as a tracking parameter in the <a href="/docs/api/admin-graphql/latest/input-objects/MarketingActivityCreateInput#field-marketingactivitycreateinput-urlparametervalue"><code class="text-highlight text-highlight--grey">marketingActivityCreateInput</code></a> and <a href="/docs/api/admin-graphql/latest/input-objects/MarketingActivityUpdateInput#field-marketingactivityupdateinput-urlparametervalue"><code class="text-highlight text-highlight--grey">marketingActivityUpdateInput</code></a> input objects. This field is currently only available to select partners. Most partners should continue to use UTMs for tracking parameters.</p>
<p>Additionally, the <a href="/docs/api/admin-graphql/latest/objects/MarketingActivityUserError"><code class="text-highlight text-highlight--grey">MarketingActivityUserError</code></a> enum is now a required type on the <code class="text-highlight text-highlight--grey">userError</code> field for the <code class="text-highlight text-highlight--grey">marketingEngagementCreate</code> mutation.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Media included in product webhooks</h3>
  </div>
  <div class="accordion-content">
    <p>The <a href="/docs/api/admin-graphql/latest/enums/WebhookSubscriptionTopic#value-productscreate"><code class="text-highlight text-highlight--grey">PRODUCTS_CREATE</code></a> and <a href="/docs/api/admin-graphql/latest/enums/WebhookSubscriptionTopic#value-productsupdate"><code class="text-highlight text-highlight--grey">PRODUCTS_UPDATE</code></a> webhook payloads now contain information about the media on a product.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Media references</h3>
  </div>
  <div class="accordion-content">
    <p>You can now use the <a href="/docs/api/admin-graphql/latest/mutations/fileUpdate"><code class="text-highlight text-highlight--grey">fileUpdate</code></a> mutation to connect files to products.</p>
<p>The following new types are available:</p>
<table>
  <caption>New types associated with media references</caption>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Type</th>
    <th scope="col">Change</th>
  </tr>
  <tr>
    <td scope="row"><code>referencesToAdd</code></td>
    <td>Field</td>
    <td>Added to <code>FileUpdateInput</code> input object</td>
  </tr>
  <tr>
    <td scope="row"><code>referencesToRemove</code></td>
    <td>Field</td>
    <td>Added to <code>FileUpdateInput</code> input object</td>
  </tr>
  <tr>
    <td scope="row"><code>UNSUPPORTED_FILE_REFERENCE</code></td>
    <td>Value</td>
    <td>Added to <code>FilesErrorCode</code> enum</td>
  </tr>
</table>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Menus on the Online Store</h3>
  </div>
  <div class="accordion-content">
    <p>You can now use the GraphQL Admin API to read and modify menus on the Online Store.</p>
<p>The following new types are available:</p>
<table>
  <caption>New types associated with menus on the Online Store</caption>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Type</th>
    <th scope="col">Change</th>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/Menu">Menu</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/MenuItem">MenuItem</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/MenuItemCreateInput">MenuItemCreateInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/MenuItemUpdateInput">MenuItemUpdateInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/mutations/menuCreate">menuCreate</a></code></td>
    <td>Mutation</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/mutations/menuUpdate">menuUpdate</a></code></td>
    <td>Mutation</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/mutations/menuDelete">menuDelete</a></code></td>
    <td>Mutation</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/queries/menu">menu</a></code></td>
    <td>Query</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/queries/menus">menus</a></code></td>
    <td>Query</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/enums/MenuItemType">MenuItemType</a></code></td>
    <td>Enum</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/QueryRoot#field-queryroot-menu">menu</a></code></td>
    <td>Field</td>
    <td>Added to <code>QueryRoot</code> object</td>
  </tr>
</table>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Metafield access controls <span id="metafield-access-controls" class="heading-flag breaking"</h3>
  </div>
  <div class="accordion-content">
    <p>Apps can now query the <a href="/docs/api/admin-graphql/latest/objects/MetafieldDefinition#field-metafielddefinition-access"><code class="text-highlight text-highlight--grey">access</code></a> field of metafield definitions that <a href="/docs/apps/build/custom-data/ownership">they have access to but don&#39;t own</a>. Previously, an <code class="text-highlight text-highlight--grey">AuthorizationError</code> error was returned when accessing the field for metafield definitions that an app didn&#39;t have permissions to manage.</p>
<aside class="note">
  <h4>Note</h4>
  <p>
Querying the <a href="/docs/api/admin-graphql/latest/objects/MetafieldAccess#field-metafieldaccess-grants"><code class="text-highlight text-highlight--grey">grants</code></a> field on the <code class="text-highlight text-highlight--grey">MetafieldAccess</code> object still requires permissions to manage the metafield definition and an error is returned if an app queries the field with insufficient permissions.</p>
</aside>
<p>The <code class="text-highlight text-highlight--grey">admin</code> and <code class="text-highlight text-highlight--grey">storefront</code> fields on the <a href="/docs/api/admin-graphql/latest/objects/MetafieldAccess#field-metafieldaccess-grants"><code class="text-highlight text-highlight--grey">MetafieldAccess</code></a> object now return values in more cases instead of <code class="text-highlight text-highlight--grey">null</code>. For example, metafields that don&#39;t have associated access grants return <code class="text-highlight text-highlight--grey">PUBLIC_READ_WRITE</code> for <code class="text-highlight text-highlight--grey">admin</code> access and <code class="text-highlight text-highlight--grey">LEGACY_LIQUID_ONLY</code> for <code class="text-highlight text-highlight--grey">storefront</code>. In addition, definitions that were created with a storefront access of <code class="text-highlight text-highlight--grey">NONE</code> now return <code class="text-highlight text-highlight--grey">NONE</code> instead of <code class="text-highlight text-highlight--grey">null</code>. As of API version 2024-07, you can set <code class="text-highlight text-highlight--grey">PUBLIC_READ_WRITE</code> as the <code class="text-highlight text-highlight--grey">admin</code> access control.</p>
<p>Additionally, the <code class="text-highlight text-highlight--grey">admin</code> and <code class="text-highlight text-highlight--grey">storefront</code> fields on the <a href="/docs/api/admin-graphql/latest/input-objects/MetafieldAccessInput"><code class="text-highlight text-highlight--grey">MetafieldAccessInput</code></a> input object now use dedicated input enum types, <a href="/docs/api/admin-graphql/latest/enums/MetafieldAdminAccessInput"><code class="text-highlight text-highlight--grey">MetafieldAdminAccessInput</code></a> and <a href="/docs/api/admin-graphql/latest/enums/MetafieldStorefrontAccessInput"><code class="text-highlight text-highlight--grey">MetafieldStorefrontAccessInput</code></a>, respectively.</p>
<p>The following new types are available:</p>
<table>
  <caption>New types associated with metafield access controls</caption>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Type</th>
    <th scope="col">Change</th>
  </tr>
  <tr>
    <td scope="row"><code>PUBLIC_READ_WRITE</code></td>
    <td>Value</td>
    <td>Added to the <code>MetafieldAdminAccess</code> enum</td>
  </tr>
  <tr>
    <td scope="row"><code>LEGACY_LIQUID_ONLY</code></td>
    <td>Value</td>
    <td>Added to the <code>MetafieldStorefrontAccess</code> enum</td>
  </tr>
  <tr>
    <td scope="row"><code>MetafieldAdminAccessInput</code></td>
    <td>Enum</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code>MetafieldStorefrontAccessInput</code></td>
    <td>Enum</td>
    <td>Added</td>
  </tr>
</table>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Metafield connections for OnlineStore objects</h3>
  </div>
  <div class="accordion-content">
    <p>You can now use the <code class="text-highlight text-highlight--grey">metafields</code> and <code class="text-highlight text-highlight--grey">metafieldDefinitions</code> connections on the <a href="/docs/api/admin-graphql/latest/objects/OnlineStoreArticle#connections"><code class="text-highlight text-highlight--grey">OnlineStoreArticle</code></a>, <a href="/docs/api/admin-graphql/latest/objects/OnlineStoreBlog#connections"><code class="text-highlight text-highlight--grey">OnlineStoreBlog</code></a>, and <a href="/docs/api/admin-graphql/latest/objects/OnlineStorePage#connections"><code class="text-highlight text-highlight--grey">OnlineStorePage</code></a> objects. Previously, you could only retrieve metafields and metafield definitions connections using the REST Admin API.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Metafield definitions and constraints</h3>
  </div>
  <div class="accordion-content">
    <p>We&#39;ve added new types for reading standard conditional metafields and filtering metafield definitions by constraints:</p>
<table>
  <caption>New types for reading standard conditional metafields and filtering metafield definitions by constraints</caption>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Type</th>
    <th scope="col">Change</th>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/MetafieldDefinitionConstraints">MetafieldDefinitionConstraints</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/MetafieldDefinitionConstraintValue">MetafieldDefinitionConstraintValue</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/MetafieldDefinitionConstraintSubtypeIdentifier">MetafieldDefinitionConstraintSubtypeIdentifier</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/enums/MetafieldDefinitionConstraintStatus">MetafieldDefinitionConstraintStatus</a></code></td>
    <td>Enum</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/enums/MetafieldDefinitionCreateUserError">MetafieldDefinitionCreateUserError</a></code></td>
    <td>Enum</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/enums/MetafieldDefinitionUpdateUserError">MetafieldDefinitionUpdateUserError</a></code></td>
    <td>Enum</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/MetafieldDefinition#field-metafielddefinition-constraints">constraints</a></code></td>
    <td>Field</td>
    <td>Added to <code>MetafieldDefinition</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/unstable/queries/metafieldDefinitions#field-constraintSubtype">constraintSubtype</a></code></td>
    <td>Field</td>
    <td>Added to <code>metafieldDefinitions</code> query</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/unstable/queries/metafieldDefinitions#field-constraintStatus">constraintStatus</a></code></td>
    <td>Field</td>
    <td>Added to <code>metafieldDefinitions</code> query</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/unstable/queries/standardMetafieldDefinitionTemplates#argument-constraintSubtype">constraintSubtype</a></code></td>
    <td>Argument</td>
    <td>Added to <code>standardMetafieldDefinitionTemplates</code> query</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/unstable/queries/standardMetafieldDefinitionTemplates#argument-constraintStatus">constraintStatus</a></code></td>
    <td>Argument</td>
    <td>Added to <code>standardMetafieldDefinitionTemplates</code> query</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/unstable/queries/standardMetafieldDefinitionTemplates#argument-excludeActivated">excludeActivated</a></code></td>
    <td>Argument</td>
    <td>Added to <code>standardMetafieldDefinitionTemplates</code> query</td>
  </tr>
</table>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Metafield error code</h3>
  </div>
  <div class="accordion-content">
    <p>We&#39;ve added a new error code for mutations that set metafields. The <a href="/docs/api/admin-graphql/latest/enums/MetafieldsSetUserErrorCode#value-internalerror"><code class="text-highlight text-highlight--grey">INTERNAL_ERROR</code></a> error code has been added to the <code class="text-highlight text-highlight--grey">MetafieldsSetUserErrorCode</code> enum.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Metafield JSON value</h3>
  </div>
  <div class="accordion-content">
    <p>The <a href="/docs/api/admin-graphql/latest/objects/Metafield"><code class="text-highlight text-highlight--grey">Metafield</code></a> and <a href="/docs/api/admin-graphql/latest/objects/MetaobjectField"><code class="text-highlight text-highlight--grey">MetaobjectField</code></a> objects now have a <code class="text-highlight text-highlight--grey">jsonValue</code> field that returns the stored value as a <code class="text-highlight text-highlight--grey">JSON</code> scalar.</p>
<p>By using the <code class="text-highlight text-highlight--grey">jsonValue</code> field, metafield values that are stored as <code class="text-highlight text-highlight--grey">JSON</code> strings don&#39;t have to be parsed on the client-side. The field is set for all metafield types and is also available in all <a href="/docs/api/functions">Function APIs</a>. The <code class="text-highlight text-highlight--grey">jsonValue</code> field can be used in Function input queries to improve function performance and reduce the instructions needed to parse JSON metafield values, which are commonly used for function configuration.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Metafields reserved namespaces</h3>
  </div>
  <div class="accordion-content">
    <p>We&#39;ve added the <a href="/docs/api/admin-graphql/latest/enums/MetafieldDefinitionDeleteUserErrorCode"><code class="text-highlight text-highlight--grey">RESERVED_NAMESPACE_ORPHANED_METAFIELDS</code></a> error code to the <code class="text-highlight text-highlight--grey">MetafieldDefinitionDelete</code> mutation.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Missing payment information for subscriptions</h3>
  </div>
  <div class="accordion-content">
    <p>The <a href="/docs/api/admin-graphql/latest/enums/SubscriptionDraftErrorCode#value-missingcustomerpaymentmethod"><code class="text-highlight text-highlight--grey">MISSING_CUSTOMER_PAYMENT_METHOD</code></a> error code is now returned when payment information is missing on the <a href="/docs/api/admin-graphql/latest/mutations/subscriptionDraftCommit"><code class="text-highlight text-highlight--grey">subscriptionDraftCommit</code></a> mutation.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Metaobjects</h3>
  </div>
  <div class="accordion-content">
    <p>We&#39;ve added the <a href="/docs/api/admin-graphql/latest/enums/MetaobjectUserErrorCode#value-displaynameconflict"><code class="text-highlight text-highlight--grey">DISPLAY_NAME_CONFLICT</code></a> error code value to the <code class="text-highlight text-highlight--grey">MetaobjectUserErrorCode</code> enum.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Online store password protection</h3>
  </div>
  <div class="accordion-content">
    <p>You can now retrieve information about the storefront password of an online store using the <a href="/docs/api/admin-graphql/latest/objects/OnlineStorePasswordProtection"><code class="text-highlight text-highlight--grey">OnlineStorePasswordProtection</code></a> and <a href="/docs/api/admin-graphql/latest/objects/OnlineStore"><code class="text-highlight text-highlight--grey">OnlineStore</code></a> objects.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Optional fields on ProductSetInput</h3>
  </div>
  <div class="accordion-content">
    <p>The <a href="/docs/api/admin-graphql/latest/input-objects/ProductSetInput#field-productsetinput-variants"><code class="text-highlight text-highlight--grey">variants</code></a> and <a href="/docs/api/admin-graphql/latest/input-objects/ProductSetInput#field-productsetinput-productoptions"><code class="text-highlight text-highlight--grey">productOptions</code></a> fields on the <code class="text-highlight text-highlight--grey">ProductSetInput</code> input object are now optional. In API versions prior to 2024-07, the <code class="text-highlight text-highlight--grey">variants</code> and <code class="text-highlight text-highlight--grey">productOptions</code> fields were required.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Order capture</h3>
  </div>
  <div class="accordion-content">
    <p>Shopify Plus merchants using Shopify Payments are able to partially capture authorizations more than once. However, you might know that the capture you&#39;re about to perform will be the last one. To reflect this, we&#39;ve added the <a href="/docs/api/admin-graphql/latest/input-objects/OrderCaptureInput#field-ordercaptureinput-finalcapture"><code class="text-highlight text-highlight--grey">finalCapture</code></a> field to the <code class="text-highlight text-highlight--grey">orderCaptureInput</code> input object.</p>
<p>When you know you&#39;re capturing an authorization for the last time, setting the <code class="text-highlight text-highlight--grey">finalCapture</code> field to <code class="text-highlight text-highlight--grey">true</code> releases any uncaptured funds back to your customer. Doing so is likely to increase customer satisfaction and decrease the risk of chargebacks.</p>
<p>For merchants not on the Shopify Plus plan, the <code class="text-highlight text-highlight--grey">finalCapture</code> field has no effect: these authorizations can only be captured once, and uncaptured funds are always returned immediately to the customer.</p>
<p>Currently, the <code class="text-highlight text-highlight--grey">finalCapture</code> field only applies to transactions made through Shopify Payments. When capturing authorizations processed through other gateways, <code class="text-highlight text-highlight--grey">finalCapture</code> must either be omitted, or set to <code class="text-highlight text-highlight--grey">null</code>.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Order transactions</h3>
  </div>
  <div class="accordion-content">
    <p>You can now use the <a href="/docs/api/admin-graphql/latest/objects/Order#field-order-transactionscount"><code class="text-highlight text-highlight--grey">transactionsCount</code></a> field on the <code class="text-highlight text-highlight--grey">Order</code> object to return the number of transactions associated with a given order.</p>
<p>We&#39;ve also added the <a href="/docs/api/admin-graphql/latest/objects/OrderTransaction#field-ordertransaction-authorizationexpiresat"><code class="text-highlight text-highlight--grey">authorizationExpiresAt</code></a> field on the <code class="text-highlight text-highlight--grey">OrderTransaction</code> object. The <code class="text-highlight text-highlight--grey">authorizationExpiresAt</code> field is available only to stores on a Shopify Plus plan and is populated only for Shopify Payments authorizations.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Product bundles</h3>
  </div>
  <div class="accordion-content">
    <p>We&#39;ve added the <a href="/docs/api/admin-graphql/latest/objects/LineItemGroup#field-lineitemgroup-customattributes"><code class="text-highlight text-highlight--grey">customAttributes</code></a> field on the <code class="text-highlight text-highlight--grey">LineItemGroup</code> object, which allows you to query a list of attributes that represent custom features or special requests. A line item group is also known as a bundle.</p>
<p>Apps can now also do the following:</p>
<ul>
<li>Retrieve a bundle item&#39;s components on a draft order by using the <code class="text-highlight text-highlight--grey">bundleComponents</code> field on the <a href="/docs/api/admin-graphql/latest/input-objects/DraftOrderBundleLineItemComponentInput#field-draftorderbundlelineitemcomponentinput-bundlecomponents"><code class="text-highlight text-highlight--grey">DraftOrderBundleLineItemComponentInput</code></a> input object.</li>
<li>Add a bundle item to a draft order by including the <a href="/docs/api/admin-graphql/latest/input-objects/DraftOrderInput#field-draftorderinput-bundlecomponents"><code class="text-highlight text-highlight--grey">bundleComponents</code></a> field on the <code class="text-highlight text-highlight--grey">draftOrderLineItemInput</code> input object.</li>
</ul>
<p>Additionally, the <a href="/docs/api/functions/reference/cart-transform/graphql/common-objects/carttransform"><code class="text-highlight text-highlight--grey">CartTransform</code></a> function now automatically runs on all draft orders.</p>
<p><a href="/docs/apps/build/product-merchandising/bundles">Learn more about bundles</a>.</p>
<p>The following new types are available for creating and updating product bundles:</p>
<table>
  <caption>New types for creating and updating product bundles</caption>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Type</th>
    <th scope="col">Change</th>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/ProductBundleComponentOptionSelectionValue">ProductBundleComponentOptionSelectionValue</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/ProductBundleComponentOptionSelection">ProductBundleComponentOptionSelection</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/ProductBundleComponentQuantityOptionValue">ProductBundleComponentQuantityOptionValue</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/ProductBundleComponentQuantityOption">ProductBundleComponentQuantityOption</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/ProductBundleComponent">ProductBundleComponent</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/ProductBundleOperation">ProductBundleOperation</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/ProductBundleMutationUserError">ProductBundleMutationUserError</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/ProductBundleComponentInput">ProductBundleComponentInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/ProductBundleComponentOptionSelectionInput">ProductBundleComponentOptionSelectionInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/ProductBundleComponentQuantityOptionInput">ProductBundleComponentQuantityOptionInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/ProductBundleComponentQuantityOptionValueInput">ProductBundleComponentQuantityOptionValueInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/ProductBundleCreateInput">ProductBundleCreateInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/ProductBundleUpdateInput">ProductBundleUpdateInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/mutations/productBundleCreate">productBundleCreate</a></code></td>
    <td>Mutation</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/mutations/productBundleUpdate">productBundleUpdate</a></code></td>
    <td>Mutation</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/enums/ProductBundleComponentOptionSelectionStatus">ProductBundleComponentOptionSelectionStatus</a></code></td>
    <td>Enum</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/Product#connection-bundlecomponents">bundleComponents</a></code></td>
    <td>Field</td>
    <td>Added to <code>Product</code> object</td>
  </tr>
</table>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Product feed variant images <span id="product-feed-variant-images" class="heading-flag breaking"</h3>
  </div>
  <div class="accordion-content">
    <p>As of API version 2024-07, the variant image field in the <code class="text-highlight text-highlight--grey">PRODUCT_FEEDS_INCREMENTAL_SYNC</code> and <code class="text-highlight text-highlight--grey">PRODUCT_FEEDS_FULL_SYNC</code> <a href="/docs/api/admin-graphql/latest/enums/WebhookSubscriptionTopic">webhook subscription topics</a> won&#39;t return an image unless one has been set. Previously, the variant image field would return the product&#39;s first image when an image wasn&#39;t explicitly set for the variant.</p>
<p>If this change doesn&#39;t work for your use case, then you can replicate the old behavior by assigning the first product image to the variant.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Product options error code</h3>
  </div>
  <div class="accordion-content">
    <p>The <a href="/docs/api/admin-graphql/latest/enums/ProductOptionUpdateUserErrorCode#value-linkedmetafielddefinitionnotfound"><code class="text-highlight text-highlight--grey">LINKED_METAFIELD_DEFINITION_NOT_FOUND</code></a> value has been added to the <code class="text-highlight text-highlight--grey">ProductOptionUpdateUserErrorCode</code> enum.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Promise provider data</h3>
  </div>
  <div class="accordion-content">
    <p>You can now use the <a href="/docs/api/admin-graphql/latest/objects/DeliveryMethod#field-deliverymethod-sourcereference"><code class="text-highlight text-highlight--grey">sourceReference</code></a> field on the <code class="text-highlight text-highlight--grey">DeliveryMethod</code> object to return promise provider data associated with a delivery promise.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Product query</h3>
  </div>
  <div class="accordion-content">
    <p>You can now use the <code class="text-highlight text-highlight--grey">published_at</code> filter on the <a href="/docs/api/admin-graphql/latest/queries/product"><code class="text-highlight text-highlight--grey">product</code></a> query to determine the date and time when a product was published to the Online Store.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Product taxonomy <span id="product-taxonomy" class="heading-flag breaking"</h3>
  </div>
  <div class="accordion-content">
    <p>The following types now have a <code class="text-highlight text-highlight--grey">category</code> field, which accepts the global ID (GID) of a taxonomy category that&#39;s specified by a merchant:</p>
<ul>
<li><a href="/docs/api/admin-graphql/unstable/input-objects/ProductInput#field-productinput-category"><code class="text-highlight text-highlight--grey">ProductInput</code></a> input object</li>
<li><a href="/docs/api/admin-graphql/latest/objects/Shop#field-shop-allproductcategorieslist"><code class="text-highlight text-highlight--grey">Shop</code></a> object</li>
<li><a href="/docs/api/admin-graphql/latest/unions/MetafieldReference#value-product"><code class="text-highlight text-highlight--grey">MetafieldReference</code></a> union</li>
</ul>
<p>We&#39;ve also deprecated the <code class="text-highlight text-highlight--grey">allProductCategories</code> field on the <code class="text-highlight text-highlight--grey">Shop</code> object. Use the <a href="/docs/api/admin-graphql/latest/objects/Shop#field-shop-allproductcategorieslist"><code class="text-highlight text-highlight--grey">allProductCategoriesList</code></a> field on the <code class="text-highlight text-highlight--grey">Shop</code> object instead.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Product translations</h3>
  </div>
  <div class="accordion-content">
    <p>You can now use the <a href="/docs/api/admin-graphql/latest/input-objects/ProductDuplicateAsyncInput#field-productduplicateasyncinput-includetranslations"><code class="text-highlight text-highlight--grey">includesTranslations</code></a> field on the <code class="text-highlight text-highlight--grey">ProductDuplicateAsyncInput</code> input object to specify whether to include translations when running the <a href="/docs/api/admin-graphql/latest/mutations/productDuplicateAsyncV2"><code class="text-highlight text-highlight--grey">productDuplicateAsyncV2</code></a> mutation.</p>
<p>If <code class="text-highlight text-highlight--grey">includesTranslations</code> is set to <code class="text-highlight text-highlight--grey">true</code>, then all translations that are saved on the product, its variants, and its metafields are copied over to the new product.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Product variants <span id="product-variants-graphql" class="heading-flag breaking"</h3>
  </div>
  <div class="accordion-content">
    <p>We&#39;ve removed several fields on product variants that are duplicates of linked inventory items. For a complete list of changes to the GraphQL Admin API, and to learn more about the types that you can use instead, refer to the <a href="/changelog/product-variant-field-cleanup">developer changelog</a>.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Querying media in files</h3>
  </div>
  <div class="accordion-content">
    <p>You can now use the <a href="/docs/api/admin-graphql/latest/queries/files"><code class="text-highlight text-highlight--grey">files</code></a> query to retrieve 3D models and external videos.</p>
<p>The following new types are available:</p>
<table>
  <caption>Types associated with querying media in files</caption>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Type</th>
    <th scope="col">Change</th>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/Model3d#interface-file">File</a></code></td>
    <td>Interface</td>
    <td>Added to <code>Model3d</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/ExternalVideo#interface-file">File</a></code></td>
    <td>Interface</td>
    <td>Added to <code>ExternalVideo</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/enums/FileContentType#value-model3d">MODEL_3D</a></code></td>
    <td>Value</td>
    <td>Added to <code>FileContentType</code> enum</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/enums/FileContentType#value-externalvideo">EXTERNAL_VIDEO</a></td>
    <td>Value</td>
    <td>Added to <code>FileContentType</code> enum</td>
  </tr>
</table>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Removals of types and fields <span id="removal-types-fields" class="heading-flag breaking"</h3>
  </div>
  <div class="accordion-content">
    <p>We&#39;ve removed the following types and fields from the GraphQL Admin API:</p>
<table>
  <caption>Removals of types and fields from the GraphQL Admin API</caption>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Type</th>
    <th scope="col">Change</th>
  </tr>
  <tr>
    <td scope="row"><code>ShippingLabel</code></td>
    <td>Object</td>
    <td><a href="/docs/api/admin-graphql/latest/objects/ShippingLabel">Removed</a>.</td>
  </tr>
  <tr>
    <td scope="row"><code>location</code> field</td>
    <td><code>Order</code> object</td>
    <td>Removed. Use the <code><a href="/docs/api/admin-graphql/latest/objects/Order#field-order-retaillocation">retailLocation</a></code> field on the <code>Order</code> object instead.</td>
  </tr>
  <tr>
    <td scope="row"><code>order</code> field</td>
    <td><code>CalculatedOrder</code> object</td>
    <td>Removed. Use the <code><a href="/docs/api/admin-graphql/latest/objects/calculatedorder#field-calculatedorder-originalorder">originalOrder</a></code> field on the <code>CalculatedOrder</code> object instead.</td>
  </tr>
  <tr>
    <td scope="row"><code>productBased</code> field</td>
    <td><code>FulfillmentService</code> object</td>
    <td><a href="/docs/api/admin-graphql/latest/objects/FulfillmentService">Removed</a>. Non-product based fulfillment services are no longer supported.</td>
  </tr>
</table>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Retail locations</h3>
  </div>
  <div class="accordion-content">
    <p>You can now use the <a href="/docs/api/admin-graphql/latest/objects/Order#field-order-retaillocation"><code class="text-highlight text-highlight--grey">retailLocation</code></a> field on the <code class="text-highlight text-highlight--grey">Order</code> object to query the physical location where a retail order is created or completed.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Refund line items</h3>
  </div>
  <div class="accordion-content">
    <p>You can now use the <a href="/docs/api/admin-graphql/latest/objects/RefundLineItem#field-refundlineitem-id"><code class="text-highlight text-highlight--grey">id</code></a> field on the <code class="text-highlight text-highlight--grey">RefundLineItem</code> object to return the global ID of the specified refund line item object.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Refunds <span id="refunds" class="heading-flag breaking"</h3>
  </div>
  <div class="accordion-content">
    <p>Shopify&#39;s suggestion for a refund is now inclusive of payable charges, such as exchange items and fees, alongside returns.</p>
<p>The <a href="/docs/api/admin-graphql/latest/objects/Return#field-return-suggestedrefund"><code class="text-highlight text-highlight--grey">Return.suggestedRefund</code></a> query and <a href="/docs/api/admin-graphql/latest/mutations/returnRefund"><code class="text-highlight text-highlight--grey">ReturnRefund</code></a> mutation now have a different expectation on the refund amount. The refund amount considers exchange line items and fees on the return, as well as any outstanding amount owed by the buyer on an order. Previously, the refund amount logic only accounted for return line items.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Returns</h3>
  </div>
  <div class="accordion-content">
    <p>As of API version 2024-07, the <a href="/docs/api/admin-graphql/latest/objects/Return#connection-returnlineitems"><code class="text-highlight text-highlight--grey">Return.returnLineItems</code></a> connection is an interface type. This change is designed to accommodate more diverse return item types in the future, and provides more flexibility in handling returns.</p>
<p>To maintain compatibility with existing implementations, adjust your queries to use an inline fragment. The following adjustment ensures that queries continue to function correctly with the new interface type:</p>
<p>
<div class="react-code-block" data-preset="basic">
<div class="react-code-block-preload ThemeMode-dim">
<div class="react-code-block-preload-bar basic-codeblock"></div>
<div class="react-code-block-preload-placeholder-container">
<div class="react-code-block-preload-code-container">
<div class="react-code-block-preload-codeline-number"></div>
<div class="react-code-block-preload-codeline"></div>
</div>
<div class="react-code-block-preload-code-container">
<div class="react-code-block-preload-codeline-number"></div>
<div class="react-code-block-preload-codeline"></div>
</div>
<div class="react-code-block-preload-code-container">
<div class="react-code-block-preload-codeline-number"></div>
<div class="react-code-block-preload-codeline"></div>
</div>
<div class="react-code-block-preload-code-container">
<div class="react-code-block-preload-codeline-number"></div>
<div class="react-code-block-preload-codeline"></div>
</div>
<div class="react-code-block-preload-code-container">
<div class="react-code-block-preload-codeline-number"></div>
<div class="react-code-block-preload-codeline"></div>
</div>
<div class="react-code-block-preload-code-container">
<div class="react-code-block-preload-codeline-number"></div>
<div class="react-code-block-preload-codeline"></div>
</div>
<div class="react-code-block-preload-code-container">
<div class="react-code-block-preload-codeline-number"></div>
<div class="react-code-block-preload-codeline"></div>
</div>
<div class="react-code-block-preload-code-container">
<div class="react-code-block-preload-codeline-number"></div>
<div class="react-code-block-preload-codeline"></div>
</div>
<div class="react-code-block-preload-code-container">
<div class="react-code-block-preload-codeline-number"></div>
<div class="react-code-block-preload-codeline"></div>
</div>
<div class="react-code-block-preload-code-container">
<div class="react-code-block-preload-codeline-number"></div>
<div class="react-code-block-preload-codeline"></div>
</div>
<div class="react-code-block-preload-code-container">
<div class="react-code-block-preload-codeline-number"></div>
<div class="react-code-block-preload-codeline"></div>
</div>
<p></div>
</div>
<script type="text/plain" data-language="graphql">
returnLineItems(first: 30) {
  edges {
    cursor
    node {
      ... on ReturnLineItem {
        id
        ...ReturnLineItemAttributes
      }
    }
  }
}
</script>
</div>
</p>
  </div>
</div></p>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Selling plans</h3>
  </div>
  <div class="accordion-content">
    <p>Metafields are now supported on the <a href="/docs/api/admin-graphql/latest/objects/SellingPlan"><code class="text-highlight text-highlight--grey">SellingPlan</code></a> object.</p>
<p>The following new types are available:</p>
<table>
  <caption>Types associated with metafields on selling plans</caption>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Type</th>
    <th scope="col">Change</th>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/SellingPlan#interface-hasmetafields">hasMetafields</a></code></td>
    <td>Interface</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/SellingPlan#interface-hasmetafielddefinitions">hasMetafieldDefinitions</a></code></td>
    <td>Interface</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/SellingPlanInput#field-sellingplaninput-metafields">metafields</a></code></td>
    <td>Field</td>
    <td>Added to <code>SellingPlanInput</code> input object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/enums/MetafieldOwnerType#value-sellingplan">SELLING_PLAN</a></code></td>
    <td>value</td>
    <td>Added to <code>MetafieldOwnerType</code> enum</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/enums/SellingPlanGroupUserErrorCode#value-invalidinput">INVALID_INPUT</a></code></td>
    <td>value</td>
    <td>Added to <code>SellingPlanGroupUserErrorCode</code> enum</td>
  </tr>
</table>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Set metafields using compare-and-swap (CAS)</h3>
  </div>
  <div class="accordion-content">
    <p>You can now set metafields using compare-and-swap (CAS) with the <a href="/docs/api/admin-graphql/latest/input-objects/MetafieldsSetInput#field-metafieldssetinput-comparedigest"><code class="text-highlight text-highlight--grey">compareDigest</code></a> field on the <a href="/docs/api/admin-graphql/latest/mutations/metafieldsSet"><code class="text-highlight text-highlight--grey">metafieldsSet</code></a> mutation. By using CAS, you can properly handle concurrency requests.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Shopify mobile apps</h3>
  </div>
  <div class="accordion-content">
    <p>As of API version 2024-07, we&#39;re introducing a new <a href="/docs/api/admin-graphql/latest/unions/MobilePlatformApplication"><code class="text-highlight text-highlight--grey">MobilePlatformApplication</code></a> type. This type facilitates the development and operational integration of shared web credentials and app link systems for Shopify mobile apps on both iOS and Android platforms.</p>
<p>The following new types are available:</p>
<table>
  <caption>Types associated with Shopify mobile apps</caption>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Type</th>
    <th scope="col">Change</th>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/AndroidApplication">AndroidApplication</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/AppleApplication">AppleApplication</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/input-objects/MobilePlatformApplicationCreateInput">MobilePlatformApplicationCreateInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/unions/MobilePlatformApplication">MobilePlatformApplication</a></code></td>
    <td>Union</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/mutations/mobilePlatformApplicationCreate">mobilePlatformApplicationCreate</a></code></td>
    <td>Mutation</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/mutations/mobilePlatformApplicationDelete">MobilePlatformApplicationDelete</a></code></td>
    <td>Mutation</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/mutations/mobilePlatformApplicationUpdate">MobilePlatformApplicationUpdate</a></code></td>
    <td>Mutation</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/MobilePlatformApplicationUserError">MobilePlatformApplicationUserError</a></code></td>
    <td>Enum</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/queries/mobilePlatformApplication">mobilePlatformApplication</a></code></td>
    <td>Query</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/queries/mobilePlatformApplications">mobilePlatformApplications</a></code></td>
    <td>Query</td>
    <td>Added</td>
  </tr>
</table>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Shopify Payments balance transactions</h3>
  </div>
  <div class="accordion-content">
    <p>You can now query the following new types related to Shopify Payments balance transactions:</p>
<table>
  <caption>New types for Shopify Payments balance transactions</caption>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Type</th>
    <th scope="col">Change</th>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/ShopifyPaymentsAssociatedOrder">ShopifyPaymentsAssociatedOrder</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/ShopifyPaymentsBalanceTransactionAssociatedPayout">ShopifyPaymentsBalanceTransactionAssociatedPayout</a></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/ShopifyPaymentsBalanceTransaction#field-shopifypaymentsbalancetransaction-amount">amount</a></td>
    <td>Field</td>
    <td>Added to <code>ShopifyPaymentsBalanceTransaction</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/ShopifyPaymentsBalanceTransaction#field-shopifypaymentsbalancetransaction-fee">fee</a></td>
    <td>Field</td>
    <td>Added to <code>ShopifyPaymentsBalanceTransaction</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/ShopifyPaymentsBalanceTransaction#field-shopifypaymentsbalancetransaction-associatedorder">associatedOrder</a></td>
    <td>Field</td>
    <td>Added to <code>ShopifyPaymentsBalanceTransaction</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/ShopifyPaymentsBalanceTransaction#field-shopifypaymentsbalancetransaction-sourcetype">sourceType</a></td>
    <td>Field</td>
    <td>Added to <code>ShopifyPaymentsBalanceTransaction</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/ShopifyPaymentsBalanceTransaction#field-shopifypaymentsbalancetransaction-type">type</a></td>
    <td>Field</td>
    <td>Added to <code>ShopifyPaymentsBalanceTransaction</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/ShopifyPaymentsBalanceTransaction#field-shopifypaymentsbalancetransaction-associatedpayout">associatedPayout</a></td>
    <td>Field</td>
    <td>Added to <code>ShopifyPaymentsBalanceTransaction</code> object</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/objects/ShopifyPaymentsBalanceTransaction#field-shopifypaymentsbalancetransaction-test">test</a></td>
    <td>Field</td>
    <td>Added to <code>ShopifyPaymentsBalanceTransaction</code> object</td>
  </tr>
</table>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>ShopifyQL <span id="ShopifyQL" class="heading-flag breaking"</h3>
  </div>
  <div class="accordion-content">
    <p>We&#39;ve deprecated the <a href="/docs/api/admin-graphql/latest/queries/shopifyqlQuery"><code class="text-highlight text-highlight--grey">shopifyqlQuery</code></a> query. Use the <a href="/docs/api/admin-graphql">GraphQL Admin API</a> instead to extract data for your use cases.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Sorting customers <span id="sorting-customers" class="heading-flag breaking"</h3>
  </div>
  <div class="accordion-content">
    <p>The following <a href="/docs/api/admin-graphql/latest/enums/CustomerSortKeys"><code class="text-highlight text-highlight--grey">CustomerSortKeys</code></a> are now deprecated:</p>
<ul>
<li><code class="text-highlight text-highlight--grey">LAST_ORDER_DATE</code></li>
<li><code class="text-highlight text-highlight--grey">ORDERS_COUNT</code></li>
<li><code class="text-highlight text-highlight--grey">TOTAL_SPENT</code></li>
</ul>
<p>You can order customers by these attributes if you filter customers using <a href="/docs/apps/build/marketing-analytics/customer-segments">segments</a>.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Store credit at checkout</h3>
  </div>
  <div class="accordion-content">
    <p>You can now use the <a href="/docs/api/admin-graphql/latest/objects/storeCreditAccount"><code class="text-highlight text-highlight--grey">StoreCreditAccount</code></a> object to retrieve information about the monetary balance that can be redeemed at checkout for purchases in the store.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Synchronous input improvement for productSet mutation <span id="synchronous-input-improvements-for-productset-mutation" class="heading-flag breaking"</h3>
  </div>
  <div class="accordion-content">
    <p>The <a href="/docs/api/admin-graphql/latest/mutations/productSet"><code class="text-highlight text-highlight--grey">productSet</code></a> mutation now defaults to running synchronously unless the input parameter <code class="text-highlight text-highlight--grey">synchronous</code> is set to <code class="text-highlight text-highlight--grey">false</code>.</p>
<p>We&#39;ve also increased the input limit on product variants to the existing asynchronous limit. API versions prior to 2024-07 had a limit of 100 variants. You should set <code class="text-highlight text-highlight--grey">synchronous</code> to <code class="text-highlight text-highlight--grey">false</code> if you need to consider input complexity / size, or are experiencing timeouts.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Tax collection improvements</h3>
  </div>
  <div class="accordion-content">
    <p>We&#39;ve added 14 additional <a href="/docs/api/admin-graphql/latest/enums/LocalizationExtensionKey"><code class="text-highlight text-highlight--grey">LocalizationExtensionsKey</code></a> values to support the collection of tax and shipping credentials in several new countries.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Translatable content types</h3>
  </div>
  <div class="accordion-content">
    <p>You can now use the following metafield definition types to save link-related content:</p>
<ul>
<li><a href="/docs/api/admin-graphql/latest/enums/LocalizableContentType#value-link"><code class="text-highlight text-highlight--grey">LINK</code></a>: A link consisting of an anchor text and URL</li>
<li><a href="/docs/api/admin-graphql/latest/enums/LocalizableContentType#value-listlink"><code class="text-highlight text-highlight--grey">LIST_LINK</code></a>: A list of link metafields</li>
</ul>
<p><a href="/docs/apps/build/custom-data/metafields">Learn more about metafields</a>.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Validation status for shipping addresses</h3>
  </div>
  <div class="accordion-content">
    <p>You can now use the <a href="/docs/api/admin-graphql/latest/objects/MailingAddress#field-mailingaddress-validationresultsummary"><code class="text-highlight text-highlight--grey">validationResultSummary</code></a> field on the <code class="text-highlight text-highlight--grey">MailingAddress</code> object to query the validation status of a shipping address. Possible values are <code class="text-highlight text-highlight--grey">ERROR</code>, <code class="text-highlight text-highlight--grey">WARNING</code>, <code class="text-highlight text-highlight--grey">NO_ISSUES</code>, and <code class="text-highlight text-highlight--grey">NULL</code>. A <code class="text-highlight text-highlight--grey">NULL</code> value indicates that the address has not undergone validation.</p>
<p><a rel="external noreferrer noopener" target="_blank" href="https://help.shopify.com/manual/orders/manage-orders/shipping-address-validation">Learn more about how Shopify validates customer addresses</a>.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Webhook sub-topics <span id="webhook-sub-topics" class="heading-flag breaking"</h3>
  </div>
  <div class="accordion-content">
    <p>The <code class="text-highlight text-highlight--grey">subTopic</code> field has been removed from the <a href="/docs/api/admin-graphql/latest/objects/WebhookSubscription"><code class="text-highlight text-highlight--grey">WebhookSubscription</code></a> object. Use the <a href="/docs/api/admin-graphql/latest/objects/WebhookSubscription#field-webhooksubscription-filter"><code class="text-highlight text-highlight--grey">filter</code></a> field instead.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Webhook topics</h3>
  </div>
  <div class="accordion-content">
    <p>We&#39;ve added the following new webhook topics to the GraphQL Admin API:</p>
<table>
  <caption>New webhook topics in the GraphQL Admin API</caption>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Description</th>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/enums/WebhookSubscriptionTopic#value-productfeedsfullsyncfinish">PRODUCT_FEEDS_FULL_SYNC_FINISH</a></code></td>
    <td>Triggers when a full sync finishes for a product feed</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/admin-graphql/latest/enums/WebhookSubscriptionTopic#value-customeraccountsettingsupdate">CUSTOMER_ACCOUNT_SETTINGS_UPDATE</a></code></td>
    <td>Triggers when merchants change customer account settings</td>
  </tr>
</table>
  </div>
</div>
  </div>
</div>


## REST Admin API changes

Version 2024-07 of the REST Admin API introduces the following changes:

<div class="accordion-container">
  <div class="accordion-controls">
    <button class="accordion-control" data-accordion-control-type="expand-all" type="button">Expand all</button>
  </div>
  <div class="accordion-content-container">
    <div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Adjustment reason for Shopify Payments transactions</h3>
  </div>
  <div class="accordion-content">
    <p>The Shopify Payments <a href="/docs/api/admin-rest/latest/resources/transactions"><code class="text-highlight text-highlight--grey">Transactions</code></a> resource now returns the <code class="text-highlight text-highlight--grey">adjustment_reason</code> property to describe the reason an adjustment was made.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Deprecation of REST resources <span id="deprecation-of-REST-resources" class="heading-flag breaking"</h3>
  </div>
  <div class="accordion-content">
    <p>The <a href="/docs/api/admin-rest/latest/resources/checkout"><code class="text-highlight text-highlight--grey">Checkout</code></a> resource is now deprecated. For more information, refer to the <a href="/changelog/deprecation-of-checkout-apis">Developer changelog</a>.</p>
<p>We&#39;ve also deprecated all endpoints on the <a href="/docs/api/admin-rest/latest/resources/country"><code class="text-highlight text-highlight--grey">Country</code></a> and <a href="/docs/api/admin-rest/latest/resources/province"><code class="text-highlight text-highlight--grey">Province</code></a> resources. For a complete list of affected endpoints, and the GraphQL type equivalents to use instead, refer to the <a href="/changelog/deprecation-notice-country-and-province-endpoints-in-admin-rest-api">Developer changelog</a>.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>New properties on the FulfillmentOrder resource</h3>
  </div>
  <div class="accordion-content">
    <p>The following properties have been added to <code class="text-highlight text-highlight--grey">delivery_method</code> property on the <a href="/docs/api/admin-rest/latest/resources/fulfillmentorder"><code class="text-highlight text-highlight--grey">FulfillmentOrder</code></a> resource:</p>
<ul>
<li><code class="text-highlight text-highlight--grey">branded_promise</code>: The branded promise that was presented to the customer during checkout. For example, &quot;Shop Promise&quot;.</li>
<li><code class="text-highlight text-highlight--grey">additional_information</code>: The additional information to consider when performing the delivery.</li>
<li><code class="text-highlight text-highlight--grey">service_code</code>: A reference to the shipping method.</li>
<li><code class="text-highlight text-highlight--grey">source_reference</code>: The promise provider data associated with delivery promise.</li>
</ul>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Order editing</h3>
  </div>
  <div class="accordion-content">
    <p>The <a href="/docs/api/admin-rest/latest/resources/webhook#event-topics-orders-edited"><code class="text-highlight text-highlight--grey">orders/edited</code></a> webhook payload now includes a <code class="text-highlight text-highlight--grey">committed_at</code> field. You can use this field to identify when an edit to an order is finalized.</p>
  </div>
</div>
  </div>
</div>


## Storefront API changes

Version 2024-07 of the Storefront API introduces the following changes:

<div class="accordion-container">
  <div class="accordion-controls">
    <button class="accordion-control" data-accordion-control-type="expand-all" type="button">Expand all</button>
  </div>
  <div class="accordion-content-container">
    <div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Cart billing address</h3>
  </div>
  <div class="accordion-content">
    <p>You can now use the <a href="/docs/api/storefront/latest/mutations/cartbillingaddressupdate"><code class="text-highlight text-highlight--grey">cartBillingAddressUpdate</code></a> mutation to associate a billing address with a cart.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Cart error code</h3>
  </div>
  <div class="accordion-content">
    <p>The <a href="/docs/api/storefront/latest/enums/CartErrorCode#value-notetoolong"><code class="text-highlight text-highlight--grey">NOTE_TOO_LONG</code></a> error code is now returned in cart mutations when a note exceeds the maximum limit of 5000 characters.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Cart wallet preferences <span id="cart-wallet-preferences" class="heading-flag breaking"</h3>
  </div>
  <div class="accordion-content">
    <p>We&#39;ve deprecated the following types:</p>
<ul>
<li><code class="text-highlight text-highlight--grey">walletPreferences</code> argument on the <a href="/docs/api/storefront/latest/input-objects/CartBuyerIdentityInput"><code class="text-highlight text-highlight--grey">CartBuyerIdentityInput</code></a> input object</li>
<li><code class="text-highlight text-highlight--grey">walletPreferences</code> field on the <a href="/docs/api/storefront/latest/objects/CartBuyerIdentity"><code class="text-highlight text-highlight--grey">CartBuyerIdentity</code></a> object</li>
</ul>
<p>Use <a href="/docs/api/storefront/latest/input-objects/CartBuyerIdentityInput#field-cartbuyeridentityinput-preferences"><code class="text-highlight text-highlight--grey">CartBuyerIdentityInput.preferences.wallet</code></a> instead.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Checkout types removed <span id="checkout-types-removed" class="heading-flag breaking"</h3>
  </div>
  <div class="accordion-content">
    <p>We&#39;ve removed checkout types from the Storefront API, following their <a href="/docs/api/release-notes/2024-04#deprecations-storefront-api-and-rest-admin-api">deprecation in the 2024-04 API version</a>.</p>
<p>For more information, refer to the <a href="/changelog/deprecation-of-checkout-apis">developer changelog</a>.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Discount computations</h3>
  </div>
  <div class="accordion-content">
    <p>We&#39;ve added the <a href="/docs/api/storefront/latest/interfaces/CartDiscountAllocation#field-cartdiscountallocation-targettype"><code class="text-highlight text-highlight--grey">targetType</code></a> field to the <code class="text-highlight text-highlight--grey">CartDiscountAllocation</code> interface. The <code class="text-highlight text-highlight--grey">targetType</code> field ensures comprehensive discount calculations, which are crucial for payment integrations.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Gift cards</h3>
  </div>
  <div class="accordion-content">
    <p>You can now manage gift cards on a cart in the following ways:</p>
<ul>
<li><strong>When creating a cart</strong>: Add the <code class="text-highlight text-highlight--grey">giftCardCodes</code> field to the <a href="/docs/api/storefront/latest/input-objects/cartinput"><code class="text-highlight text-highlight--grey">CartInput</code></a> input object.</li>
<li><strong>After a cart is created</strong>: Run the <a href="/docs/api/storefront/latest/mutations/cartGiftCardCodesUpdate"><code class="text-highlight text-highlight--grey">cartGiftCardCodesUpdate</code></a> mutation.</li>
<li><strong>Querying for applied gift cards</strong>: Use the <a href="/docs/api/storefront/latest/objects/Cart#field-cart-appliedgiftcards"><code class="text-highlight text-highlight--grey">appliedGiftCards</code></a> field.</li>
</ul>
<p>The following new types are available:</p>
<table>
  <caption>New types for managing gift cards on a cart</caption>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Type</th>
    <th scope="col">Change</th>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/storefront/latest/mutations/cartGiftCardCodesUpdate">cartGiftCardCodesUpdate</a></code></td>
    <td>Mutation</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/storefront/latest/input-objects/CartInput#field-cartinput-giftcardcodes">giftCardCodes</a></code></td>
    <td>Field</td>
    <td>Added to <code>CartInput</code></td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/storefront/latest/objects/Cart#field-cart-appliedgiftcards">appliedGiftCards</a></code></td>
    <td>Field</td>
    <td>Added to <code>Cart</code> object</td>
  </tr>
</table>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Removals of types and fields <span id="removal-types-fields-storefront" class="heading-flag breaking"</h3>
  </div>
  <div class="accordion-content">
    <p>We&#39;ve removed the following types and fields from the Storefront API:</p>
<table>
  <caption>Removals of types and fields from the Storefront API</caption>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Type</th>
    <th scope="col">Change</th>
  </tr>
  <tr>
    <td scope="row"><code>ShopPayPaymentRequestContactFieldInput</code></td>
    <td>Input object</td>
    <td>Removed. Shipping address is now read from the payment method.</td>
  </tr>
  <tr>
    <td scope="row"><code>shippingAddress</code> field</td>
    <td><code>ShopPayPaymentRequestInput</code> input object</td>
    <td>Removed. Shipping address is now read from the payment method. </td>
  </tr>
  <tr>
    <td scope="row"><code>amount</code> field</td>
    <td><code>ShopPayPaymentRequestLineItemInput</code> input object</td>
    <td>Removed. Use the <code><a href="/docs/api/storefront/latest/input-objects/ShopPayPaymentRequestLineItemInput#field-shoppaypaymentrequestlineiteminput-finalitemprice">finalLinePrice</a></code> field instead.</td>
  </tr>
  <tr>
    <td scope="row"><code>amount</code> field</td>
    <td><code>ShopPayPaymentRequestLineItem</code> object</td>
    <td>Removed. Use the <code><a href="/docs/api/storefront/latest/input-objects/ShopPayPaymentRequestLineItemInput#field-shoppaypaymentrequestlineiteminput-finalitemprice">finalLinePrice</a></code> field instead.</td>
  </tr>
</table>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Shop Pay payment request checkouts</h3>
  </div>
  <div class="accordion-content">
    <p>You can now use the following types to manage Shop Pay payment request checkouts:</p>
<table>
  <caption>New types for managing Shop Pay payment request checkouts</caption>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Type</th>
    <th scope="col">Change</th>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/storefront/latest/objects/ShopPayPaymentRequestContactField">ShopPayPaymentRequestContactField</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/storefront/latest/objects/ShopPayPaymentRequestDeliveryMethod">ShopPayPaymentRequestDeliveryMethod</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/storefront/latest/objects/ShopPayPaymentRequestDiscount">ShopPayPaymentRequestDiscount</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/storefront/latest/objects/ShopPayPaymentRequestImage">ShopPayPaymentRequestImage</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/storefront/latest/objects/ShopPayPaymentRequestReceipt">ShopPayPaymentRequestReceipt</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/storefront/latest/objects/ShopPayPaymentRequestSession">ShopPayPaymentRequestSession</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/storefront/latest/objects/ShopPayPaymentRequestShippingLine">ShopPayPaymentRequestShippingLine</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/storefront/latest/objects/ShopPayPaymentRequestTotalShippingPrice">ShopPayPaymentRequestTotalShippingPrice</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/storefront/latest/objects/ShopPayPaymentRequest">ShopPayPaymentRequest</a></code></td>
    <td>Object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/storefront/latest/input-objects/ShopPayPaymentRequestDeliveryMethodInput">ShopPayPaymentRequestDeliveryMethodInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/storefront/latest/input-objects/ShopPayPaymentRequestDiscountInput">ShopPayPaymentRequestDiscountInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/storefront/latest/input-objects/ShopPayPaymentRequestImageInput">ShopPayPaymentRequestImageInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/storefront/latest/input-objects/ShopPayPaymentRequestInput">ShopPayPaymentRequestInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/storefront/latest/input-objects/ShopPayPaymentRequestLineItemInput">ShopPayPaymentRequestLineItemInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/storefront/latest/input-objects/ShopPayPaymentRequestLineItem">ShopPayPaymentRequestLineItem</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/storefront/latest/input-objects/ShopPayPaymentRequestShippingLineInput">ShopPayPaymentRequestShippingLineInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/storefront/latest/input-objects/ShopPayPaymentRequestTotalShippingPriceInput">ShopPayPaymentRequestTotalShippingPriceInput</a></code></td>
    <td>Input object</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/storefront/latest/mutations/shopPayPaymentRequestSessionCreate">shopPayPaymentRequestSessionCreate</a></code></td>
    <td>Mutation</td>
    <td>Added</td>
  </tr>
  <tr>
    <td scope="row"><code><a href="/docs/api/storefront/latest/mutations/shopPayPaymentRequestSessionSubmit">shopPayPaymentRequestSessionSubmit</a></code></td>
    <td>Mutation</td>
    <td>Added</td>
  </tr>
</table>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Single-use delivery addresses</h3>
  </div>
  <div class="accordion-content">
    <p>Carts now support single-use delivery addresses with the <code class="text-highlight text-highlight--grey">oneTimeUse</code> field on the <a href="/docs/api/storefront/latest/input-objects/DeliveryAddressInput">DeliveryAddressInput</a> input object.</p>
<p>You can use the <code class="text-highlight text-highlight--grey">oneTimeUse</code> field to pass a delivery address that shouldn&#39;t be saved to the customer&#39;s account after checkout. For example, you might want to use this field for one-time gifting purposes.</p>
  </div>
</div>
  </div>
</div>


## Shopify Function APIs changes

Version 2024-07 of the Shopify Function APIs introduces the following changes:

<div class="accordion-container">
  <div class="accordion-controls">
    <button class="accordion-control" data-accordion-control-type="expand-all" type="button">Expand all</button>
  </div>
  <div class="accordion-content-container">
    <div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Metafields support on selling plans</h3>
  </div>
  <div class="accordion-content">
    <p>The <code class="text-highlight text-highlight--grey">HasMetafields</code> interface is now available on the <code class="text-highlight text-highlight--grey">SellingPlan</code> object associated with each <a href="/docs/api/functions#available-apis">Function API</a>.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Order Routing Location Rule API</h3>
  </div>
  <div class="accordion-content">
    <p>We&#39;ve added the <code class="text-highlight text-highlight--grey">lines</code> field to the <a href="/docs/api/functions/reference/order-routing-location-rule/graphql/common-objects/fulfillmentgroup?api%5Bversion%5D=2024-07"><code class="text-highlight text-highlight--grey">FulfillmentGroup</code></a> object. The <code class="text-highlight text-highlight--grey">lines</code> field returns a list of cart lines containing information about the items that are part of the fulfillment group.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Payment Customization API</h3>
  </div>
  <div class="accordion-content">
    <p>API clients installed on Shopify Plus stores can now make use of the optional <a href="/docs/api/functions/reference/payment-customization/graphql/common-objects/hideoperation?api%5Bversion%5D=2024-07"><code class="text-highlight text-highlight--grey">placements</code></a> argument in the <code class="text-highlight text-highlight--grey">hide</code> operation. This allows you to explicitly hide payment methods from the accelerated checkout or payment selection.</p>
<p><a href="/docs/apps/build/checkout/payments">Learn more about payment customization functions</a>.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Payment method names <span id="payment-method-names" class="heading-flag breaking"</h3>
  </div>
  <div class="accordion-content">
    <p>Previously, the <a href="/docs/api/functions/reference/payment-customization/graphql/common-objects/paymentcustomizationpaymentmethod?api%5Bversion%5D=2024-07"><code class="text-highlight text-highlight--grey">PaymentCustomizationPaymentMethod</code></a> object returned multiple payment methods with the name &quot;Shopify Payments&quot; when a store has wallets enabled through Shopify Payments (for example, Apple Pay or Google Pay). This made it impossible for app developers to target the credit card or a specific wallet option for hide, rename, or move operations.</p>
<p>To fix this issue, we&#39;ve changed the <code class="text-highlight text-highlight--grey">name</code> value for wallets to the following values:</p>
<div class='table-container'><table><thead><tr>
<th>Payment method</th>
<th>API version 2024-04 and lower</th>
<th>API version 2024-07 and higher</th>
</tr>
</thead><tbody><tr>
<td>Credit card</td>
<td><code class="text-highlight text-highlight--grey">&quot;Shopify Payments&quot;</code></td>
<td><code class="text-highlight text-highlight--grey">&quot;Shopify Payments&quot;</code></td>
</tr>
<tr>
<td>Apple Pay</td>
<td><code class="text-highlight text-highlight--grey">&quot;Shopify Payments&quot;</code></td>
<td><code class="text-highlight text-highlight--grey">&quot;Apple Pay&quot;</code></td>
</tr>
<tr>
<td>Google Pay</td>
<td><code class="text-highlight text-highlight--grey">&quot;Shopify Payments&quot;</code></td>
<td><code class="text-highlight text-highlight--grey">&quot;Google Pay&quot;</code></td>
</tr>
<tr>
<td>Meta Pay</td>
<td><code class="text-highlight text-highlight--grey">&quot;Shopify Payments&quot;</code></td>
<td><code class="text-highlight text-highlight--grey">&quot;Meta Pay&quot;</code></td>
</tr>
<tr>
<td>Shop Pay</td>
<td><code class="text-highlight text-highlight--grey">&quot;Shopify Payments&quot;</code></td>
<td><code class="text-highlight text-highlight--grey">&quot;Shop Pay&quot;</code></td>
</tr>
</tbody></table></div>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Product Discount API</h3>
  </div>
  <div class="accordion-content">
    <p>The Product Discount API now supports <a href="/docs/api/functions/reference/product-discounts/graphql/common-objects/cartlinetarget"><code class="text-highlight text-highlight--grey">CartLineTarget</code></a> object, which enables you to apply discounts on specific cart lines. This functionality was historically only possible with Shopify Scripts.</p>
<p>You can use the <code class="text-highlight text-highlight--grey">CartLineTarget</code> object to link discounts to attributed cart lines such as upsell products, free gifts with purchase, or buyer customized products.</p>
  </div>
</div>
  </div>
</div>


## Customer Account API changes

Version 2024-07 of the Customer Account API introduces the following changes:

<div class="accordion-container">
  <div class="accordion-controls">
    <button class="accordion-control" data-accordion-control-type="expand-all" type="button">Expand all</button>
  </div>
  <div class="accordion-content-container">
    <div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Financial status of an order</h3>
  </div>
  <div class="accordion-content">
    <p>You can now determine whether the financial status of an order is expired using the <a href="/docs/api/customer/latest/enums/OrderFinancialStatus#value-expired"><code class="text-highlight text-highlight--grey">EXPIRED</code></a> value on the <code class="text-highlight text-highlight--grey">OrderFinancialStatus</code> enum.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Set metafields using compare-and-swap (CAS)</h3>
  </div>
  <div class="accordion-content">
    <p>You can now set metafields using compare-and-swap (CAS) with the <a href="/docs/api/customer/latest/input-objects/MetafieldsSetInput#field-metafieldssetinput-comparedigest"><code class="text-highlight text-highlight--grey">compareDigest</code></a> field on the <a href="/docs/api/customer/latest/mutations/metafieldsSet"><code class="text-highlight text-highlight--grey">metafieldsSet</code></a> mutation. By using CAS, you can properly handle concurrency requests.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Store credit at checkout</h3>
  </div>
  <div class="accordion-content">
    <p>Customers who are <a href="/docs/api/customer">authenticated with a customer account</a> can now review and spend their <a href="/docs/api/customer/latest/objects/Customer#connection-storecreditaccounts">store credit</a> at checkout.</p>
  </div>
</div>
<div class="accordion-item">
  <div class="accordion-link">
    <div class="chevron-up"></div>
    <div class="chevron-down"></div>
    <h3>Writing metafield values <span id="writing-metafield-values" class="heading-flag breaking"</h3>
  </div>
  <div class="accordion-content">
    <p>You can now use the <a href="/docs/api/customer/latest/mutations/metafieldsSet"><code class="text-highlight text-highlight--grey">metafieldsSet</code></a> mutation to assign metafield values on <a href="/docs/api/customer/latest/objects/Customer"><code class="text-highlight text-highlight--grey">Customer</code></a>, <a href="/docs/api/customer/latest/objects/Order"><code class="text-highlight text-highlight--grey">Order</code></a>, <a href="/docs/api/customer/latest/objects/Company"><code class="text-highlight text-highlight--grey">Company</code></a>, and <a href="/docs/api/customer/latest/objects/CompanyLocation"><code class="text-highlight text-highlight--grey">CompanyLocation</code></a> objects.</p>
<p>As part of this change, the Customer Account API needs to be granted explicit read or read/write access to metafield definitions to have access to metafield values. This represents a breaking change because as of API version 2024-07, metafield definitions without <a href="#metafield-access-controls">access permissions</a> will not be available to the Customer Account API.</p>
  </div>
</div>
  </div>
</div>