> 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.
The API version release date and the date that the version is no longer supported
Release date Date version is no longer supported
July 1, 2024 July 1, 2025
## 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:
New types associated with metafield access controls
Name Type Change
PUBLIC_READ_WRITE Value Added to the MetafieldAdminAccess enum
LEGACY_LIQUID_ONLY Value Added to the MetafieldStorefrontAccess enum
MetafieldAdminAccessInput Enum Added
MetafieldStorefrontAccessInput Enum Added
### 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:
Removals of types and fields from the GraphQL Admin API
Name Type Change
ShippingLabel Object Removed.
location field Order object Removed. Use the retailLocation field on the Order object instead.
order field CalculatedOrder object Removed. Use the originalOrder field on the CalculatedOrder object instead.
productBased field FulfillmentService object Removed. Non-product based fulfillment services are no longer supported.
We've removed the following types and fields from the Storefront API:
Removals of types and fields from the Storefront API
Name Type Change
ShopPayPaymentRequestContactFieldInput Input object Removed. Shipping address is now read from the payment method.
shippingAddress field ShopPayPaymentRequestInput input object Removed. Shipping address is now read from the payment method.
amount field ShopPayPaymentRequestLineItemInput input object Removed. Use the finalLinePrice field instead.
amount field ShopPayPaymentRequestLineItem object Removed. Use the finalLinePrice field instead.
### 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:

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

Where product variants are configured to prevent overselling and one or more items in the contract are out of stock, then the billing attempt will fail with the new INSUFFICIENT_INVENTORY error code.

Learn more about subscription contracts and billing attempts.

The discountedPriceSet and discountedPrice fields on the 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.

You can now query the cash transactions that are associated with each cash tracking session. The new cashTransactions connection returns all of the cash order transactions that affected the amount in the cash drawer during a cash tracking session.

You can use the checkoutBrandingUpsert mutation to configure the styling and visibility of dividers in checkout.

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.

The following new types are available:

New types related to checkout branding
Name Type Change
divided Field Added to CheckoutBrandingFooterInput input object
divided Field Added to CheckoutBrandingFooter object
divided Field Added to CheckoutBrandingHeaderInput input object
divided Field Added to CheckoutBrandingHeader object

You can now query the typOspPagesActive field on the CheckoutProfiles object. The typOspPagesActive field returns the status of the Thank You page (TYP) and Order Status page (OSP) on a checkout profile, providing insight as to whether the pages have enabled checkout extensibility.

If typOspPagesActive is true, then both the Thank You and Order Status pages are using checkout extensibility, and render the appropriate checkout UI extensions while also making use of pixels, and Functions. If typOspPagesActive is false, then the Thank You and Order Status pages still use scripts and other deprecated features.

Combined listings bring together products that are merchandised by an option, such as color, model, or dimension, for enhanced display in the product details page.

As of API version 2024-07, you can use the GraphQL Admin API to manage combined listings.

We've added the dataSaleOptOut mutation, which opts a customer out of data sales and sharing, and supports compliance with US state laws like CCPA and CPRA. The dataSaleOptOut mutation also applies the opt-out to the Customer Privacy API.

We've also added the dataSaleOptOut field to the Customer object.

To learn more about data sales and sharing opt-outs, refer to Configuring customer privacy settings.

We've added the DeliveryPromiseProvider object, which represents an entity, such as a third-party service, that can provide delivery estimates on behalf of a store.

Each DeliveryPromiseProvider object is associated with a shop Location.

A DeliveryPromiseProvider object can be created or updated using the deliveryPromiseProviderUpsert mutation, and retrieved using the deliveryPromiseProvider query.

DraftOrderInput now accepts discountCodes, acceptAutomaticDiscounts, and allowDiscountCodesInCheckout. These optional input fields allow you to apply discount codes to a draft order and decide whether to accept automatic discounts when a draft order is calculated.

