Shopify Google Channel

Google Rejected the Page, Not the Feed: the Multi-Format Variant Trap

A book publisher on Shopify sells every title in three formats — print, ebook, audiobook. They excluded every digital edition from their Google Merchant Center data source, and the automated review kept rejecting their print listings. The feed was never the whole problem: Google reviews the landing page on the submitted URL, and on that page the ebook is still one click away in the same Add to Cart form. This is the dividing line, and the three documented routes out.

TL;DR: Google’s “Unsupported Shopping content” policy explicitly lists eBooks and digital books as content that cannot be promoted — so digital formats must stay out of Google’s surfaces. But excluding them from the feed is only half the job: Merchant Center’s automated review evaluates the landing page of the submitted URL, not just the data you submit. When ebook/audiobook exist as selectable, purchasable variants on the same product URL, the crawler sees an unsupported digital good offered for sale — and rejects the listing no matter how clean the feed is. The dividing line: mentioning “also available as ebook” in copy is allowed; offering the ebook as a purchasable variant on the submitted URL is not. Three routes out: split the formats into separate products (A), build a proxy page template that renders only physical variants using requires_shipping (B), and add GMC attribute rules with excluded_destination as feed hygiene (C) — necessary, but not a cure on its own.

This is part 1 of our Shopify Google Channel in production series. The demand evidence is a live Shopify Community thread (topic 658986, a field report we label as such throughout): a multi-format book publisher did the obvious feed-level fix, watched the rejections continue, and thirteen answers later there is still no accepted answer.

The problem

The OP, casacarlini, sells print + ebook + audiobook editions of every title. Digital editions are “a significant part of our business”, so removing them from the storefront is not an option. They used a feed management app to exclude every digital edition from the data source — the fix every feed tool advertises — and Google’s automated review kept flagging the physical book listings.

The diagnostic breakthrough came from a respondent (dropfeed) who actually audited the catalog: 423 of the store’s 480 products carry a single Format option with Audiobook, Ebook, Paperback and Hardcover as variants of one product. All four formats share one URL and one item group. That single structural fact explains why every feed-level fix failed.

Root cause: three documented facts, one collision

  1. Google’s Shopping policies don’t support ebooks. The “Unsupported Shopping content” policy lists “eBooks and digital books (not including audiobooks)” — PDFs, ePub, MOBI — as content that cannot be promoted. So the digital formats must stay out of Google’s surfaces. Fair enough.

  2. Google evaluates the landing page, not just the feed. The landing page requirements say that when your landing page contains multiple products “such as variants”, the product in your product data must be the primary focus, and the price shown must match your product data. The link attribute doc adds that you submit one link per product or product variant — and Google’s own structured data documentation shows that a variant is addressed by preselecting it through URL parameters (e.g. ?size=small&color=green).

  3. On the submitted URL, the ebook is still buyable. Because ebook and audiobook are variants of the same Shopify product, the print URL renders one Add to Cart form whose Format picker lets a shopper select — and purchase — a digital edition. The automated review crawls that URL and sees an unsupported digital good offered for sale on the landing page of a submitted offer.

The community thread converged on a precise formulation of the dividing line (field report, consistent with the policy pages above):

That is why filtering the feed changed nothing: the publisher had cleaned the data Google reads, but not the page Google visits. Preselecting the paperback variant (so the print price loads first) does not fix it either — the digital options are still one click away in the same form, still purchasable, on the same URL.

There is a second, quieter amplifier: structured data. If the product page emits JSON-LD offers for the digital variants (many themes and apps do), Google’s crawlers can read the ebook as an offer even where a human sees only a dropdown. Google’s Search Central documentation describes the ProductGroup pattern — hasVariant, variesBy, productGroupID — for pages whose variants belong to one parent product. Correct markup for a genuine multi-format page; a liability when some of those variants are unsupported content.

Minimal reproduction

You can reproduce the mechanics on a development store without touching Google at all — the failure is structural and visible in Liquid:

  1. Create one product, dune, with option Format: Paperback ($18, requires shipping), Ebook ($9, digital), Audiobook ($15, digital).
  2. Exclude the product (or the digital variants, if your feed app is variant-aware) from your Google feed by whatever method you like.
  3. Open the product URL with the paperback preselected: /products/dune?variant=<paperback_variant_id>.
  4. View source. The Add to Cart form posts a variant id, and the Format selector still contains all three options. Any crawler that renders or parses the page sees three purchasable offers — two of them digital — on the submitted URL.

