Starting with API version 2026-07, ProductVariant becomes Publishable , letting you control publication status per variant on a per-publication (channel or catalog) basis. Workarounds like deleting variants, duplicating products, or hiding them in storefront code are no longer needed.
The only way to "hide just this variant" was workarounds like deleting it, duplicating the product, or hiding it on the storefront side—distorting data and adding maintenance overhead.
Without deleting or duplicating variants, you can finely decide "which variants to show" for each channel / catalog (API version 2026-07).
Whether a variant is shown depends on passing① product-level publishingand then also passing② variant-level publishing—only those that pass both are shown. If ① is closed, it won't show regardless of ② (the product level takes precedence).
resourcePublicationsv2 / publishedOnPublication you can now read a variant's publication status.The article explicitly describes this as a "non-breaking, additive change." There are three prerequisites that keep existing implementations from breaking.
Product-level publishing behavior is unchanged. Unless a product is active and published to a channel , none of its variants are shown on that channel.
Variants are published by default. Existing apps that publish at the product level without any changes keep working as-is.
Variants can be created in an unpublished state, and early exposure to buyers can be prevented..
publishablePublish and publishableUnpublish now accept ProductVariant IDs .
ProductVariant now conforms to the Publishable interface, just like Product and Collection.resourcePublicationsv2 and publishedOnPublication are included.
When a variant is published to or removed from a feed's channel,product update the product feed webhook fires as such (accompanied by variant added / deleted).
variant_publication/create update delete The webhook is still in developmentand is scheduled to ship imminently.
variant_publication/* webhook'sexact availability and the concrete read specification on the Storefront GraphQL API side are not documented. For now, the reliable event sources are the product feed webhook and, on the Admin API, resourcePublicationsv2 reads.| App type | Required action | Notes |
|---|---|---|
| Channel apps that use product feed | No changes needed | The feed adds/removes variants on the product, and the incremental sync webhook fires. |
| Channels / pseudo-channels that don't use feed and read publication status via the Admin API | Action recommended | ProductVariant.resourcePublicationsv2 you should add an implementation that reads each variant's publication status. |
| Apps that create variants after the product is published | Needs review | New variants default to published across all of the parent product's publications. To create them unpublished, use productSet / productVariantBulkCreate 's variant.published: false . |
| Apps that publish products | No changes needed | As before, on the product you just need to call publishablePublish . If unpublished variants are relevant to your workflow, consider handling it. |
Product-level publishing always takes precedence. Unless the product is active and published to the channel, publishing variants won't make them appear no matter what. When debugging, suspect the product level first.
With the same Publishable approach as Product / Collection, you fetch each publication's publish status fromProductVariant.resourcePublicationsv2 . Existing Publishable implementations are easy to reuse.
Variants are published if you do nothing; making them unpublished must be explicit — i.e., specify variant.published: false with productSet / productVariantBulkCreate .
A dedicated variant_publication/* webhook is still in development. If you want to detect changes in real time, a realistic design is to first ride the product feed's product update (variant added/deleted).
This feature is available in API version 2026-07 . The tags also include the Storefront GraphQL API, but the body only describes changes to the Admin API, andthere is no documentation on how to actually read it on the Storefront side. Verifying the storefront display must be done separately.
publishableUnpublish. This gives them a publish status at the channel / catalog level.resourcePublicationsv2.productSet / productVariantBulkCreate 's variant.published: false , create them unpublished → at launch, use publishablePublish to publish them all at once.ProductVariant.resourcePublicationsv2 and build per-variant publication status into your sync process.