We've also added the platformDiscounts 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.

The following new types are available:

New types related to discounts
Name Type Change
platformDiscounts Field Added to DraftOrder object
discountCodes Field Added to DraftOrder object
acceptAutomaticDiscounts Field Added to DraftOrder object
allowDiscountCodesInCheckout Field Added to DraftOrder object
warnings Field Added to DraftOrder object
DraftOrderDiscountNotAppliedWarning Object Added
DraftOrderPlatformDiscountAllocation Object Added
DraftOrderPlatformDiscount Object Added
DraftOrderWarning Object Added
platformDiscounts Field Added to CalculatedDraftOrder object
discountCodes Field Added to CalculatedDraftOrder object
acceptAutomaticDiscounts Field Added to CalculatedDraftOrder object
warnings Field Added to CalculatedDraftOrder object
approximateDiscountedUnitPriceSet Field Added to DraftOrderLineItem object
DraftOrderPlatformDiscountAllocationTarget Union Added

The DUPLICATE_VALUE error code has been added to the ProductSetUserErrorCode enum.

The id field on the ProductVariantSetInput input object now has validation support to prevent duplicate values. This enhancement ensures that there are no collisions when updating variants.

You can now use the GraphQL Admin API to interact with exchanges.

The returnCreate 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 FulfillmentOrder for the new items to be sent to the customer.

You can use the returnLineItemRemoveFromReturn mutation to remove return lines from a return. With returns creating sales, removing a return line from a return will also reversely impact return sales.

Additionally, you can use the returnCalculate query to calculate financials before return creation, including inputs for return lines, exchange lines, fees and discounts. Learn how to use the returnCalculate query.

The following new types are available:

New types related to exchanges
Name Type Change
CalculateExchangeLineItemInput Input object Added
CalculateReturnInput Input object Added
CalculateReturnLineItemInput Input object Added
ExchangeLineItemAppliedDiscountInput Input object Added
ExchangeLineItemAppliedDiscountValueInput Input object Added
ExchangeLineItemInput Input object Added
RestockingFeeInput Input object Added
ReturnEditSetRestockingFeeInput Input object Added
ReturnLineItemRemoveFromReturnInput Input object Added
ReturnShippingFeeInput Input object Added
exchangeLineItems Field Added to ReturnInput input object
returnShippingFee Field Added to ReturnInput input object
restockingFee Field Added to ReturnLineItemInput input object
CalculatedExchangeLineItem Object Added
CalculatedRestockingFee Object Added
CalculatedReturnFee Object Added
CalculatedReturnLineItem Object Added
CalculatedReturnShippingFee Object Added
CalculatedReturn Object Added
ReturnLineItemRemoveFromReturn Mutation Added

The following customer query filters in the 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 instead.

When you create, update, or query a webhook subscription, you can now include a filter parameter. Filter parameters, which are specified using Shopify search syntax, allow you to specify conditions as to when webhooks should be emitted for a subscription.

We've added the MAXIMUM_FULFILLMENT_CONSTRAINT_RULES_REACHED error code to the fulfillmentConstraintRuleCreate mutation. The error code is returned when you add more than a maximum of ten fulfillment constraint rules to a store.

You can now access assigned fulfillment orders from the assignedFulfillmentOrders connection on the QueryRoot object instead of from the pre-existing assignedFulfillmentOrders connection on the Shop object. This change includes the deprecation of the Shop.assignedFulfillmentOrders query in favour of the newly added QueryRoot.assignedFulfillmentOrders query.

The DeliveryMethodType enum also now includes the PICKUP_POINT value to identify fulfillment orders containing deliveries to pickup point locations.

Learn how to generate pickup point options.

The variant field has been added to the FulfillmentOrderLineItem object.

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.

Learn more about order management apps.

We've added new types to the GraphQL Admin API to provide parity with the following REST resources: CarrierService, Customer, Fulfillment, FulfillmentEvent, FulfillmentService, InventoryItem, Location, Order, and Product.

