How to get your subscription offer cited by AI

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 SEO | AEO, for a subscription merchant | |
|---|---|---|
| Unit of value | The page | The sentence, the table row, the FAQ answer |
| What wins | Ranking, then a click | Being 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 mode | The page ranks below competitors | The page ranks fine and says nothing quotable about the plan |
| The subscription-specific trap | — | The 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

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.
| Layer | What it is | What it carries about a subscription |
|---|---|---|
| Global Catalog extension | Cross-merchant discovery — the layer that decides which store an agent surfaces | Nothing in the documented variant fields. A requires.selling_plan boolean appears in the example response only |
| Storefront Catalog extension | Single-merchant, once an agent is pointed at your store | A full selling_plans array — but “Only on get_product responses”, never in search |
| OpenAI product feed | The feed behind product discovery in ChatGPT | No recurring price field. subscription_cost exists only as a Google-compatible attribute for the zero-price mobile-device exception |
structured_data filter | The JSON-LD a Shopify theme emits for a product | offers 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

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.
- The recurring price and what it buys. “£18 per delivery for a 250g bag,” not “from £18.”
- 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.
- 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.
- The commitment. Minimum cycles, prepaid term length, and what happens at the end of a prepaid subscription — renew, lapse, or convert.
- 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.
- Where you ship, and what shipping costs on a recurring order. Global Catalog filters searches by
ships_tocountry, 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

| Layer | Can you influence it? | How |
|---|---|---|
| Product page text | Fully | Write the six facts as server-rendered sentences |
| Product JSON-LD | Fully | Add recurring price markup the theme filter does not emit |
| Channel eligibility | Yes | B2B-only, password-protected and unlisted products are excluded from AI channels |
| Taxonomy category | Yes | Global Catalog filters by taxonomy category GID; a miscategorised product is filtered out |
| Review count and rating | Indirectly | Global Catalog filters by a minimum rating and a minimum review count on the variant |
| Inferred product attributes | Indirectly | Shopify generates them from your product data and warns they are “discovery and merchandising signals, not merchant-authored source text” |
| Relative price tier | Indirectly | Global Catalog has a price_tier filter of low, medium or high, computed relative to the product’s category |
| Selling-plan fields in discovery | No | The 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

Eight steps, in the order we would do them. This is a diagnostic, not a project — most stores finish it in an afternoon.
- 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. - Open your own agent-facing files. Visit
/agents.mdon your storefront, plus the/llms.txtand/llms-full.txtURLs that mirror it. Shopify manages this file by default; read what it says about you before deciding whether you need to change anything. - Inspect the product JSON-LD. Run the product URL through a structured-data validator and read the
offersblock. If a billing cycle is not there, nothing reading your page can infer it. - 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.
- 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.
- 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.
- 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.
- Confirm the crawlers are fetching you. Look in your hosting logs for
OAI-SearchBot,ChatGPT-User,PerplexityBot,Claude-SearchBotandBingbot. 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.
Related reading
- Can an AI agent buy your Shopify subscription? — the mechanism underneath this article: the channels, the checkout limits, and where a subscription sale completes
- Shopify subscription analytics: what to measure, and how to calculate it — including how to report a new traffic source without corrupting your churn baseline
- How to raise subscription prices without losing subscribers — because the price you publish to machines is the price you have to keep consistent everywhere
- How to run a coffee subscription on Shopify — the operator guide beneath the merchandising decisions here
- Selling plan — the Shopify object that carries your recurring offer, and the one discovery cannot see
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.







