DEV Community

Max
Max

Posted on • Originally published at storecanary.io

Shopify availability mismatch breaking your clients' feeds

TL;DR

  • Shopify inventory updates instantly; the Merchant Center feed does not. Drift between them silently suppresses products in Shopping with no alert in Shopify admin.
  • Three main triggers: scheduled feed fetches (not push-on-change), duplicate submissions from two competing apps, and theme JSON-LD that doesn't update when a variant sells out.
  • Fix: one feed source, push-on-change sync, and verified offers.availability updates in page schema after any theme or app change.

This is a bug your clients won't notice until it costs them revenue. Shopify's inventory count updates the instant a sale, restock, or manual edit happens. Google Merchant Center reads availability from a separate feed pipeline with its own update cadence. When the two drift, products either vanish from Shopping results (shown as out of stock when they're not) or keep appearing after selling out, burning impressions on a page that can't convert.

Neither system alerts you to the gap. Shopify admin shows inventory as healthy; Merchant Center shows a suppressed or disapproved listing that Shopify cannot see. This article covers the four mechanisms that cause the drift, how to detect it across a client's store, and the structural fix.

Why does Shopify availability diverge from the Merchant Center feed?

Shopify's inventory count is authoritative and updates instantly. Merchant Center reads from a separate feed pipeline with its own cadence. Four mechanisms cause the drift:

  • Scheduled fetches instead of push-on-change. Some feed setups pull a fresh file every 12 or 24 hours rather than pushing changes the moment inventory shifts. Between fetches, Google works from a snapshot that is already stale.
  • Two feed sources submitting the same product. Stores running both Shopify's native Google & YouTube channel app and a legacy or third-party feed app can submit the same product twice, with each app reporting different availability for the same GTIN.
  • Page JSON-LD contradicting the feed. Google cross-checks the feed's availability value against the offers.availability field in the live page's JSON-LD. If a theme caches that value, or a variant-level app updates the visible "Sold out" badge without touching the schema, the page and the feed tell Google conflicting things.
  • Variant-level stock not reflected at product level. A product where nine of ten variants are sold out can report availability inconsistently depending on which variant the feed treats as canonical, especially after a variant is deleted or reordered.

Why is this invisible in Shopify admin?

Shopify admin shows Shopify's own view only: current inventory, current variant status, current "Active" listing state. It has no visibility into what Merchant Center currently believes about that same product, because that belief lives on Google's side, driven by a feed pipeline Shopify doesn't monitor after handoff. A product can look perfectly healthy in Shopify admin while its Merchant Center listing is quietly suppressed or showing the wrong stock state. You only find out from Merchant Center's own diagnostics, if you check them.

What does the mismatch actually cost?

In-stock product showing as out of stock: Google's Shopping algorithm deprioritizes unavailable listings. The product effectively disappears from Shopping results even though it's fully sellable, with no error raised anywhere.

Out-of-stock product still showing as in stock: worse. You're spending impressions (and often ad budget) sending shoppers to a product they can't buy. A pattern of "available" listings that turn out unsellable is exactly what Google's misrepresentation policy targets. Repeated mismatches can escalate from a warning to an account-level suspension.

How do you check a client's store for this?

  1. In Google Merchant Center, open Products > Diagnostics and filter for availability-related warnings. This shows exactly which items Google currently considers mismatched.
  2. Pick five currently out-of-stock products and view each page source. Search for "availability" inside the JSON-LD block and confirm it reads OutOfStock, not InStock.
  3. If the store runs more than one sales-channel or feed app connected to Google, check Merchant Center's Apps and Products tabs for duplicate submissions of the same item under different feed sources.
  4. Check the feed's update frequency. Shopify's native Google & YouTube app pushes on inventory change, but a secondary feed app may be on a manual or scheduled sync. Confirm it isn't running on a 24-hour-or-longer delay for fast-moving SKUs.

This is the same category of failure as the redirect-to-homepage mismatch and the price mismatch trap: Merchant Center compares feed claims against the live page, and any gap in price, landing page, or availability gets treated as misrepresentation.

What is the structural fix?

  • Use a single feed source. If the store runs Shopify's native Google & YouTube channel alongside a separate feed app, pick one and disconnect the other. Duplicate submissions are the most common cause of contradictory availability for the same product.
  • Push on inventory change, not on a fixed schedule, especially for products that sell out quickly.
  • Confirm theme JSON-LD updates offers.availability on variant sellout, not just the visible "Sold out" label. The schema and the badge can drift independently.
  • Re-check after any theme or app update. A theme update or new inventory app is the single most common moment this breaks, because it touches the code that writes the schema.

Have you run into a case where a feed app and Shopify's native channel were both pushing to Merchant Center at the same time? What did the conflict look like in diagnostics?

The full version of this article — with screenshots and ongoing updates — lives on the StoreCanary blog.

Top comments (0)