The following new types are available:

New types on the GraphQL Admin API
Name Type Change
DeliveryCarrierServiceCreateInput Input object Added
DeliveryCarrierServiceUpdateInput Input object Added
carrierServiceCreate Mutation Added
carrierServiceUpdate Mutation Added
carrierServiceDelete Mutation Added
active Field Added to the DeliveryCarrierService object
supportsServiceDiscovery Field Added to the DeliveryCarrierService object
callbackUrl Field Added to the DeliveryCarrierService object
carrierServices Field Added to QueryRoot object
customersCount Query Added
fulfillmentsCount Field Added to Order object
createdAt Field Added to FulfillmentEvent object
trackingSupport Field Added to FulfillmentService object
InventoryQuantityInput Input object Added
InventorySetQuantitiesInput Input object Added
inventorySetQuantities Mutation Added
locationsCount Query Added
ordersCount Query Added
staffMember Field Added to Order object
sourceName Field Added to Order object
orderDelete Mutation Added
OrderDeleteUserError Object Added
publishedProductsCount Query Added
webhookSubscriptionsCount Query Added

The includeFields that are specified on a webhook subscription are now available for all webhook topics. Previously, some webhook topics weren't respecting the includeFields configuration.

We've added new fields to the ShopPolicy object. A ShopPolicy is a policy that a merchant has configured for their store, such as their refund or privacy policy.

New fields on the ShopPolicy object
Name Type Change
title Field Added
createdAt Field Added
updatedAt Field Added

We've made several improvements to Shopify Payments payouts and balance transactions in the GraphQL Admin API to provide parity with the REST Admin API:

  • You can now use Shopify's API search syntax to filter and sort payouts using the sortKey and savedSearchId parameters. This functionality allows you to efficiently search and organize payouts based on specific criteria such as ledger_type, status, amount, currency, and issued_at.

  • You can now use the following new fields on the ShopifyPaymentsBalanceTransaction object:

    • sourceID: Represents the ID of the object that led to the transaction.
    • sourceOrderTransactionID: Indicates the ID of the order transaction that triggered the balance transaction. If the sourceType is an adjustment, then this value is null.
    • adjustmentOrderTransactions: An array of associated order transactions that resulted in the balance transaction. If the sourceType is not an adjustment, then this array is null. Each object in the array includes adjustmentReason, which specifies the reason for the adjustment associated with the transaction. If the sourceType is not an adjustment, then value is null.

The LEDGER_DOCUMENT_INVALID error code has been added to the inventorySetScheduledChanges mutation. The error code is returned when the ledgerDocumentUri provided is not a valid URI.

Prior to API version 2024-07, you could send inventory item data using ProductVariant mutations or on the 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 is now the input object type on the inventoryItemUpdate mutation instead of the InventoryItemUpdateInput input object.

The 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.

You can now use the urlParameterValue field as a tracking parameter in the marketingActivityCreateInput and marketingActivityUpdateInput input objects. This field is currently only available to select partners. Most partners should continue to use UTMs for tracking parameters.

Additionally, the MarketingActivityUserError enum is now a required type on the userError field for the marketingEngagementCreate mutation.

The PRODUCTS_CREATE and PRODUCTS_UPDATE webhook payloads now contain information about the media on a product.

You can now use the fileUpdate mutation to connect files to products.

The following new types are available:

New types associated with media references
Name Type Change
referencesToAdd Field Added to FileUpdateInput input object
referencesToRemove Field Added to FileUpdateInput input object
UNSUPPORTED_FILE_REFERENCE Value Added to FilesErrorCode enum

You can now use the GraphQL Admin API to read and modify menus on the Online Store.

The following new types are available:

New types associated with menus on the Online Store
Name Type Change
Menu Object Added
MenuItem Object Added
MenuItemCreateInput Input object Added
MenuItemUpdateInput Input object Added
menuCreate Mutation Added
menuUpdate Mutation Added
menuDelete Mutation Added
menu Query Added
menus Query Added
MenuItemType Enum Added
menu Field Added to QueryRoot object

Apps can now query the access field of metafield definitions that they have access to but don't own. Previously, an AuthorizationError error was returned when accessing the field for metafield definitions that an app didn't have permissions to manage.

The admin and storefront fields on the MetafieldAccess 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 input object now use dedicated input enum types, MetafieldAdminAccessInput and MetafieldStorefrontAccessInput, respectively.

The following new types are available:

New types associated with metafield access controls
Name Type Change
PUBLIC_READ_WRITE Value Added to the MetafieldAdminAccess enum
LEGACY_LIQUID_ONLY Value Added to the MetafieldStorefrontAccess enum
MetafieldAdminAccessInput Enum Added
MetafieldStorefrontAccessInput Enum Added

You can now use the metafields and metafieldDefinitions connections on the OnlineStoreArticle, OnlineStoreBlog, and OnlineStorePage objects. Previously, you could only retrieve metafields and metafield definitions connections using the REST Admin API.

We've added new types for reading standard conditional metafields and filtering metafield definitions by constraints:

New types for reading standard conditional metafields and filtering metafield definitions by constraints
Name Type Change
MetafieldDefinitionConstraints Object Added
MetafieldDefinitionConstraintValue Object Added
MetafieldDefinitionConstraintSubtypeIdentifier Input object Added
MetafieldDefinitionConstraintStatus Enum Added
MetafieldDefinitionCreateUserError Enum Added
MetafieldDefinitionUpdateUserError Enum Added
constraints Field Added to MetafieldDefinition object
constraintSubtype Field Added to metafieldDefinitions query
constraintStatus Field Added to metafieldDefinitions query
constraintSubtype Argument Added to standardMetafieldDefinitionTemplates query
constraintStatus Argument Added to standardMetafieldDefinitionTemplates query
excludeActivated Argument Added to standardMetafieldDefinitionTemplates query

We've added a new error code for mutations that set metafields. The INTERNAL_ERROR error code has been added to the MetafieldsSetUserErrorCode enum.

The Metafield and MetaobjectField objects now have a jsonValue field that returns the stored value as a JSON scalar.

By using the jsonValue field, metafield values that are stored as JSON strings don't have to be parsed on the client-side. The field is set for all metafield types and is also available in all Function APIs. The jsonValue 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.

We've added the RESERVED_NAMESPACE_ORPHANED_METAFIELDS error code to the MetafieldDefinitionDelete mutation.

The MISSING_CUSTOMER_PAYMENT_METHOD error code is now returned when payment information is missing on the subscriptionDraftCommit mutation.

We've added the DISPLAY_NAME_CONFLICT error code value to the MetaobjectUserErrorCode enum.

You can now retrieve information about the storefront password of an online store using the OnlineStorePasswordProtection and OnlineStore objects.

The variants and productOptions fields on the ProductSetInput input object are now optional. In API versions prior to 2024-07, the variants and productOptions fields were required.

Shopify Plus merchants using Shopify Payments are able to partially capture authorizations more than once. However, you might know that the capture you're about to perform will be the last one. To reflect this, we've added the finalCapture field to the orderCaptureInput input object.

When you know you're capturing an authorization for the last time, setting the finalCapture field to true releases any uncaptured funds back to your customer. Doing so is likely to increase customer satisfaction and decrease the risk of chargebacks.

For merchants not on the Shopify Plus plan, the finalCapture field has no effect: these authorizations can only be captured once, and uncaptured funds are always returned immediately to the customer.

Currently, the finalCapture field only applies to transactions made through Shopify Payments. When capturing authorizations processed through other gateways, finalCapture must either be omitted, or set to null.

You can now use the transactionsCount field on the Order object to return the number of transactions associated with a given order.

