CUROBI

How to get your subscription offer cited by AI

aeo
AI is citing Shopify subscription products: a Google AI Overview bubble recommending Shopify subscription products, connected to a Curobi Subscriptions store card rated 4.9 and to a Product JSON-LD snippet with an offers block below it

To be cited by an AI engine, a subscription offer has to exist as readable text and correct structured data on a page the engine can fetch — because none of the machine-readable product layers that describe Shopify stores to AI systems carries a recurring price. Shopify’s cross-merchant Global Catalog extension documents no selling-plan fields on its variant table, Shopify’s structured_data Liquid filter emits an offers block with a single price and no billing cycle, and OpenAI’s product feed specification has no recurring price field for a physical-goods subscription. The subscribe-and-save offer travels as prose or it does not travel.

That is the whole strategy, and it is much less exotic than the “AI SEO” market suggests. This article is about the specific version of it for a merchant selling on a recurring basis: what to publish, what schema is worth emitting, what you cannot control, and how to check.

For the mechanism underneath — how agentic channels work on Shopify, which of them can complete a checkout, and where a subscription sale actually lands — see can an AI agent buy your Shopify subscription. This piece assumes that answer and starts from what a merchant does about it.

What AEO means for a subscription merchant, concretely

Answer engine optimisation is the practice of making individual passages of a page extractable, quotable and attributable by an AI system. Classic SEO optimises a URL for a position in a list; AEO optimises a sentence for being lifted into a generated answer.

Classic SEOAEO, for a subscription merchant
Unit of valueThe pageThe sentence, the table row, the FAQ answer
What winsRanking, then a clickBeing quoted, named and linked inside the answer
The query“coffee subscription uk”“which roasters deliver fresh single-origin every two weeks under £20 and let me skip a month”
The failure modeThe page ranks below competitorsThe page ranks fine and says nothing quotable about the plan
The subscription-specific trapThe offer is assembled client-side, or explained on a landing page the buyer never reaches

The trap in the last row is the one that matters. A subscription business usually explains itself somewhere other than the product page: a “how it works” page, a quiz, an onboarding email, a widget that renders after load. Half of AI-referred sessions land straight on a product detail page — about 2.5 times the rate Shopify sees from traditional search, according to figures Shopify president Harley Finkelstein gave on the company’s Q2 2026 earnings call and reported by TechCrunch. An engine summarising that page can only use what the page says.

Why the recurring offer is missing from every machine-readable layer

The recurring offer is missing from every machine-readable layer: a Glow Serum product card showing "Subscribe & Save 20%" at $39.00 every month, with schema markup, Open Graph meta, Google Merchant Center and AI crawler layers each flagged "no recurrence data", and a result panel saying AI and search engines cannot surface, compare or recommend the offer

There are four layers that describe a Shopify product to an AI system. A subscription is absent, or nearly absent, from all four. Every field below was checked against the current documentation on 24 August 2026.

LayerWhat it isWhat it carries about a subscription
Global Catalog extensionCross-merchant discovery — the layer that decides which store an agent surfacesNothing in the documented variant fields. A requires.selling_plan boolean appears in the example response only
Storefront Catalog extensionSingle-merchant, once an agent is pointed at your storeA full selling_plans array — but “Only on get_product responses”, never in search
OpenAI product feedThe feed behind product discovery in ChatGPTNo recurring price field. subscription_cost exists only as a Google-compatible attribute for the zero-price mobile-device exception
structured_data filterThe JSON-LD a Shopify theme emits for a productoffers with availability, price, priceCurrency, url. No selling plan, no billing cycle

Three of those deserve a sentence of detail.

Global Catalog. Its documented variant fields are checkout_url, requires.shipping, requires.components, condition, eligible.native_checkout, availability.running_low and the seller identity fields. requires.selling_plan shows up in the published example response but is not in that table, and there is no selling_plans array anywhere in the extension. So in the layer where a shopper’s agent compares merchants, the most an engine can learn is that a purchase option exists — never its price, its cadence, or its discount.