Feed-side exclusion verified; landing-side exposure intact. Rejection reproduced in exactly the shape the merchant reported.

Route A — Split the formats into separate products (the structural fix)

Make print, ebook, and audiobook separate Shopify products. Publish only the print products to Google surfaces; keep the digital products on the storefront, linked from the print page (“Also available as ebook / audiobook”). The submitted print URL then offers only physical formats, which is exactly what passes review.

The publisher’s objection is real: this multiplies the catalog 3-4x (their words: “multiplying our catalog by 3x or 4x”). Mitigations exist but don’t eliminate the cost — bulk editors, metafield-driven cross-links, and for programmatic control the Admin GraphQL API (publicationCreate publishes a product to a channel; channel availability is product-level, and tags/metafields alone do not control sync).

Route B — Proxy page: a physical-only offer page per title (the theme fix)

Keep the variant structure. Create an alternate page template that renders only the physical variants of a given product, and submit those proxy URLs to Google.

Shopify theme architecture supports alternate templates: a template is assigned to a page, and Liquid templates give you full control over markup. Inside the template, pull the product with all_products['your-handle'] and filter variants by requires_shipping — true for physical goods, false for digital ones:

{%- comment -%} templates/page.print-proxy.liquid {%- endcomment -%}
{%- assign book = all_products['dune'] -%}

<h1>{{ book.title }} — Print edition</h1>

<form method="post" action="/cart/add">
  <label for="fmt">Format</label>
  <select id="fmt" name="id">
    {%- for variant in book.variants -%}
      {%- if variant.requires_shipping -%}
        <option value="{{ variant.id }}">
          {{ variant.title }} — {{ variant.price | money }}
        </option>
      {%- endif -%}
    {%- endfor -%}
  </select>
  <button type="submit">Add to cart</button>
</form>

What this buys you, mapped to the requirements:

Two documented constraints to respect:

The proxy route was proposed in the community thread (Maxime_StoreCanary, building on another contributor’s caution); the mechanics above are the documented Liquid pieces that make it work. It is more template work than Route A but preserves the catalog.

Route C — GMC attribute rules with excluded_destination (the feed-hygiene fix)

The thread’s feed-side answer (EmmanuelFlossie) is worth doing regardless of which structural route you pick. In Merchant Center, “feed rules” are now called attribute rules (Google renamed them; the attribute rules documentation page says so). Add a rule on your data source that sets excluded_destination when the title matches digital markers (e.g. “title contains ebook”), and exclude from Shopping ads, free listings, display, etc. The excluded_destination attribute is documented precisely for this: preventing a product from appearing in chosen destinations.

Understand what Route C does and does not do:

On the sync side: the Google & YouTube app syncs product data from Shopify to Merchant Center automatically or manually — whichever sync you use, attribute rules sit after the data arrives, which is why they catch strays that channel-side visibility settings miss.

Checklist

Where an agent fits

Choosing a route is a one-time architecture decision. The ongoing work is the hygiene loop around it: re-auditing the catalog as new titles are added (the 423/480 pattern crept in one product at a time), watching Merchant Center for fresh disapprovals, verifying that every submitted URL still renders only supported offers, and filing review requests with the evidence attached. That is a scheduled monitoring loop — exactly the kind of thing a store operations agent can own: check, compare against policy, flag the exception to a human with the receipts. We build ready-to-use agents for loops like this; if that’s the hole in your week, they’re worth a look.


Verified against Google’s official documentation (Unsupported Shopping content policy, landing page requirements, the link and excluded_destination attribute docs, attribute rules, product-variant structured data) and Shopify’s official documentation (Liquid all_products and variant objects, theme template architecture, Admin GraphQL publicationCreate, latest stable 2026-07) as of August 2026. Community thread content (the merchant’s catalog audit, the “purchasable variant” diagnosis, the proxy-page suggestion, the attribute-rules recipe) is a field report from Shopify Community topic 658986 and is labeled as such wherever it appears above.