We've also added the authorizationExpiresAt field on the OrderTransaction object. The authorizationExpiresAt field is available only to stores on a Shopify Plus plan and is populated only for Shopify Payments authorizations.

We've added the customAttributes field on the LineItemGroup 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.

Apps can now also do the following:

  • Retrieve a bundle item's components on a draft order by using the bundleComponents field on the DraftOrderBundleLineItemComponentInput input object.
  • Add a bundle item to a draft order by including the bundleComponents field on the draftOrderLineItemInput input object.

Additionally, the CartTransform function now automatically runs on all draft orders.

Learn more about bundles.

The following new types are available for creating and updating product bundles:

New types for creating and updating product bundles
Name Type Change
ProductBundleComponentOptionSelectionValue Object Added
ProductBundleComponentOptionSelection Object Added
ProductBundleComponentQuantityOptionValue Object Added
ProductBundleComponentQuantityOption Object Added
ProductBundleComponent Object Added
ProductBundleOperation Object Added
ProductBundleMutationUserError Object Added
ProductBundleComponentInput Input object Added
ProductBundleComponentOptionSelectionInput Input object Added
ProductBundleComponentQuantityOptionInput Input object Added
ProductBundleComponentQuantityOptionValueInput Input object Added
ProductBundleCreateInput Input object Added
ProductBundleUpdateInput Input object Added
productBundleCreate Mutation Added
productBundleUpdate Mutation Added
ProductBundleComponentOptionSelectionStatus Enum Added
bundleComponents Field Added to Product object

As of API version 2024-07, the variant image field in the PRODUCT_FEEDS_INCREMENTAL_SYNC and PRODUCT_FEEDS_FULL_SYNC webhook subscription topics 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.

The LINKED_METAFIELD_DEFINITION_NOT_FOUND value has been added to the ProductOptionUpdateUserErrorCode enum.

You can now use the sourceReference field on the DeliveryMethod object to return promise provider data associated with a delivery promise.

You can now use the published_at filter on the product query to determine the date and time when a product was published to the Online Store.

The following types now have a category field, which accepts the global ID (GID) of a taxonomy category that's specified by a merchant:

We've also deprecated the allProductCategories field on the Shop object. Use the allProductCategoriesList field on the Shop object instead.

You can now use the includesTranslations field on the ProductDuplicateAsyncInput input object to specify whether to include translations when running the productDuplicateAsyncV2 mutation.

If includesTranslations is set to true, then all translations that are saved on the product, its variants, and its metafields are copied over to the new product.

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.

You can now use the files query to retrieve 3D models and external videos.

The following new types are available:

Types associated with querying media in files
Name Type Change
File Interface Added to Model3d object
File Interface Added to ExternalVideo object
MODEL_3D Value Added to FileContentType enum
EXTERNAL_VIDEO Value Added to FileContentType enum

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

Removals of types and fields from the GraphQL Admin API
Name Type Change
ShippingLabel Object Removed.
location field Order object Removed. Use the retailLocation field on the Order object instead.
order field CalculatedOrder object Removed. Use the originalOrder field on the CalculatedOrder object instead.
productBased field FulfillmentService object Removed. Non-product based fulfillment services are no longer supported.

You can now use the retailLocation field on the Order object to query the physical location where a retail order is created or completed.

You can now use the id field on the RefundLineItem object to return the global ID of the specified refund line item object.

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

The Return.suggestedRefund query and 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.

As of API version 2024-07, the Return.returnLineItems 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.

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:

Metafields are now supported on the SellingPlan object.

The following new types are available:

Types associated with metafields on selling plans
Name Type Change
hasMetafields Interface Added
hasMetafieldDefinitions Interface Added
metafields Field Added to SellingPlanInput input object
SELLING_PLAN value Added to MetafieldOwnerType enum
INVALID_INPUT value Added to SellingPlanGroupUserErrorCode enum

You can now set metafields using compare-and-swap (CAS) with the compareDigest field on the metafieldsSet mutation. By using CAS, you can properly handle concurrency requests.

As of API version 2024-07, we're introducing a new MobilePlatformApplication 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.

The following new types are available:

Types associated with Shopify mobile apps
Name Type Change
AndroidApplication Object Added
AppleApplication Object Added
MobilePlatformApplicationCreateInput Input object Added
MobilePlatformApplication Union Added
mobilePlatformApplicationCreate Mutation Added
MobilePlatformApplicationDelete Mutation Added
MobilePlatformApplicationUpdate Mutation Added
MobilePlatformApplicationUserError Enum Added
mobilePlatformApplication Query Added
mobilePlatformApplications Query Added

You can now query the following new types related to Shopify Payments balance transactions:

New types for Shopify Payments balance transactions
Name Type Change
ShopifyPaymentsAssociatedOrder Object Added
ShopifyPaymentsBalanceTransactionAssociatedPayout Object Added
amount Field Added to ShopifyPaymentsBalanceTransaction object
fee Field Added to ShopifyPaymentsBalanceTransaction object
associatedOrder Field Added to ShopifyPaymentsBalanceTransaction object
sourceType Field Added to ShopifyPaymentsBalanceTransaction object
type Field Added to ShopifyPaymentsBalanceTransaction object
associatedPayout Field Added to ShopifyPaymentsBalanceTransaction object
test Field Added to ShopifyPaymentsBalanceTransaction object

We've deprecated the shopifyqlQuery query. Use the GraphQL Admin API instead to extract data for your use cases.

The following CustomerSortKeys are now deprecated:

  • LAST_ORDER_DATE
  • ORDERS_COUNT
  • TOTAL_SPENT

You can order customers by these attributes if you filter customers using segments.

You can now use the StoreCreditAccount object to retrieve information about the monetary balance that can be redeemed at checkout for purchases in the store.

The 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.

We've added 14 additional LocalizationExtensionsKey values to support the collection of tax and shipping credentials in several new countries.

You can now use the following metafield definition types to save link-related content:

  • LINK: A link consisting of an anchor text and URL
  • LIST_LINK: A list of link metafields

Learn more about metafields.

You can now use the validationResultSummary field on the MailingAddress object to query the validation status of a shipping address. Possible values are ERROR, WARNING, NO_ISSUES, and NULL. A NULL value indicates that the address has not undergone validation.

Learn more about how Shopify validates customer addresses.

The subTopic field has been removed from the WebhookSubscription object. Use the filter field instead.

We've added the following new webhook topics to the GraphQL Admin API:

New webhook topics in the GraphQL Admin API
Name Description
PRODUCT_FEEDS_FULL_SYNC_FINISH Triggers when a full sync finishes for a product feed
CUSTOMER_ACCOUNT_SETTINGS_UPDATE Triggers when merchants change customer account settings
## REST Admin API changes Version 2024-07 of the REST Admin API introduces the following changes:

The Shopify Payments Transactions resource now returns the adjustment_reason property to describe the reason an adjustment was made.

The Checkout resource is now deprecated. For more information, refer to the Developer changelog.

We've also deprecated all endpoints on the Country and Province resources. For a complete list of affected endpoints, and the GraphQL type equivalents to use instead, refer to the Developer changelog.

The following properties have been added to delivery_method property on the FulfillmentOrder resource:

  • branded_promise: The branded promise that was presented to the customer during checkout. For example, "Shop Promise".
  • additional_information: The additional information to consider when performing the delivery.
  • service_code: A reference to the shipping method.
  • source_reference: The promise provider data associated with delivery promise.

The orders/edited webhook payload now includes a committed_at field. You can use this field to identify when an edit to an order is finalized.

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

You can now use the cartBillingAddressUpdate mutation to associate a billing address with a cart.