Storefront Catalog. The field description is explicit: selling_plans is “Available purchase options (subscriptions). Only on get_product responses — use requires.selling_plan in search to detect availability.” Even inside your own store, an agent has to fetch one specific product before it discovers there is a subscription at all.

The ChatGPT feed. OpenAI’s product feed specification is a separate world from Shopify’s catalog, and it lands in the same place. The only subscription-shaped attribute in it, subscription_cost, appears in the Google-compatible feed-mapping section, where the spec states that a zero price “passes validation only for supported mobile-device categories with a valid subscription_cost”. That is a phone-plan field. There is no way to express “£18 every four weeks” for a bag of coffee.

The consequence. Your subscription offer is a fact about your business that the product-data pipeline is not built to carry. Every AI system that knows the offer learned it from your page.

That is the asymmetry to design around, and it is not something an app can fix for you. No subscription app can write a field into Shopify’s Global Catalog that Shopify has not defined.

Google’s own guidance sets the priority

Google's own guidance sets the priority: a robot holding a magnifying glass beside a card headed "Follow Google's Guidance" listing helpful, reliable, people-first, experience and structured data, above a Curobi nameplate

Before spending a day on markup, read what Google says about its AI surfaces. Its AI features documentation states: “There are no additional requirements to appear in AI Overviews or AI Mode, nor other special optimizations necessary,” and “You don’t need to create new machine readable files, AI text files, or markup to appear in these features.” What it does ask for is that “important content is available in textual form,” with the ordinary nosnippet, data-nosnippet, max-snippet and noindex controls available to limit what is shown.

Two things follow. First, most of the “AEO” product category sells work Google explicitly says is unnecessary. Second, and more usefully, the requirement that important content exist as text is precisely the requirement a subscription offer usually fails.

The six facts a subscription page must state in text

These are the facts an answer engine needs in order to describe your plan correctly, and an agent needs in order to decide it is a match. Each should appear as a complete sentence in server-rendered HTML — not only inside a purchase-option widget, and not only in an image or a PDF.

  1. The recurring price and what it buys. “£18 per delivery for a 250g bag,” not “from £18.”
  2. The cadence in plain words, and how many deliveries a year it produces. “Every four weeks — thirteen deliveries a year,” because every four weeks and monthly are different products and an engine will otherwise call them the same thing.
  3. What arrives, and whether it changes. A fixed product, a rotating selection, or a customer-chosen box. This is the single most common thing summarised wrongly.
  4. The commitment. Minimum cycles, prepaid term length, and what happens at the end of a prepaid subscription — renew, lapse, or convert.
  5. How to skip, pause, change or cancel, in one sentence. Not a link to a policy page. This is the fact a shopper most often asks an assistant before subscribing.
  6. Where you ship, and what shipping costs on a recurring order. Global Catalog filters searches by ships_to country, so shipping scope is a discovery input, not a footnote.

Write each so it survives being quoted alone. “Cancel anytime from your account” is quotable; “you can cancel it whenever you like” is not, because it has no antecedent once the sentence is lifted out.

Structured data that actually helps a recurring offer

Shopify’s theme filter emits a Product or ProductGroup with a single price. To describe a recurring price, schema.org gives you UnitPriceSpecification, whose billingDuration property “Specifies for how long this price (or price component) will be billed” and whose billingIncrement “specifies the minimal quantity and rounding increment that will be the basis for the billing.”

"offers": {
  "@type": "Offer",
  "priceCurrency": "GBP",
  "priceSpecification": {
    "@type": "UnitPriceSpecification",
    "price": 18.00,
    "priceCurrency": "GBP",
    "billingDuration": 4,
    "billingIncrement": 1,
    "unitText": "week"
  }
}

