Skip to main content

Product

Requires read_products access scope.

Supported actions: create, update, delete

Subscribe to field-level changes on the Product GraphQL Admin API object.

Each topic corresponds to a commerce resource that can exist independently within its domain. Child entities that depend on a parent within the same domain don't have their own topic. Instead, changes to child entities trigger a delivery on the parent topic. Calculated fields, derived fields, auto-updated timestamps, and cross-domain fields aren't available as triggers.

shopify.app.toml

[events]
api_version = "2026-10"

[[events.subscription]]
handle = "my_product_event"

topic = "Product"
actions = ["update"]
triggers = ["product.bundleComponents.*"]

uri = "https://your-app.com/events"

query = """
query product_event_payload($productId: ID!) {
product(id: $productId) {
id
title
status
bundleComponents(first: 10) {
nodes {
__typename
}
}
}
}
"""

Field-level triggers for Product subscriptions.

All triggers require the read_products access scope. Those triggers that require additional scopes are documented where relevant. Deprecated triggers are listed last.

Subscriptions can include multiple triggers. Use the shopify-webhook-id header for deduplication when handling duplicate deliveries.

Custom queries aren't limited to Product. They can query the full GraphQL Admin API.

Anchor to list-of-topics-product.*
product.*

Fires when events involve the Product object, which lets you manage products in a merchant’s store.

The "create" and "delete" actions are only relevant within the context of this parent topic. Use fields_changed to follow or replicate impacted data after a delete event. Define a custom query to retrieve specific fields from create events.

product.* is a parent trigger. Subscribing with the "update" action receives events for all supported triggers under product, including nested triggers. Use a more specific trigger to limit events to the fields you need.

Variables: productId

Anchor to list-of-topics-product.bundleComponents.*
product.bundleComponents.*

Fires when the bundleComponents field on the Product object changes.

product.bundleComponents.* is a parent trigger. Subscribing with the "update" action receives events for all supported triggers under product.bundleComponents, including nested triggers. Use a more specific trigger to limit events to the fields you need.

Include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The bundleComponents field contains a list of components that are associated with a product in a bundle.

Variables: productId

Anchor to list-of-topics-product.bundleComponents.quantity
product.bundleComponents.quantity

Fires when the quantity field on the ProductBundleComponent object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The quantity field represents the quantity of the component product set for this bundle line.

Variables: productId

Anchor to list-of-topics-product.bundleComponents.quantityOption
product.bundleComponents.quantityOption

Fires when the quantityOption field on the ProductBundleComponent object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The quantityOption field represents the quantity as option of the component product.

Variables: productId

Anchor to list-of-topics-product.category
product.category

Fires when the category field on the Product object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The category field represents the category of a product from Shopify's Standard Product Taxonomy.

Variables: productId

Anchor to list-of-topics-product.combinedListing.*
product.combinedListing.*

Fires when the combinedListing field on the Product object changes.

product.combinedListing.* is a parent trigger. Subscribing with the "update" action receives events for all supported triggers under product.combinedListing, including nested triggers. Use a more specific trigger to limit events to the fields you need.

Include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The combinedListing field represents a special product type that combines separate products from a store into a single product listing.

Variables: productId

Anchor to list-of-topics-product.combinedListing.combinedListingChildren.*
product.combinedListing.combinedListingChildren.*

Fires when the combinedListingChildren field on the CombinedListing object changes.

product.combinedListing.combinedListingChildren.* is a parent trigger. Subscribing with the "update" action receives events for all supported triggers under product.combinedListing.combinedListingChildren, including nested triggers. Use a more specific trigger to limit events to the fields you need.

Include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The combinedListingChildren field contains a list of child products in the combined listing.

Variables: productId

Anchor to list-of-topics-product.combinedListing.combinedListingChildren.parentVariant
product.combinedListing.combinedListingChildren.parentVariant

Fires when the parentVariant field on the CombinedListingChild object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The parentVariant field represents the parent variant.

Variables: parentVariantId, productId

Anchor to list-of-topics-product.combinedListing.combinedListingChildren.product
product.combinedListing.combinedListingChildren.product

Fires when the product field on the CombinedListingChild object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The product field represents the child product.

Variables: combinedListingChildrenProductId, productId

Anchor to list-of-topics-product.combinedListingRole
product.combinedListingRole

Fires when the combinedListingRole field on the Product object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The combinedListingRole field represents the role of the product in a combined listing.

