Schema Markup for Subscription Products: What Most Stores Miss
When a potential subscriber searches Google for a product you sell, structured data determines whether they see a bare blue link or a rich result with pricing, review stars, and a subscription badge. The difference in click-through rate between the two can be 20–30%. Despite that, most Shopify subscription stores either implement no structured data at all, or implement it in a way that fails Google's validation and earns nothing.
This guide covers the four schema types that matter most for subscription product pages, with complete JSON-LD examples you can adapt, plus how to test your markup and what rich results you can realistically expect to earn.
Product schema with subscription attributes
The most impactful schema for any subscription store is Product combined with an Offer that describes your subscription pricing. Google can use this to show a product card in search results with your subscribe-and-save price, a recurring billing indicator, and availability status.
The two properties most stores omit are priceSpecification (required to describe subscription pricing accurately) and hasMerchantReturnPolicy (which Google increasingly rewards). Both are straightforward to add.
product-schema.json
{
"@context": "https://schema.org",
"@type": "Product",
/* ── Core product identity ── */
"name": "Premium Omega-3 Fish Oil — 90 Capsules",
"description": "Wild-caught omega-3 fish oil, 1000mg per capsule. Subscribe and save 15%.",
"sku": "FO-90-001",
"brand": {
"@type": "Brand",
"name": "Your Store Name"
},
"image": [
"https://yourstore.com/products/fish-oil-90-front.jpg",
"https://yourstore.com/products/fish-oil-90-angle.jpg"
],
/* ── Reviews (required for star rating in results) ── */
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"reviewCount": "312"
},
"offers": {
"@type": "Offer",
"url": "https://yourstore.com/products/fish-oil-90",
"priceCurrency": "USD",
/* ── Subscription price (not one-time price) ── */
"price": "24.99", /* highlighted: subscription price */
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition",
/* ── Subscription billing spec ── */
"priceSpecification": {
"@type": "UnitPriceSpecification",
"price": "24.99",
"priceCurrency": "USD",
"billingDuration": { /* highlighted: billing interval */
"@type": "QuantitativeValue",
"value": "1",
"unitCode": "MON" /* MON = monthly, WEE = weekly */
},
"billingIncrement": 1,
"referenceQuantity": {
"@type": "QuantitativeValue",
"value": "1",
"unitCode": "C62"
}
},
/* ── Return policy ── */
"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"applicableCountry": "US",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"merchantReturnDays": 30,
"returnMethod": "https://schema.org/ReturnByMail",
"returnFees": "https://schema.org/FreeReturn"
}
}
}
Key point
Use your subscription price in the price field, not the one-time price. Google displays whatever value is in the schema — if it doesn't match the price a subscriber pays, your listing may fail manual review and lose the rich result.
FAQ schema
FAQ schema earns expandable question-and-answer dropdowns directly in Google's search results — no click required. For subscription products, the questions that perform best mirror what hesitant subscribers actually ask before committing: cancellation, delivery frequency, and what happens if they skip.
Keep answers concise (under 300 characters) and factual. Google will truncate long answers in the rich result, and verbose markup is more likely to be manually reviewed and rejected.
faq-schema.json
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "How often will I receive my order?", /* highlighted: frequency question */
"acceptedAnswer": {
"@type": "Answer",
"text": "Deliveries arrive on your chosen schedule — every 4 weeks, 6 weeks, or 2 months. You can change your frequency any time from your account portal."
}
},
{
"@type": "Question",
"name": "Can I cancel my subscription at any time?", /* highlighted: cancellation question */
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. There are no contracts or minimum terms. Cancel any time from your account portal, with no fees or penalties. Cancellations made before your next order date take effect immediately."
}
},
{
"@type": "Question",
"name": "Can I skip a delivery?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. Log in to your account portal and skip any upcoming order at least 24 hours before it is due to process. Skipped orders are not charged."
}
},
{
"@type": "Question",
"name": "What discount do I get as a subscriber?", /* highlighted: discount question */
"acceptedAnswer": {
"@type": "Answer",
"text": "Subscribers save 15% on every order compared to the one-time purchase price. The discount is applied automatically and shown at checkout before you confirm your first order."
}
}
]
}
Add this FAQ schema to every subscription product page. The questions do not need to be physically visible on the page — Google accepts FAQ schema whether the content is in an accordion, a hidden section, or only in the structured data. That said, keeping the answers consistent with what is visible on the page is best practice and protects against manual action.
Organization schema
Organization schema establishes your brand identity with Google — your logo, contact details, social profiles, and site sitelinks. It contributes to the knowledge panel that can appear when someone searches your brand name directly. This is typically placed once, on the homepage, rather than on every page.
If you are using Zerglo for your subscription infrastructure, this schema is already present on your homepage. If you are setting it up yourself, the minimum viable version looks like this:
organization-schema.json
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Your Store Name",
"url": "https://yourstore.com",
"logo": "https://yourstore.com/logo.png", /* highlighted: logo must be 112×112px minimum */
"contactPoint": {
"@type": "ContactPoint",
"contactType": "customer service",
"email": "[email protected]",
"availableLanguage": "English"
},
/* ── Social profiles (helps Google entity disambiguation) ── */
"sameAs": [ /* highlighted: include all active profiles */
"https://www.instagram.com/yourstorehandle",
"https://www.facebook.com/yourstorepage",
"https://twitter.com/yourstorehandle"
]
}
The sameAs array is the most commonly omitted property. It helps Google connect your schema to your social presence, which strengthens the brand knowledge panel and improves disambiguation for stores with common names.
Testing your markup
Google's Rich Results Test validates your structured data against Google's own parser. Paste a URL or raw JSON-LD to see which rich result types your markup is eligible for, and any errors or warnings blocking eligibility.
The validation errors we encounter most often on subscription stores:
Missing required field: offers
Product schema without an Offer node is valid JSON-LD but does not qualify for product rich results. The Offer, including a price and priceCurrency, is mandatory.
Price mismatch
The price in your schema does not match what the Google crawler sees rendered on the page. This often happens when the subscription price is injected via JavaScript after the page loads — Google's crawler may not execute the JS, reading the one-time price from the DOM instead.
Invalid availability value
The availability property must be a full schema.org URL: https://schema.org/InStock. Shorthand values like "InStock" without the namespace will fail validation.
FAQ answers too promotional
Google's quality guidelines prohibit FAQ answers that are primarily promotional rather than informational. Answers that read as advertising copy rather than factual responses to a question risk manual action and rich result removal.
After fixing errors, use Google Search Console's URL Inspection tool to request re-indexing. Rich results typically appear within one to two crawl cycles — usually three to seven days for an active store.
What rich results you can earn
Implement the schema above correctly and you become eligible for four distinct rich result types in Google Search:
Product cards
A visual product listing in the Shopping section of search results, showing your product image, name, subscription price, review stars, and store name. Product cards appear for both organic and paid placements and have significantly higher click-through rates than standard blue links for product searches.
FAQ dropdowns
Expandable question-and-answer pairs shown directly beneath your search result listing. Each expanded FAQ answer links back to your page. This expands your search result footprint significantly — a standard result with four FAQ items can occupy four to five times the vertical space of a plain listing, pushing competing results further down the page.
Breadcrumbs
Your site's navigation hierarchy shown in the search result URL line — e.g. yourstore.com › Shop › Supplements › Fish Oil. Breadcrumbs make your result look more navigable and trustworthy, and are straightforward to implement with BreadcrumbList schema on each page.
Review stars
Star ratings shown inline in organic search results, pulled from your aggregateRating property. Review stars are the single highest-impact visual element for increasing organic click-through rate on product searches — but they require a legitimate review count (Google sets a minimum) and the rating must reflect actual customer reviews, not self-assigned values.
The SEO impact of getting this right
Structured data is not a direct ranking factor — Google has been explicit about this. What it is, is a click-through rate multiplier. A subscription product page that earns review stars, a product card, and FAQ dropdowns will consistently outperform an identical page without rich results, even when both rank in the same position. Over time, the higher click-through rate feeds into Google's behavioral signals and can contribute to improved ranking indirectly.
The implementation cost is low. The JSON-LD examples in this guide are complete — adapt the field values for your products, embed them in a <script type="application/ld+json"> tag in the <head> of each relevant page, validate with the Rich Results Test, and you're done. For a Shopify store, this is typically a theme code change that takes under an hour.
Most subscription stores that come to Zerglo have no structured data, or have the basic Product schema from their theme with no subscription-specific attributes. Fixing this is one of the quickest wins available in subscription SEO — and one of the few areas where an hour of implementation work can generate measurable organic traffic improvements within weeks, not months.