Be honest with yourself about what that buys. Google’s merchant listing documentation uses UnitPriceSpecification for the active price and the strikethrough price via priceType, and documents no recurring-billing properties at all. So this markup produces no documented rich result. Its value is that a system parsing your page finds the billing cycle stated rather than implied by the phrase subscribe and save — which is the same reason to emit it as to write the sentence in the first place.

Two rules keep this side honest. Emit FAQPage only where the questions and answers are visible on the page, word for word. And never mark up a price the page does not show — a schema price that disagrees with the rendered price is the fastest way to teach an engine a wrong fact about your store, and engines cross-check.

What gets a page cited: the patterns we run on this site

Curobi’s own site is built to this standard, and the useful part is the mistakes rather than the wins. Three patterns have earned their place.

Generate facts; never retype them. An audit of this site found two wrong facts in the hand-written llms.txt — a dead app-store URL and a founding year that contradicted the organisation schema — and zero wrong facts in the generated llms-full.txt, which renders from the same FAQ data file the human-facing FAQ page renders from. The file has since been converted to a generated endpoint. The lesson generalises directly to a store: if your subscription price lives in the theme, in a metafield, in an FAQ page and in a marketing landing page as four separately-typed strings, one of them is already wrong, and an engine that finds the disagreement has a reason to trust none of them.

Write every answer to stand alone. The rule sits in the header of the file that holds the FAQ data, next to the data, which is why it has held: each answer must be complete and correct when lifted without the surrounding page. A subscription page fails this constantly — “it ships every two weeks” is meaningless without knowing what it is.

Give each term one definition and reuse it everywhere. A glossary entry whose first sentence defines the term, and which reuses that same sentence as the meta description and in the DefinedTerm markup, gives three surfaces one fact and no room for drift. Definitional pages get cited well above their traffic weight — selling plan is a query an engine answers rather than sends a click for.

One honest caveat, because this is where AEO advice usually oversells: speakable markup is not a confirmed selection signal outside Google’s narrow news programme, and we cannot publish a number showing any of this increased citations, because no engine reports one. What we can say is that every item above also makes the page correct for a human, which is the only version of this work that cannot be wasted.

What you control, and what you cannot

What you control, and what you cannot: a subscriber adjusting a coffee subscription on screen — quantity, a "deliver every 4 weeks" cadence slider and a next delivery date of May 28 — with Pause, Skip and Cancel toggles and a swap-product card branching off it

LayerCan you influence it?How
Product page textFullyWrite the six facts as server-rendered sentences
Product JSON-LDFullyAdd recurring price markup the theme filter does not emit
Channel eligibilityYesB2B-only, password-protected and unlisted products are excluded from AI channels
Taxonomy categoryYesGlobal Catalog filters by taxonomy category GID; a miscategorised product is filtered out
Review count and ratingIndirectlyGlobal Catalog filters by a minimum rating and a minimum review count on the variant
Inferred product attributesIndirectlyShopify generates them from your product data and warns they are “discovery and merchandising signals, not merchant-authored source text”
Relative price tierIndirectlyGlobal Catalog has a price_tier filter of low, medium or high, computed relative to the product’s category
Selling-plan fields in discoveryNoThe fields do not exist. Nothing you or an app can do creates them

Three of those need working through.

Reviews are a discovery gate, not just social proof. The rating filter matches products with at least one variant meeting both a minimum rating and a minimum review count — Shopify’s own example asks for 4.5 with at least ten reviews. Reviews attached to the exact product an agent finds are what clear that bar; a store-level average does not.

Your one-time price is the number being compared. Since the discovery layer carries a price but no selling-plan adjustment, an offer built as “first bag 30% off, then £18” is being compared on the £18. That is our reading of the field list rather than something Shopify states, but it follows from what the fields are: the discount that makes your subscription attractive is not in the comparison.