Variables: productId

Anchor to list-of-topics-product.descriptionHtml
product.descriptionHtml

Fires when the descriptionHtml field on the Product object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The descriptionHtml field represents the description of the product, with HTML tags.

Variables: productId

Anchor to list-of-topics-product.giftCardTemplateSuffix
product.giftCardTemplateSuffix

Fires when the giftCardTemplateSuffix field on the Product object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The giftCardTemplateSuffix field represents the theme template that's used when customers view the gift card in a store.

Variables: productId

Anchor to list-of-topics-product.handle
product.handle

Fires when the handle field on the Product object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The handle field represents a unique, human-readable string of the product's title.

Variables: productId

Anchor to list-of-topics-product.media
product.media

Fires when the media field on the Product object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The media field represents the media associated with the product.

Variables: mediaId, productId

Anchor to list-of-topics-product.metafield(namespace: String!, key: String!).*
product.metafield(namespace: String!, key: String!).*

Fires when the metafield field on the Product object changes.

product.metafield(namespace: String!, key: String!).* is a parent trigger. Subscribing with the "update" action receives events for all supported triggers under product.metafield(namespace: String!, key: String!), including nested triggers. Use a more specific trigger to limit events to the fields you need.

Include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The metafield field represents a custom field, including its namespace and key, that's associated with a Shopify resource for the purposes of adding and storing additional information.

Variables: metafieldKey, metafieldNamespace, productId

Anchor to list-of-topics-product.metafield(namespace: String!).*
product.metafield(namespace: String!).*

Fires when the metafield field on the Product object changes.

product.metafield(namespace: String!).* is a parent trigger. Subscribing with the "update" action receives events for all supported triggers under product.metafield(namespace: String!), including nested triggers. Use a more specific trigger to limit events to the fields you need.

Include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

This subscription omits the optional argument metafield.key.

The metafield field represents a custom field, including its namespace and key, that's associated with a Shopify resource for the purposes of adding and storing additional information.

Variables: metafieldKey, metafieldNamespace, productId

Anchor to list-of-topics-product.metafield(namespace: String!, key: String!).value
product.metafield(namespace: String!, key: String!).value

Fires when the value field on the Metafield object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The value field represents the data stored in the metafield.

Variables: metafieldKey, metafieldNamespace, productId

Anchor to list-of-topics-product.metafield(namespace: String!).value
product.metafield(namespace: String!).value

Fires when the value field on the Metafield object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

This subscription omits the optional argument metafield.key.

The value field represents the data stored in the metafield.

Variables: metafieldKey, metafieldNamespace, productId

Anchor to list-of-topics-product.options.*
product.options.*

Fires when the options field on the Product object changes.

product.options.* is a parent trigger. Subscribing with the "update" action receives events for all supported triggers under product.options, including nested triggers. Use a more specific trigger to limit events to the fields you need.

Include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The options field contains a list of product options.

Variables: optionsId, productId

Anchor to list-of-topics-product.options.linkedMetafield.*
product.options.linkedMetafield.*

Fires when the linkedMetafield field on the ProductOption object changes.

product.options.linkedMetafield.* is a parent trigger. Subscribing with the "update" action receives events for all supported triggers under product.options.linkedMetafield, including nested triggers. Use a more specific trigger to limit events to the fields you need.

Include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The linkedMetafield field represents the metafield identifier linked to this option.

Variables: optionsId, productId

Anchor to list-of-topics-product.options.linkedMetafield.key
product.options.linkedMetafield.key

Fires when the key field on the LinkedMetafield object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

Key of the metafield the option is linked to.

Variables: optionsId, productId

Anchor to list-of-topics-product.options.linkedMetafield.namespace
product.options.linkedMetafield.namespace

Fires when the namespace field on the LinkedMetafield object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

Namespace of the metafield the option is linked to.

Variables: optionsId, productId

Anchor to list-of-topics-product.options.name
product.options.name

Fires when the name field on the ProductOption object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The name field represents the product option’s name.

Variables: optionsId, productId

Anchor to list-of-topics-product.options.optionValues.*
product.options.optionValues.*

Fires when the optionValues field on the ProductOption object changes.

product.options.optionValues.* is a parent trigger. Subscribing with the "update" action receives events for all supported triggers under product.options.optionValues, including nested triggers. Use a more specific trigger to limit events to the fields you need.

