Developer changelog
Subscribe to the changelog to stay up to date on recent changes to Shopify’s APIs and other developer products, as well as preview upcoming features and beta releases.
Filter by tag:
Get prepared for future changes to Shopify’s APIs and other developer products.
There are no entries for your filter criteria.
April 01, 2024
Action required
Unification of count fields API
As of 2024-04
, fields that returned a count of resources will be removed and replaced with new count fields that have consistent API design and improved features.
API design and naming
Count fields are now standalone fields with a common naming pattern and their own arguments instead of being a field under a connection type.
Before:
query {
products(first: 0) {
totalCount
}
}
After:
query {
productsCount {
count
}
}
In the before example, the products
connection field was overloaded with multiple behaviors (count and pagination) which caused confusion as to how, and if, arguments affected the resulting count.
With the new count fields, there's one clear behavior and it simplifies how field arguments affect the count.
Return type
Instead of varying Int
or UnsignedInt64
return type, all count fields now return a Count
object type with precision
and count
fields.
Precision
The new precision
field indicates if a server limit was reached such that we returned early, reporting that there were "at least" n records.
For example, counting the number of products has a server limit of 10,000
. If there were 42
products, the count object would look like { count: 42, precision: "EXACT" }
. If there were 10,042
products, the count object would look like { count: 10000, precision: "AT_LEAST" }
Filtering
Some count fields will now accept filter arguments matching that of a neighboring connection, such as products
and productsCount
.
Migration
CatalogConnection.totalCount
-->CompanyLocation.catalogsCount
,Market.catalogsCount
,QueryRoot.catalogsCount
Collection.productsCount
-->Collection.productsCount
Collection.publicationCount
-->Collection.publicationCount
Company.contactCount
-->Company.contactsCount
Company.locationCount
-->Company.locationsCount
Company.orderCount
-->Company.ordersCount
CompanyLocationCatalog.companyLocationsCount
-->CompanyLocationCatalog.companyLocationsCount
CustomerJourneySummary.momentsCount
-->CustomerJourneySummary.momentsCount
DeliveryLocationGroup.locationsCount
-->DeliveryLocationGroup.locationsCount
DeliveryProfile.productVariantsCount
-->DeliveryProfile.productVariantsCount
DeliveryProfile.productVariantsCountV2
-->DeliveryProfile.productVariantsCount
DiscountCodeApp.codeCount
-->DiscountCodeApp.codesCount
DiscountCodeBasic.codeCount
-->DiscountCodeBasic.codesCount
DiscountCodeBxgy.codeCount
-->DiscountCodeBxgy.codesCount
DiscountCodeFreeShipping.codeCount
-->DiscountCodeFreeShipping.codesCount
FulfillmentOrderLocationForMove.availableLineItemsCount
-->FulfillmentOrderLocationForMove.availableLineItemsCount
FulfillmentOrderLocationForMove.unavailableLineItemsCount
-->FulfillmentOrderLocationForMove.unavailableLineItemsCount
PriceRule.discountCodesCount
-->PriceRule.discountCodesCount
Product.mediaCount
-->Product.mediaCount
Product.publicationCount
-->Product.publicationCount
ProductBundleComponent.componentVariantsCount
-->ProductBundleComponent.componentVariantsCount
ProductBundleComponent.nonComponentVariantsCount
-->ProductBundleComponent.nonComponentVariantsCount
ProductComponentType.componentVariantsCount
-->ProductComponentType.componentVariantsCount
ProductComponentType.nonComponentVariantsCount
-->ProductComponentType.nonComponentVariantsCount
ProductConnection.totalCount
-->Channel.productsCount
,QueryRoot.productsCount
ProductVariant.sellingPlanGroupCount
-->ProductVariant.sellingPlanGroupsCount
Publishable.publicationCount
-->Publishable.resourcePublicationsCount
QueryRoot.channelCount
-->QueryRoot.publicationsCount
QueryRoot.companyCount
-->QueryRoot.companiesCount
QueryRoot.giftCardsCount
-->QueryRoot.giftCardsCount
QueryRoot.publicationCount
-->QueryRoot.publicationsCount
QueryRoot.segmentCount
-->QueryRoot.segmentsCount
SellingPlanGroup.productCount
-->SellingPlanGroup.productsCount
SellingPlanGroup.productVariantCount
-->SellingPlanGroup.productVariantsCount
Shop.limitedPendingOrderCount
-->QueryRoot.pendingOrdersCount
Shop.pendingOrdersCount
-->QueryRoot.pendingOrdersCount
SubscriptionBillingCycleEditedContract.lineCount
-->SubscriptionBillingCycleEditedContract.linesCount
SubscriptionContract.lineCount
-->SubscriptionContract.linesCount
SubscriptionContractBase.lineCount
-->SubscriptionContractBase.linesCount
April 01, 2024
ShippingLineInput now accepts priceWithCurrency API
As of 2024-04, you can use priceWithCurrency
to provide the price of the shipping rate along with the currency, whereas price
uses the shop currency. If priceWithCurrency
is provided, price
will be ignored.
Learn more about priceWithCurrency
on Shopify.dev.
April 01, 2024
Action required
Deprecation of Checkout APIs API
As of API version 2024-04 the Checkout API’s will be marked as deprecated. This deprecation will impact both the Admin REST API (excluding Abandoned Checkout) and Storefront GraphQL API endpoints. To maintain continuity and unlock new capabilities, apps will need to migrate to either the Storefront Cart API, and or Checkout Sheet Kit for mobile apps.
Deprecation Schedule:
April 1, 2024 (Version: 2024-04
)
All affected fields within the Checkout APIs will be marked as deprecated. This is the final stable version where the Checkout APIs will remain available. The fields will also be removed from unstable
and the 2024-07
Release Candidate versions onwards. We strongly recommend you to start migrating to the new API when possible to avoid any disruptions.
April 1, 2025 (Version: 2025-04
)
The 2024-04
API version will reach its end of life. As a result, Checkout mutations will no longer be available on any version.
Recognizing the need for a high throughput cart, Shopify introduced the Storefront Cart API in 2021 as the successor to the Checkout API, and we have been continually enriching it with new features. The Cart API offers improved performance, scalability, and a richer feature set including subscriptions, product bundles, and contextual pricing. Additionally, it integrates with Shopify's web checkout for further customization using Shopify Functions and UI extensions.
The Checkout Sheet Kit, compatible with Android, Swift, and React Native, streamlines mobile app development by integrating a fully-featured web checkout. This eliminates the need for a separate checkout build, reducing maintenance while preserving all customizations and business logic.
Action Required:
Update any application calling Admin REST API or Storefront GraphQL API checkout endpoints prior to 2025-04
to utilize the Cart API or Checkout Sheet Kit to avoid disruption. If you have questions, please utilize the feedback repository.
April 01, 2024
Action required
Removal of productDuplicateAsync
mutation from the GraphQL Admin API
API
As of 2024-04, we're removing the deprecated productDuplicateAsync
mutation. The mutation was deprecated since 2023-07
version.
Use the productDuplicateAsyncV2 mutation instead.
April 01, 2024
Action required
Deprecation of the fulfillmentService.fulfillmentOrdersOptIn
field
API
The fulfillmentOrdersOptIn
field on the FulfillmentService
GraphQL and REST API objects, along with the related mutations and endpoints, is being deprecated as the migration to the Fulfillment Orders API has been completed. All properly functioning fulfillment services now have the fulfillmentOrdersOptIn
field set to true
.
In the 2024-04
API version, the fulfillmentOrdersOptIn
field becomes nullable and defaults to true
in the fulfillmentServiceCreate mutation and the Create Fulfillment Service REST endpoint. This field will be removed from the mutation input and the REST endpoint parameters in the subsequent API version (2024-07
). To prepare for the 2024-07
API version release, stop supplying the fulfillmentOrdersOptIn
parameter when creating a new fulfillment service.
April 01, 2024
Customer APIs: Allow querying of customer subscription contracts API
As of the 2024-04 release of the GraphQL Customer API, you can now query for a customer's subscription contracts using the subscriptionContracts
or subscriptionContract
fields.
This allows developers to query for all subscription contracts belonging to a customer, or to query for a specific subscription contract.
Learn more about querying for a customer's subscription contracts on Shopify.dev.
April 01, 2024
Action required
New Error codes and updated error code mapping for payment and billing API
As of 2024-04, Added the following fields to the SubscriptionBillingAttemptErrorCode
enum
InsufficientFunds
PurchaseTypeNotSupported
Paypal Error
CardNumberIncorrect
FraudSuspected
Additionally, the following payment error code mappings have changed: * “Insufficient Funds” has been removed from “Invalid Payment Method” and now receives its own billing attempt error * “Pick up card” has been removed from “Payment Method Declined” and is now classified as “Fraud Suspected” * “Invalid Item Total” has been added to “Payment Method Declined”
And the following codes from payment processors have changed:
-
- 2007 now maps to “Card Number Incorrect”
- 2014 now maps to “Fraud Suspected”
- 2105 now maps to “Transient Error”
- 2106 now maps to “Transient Error”
- 2107 now maps to “Invalid Payment Method”
- 2108 now maps to “Invalid Payment Method”
-
- 10417 now maps to “Paypal Error General”
-
- cardnotsupported now maps to “Invalid Purchase Type”
- invalid_account now maps to “Card Number Incorrect”
- invalid_amount now maps to “Payment Method Declined”
April 01, 2024
Action required
Inventory Mutations and Fields Removal API
As of Admin API 2024-04, we are removing the following fields and mutations:
- InventoryLevel.available
- InventoryLevel.incoming
- InventoryLevel.deactivationAlertHtml
- Mutation.InventoryAdjustQuantity
- Mutation.InventoryBulkAdjustQuantityAtLocation
After building new fields to handle inventory quantities other than available, new fields and mutations that can handle all quantities were needed and released in 2023-01.
InventoryLevel.available
and InventoryLevel.incoming
should be replaced with InventoryLevel.quantities
.
InventoryLevel.deactivationAlertHtml
should be replaced with InventoryLevel.deactivationAlert
.
Mutation.InventoryAdjustQuantity
and Mutation.InventoryBulkAdjustQuantityAtLocation
should be replaced with Mutation.AdjustQuantities
or Mutation.MoveQuantities
.
For those still using these fields on unstable
, they will continue to work until 2024-04 is no longer supported.
More information on how to use these new fields can be found here
April 01, 2024
Action required
New Create Fulfillment Request Validation API
As of Admin version 2024-04 , there cannot be multiple of the same fulfillment_order_id
within the line_items_by_fulfillment_order
param for the REST "Creates a fulfillment for one or many fulfillment orders" API and GraphQL fulfillmentCreateV2
mutation.
Please combine any payload with the same fulfillment_order_id
into one group.
April 01, 2024
New inventory_management
boolean argument on fulfillmentServiceUpdate
mutation
API
As of 2024-04 version Admin GraphQL API, you can update inventory_management
boolean value on the FulfillmentService object using the [fulfillmentServiceUpdate mutation]((https://shopify.dev/docs/api/admin-graphql/2024-04/mutations/fulfillmentServiceUpdate) .
Learn more about inventory_management
argument on Shopify.dev.