Prepaid plans price themselves out of the tier they belong in. A six-month prepaid plan listed as a single £108 product sits in a different relative price tier from a £18 per-delivery plan, inside the same category. Again our interpretation, not a documented behaviour — but if prepaid is your main offer, publishing a per-delivery entry point as well is cheap insurance, and prepaid and pay-as-you-go plans answer different buying intents anyway.

How to audit what an AI engine can read about your subscription

How to audit what an AI engine can read about your subscription: a magnifying glass over a web page mock-up headed "Audit what AI can read", with Crawlable, Structured and Readable check cards on the left, an AI robot tile and an "AI scan" badge

Eight steps, in the order we would do them. This is a diagnostic, not a project — most stores finish it in an afternoon.

  1. Read your product page with JavaScript switched off. Disable JavaScript, or fetch the URL with curl, and write down which of the six facts survive. Anything that vanishes is invisible to a system reading the HTML.
  2. Open your own agent-facing files. Visit /agents.md on your storefront, plus the /llms.txt and /llms-full.txt URLs that mirror it. Shopify manages this file by default; read what it says about you before deciding whether you need to change anything.
  3. Inspect the product JSON-LD. Run the product URL through a structured-data validator and read the offers block. If a billing cycle is not there, nothing reading your page can infer it.
  4. Confirm the product is eligible for AI channels. Products published only to B2B markets, hidden behind a password or customer login, or marked unlisted are excluded from AI channel discovery.
  5. Check the taxonomy category and attributes. Global Catalog filters by taxonomy category GID, and its filterable attributes are only Color, Size and Target gender — so grind, roast level and origin will never be a filter, and belong in your text.
  6. Check the review count on the exact product an agent would find. The rating filter has a minimum-count threshold; product-level reviews clear it, store-level averages do not.
  7. Run a fixed query set through the engines and record what comes back. Ask ChatGPT, Google AI Mode, Perplexity and Claude what a customer would ask. Record whether you appear and whether the price, cadence and cancellation terms are right.
  8. Confirm the crawlers are fetching you. Look in your hosting logs for OAI-SearchBot, ChatGPT-User, PerplexityBot, Claude-SearchBot and Bingbot. Live-retrieval fetches are the earliest evidence that any of this is reaching an answer.

Step seven is the one to keep doing. When an engine states your price or cadence wrongly, that is not noise — it is a defect with a source page, and it is fixable.

What is not solvable yet

Say this plainly, because the alternative is buying a solution to it.

  • You cannot put your selling plan into cross-merchant discovery. The field does not exist in Shopify’s Global Catalog extension. No app, agency or schema can add it.
  • You cannot markup your way into AI Overviews. Google says there are no additional requirements and no special optimisations for its AI surfaces.
  • You cannot attribute a citation. There is no reporting surface that tells you your store was named in an answer. Referral data captures only the sessions that clicked.
  • You cannot verify how engines weight third-party mentions. Getting listed and reviewed elsewhere is a reasonable operating assumption — engines can corroborate what others say about you — but nobody outside those companies can quantify it, and anyone selling you a number for it is guessing.
  • You cannot fix this once. Shopify’s catalog extensions carry a version date, and this one is 2026-04-08. Re-read the field tables before you rely on anything here.

How Curobi thinks about this

Curobi builds a Shopify subscription app, so read this as a vendor describing its own constraints rather than neutral advice.

The practical implication of everything above is a design constraint rather than a feature: whatever renders your subscription offer has to put the offer into the page, in text, at render time. A subscription widget built from Shopify app blocks is part of the theme’s own output for exactly that reason — the same reason it matters for conversion and for accessibility. An offer that only exists after a third-party script executes is an offer no answer engine, crawler or agent can quote.

What we will not claim is that installing a subscription app makes you visible to AI. Nobody’s app does that, because the field that would carry a selling plan into cross-merchant discovery does not exist. The work in this article is yours, and most of it is writing.

Frequently asked questions

What is AEO, and how is it different from SEO for a Shopify store?

