Initial product feed sync returns no products after channel creation and webhook subscription

Hi everyone,

We’re building a Shopify Sales Channel using contextual product feeds with automatic feed management on Admin API 2026-07.

Our development store has 13 products and 24 variants published to the channel, and Channel.productsCount reports 13. However, immediately after channelCreate, both Shopify’s automatic initial sync and our manually requested channelFullSync completed with count: 0.

We received PRODUCT_FEEDS_FULL_SYNC_FINISH for both syncs, but received zero PRODUCT_FEEDS_FULL_SYNC webhooks containing products. About 11 minutes later, we requested the same sync again and received all 13 products and 24 variants.

Nothing changed between the unsuccessful and successful attempts.

We did not change:

  • Channel, feed, market, or catalog configuration
  • Product publication or product data
  • Webhook subscriptions
  • API version, scopes, application code, or database state

The 11-minute delay was simply time spent auditing our implementation - not an intentional retry interval. Our ingestion system also appears to be working correctly: when Shopify eventually sent the 13 product webhooks, all 13 products and 24 variants were persisted.

Our provisioning follows Shopify’s documented channel-connection flow:

  1. Call channelCreate.
  2. Confirm the channel was returned without user errors.
  3. Register and verify PRODUCT_FEEDS_FULL_SYNC, PRODUCT_FEEDS_FULL_SYNC_FINISH, and PRODUCT_FEEDS_INCREMENTAL_SYNC.
  4. Call channelFullSync.
  5. Process deliveries idempotently using the webhook and full-sync IDs.

Shopify documents that product feeds immediately begin emitting events after channelCreate, that a full sync is triggered by default when a feed is created, and that a requested full sync emits one product webhook per published product followed by a finish webhook.

Our timeline, in UTC:

23:25:32.423  Automatic sync finishes with count: 0
23:25:35.156  Requested channelFullSync finishes with count: 0
23:25–23:36   We audit the setup; no configuration or code changes
23:36:35      Same channelFullSync requested again
23:36:38      13 product webhooks arrive; finish count is 13

Diagnostic identifiers:

API version: 2026-07

Development store:
https://linkdrop-dev.myshopify.com

Channel: gid://shopify/Channel/176225910868
Feed: gid://shopify/ProductFeed/8675033172

Successful operation:
gid://shopify/ProductFullSync/8675033172839633453236474966871788219395

Successful PRODUCT_FEEDS_FULL_SYNC_FINISH webhook delivery ID:
047373c4-7c9a-5299-b6e3-0487ad715255

Our questions are:

  1. Is there an expected eventual-consistency period after channelCreate before the published catalog becomes available to channelFullSync?
  2. Is there a readiness signal we should wait for?
  3. Should we compare PRODUCT_FEEDS_FULL_SYNC_FINISH.count with Channel.productsCount to detect an incomplete sync?
  4. If a zero-count result should be retried, what interval, backoff, and attempt limit does Shopify recommend?
  5. Is this expected behavior, or something Shopify needs to investigate?

Support suggested retrying after 30–60 seconds with exponential backoff, but we haven’t found that delay or a readiness signal documented. We’re looking for the production-safe synchronization flow Shopify recommends, and ideally we’d like something faster than waiting 30 seconds to sync our users products.

Hi @gurshanj! I have been having a look into this for you.

In a controlled Admin API 2026-07 test, I confirmed an ACTIVE product was published to the channel (publishedOnPublication: true and Channel.productsCount: 1) before calling channelFullSync. The immediate sync delivered that product and completed with count: 1. A separate automatic initial sync returned count: 0 when no product had been created yet, so a zero finish event alone does not show that a published catalog was skipped.

Could you share the metadata.fullSyncId values from both zero-count finish payloads, the operation ID and x-request-id from the manual channelFullSync, and whether the products were confirmed with publishedOnPublication before each sync? It would also help to know whether the automatic and manual syncs overlapped.

Once I have those details I can get looking at our logs and see if what you saw was expected or not - thanks in advance!

Hi, thanks for looking into this.