Include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

Similar to values, option_values returns all the corresponding option value objects to the product option, including values not assigned to any variants.

Variables: optionsId, optionValuesId, productId

Anchor to list-of-topics-product.options.optionValues.linkedMetafieldValue
product.options.optionValues.linkedMetafieldValue

Fires when the linkedMetafieldValue field on the ProductOptionValue object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The linkedMetafieldValue field represents the value of the linked metafield.

Variables: optionsId, optionValuesId, productId

Anchor to list-of-topics-product.options.optionValues.name
product.options.optionValues.name

Fires when the name field on the ProductOptionValue object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The name field represents the name of the product option value.

Variables: optionsId, optionValuesId, productId

Anchor to list-of-topics-product.options.optionValues.swatch.*
product.options.optionValues.swatch.*

Fires when the swatch field on the ProductOptionValue object changes.

product.options.optionValues.swatch.* is a parent trigger. Subscribing with the "update" action receives events for all supported triggers under product.options.optionValues.swatch, including nested triggers. Use a more specific trigger to limit events to the fields you need.

Include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The swatch field represents the swatch associated with the product option value.

Variables: optionsId, optionValuesId, productId

Anchor to list-of-topics-product.options.optionValues.swatch.color
product.options.optionValues.swatch.color

Fires when the color field on the ProductOptionValueSwatch object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The color field represents the color representation of the swatch.

Variables: optionsId, optionValuesId, productId

Anchor to list-of-topics-product.options.optionValues.swatch.image
product.options.optionValues.swatch.image

Fires when the image field on the ProductOptionValueSwatch object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The image field represents an image representation of the swatch.

Variables: optionsId, optionValuesId, productId

Anchor to list-of-topics-product.options.position
product.options.position

Fires when the position field on the ProductOption object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The position field represents the product option's position.

Variables: optionsId, productId

Anchor to list-of-topics-product.productType
product.productType

Fires when the productType field on the Product object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The productType field represents the product type that merchants define.

Variables: productId

Anchor to list-of-topics-product.requiresSellingPlan
product.requiresSellingPlan

Fires when the requiresSellingPlan field on the Product object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The requiresSellingPlan field indicates whether the product can only be purchased with a selling plan.

Variables: productId

Anchor to list-of-topics-product.status
product.status

Fires when the status field on the Product object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The status field represents the product status, which controls visibility across all sales channels.

Variables: productId

Anchor to list-of-topics-product.tags
product.tags

Fires when the tags field on the Product object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The tags field represents a comma-separated list of searchable keywords that are associated with the product.

Variables: productId

Anchor to list-of-topics-product.templateSuffix
product.templateSuffix

Fires when the templateSuffix field on the Product object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The templateSuffix field represents the theme template that's used when customers view the product in a store.

Variables: productId

Anchor to list-of-topics-product.title
product.title

Fires when the title field on the Product object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The title field represents the name for the product that displays to customers.

Variables: productId

Anchor to list-of-topics-product.variants.*
product.variants.*

Fires when the variants field on the Product object changes.

product.variants.* is a parent trigger. Subscribing with the "update" action receives events for all supported triggers under product.variants, including nested triggers. Use a more specific trigger to limit events to the fields you need.

Include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The variants field contains a list of variants associated with the product.

Variables: productId, variantsId

Anchor to list-of-topics-product.variants.barcodes
product.variants.barcodes

Fires when the barcodes field on the ProductVariant object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The barcodes field represents the barcodes associated with the product variant.

Variables: productId, variantsId

Anchor to list-of-topics-product.variants.compareAtPrice
product.variants.compareAtPrice

Fires when the compareAtPrice field on the ProductVariant object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The compareAtPrice field represents the compare-at price of the variant in the default shop currency.

Variables: productId, variantsId

Anchor to list-of-topics-product.variants.inventoryPolicy
product.variants.inventoryPolicy

Fires when the inventoryPolicy field on the ProductVariant object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The inventoryPolicy field indicates whether customers are allowed to place an order for the product variant when it's out of stock.

Variables: productId, variantsId

Anchor to list-of-topics-product.variants.media
product.variants.media

Fires when the media field on the ProductVariant object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The media field represents the media associated with the product variant.

Variables: mediaId, productId, variantsId

Anchor to list-of-topics-product.variants.metafield(namespace: String!, key: String!).*
product.variants.metafield(namespace: String!, key: String!).*

