Admin GraphQL API: how to retrieve only variants assigned to a specific Sales Channel?

Hello everyone,

I’m trying to understand whether the Shopify Admin GraphQL API exposes variant-level assignment / availability for a specific Sales Channel.

My use case is the Facebook & Instagram sales channel.

I have the following Publication / Channel:

{
“id”: “gid://shopify/Publication/288304562471”,
“supportsFuturePublishing”: false,
“channels”: {
“nodes”: [
{
“id”: “gid://shopify/Channel/288304562471”,
“name”: “Facebook & Instagram”,
“handle”: “facebook-ads”
}
]
}
}

I can retrieve products published to this channel using channel.productPublicationsV3:

query GetChannelProducts {
channel(id: “gid://shopify/Channel/288304562471”) {
id
name
handle
productPublicationsV3(first: 250) {
nodes {
publishable {
… on Product {
id
title
handle
variants(first: 250) {
nodes {
id
title
sku
}
}
}
}
}
}
}
}

However, this returns the products published to the channel and then all variants of those products.

That does not solve my case, because in the Shopify admin UI / Facebook & Instagram channel configuration, not all variants of a published product are necessarily assigned or available for that channel.

I also tried querying variants directly with the channel-specific published_status filter:

query GetVariantsByChannel {
productVariants(
first: 250
query: “published_status:facebook-ads-published”
) {
nodes {
id
title
sku
product {
id
title
handle
}
}
}
}

But in my tests, this query still returns variants whose parent product is published to the Facebook & Instagram channel, even when the specific variant itself is not assigned / available for that channel.

So it seems that:

published_status:facebook-ads-published

filters by the publication status of the parent product, not by the individual variant’s channel assignment.

My questions are:

Is variant-level assignment / availability for a Sales Channel exposed anywhere in the Admin GraphQL API?
Is there any field on ProductVariant, or any connection similar to productPublicationsV3, that allows querying variant-level channel assignment?
Is there a reliable way to retrieve only the variants assigned / available for a specific Sales Channel such as Facebook & Instagram?
If this data exists only inside the Facebook & Instagram sales channel app configuration and is not exposed through Admin GraphQL, can someone confirm that?

I’m specifically not trying to retrieve:

products published to a channel → all variants of those products

I need:

only variants actually assigned / available for a specific channel

even when their parent product has other variants that are not assigned to that channel.

Any clarification or confirmed workaround would be greatly appreciated.

Thank you!
Andrew

Hey @Andrew_Yurkovets - good question. The piece I’d adjust here is that publication IDs are shop-specific, so for a channel like Facebook & Instagram you’ll usually want to first identify the relevant publication for that shop.

One way to do that is to query app-backed publications using publications(catalogType: APP) and inspect the associated AppCatalog, which exposes the apps/channels tied to that catalog. Once you’ve found the Facebook & Instagram publication ID, you can use that ID for publication checks.

Also worth noting: as of API version 2026-07, we added support for publishing and unpublishing variants independently from products. In that version, ProductVariant is a Publishable, and the product/variant publishing guide shows ProductVariant.publishedOnPublication, resourcePublicationsV2, and unpublishedPublications for checking variant-level publication state.

The main thing is that product-level publishing still takes precedence: the parent product must be active and published to the channel before any of its variants can render there. So the flow is roughly:

  1. Find the Facebook & Instagram publication for the shop.
  2. Confirm the parent product is published to that publication.
  3. On API version 2026-07, check the specific variant’s publication state against that same publication.

Here’s a quick example of what the query would look like:

query VariantPublicationState($publicationId: ID!, $variantId: ID!) {
  productVariant(id: $variantId) {
    id
    title
    sku
    publishedOnPublication(publicationId: $publicationId)
  }
}

Hope this helps!