We didn’t retain the requested identifiers from the original requests, so we removed the connection/channel and recreated the flow from a clean state. We reproduced the same result: both the automatic initial sync and our subsequent manual channelFullSync completed successfully with count: 0, with no product webhooks delivered.

Environment

  • API version: 2026-07

  • Development store: linkdrop-dev.myshopify.com

  • Channel ID: gid://shopify/Channel/176267001940

  • Publication ID: gid://shopify/Publication/176267001940

  • Feed ID: gid://shopify/ProductFeed/8678178900

  • Feed context: US / EN

Channel creation

  • channelCreate response: 2026-09-01T08:32:50.943Z

  • x-request-id: 3de64211-cfb8-49c4-ae75-2820be446c6a-1788251570

Automatic initial sync

  • metadata.fullSyncId: gid://shopify/ProductFullSync/86781789002354594564831556586

  • Webhook delivery ID: 0bcaf292-44a9-574e-9ce7-63a97a7c0e59

  • Created at: 2026-09-01T08:32:52.000Z

  • Finish triggered at: 2026-09-01T08:32:53.926Z

  • Status: completed

  • Count: 0

No corresponding full-sync product webhooks were delivered.

Manual channelFullSync

  • x-request-id: f0030e2a-a3b3-4a20-8ceb-1dd990468833-1788251575

  • Operation ID / metadata.fullSyncId: gid://shopify/ProductFullSync/867817890032334281994688331788251575

  • Webhook delivery ID: 24800fb4-c2b6-5436-913e-c78c3ba8d338

  • Created at: 2026-09-01T08:32:56.000Z

  • Finish triggered at: 2026-09-01T08:32:57.586Z

  • Status: completed

  • Count: 0

The syncs did not overlap. The automatic sync finished at 08:32:53.926Z, while our preflight inspection completed at 08:32:55.607Z and the manual sync was requested afterward.

We could not directly confirm publishedOnPublication because Shopify returned:

Access denied for publishedOnPublication field.

However, a channel query shortly after the syncs showed:

  • Active products in the store: 15

  • Channel.productsCount: 0

  • Products returned under Channel.products: 0

We made no product, market, publication, or app configuration changes during this reproduction.

Please let me know if you need any additional information or timestamps to investigate.

Thanks.

Thanks for rerunning this from a clean state and providing the identifiers - I was able to investigate a bit more closely this time round as a result.

The clean-state result points to channel publication eligibility rather than channelFullSync failing to execute.

Products must be published to the channel’s publication and be eligible for the feed’s country and language context. Being ACTIVE in the store, or published to a different channel, is not enough. The product publishing guide covers publication-specific visibility. For the next test, publish one ACTIVE product to the channel publication:

Choose an ACTIVE product, or use one that is already in your catalog.

query ActiveProductCandidate {
  products(
    first: 1
    query: "status:active"
    sortKey: UPDATED_AT
    reverse: true
  ) {
    nodes {
      id
      title
      status
    }
  }
}

If no product is already published to this channel, publish the selected product with publishablePublish. Use the publication ID returned by your channel setup.

mutation PublishProductToChannel($productId: ID!, $publicationId: ID!) {
  publishablePublish(
    id: $productId
    input: [{publicationId: $publicationId}]
  ) {
    publishable {
      ... on Product {
        id
        title
      }
    }
    userErrors {
      field
      message
    }
  }
}

Variables:

{
  "productId": "gid://shopify/Product/REPLACE_WITH_PRODUCT_ID",
  "publicationId": "gid://shopify/Publication/REPLACE_WITH_PUBLICATION_ID"
}

This mutation requires write_publications and read_products. If you do not want to change catalog data, skip it and use an existing product that is already published to the channel.

Immediately before the sync, verify the product’s publication and country context. Use the feed’s country value for country.

query VerifyProductEligibility(
  $productId: ID!
  $publicationId: ID!
  $country: CountryCode!
) {
  product(id: $productId) {
    id
    title
    status
    publishedOnPublication(publicationId: $publicationId)
    publishedInContext(context: {country: $country})
  }
}

Variables:

{
  "productId": "gid://shopify/Product/REPLACE_WITH_PRODUCT_ID",
  "publicationId": "gid://shopify/Publication/REPLACE_WITH_PUBLICATION_ID",
  "country": "US"
}

Both publication and context checks should be positive before the sync. Then confirm the channel count and run the sync for the same country and language.

query VerifyChannelCatalog($channelId: ID!) {
  channel(id: $channelId) {
    id
    productsCount {
      count
      precision
    }
    products(first: 10) {
      nodes {
        id
        title
        status
      }
    }
  }
}

mutation TriggerChannelFullSync(
  $channelId: ID!
  $country: CountryCode!
  $language: LanguageCode!
) {
  channelFullSync(
    channelId: $channelId
    country: $country
    language: $language
  ) {
    fullSyncTraceInfo {
      country
      language
      operationId
    }
    userErrors {
      message
    }
  }
}

Variables:

{
  "channelId": "gid://shopify/Channel/REPLACE_WITH_CHANNEL_ID",
  "country": "US",
  "language": "en"
}

If the sync still finishes with count: 0, share the new x-request-id, fullSyncId, and the pre-sync eligibility result - with those I can raise this with the relevant team internally. Thanks

Thanks for the detailed instructions. We repeated the test from a completely clean state and added the exact publishedOnPublication and publishedInContext checks you requested.

We removed the previous channel connection and confirmed that no connection, feed, product, variant, or webhook-event records remained locally. We then reconnected the development store, which created a fresh channel and feed. We did not change any product, market, publication, or channel configuration during the test.

We did not call publishablePublish because products were already published to the exact publication associated with the newly created channel, as your instructions indicated that this step could be skipped in that case.

Test details

  • API version: 2026-07
  • Development store: linkdrop-dev.myshopify.com
  • Channel ID: gid://shopify/Channel/176298786900
  • Publication ID: gid://shopify/Publication/176298786900
  • Product feed ID: gid://shopify/ProductFeed/8681717844
  • Feed context: US / en
  • channelCreate x-request-id: 1a4a67af-37bf-4028-ac2a-ccd3584efe6a-1788282983

The automatic initial sync completed first:

  • Full-sync ID: gid://shopify/ProductFullSync/8681717844773914816474312
  • Finish delivery ID: 41ec9971-4fa7-5231-b496-6419038f2724
  • Result: completed
  • Count: 0
  • Error: none

Immediately before requesting another full sync, we queried the exact publication and US context at 2026-09-01T17:16:28.990Z.

  • Publication/context x-request-id: 6856200c-af14-4200-a410-9ad3147995d1-1788282988
  • Product eligibility x-request-id: 42e4ffba-c749-48e2-8567-43807878eafa-1788282988
  • Channel.productsCount: 13
  • Publication includedProductsCount: 13
  • Active products inspected: 15
  • Products with publishedOnPublication: true: 13

Every one of those 13 publication members also returned:

publishedInContext(context: { country: US }): true

For example, The Collection Snowboard: Hydrogen returned both values as true, as did the other 12 products shown under Channel.products.

We then immediately called channelFullSync for the newly created channel:

  • channelFullSync x-request-id: 18fa4f23-c6cc-46a3-b9e1-ed05b22a0293-1788282989
  • Full-sync/operation ID: gid://shopify/ProductFullSync/8681717844184236463915222931788282989
  • Full-sync product delivery ID: 8003e5e3-c1a5-58bc-85c5-5b8a3b1a4e72
  • Finish delivery ID: 79a99eac-febf-5f7e-9f97-48856cd8bd8c
  • Result: completed
  • Count: 1
  • Error: none

That sync delivered only The Collection Snowboard: Hydrogen. The other 12 products were not delivered, even though immediately before the sync they were present under the channel, published to the exact publication, and eligible in the US context.

The automatic initial sync had already completed before the explicit sync was requested, so the two full-sync operations did not overlap. Continued observation after the explicit sync also showed the channel and publication remaining stable at 13 eligible products.

Hi @gurshanj, I appreciate you sharing the details from that latest test! We’re looking into this internally and I’ll follow up here once I have more info to share. Thanks!