Fires when the metafield field on the ProductVariant object changes.

product.variants.metafield(namespace: String!, key: String!).* is a parent trigger. Subscribing with the "update" action receives events for all supported triggers under product.variants.metafield(namespace: String!, key: String!), including nested triggers. Use a more specific trigger to limit events to the fields you need.

Include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The metafield field represents a custom field, including its namespace and key, that's associated with a Shopify resource for the purposes of adding and storing additional information.

Variables: metafieldKey, metafieldNamespace, productId, variantsId

Anchor to list-of-topics-product.variants.metafield(namespace: String!).*
product.variants.metafield(namespace: String!).*

Fires when the metafield field on the ProductVariant object changes.

product.variants.metafield(namespace: String!).* is a parent trigger. Subscribing with the "update" action receives events for all supported triggers under product.variants.metafield(namespace: String!), including nested triggers. Use a more specific trigger to limit events to the fields you need.

Include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

This subscription omits the optional argument metafield.key.

The metafield field represents a custom field, including its namespace and key, that's associated with a Shopify resource for the purposes of adding and storing additional information.

Variables: metafieldKey, metafieldNamespace, productId, variantsId

Anchor to list-of-topics-product.variants.metafield(namespace: String!, key: String!).value
product.variants.metafield(namespace: String!, key: String!).value

Fires when the value field on the Metafield object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The value field represents the data stored in the metafield.

Variables: metafieldKey, metafieldNamespace, productId, variantsId

Anchor to list-of-topics-product.variants.metafield(namespace: String!).value
product.variants.metafield(namespace: String!).value

Fires when the value field on the Metafield object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

This subscription omits the optional argument metafield.key.

The value field represents the data stored in the metafield.

Variables: metafieldKey, metafieldNamespace, productId, variantsId

Anchor to list-of-topics-product.variants.position
product.variants.position

Fires when the position field on the ProductVariant object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The position field represents the order of the product variant in the list of product variants.

Variables: productId, variantsId

Anchor to list-of-topics-product.variants.price
product.variants.price

Fires when the price field on the ProductVariant object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The price field represents the price of the product variant in the default shop currency.

Variables: productId, variantsId

Anchor to list-of-topics-product.variants.productVariantComponents.*
product.variants.productVariantComponents.*

Fires when the productVariantComponents field on the ProductVariant object changes.

product.variants.productVariantComponents.* is a parent trigger. Subscribing with the "update" action receives events for all supported triggers under product.variants.productVariantComponents, including nested triggers. Use a more specific trigger to limit events to the fields you need.

Include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The productVariantComponents field contains a list of the product variant components.

Variables: productId, variantsId

Anchor to list-of-topics-product.variants.productVariantComponents.quantity
product.variants.productVariantComponents.quantity

Fires when the quantity field on the ProductVariantComponent object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The quantity field represents the required quantity of the component.

Variables: productId, variantsId

Anchor to list-of-topics-product.variants.requiresComponents
product.variants.requiresComponents

Fires when the requiresComponents field on the ProductVariant object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The requiresComponents field indicates whether a product variant requires components.

Variables: productId, variantsId

Anchor to list-of-topics-product.variants.showUnitPrice
product.variants.showUnitPrice

Fires when the showUnitPrice field on the ProductVariant object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The showUnitPrice field indicates whether to show the unit price for this product variant.

Variables: productId, variantsId

Anchor to list-of-topics-product.variants.taxable
product.variants.taxable

Fires when the taxable field on the ProductVariant object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The taxable field indicates whether a tax is charged when the product variant is sold.

Variables: productId, variantsId

Anchor to list-of-topics-product.variants.title
product.variants.title

Fires when the title field on the ProductVariant object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The title field represents the title of the product variant.

Variables: productId, variantsId

Anchor to list-of-topics-product.vendor
product.vendor

Fires when the vendor field on the Product object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The vendor field represents the name of the product's vendor.

Variables: productId

Anchor to list-of-topics-product.variants.barcode
product.variants.barcode
Deprecated

Fires when the barcode field on the ProductVariant object changes.

Subscribe to this trigger with the "update" action and include the field in a custom query to retrieve updated data from the payload. You can trace the field in subsequent requests using fields_changed.

The barcode field represents the value of the barcode associated with the product.

Variables: productId, variantsId


Was this page helpful?