Answer engine optimisation is the practice of making a page’s individual passages extractable and quotable by an AI system, where classic SEO aims to rank a whole URL in a list of links. The unit of value is different: SEO succeeds when a page reaches the top of a results page and earns a click, AEO succeeds when a sentence, table row or FAQ answer from that page is lifted into a generated answer and attributed to your store. For a Shopify subscription merchant the practical difference is that a subscribe-and-save offer assembled by JavaScript, or explained on a landing page the buyer never reaches, can rank perfectly well and still be uncitable, because there is no self-contained sentence anywhere on the product page that states what the plan costs, how often it ships and how it is cancelled.

Do AI search engines and shopping agents see my subscribe-and-save price?

Not in the layers that decide which stores get shown. Shopify’s Storefront Catalog extension, which an agent uses once it is already pointed at one merchant, exposes a selling_plans array on each variant — but only on get_product responses, not in search. Shopify’s Global Catalog extension, the cross-merchant discovery surface, documents no selling-plan fields on its variant table at all; a requires.selling_plan boolean appears in its example response, and even that only says a plan exists, never what it costs or how often it ships. OpenAI’s product feed specification for ChatGPT has no recurring price field either — its only subscription-shaped attribute, subscription_cost, is a Google-compatible field the spec describes solely for the zero-price exception that applies to mobile-device categories. The recurring price reaches an AI system through the text and structured data on your own pages, or it does not reach it at all.

Does an llms.txt file help my Shopify store get cited by AI?

Not on Google, by Google’s own statement, and on Shopify it is probably not your file to write. Google’s documentation on AI features says there are no additional requirements to appear in AI Overviews or AI Mode and that you do not need to create new machine readable files, AI text files, or markup to appear in these features. Separately, Shopify manages an agents.md file for every store by default and serves /llms.txt and /llms-full.txt as alternate URLs mirroring it, so the file most merchants would go looking to write already exists and is maintained by the platform. Overriding it with an agents.md.liquid template is something Shopify advises doing only for advanced requirements the managed file does not cover. The time is better spent on the product page text an engine actually quotes.

What structured data should a subscription product page carry?

Product or ProductGroup with a correct Offer, plus a priceSpecification using schema.org UnitPriceSpecification with billingDuration and billingIncrement to express the recurring cycle, and FAQPage markup only where the questions and answers are visible on the page. Be clear about what that buys: Google’s merchant listing documentation uses UnitPriceSpecification for the active and strikethrough price and documents no recurring-billing properties, so billingDuration is valid schema.org that no documented Google rich result consumes. Its value is that it states the billing cycle in machine-readable form for any system reading the page, instead of leaving it implied by the words subscribe and save. Shopify’s own structured_data Liquid filter emits Product or ProductGroup with an offers block carrying availability, price, priceCurrency and url, and nothing about selling plans, so anything recurring is an addition you or your app makes.

How do I tell whether AI engines are citing my store?

There is no console for it, so use three proxies together. First, check your server logs for requests from the live-retrieval crawlers — OAI-SearchBot, ChatGPT-User, PerplexityBot, Perplexity-User, Claude-SearchBot and DuckAssistBot — which confirms your pages are being fetched at answer time rather than only being indexed. Second, watch analytics referrals from assistant domains, which captures the sessions that convert. Third, run a fixed set of queries through each engine once a month, record whether your store appears and whether the facts it repeats about your subscription are correct, then trace any wrong fact back to the page that taught it. The third one is the most useful, because a wrong price or cadence in an AI answer is a defect you can fix at the source.

Every field, quotation and limitation described here was checked against Shopify’s developer documentation, OpenAI’s product feed specification, Google Search’s AI features and merchant listing documentation, and schema.org on 24 August 2026. Catalog extensions are versioned — Shopify’s Global Catalog extension is at version 2026-04-08 — so re-read the field tables before relying on any of this in a quarter’s time.

  • Share: