Version 8.0.0
Ensure the Craft queue is empty before upgrading. Any pending sync jobs will be unable to update their status after the migration runs.
If you change the Additional Features or Custom Scopes settings after the app is already authorized, you must update the scopes in your Shopify app configuration and then re-authorize the app.
This is primarily a maintenance release, focusing on Shopify API compatibility, authorization, and overall consistency.
Developers should review their templates and extensions for potentially breaking changes to products’ and variants’ shopifyId property.
See Upgrading for details.
Store Management
- Added support for syncing product translations from Shopify. (#215)
- It’s now possible to view the required API scopes in the plugin settings.
- It’s now possible to extend the API scopes with opt-in additional features and custom scopes.
- Added support for Shopify API versions
2026-04and2026-07. - Product inventory is now synced when Shopify sends
inventory_items/updatewebhooks.
Extensibility
- Added
craft\shopify\auth\OAuthFlow. - Added
craft\shopify\clients\GraphqlClient. - Added
craft\shopify\controllers\SettingsController::actionGetScopes(). - Added
craft\shopify\enums\ApiVersion. - Added
craft\shopify\enums\WebhookTopics. - Added
craft\shopify\exceptions\InvalidOAuthException. - Added
craft\shopify\exceptions\ShopifyApiCommunicationException. - Added
craft\shopify\exceptions\ShopifyApiException. - Added
craft\shopify\helpers\Metafield. - Added
craft\shopify\helpers\ShopifyHelper. - Added
craft\shopify\models\Settings::REQUIRED_SCOPES. - Added
craft\shopify\models\Settings::getAdditionalFeatures(). - Added
craft\shopify\models\Settings::getAdditionalFeaturesOptions(). - Added
craft\shopify\models\Settings::getCustomScopes(). - Added
craft\shopify\models\Settings::getScopes(). - Added
craft\shopify\models\Settings::setAdditionalFeatures(). - Added
craft\shopify\models\Settings::setCustomScopes(). - Added
craft\shopify\models\Variant::$shopifyGid. - Added
craft\shopify\services\Api::connect(). - Added
craft\shopify\services\Api::getShopLocalesGql(). - Added
craft\shopify\services\Api::getWebhookTopics(). - Added
craft\shopify\services\BulkOperations::getBulkOperationByShopifyGid(). - Added
craft\shopify\services\Products::deleteProductByShopifyGid(). - Added
craft\shopify\services\Products::deleteShopifyDataByShopifyGid(). - Added
craft\shopify\services\Products::syncProductByShopifyGid(). - Added
craft\shopify\webhooks\WebhookRegistry. craft\shopify\elements\Product::setMetafields()andcraft\shopify\models\Variant::setMetafields()now require a list-shaped array of{key, value}objects (or a JSON-encoded string of the same), and throw\InvalidArgumentExceptionfor anything else. Previously, an associativekey => valuemap was also accepted without validation.craft\shopify\handlers\Webhook::handle()no longer implementsShopify\Webhooks\Handler, and its$topicargument is now acraft\shopify\enums\WebhookTopicsenum instead of a string.craft\shopify\models\Variant::$shopifyIdnow holds the numeric Shopify ID. The full GID is now available via$shopifyGid.craft\shopify\records\ShopifyData::$shopifyIdis now a generated (read-only) column containing the numeric Shopify ID. The full GID is now available via$shopifyGid.craft\shopify\services\Api::getGqlClient()now returns acraft\shopify\clients\GraphqlClientinstance instead ofShopify\Clients\Graphql.- API and webhook errors are now thrown as
craft\shopify\exceptions\ShopifyApiExceptionandcraft\shopify\exceptions\InvalidOAuthException, rather than theShopify\Exception\*classes from the (now-removed)shopify/shopify-apipackage. - Renamed
craft\shopify\jobs\ProcessBulkOperationData::$bulkOperationShopifyIdto$bulkOperationShopifyGid. - Renamed
craft\shopify\models\BulkOperation::$shopifyIdto$shopifyGid. - Deprecated
craft\shopify\services\BulkOperations::getBulkOperationByShopifyId(). UsegetBulkOperationByShopifyGid()instead. - Deprecated
craft\shopify\services\Products::deleteProductByShopifyId(). UsedeleteProductByShopifyGid()instead. - Deprecated
craft\shopify\services\Products::deleteShopifyDataByShopifyId(). UsedeleteShopifyDataByShopifyGid()instead. - Deprecated
craft\shopify\services\Products::syncProductByShopifyId(). UsesyncProductByShopifyGid()instead. - Removed
craft\shopify\console\controllers\SyncController::$throttle. - Removed
craft\shopify\models\Settings::getApiKey(). UsegetClientId()instead. - Removed
craft\shopify\models\Settings::getApiSecretKey(). UsegetClientSecret()instead. - Removed
craft\shopify\models\Settings::setApiKey(). UsesetClientId()instead. - Removed
craft\shopify\models\Settings::setApiSecretKey(). UsesetClientSecret()instead. - Removed
craft\shopify\services\Api::WEBHOOK_TOPICS. UsegetWebhookTopics()instead. - Removed
craft\shopify\services\Api::getSession(). Useconnect()instead. - Removed
craft\shopify\services\Api::initializeContext().
System
- Shopify for Craft now requires Craft CMS 5.10.7 or later. Craft 4 is no longer supported.
- The
shopify_datatable’sshopifyIdcolumn has been renamed toshopifyGid. A newshopifyIdgenerated column has been added, set to the numeric ID at the end of the GID. - The
shopify_bulkoperationstable’sshopifyIdcolumn has been renamed toshopifyGid. - Removed the
shopify/shopify-apiComposer dependency. - Fixed a bug where validation errors for the “Context Pricing Countries” setting weren’t displaying correctly.
- Fixed a bug where
inventory_levels/updatewebhooks weren’t triggering a product sync.
Version 7.1.4
- It is now possible to view plugin settings as an admin on environments that do not allow admin changes.
- Fixed a bug where CSRF validation wasn’t being enforced for the settings, product sync, and sync-deletion actions.
- Fixed a bug where Shopify product element permissions weren’t being enforced.
Version 7.1.2
- Fixed a PHP error that occurred when editing settings in Craft 4. (#216)
Version 7.1.1
shopifyIdandshopifyGidfields are now available when querying product variants via GraphQL. (#211)
Version 7.1.0
- Added support for querying for products via GraphQL. (#49, #203, #206)
- Added the
totalInventoryproduct query param. - Added
craft\shopify\elements\Product::$totalInventory. - Added
craft\shopify\elements\db\ProductQuery::$totalInventory. - Added
craft\shopify\elements\db\ProductQuery::totalInventory(). - Added
craft\shopify\gql\arguments\elements\Product. - Added
craft\shopify\gql\interfaces\elements\Product. - Added
craft\shopify\gql\types\Image. - Added
craft\shopify\gql\types\Metafield. - Added
craft\shopify\gql\types\Option. - Added
craft\shopify\gql\types\Variant. - Added
craft\shopify\gql\types\elements\Product.
Version 7.0.2
- Fixed a PHP error that could occur when authorizing the Shopify app. (#204)
Version 7.0.1
- Fixed a PHP error that could occur when retrieving products. (#202)
Version 7.0.0
Shopify for Craft 7.x uses a new app-based authorization system. Follow the upgrade instructions to get new credentials.
- Shopify for Craft now requires version
2026-01of Shopify’s GraphQL Admin API. - Shopify for Craft now requires Shopify PHP SDK 6.0 or later.
- Added support for setting the base webhook and auth URL using the
SHOPIFY_PUBLIC_DEV_URLenvironment variable. (#185) - Product conditions can now have a “Template Suffix” rule.
- Added the “Shopify Sync” permission.
- Added the
templateSuffixproduct query param. - Added
craft\shopify\collections\VariantCollection. - Added
craft\shopify\console\controllers\ApiController. - Added
craft\shopify\controllers\AuthController. - Added
craft\shopify\db\Table::ACCESS_TOKENS. - Added
craft\shopify\elements\conditions\products\TemplateSuffixConditionRule. - Added
craft\shopify\elements\db\ProductQuery::$templateSuffix. - Added
craft\shopify\elements\db\ProductQuery::templateSuffix(). - Added
craft\shopify\events\DefineGqlFieldsEvent. - Added
craft\shopify\events\DefineGqlQueryArgumentsEvent. - Added
craft\shopify\fieldlayoutelements\MediaField. - Added
craft\shopify\fieldlayoutelements\MetafieldsField. - Added
craft\shopify\fieldlayoutelements\OptionsField. - Added
craft\shopify\fieldlayoutelements\VariantsField. - Added
craft\shopify\models\Settings::getAuthUrl(). - Added
craft\shopify\models\Settings::getClientId(). - Added
craft\shopify\models\Settings::getClientSecret(). - Added
craft\shopify\models\Settings::setClientId(). - Added
craft\shopify\models\Settings::setClientSecret(). - Added
craft\shopify\models\Variant. - Added
craft\shopify\records\AccessToken. - Added
craft\shopify\services\Api::API_ACCESS_TOKEN_ENV_VAR. - Added
craft\shopify\services\Api::EVENT_DEFINE_GQL_QUERY_ARGUMENTS. - Added
craft\shopify\services\Api::EVENT_DEFINE_PRODUCT_GQL_FIELDS. - Added
craft\shopify\services\Api::getAccessToken(). - Added
craft\shopify\services\Api::initializeContext(). craft\shopify\elements\Product::getCheapeastVariant()now returns acraft\shopify\models\Variantobject.craft\shopify\elements\Product::getDefaultVariant()now returns acraft\shopify\models\Variantobject.craft\shopify\elements\Product::getVariants()now returns a collection.- Deprecated the
--throttleoption forshopify/synccommands. - Deprecated
craft\shopify\models\Settings::getApiKey().getClientId()should be used instead. - Deprecated
craft\shopify\models\Settings::getApiSecretKey().getClientSecret()should be used instead. - Deprecated
craft\shopify\models\Settings::setApiKey().setClientId()should be used instead. - Deprecated
craft\shopify\models\Settings::setApiSecretKey().setClientSecret()should be used instead. - Removed the
publishedOnCurrentPublicationproduct query param. - Removed
craft\shopify\controllers\ProductsController::actionRenderCardHtml(). - Removed
craft\shopify\elements\Product::$publishedOnCurrentPublication. - Removed
craft\shopify\elements\Product::getBodyHtml(). - Removed
craft\shopify\elements\Product::setBodyHtml(). - Removed
craft\shopify\elements\db\ProductQuery::$publishedOnCurrentPublication. - Removed
craft\shopify\elements\db\ProductQuery::publishedOnCurrentPublication(). - Removed
craft\shopify\handlers\Product. - Removed
craft\shopify\helpers\Metafields. - Removed
craft\shopify\models\Settings::$syncProductMetafields. - Removed
craft\shopify\models\Settings::$syncVariantMetafields. - Removed
craft\shopify\services\Products::syncAllProducts(). - Fixed a bug where product slugs weren’t syncing correctly.
Version 6.1.3
- Fixed a PHP error that could occur when contextual pricing countries aren’t set. (#191)
Version 6.1.2
- Fixed a bug where syncing queue jobs could run indefinitely. (#189)
- Fixed a bug where syncing products could fail if the sync file had downloaded incorrectly.
Version 6.1.1
- Fixed a bug where file storage could be maxed out when using multiple queue workers.
- Fixed a bug where contextual pricing countries weren’t being force to be capitalized.
Version 6.1.0
- Shopify for Craft now supports version
2025-07of Shopify’s GraphQL Admin API. - Fixed a PHP error that could occur with missing environment variables. (#178)
Version 6.0.5
- Fixed a bug where Shopify data could be overwritten when syncing products. (#177)
Version 6.0.4.1
- Fixed a PHP error that could occur when upgrading. (#176)
Version 6.0.3
- Fixed a SQL error that occurred when syncing products on MariaDB. (#166)
- Fixed a SQL error that could occur when upgrading.
Version 6.0.2
- Fixed a bug where image sort order wasn’t being respected when syncing products. (#161)
Version 6.0.1
- Fixed a PHP error that could occur when viewing Shopify utilities. (#156)
- Fixed a bug where
imagewas missing from Shopify variant data.
Version 6.0.0
After updating, go to Shopify → Webhooks and create the missing webhooks.
- Shopify for Craft now uses the GraphQL Admin API to interact with Shopify.
- Shopify now requires Craft CMS 4.15.0+ or 5.0.0+.
- Data syncing is now done via the queue.
- Added the
shopify/data/resetcommand. - Added
craft\shopify\Plugin::getBulkOperation(). - Added
craft\shopify\api\BulkDataBatcher. - Added
craft\shopify\console\controllers\DataController. - Added
craft\shopify\controllers\Sync. - Added
craft\shopify\db\ProductQuery::$publishedOnCurrentPublication. - Added
craft\shopify\db\ProductQuery::$shopifyGid. - Added
craft\shopify\db\ProductQuery::$withAll. - Added
craft\shopify\db\ProductQuery::$withImages. - Added
craft\shopify\db\ProductQuery::$withMetafields. - Added
craft\shopify\db\ProductQuery::$withVariants. - Added
craft\shopify\db\ProductQuery::publishedOnCurrentPublication(). - Added
craft\shopify\db\ProductQuery::shopifyGid(). - Added
craft\shopify\db\ProductQuery::withAll(). - Added
craft\shopify\db\ProductQuery::withImages(). - Added
craft\shopify\db\ProductQuery::withMetafields(). - Added
craft\shopify\db\ProductQuery::withVariants(). - Added
craft\shopify\db\Table::DATA. - Added
craft\shopify\elements\Product::$publishedOnCurrentPublication. - Added
craft\shopify\elements\Product::$shopifyGid. - Added
craft\shopify\elements\Product::getData(). - Added
craft\shopify\elements\Product::getDescriptionHtml(). - Added
craft\shopify\elements\Product::setData(). - Added
craft\shopify\elements\Product::setDescriptionHtml(). - Added
craft\shopify\helpers\Product::shopifyPublishedHtml(). - Added
craft\shopify\helpers\Product::shopifyStatusHtml(). - Added
craft\shopify\jobs\ProcessBulkOperationData. - Added
craft\shopify\models\BulkOperation. - Added
craft\shopify\records\BulkOperation. - Added
craft\shopify\records\ShopifyData. - Added
craft\shopify\services\Api::WEBHOOK_TOPICS. - Added
craft\shopify\services\Api::createQuery(). - Added
craft\shopify\services\Api::deleteWebhookById(). - Added
craft\shopify\services\Api::getGqlClient(). - Added
craft\shopify\services\Api::getProductGql(). - Added
craft\shopify\services\Api::getShop(). - Added
craft\shopify\services\Api::getShopGql(). - Added
craft\shopify\services\Api::getShopifyDataByType(). - Added
craft\shopify\services\Api::getWebhooks(). - Added
craft\shopify\services\Api::query(). - Added
craft\shopify\services\BulkOperations. - Added
craft\shopify\services\Products::deleteShopifyDataByShopifyId(). - Added
craft\shopify\services\Products::eagerLoadImagesForProducts(). - Added
craft\shopify\services\Products::eagerLoadMetafieldsForProducts(). - Added
craft\shopify\services\Products::eagerLoadVariantsForProducts(). - Added
craft\shopify\services\Products::normalizeShopifyGid(). craft\shopify\events\ShopifyProductSyncEvent::$sourcenow has a type ofarray.craft\shopify\services\Products::createOrUpdateProduct()no longer has$metafieldsand$variantsarguments.craft\shopify\services\Products::createOrUpdateProduct()’s$productargument now has a type ofarray.- Renamed
craft\shopify\handlers\ProducttoWebhook. - Deprecated
craft\shopify\elements\Product::getBodyHtml().getDescriptionHtml()should be used instead. - Deprecated
craft\shopify\elements\Product::getShopifyStatusHtml().craft\shopify\helpers\Product::shopifyStatusHtml()should be used instead. - Deprecated
craft\shopify\elements\Product::setBodyHtml().setDescriptionHtml()should be used instead. - Deprecated
craft\shopify\helpers\Metafields. - Deprecated
craft\shopify\models\Settings::$syncProductMetafields. Metafields are always included when synchronizing product data. - Deprecated
craft\shopify\models\Settings::$syncVariantMetafields. Metafields are always included when synchronizing variant data. - Deprecated
craft\shopify\services\Api::get().query()should be used instead. - Deprecated
craft\shopify\services\Api::getAll().query()should be used instead. - Deprecated
craft\shopify\services\Api::getAllProducts(). - Deprecated
craft\shopify\services\Api::getClient().getGqlClient()should be used instead. - Deprecated
craft\shopify\services\Api::getMetafieldsByIdAndOwnerResource(). - Deprecated
craft\shopify\services\Api::getMetafieldsByProductId(). - Deprecated
craft\shopify\services\Api::getMetafieldsByVariantId(). - Deprecated
craft\shopify\services\Api::getProductByShopifyId(). - Deprecated
craft\shopify\services\Api::getProductIdByInventoryItemId(). - Deprecated
craft\shopify\services\Api::getVariantsByProductId(). - Removed
craft\shopify\db\Table::PRODUCTDATA. - Removed
craft\shopify\elements\Product::$publishedScope. - Removed
craft\shopify\elements\db\ProductQuery::$publishedScope. - Removed
craft\shopify\elements\db\ProductQuery::publishedScope(). - Removed
craft\shopify\jobs\UpdateProductMetadata. - Removed
craft\shopify\records\ProductData. - Removed
craft\shopify\services\Api::SHOPIFY_API_VERSION. - Removed
craft\shopify\services\Products::$sleepSeconds. - Removed
craft\shopify\services\Products::$throttle.
Version 5.4.1
- Fixed a PHP error that could occur when updating. (#133)
Version 5.4.0
- It is now possible to associate Shopify products with elements imported in Feed Me. (#116)
- Added
craft\shopify\feedme\fields\Products.
Version 5.3.1
- Fixed a PHP error that could occur when trying to create webhooks. (#129)
Version 5.3.0
- Shopify now requires Craft CMS 4.3.0+ or 5.0.0+.
- Added the “API Version” setting. (#128, #121)
- Added support for selecting products in Link fields. (Craft 5 only.)
- Product syncing now uses presentment prices by default. (#122)
- Added
craft\shopify\linktypes\Product. - Added
craft\shopify\models\Settings::getApiVersion(). - Added
craft\shopify\models\Settings::setApiVersion(). - Added
craft\shopify\services\Api::getMetaFieldClass(). - Added
craft\shopify\services\Api::getProductClass(). - Added
craft\shopify\services\Api::getSupportedApiVersions(). - Added
craft\shopify\services\Api::getVariantClass(). - Deprecated
craft\shopify\services\Api::SHOPIFY_API_VERSION. - Fixed a bug where variant column data could be larger than a MySQL TEXT column.
Version 5.2.0
shopify/synccommands now support a--throttleoption.- Fixed a bug where syncing Shopify variants would be limited to 50. (#115)
- Added
craft\shopify\console\controllers\SyncController::$throttle. - Added
craft\shopify\services\Products::$throttle. - Added
craft\shopify\services\Products::$sleepSeconds.
Version 5.1.2
- Fixed a bug where syncing meta fields would cause Shopify API rate limiting.
- Fixed a bug where variant meta fields weren’t being unpacked.
Version 5.1.0
- Added support for syncing variant meta fields. (#99)
- Added the
syncProductMetafieldsandsyncVariantMetafieldsconfig settings, which can be enabled to sync meta fields. - Added
craft\shopify\models\Settings::$syncProductMetafields. - Added
craft\shopify\models\Settings::$syncVariantMetafields.
Version 5.0.0
- Shopify now requires Craft CMS 5.0.0-beta.10 or later.
Version 4.1.1
- Fixed a bug where syncing meta fields would cause Shopify API rate limiting.
- Fixed a bug where variant meta fields weren’t being unpacked.
Version 4.1.0
- Added support for syncing variant meta fields. (#99)
- Added the
syncProductMetafieldsandsyncVariantMetafieldsconfig settings, which can be enabled to sync meta fields. - Added
craft\shopify\models\Settings::$syncProductMetafields. - Added
craft\shopify\models\Settings::$syncVariantMetafields.
Version 4.0.0
After updating, visit your Shopify store and go to Settings → Apps and sales channels → Develop apps → [your app] → Configuration, and update the Webhook version setting to
2023-10.
- Syncing meta fields is no longer performed via a queue job.
- Shopify products’ reference handle is now
shopifyproduct. (#77) - Deprecated
craft\shopify\jobs\UpdateProductMetadata. - Removed
craft\shopify\events\ShopifyProductSyncEvent::$metafields.ShopifyProductSyncEvent::$element->getMetaFields()can be used instead. - shopify/shopify-api 5.2.0 or later is now required. (#81, #84)
- Fixed a bug where routes weren’t saving the chosen template.
Version 3.2.0
- Added support for syncing variant inventory levels. (#61)
- Added
craft\shopify\elements\db\ProductQuery::publishedScope(). (#65) - Fixed a PHP error that occurred when saving the plugin settings in headless mode. (#68)
- Fixed a bug where changes to the product field layout in the project config weren’t applying correctly. (#52)
- Fixed an error that occurred when installing the plugin on PostgreSQL. (#58)
Version 3.1.1
- Fixed a SQL error that occurred when syncing products with several tags. (#54)
- Product metadata is now synced via a queue job to avoid the Shopify API rate limiting.
Version 3.0.0.1
- Fixed a namespacing bug.
Version 3.0.0
- Initial release under new management. If you’re upgrading from Shopify Product Fetcher, see Migrating from v2.x.