The NOTE_TOO_LONG error code is now returned in cart mutations when a note exceeds the maximum limit of 5000 characters.

We've deprecated the following types:

Use CartBuyerIdentityInput.preferences.wallet instead.

We've removed checkout types from the Storefront API, following their deprecation in the 2024-04 API version.

For more information, refer to the developer changelog.

We've added the targetType field to the CartDiscountAllocation interface. The targetType field ensures comprehensive discount calculations, which are crucial for payment integrations.

You can now manage gift cards on a cart in the following ways:

The following new types are available:

New types for managing gift cards on a cart
Name Type Change
cartGiftCardCodesUpdate Mutation Added
giftCardCodes Field Added to CartInput
appliedGiftCards Field Added to Cart object

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

Removals of types and fields from the Storefront API
Name Type Change
ShopPayPaymentRequestContactFieldInput Input object Removed. Shipping address is now read from the payment method.
shippingAddress field ShopPayPaymentRequestInput input object Removed. Shipping address is now read from the payment method.
amount field ShopPayPaymentRequestLineItemInput input object Removed. Use the finalLinePrice field instead.
amount field ShopPayPaymentRequestLineItem object Removed. Use the finalLinePrice field instead.

You can now use the following types to manage Shop Pay payment request checkouts:

New types for managing Shop Pay payment request checkouts
Name Type Change
ShopPayPaymentRequestContactField Object Added
ShopPayPaymentRequestDeliveryMethod Object Added
ShopPayPaymentRequestDiscount Object Added
ShopPayPaymentRequestImage Object Added
ShopPayPaymentRequestReceipt Object Added
ShopPayPaymentRequestSession Object Added
ShopPayPaymentRequestShippingLine Object Added
ShopPayPaymentRequestTotalShippingPrice Object Added
ShopPayPaymentRequest Object Added
ShopPayPaymentRequestDeliveryMethodInput Input object Added
ShopPayPaymentRequestDiscountInput Input object Added
ShopPayPaymentRequestImageInput Input object Added
ShopPayPaymentRequestInput Input object Added
ShopPayPaymentRequestLineItemInput Input object Added
ShopPayPaymentRequestLineItem Input object Added
ShopPayPaymentRequestShippingLineInput Input object Added
ShopPayPaymentRequestTotalShippingPriceInput Input object Added
shopPayPaymentRequestSessionCreate Mutation Added
shopPayPaymentRequestSessionSubmit Mutation Added

Carts now support single-use delivery addresses with the oneTimeUse field on the DeliveryAddressInput input object.

You can use the oneTimeUse field to pass a delivery address that shouldn't be saved to the customer's account after checkout. For example, you might want to use this field for one-time gifting purposes.

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

The HasMetafields interface is now available on the SellingPlan object associated with each Function API.

We've added the lines field to the FulfillmentGroup object. The lines field returns a list of cart lines containing information about the items that are part of the fulfillment group.

API clients installed on Shopify Plus stores can now make use of the optional placements argument in the hide operation. This allows you to explicitly hide payment methods from the accelerated checkout or payment selection.

Learn more about payment customization functions.

Previously, the PaymentCustomizationPaymentMethod 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"

The Product Discount API now supports CartLineTarget object, which enables you to apply discounts on specific cart lines. This functionality was historically only possible with Shopify Scripts.

You can use the CartLineTarget object to link discounts to attributed cart lines such as upsell products, free gifts with purchase, or buyer customized products.

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

You can now determine whether the financial status of an order is expired using the EXPIRED value on the OrderFinancialStatus enum.

You can now set metafields using compare-and-swap (CAS) with the compareDigest field on the metafieldsSet mutation. By using CAS, you can properly handle concurrency requests.

Customers who are authenticated with a customer account can now review and spend their store credit at checkout.

You can now use the metafieldsSet mutation to assign metafield values on Customer, Order, Company, and 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 will not be available to the Customer Account API.