Key Takeaways
- Offer Schema makes pricing machine-readable so AI can accurately compare products, recommend within budgets, and cite specific prices
- Nested inside Product Schema as the
offersproperty -- always implement together - Use Offer for single fixed-price items and AggregateOffer for price ranges across configurations
- Required properties:
price,priceCurrency, andavailability-- without these, the offer is incomplete - For SaaS with multiple tiers, use an array of Offer objects (one per tier) rather than a single AggregateOffer for better AI granularity
- Keep pricing Schema synchronized with visible page content -- mismatches trigger Google penalties and erode AI trust
Is your pricing visible to AI? Check your AI visibility for free -- no signup required, results in 60 seconds.
Table of Contents
What Is Offer Schema?
Offer Schema is a schema.org structured data type that describes the commercial terms under which a product or service is available for purchase. It specifies the price, currency, availability status, seller, condition (new, used, refurbished), and the time period during which the offer is valid. Offer Schema is typically nested inside Product Schema as the offers property, creating a complete machine-readable profile of both the product and its pricing.
The relationship between Product and Offer Schema is this: Product Schema describes what something is, while Offer Schema describes how to buy it. A single product can have multiple offers -- different sellers, different conditions, different pricing tiers -- each represented by its own Offer object.
For AI SEO, Offer Schema is critical because price-related queries are among the most common product questions directed at AI assistants. When a user asks "How much does [product] cost?" or "Best [product type] under $100," the AI needs structured pricing data to provide an accurate, citable answer. For background on structured data formats, see our JSON-LD basics guide.
Why Pricing Schema Matters for AI
Price is one of the most frequently requested data points in AI product queries. AI models need reliable, structured pricing information to answer three types of questions accurately.
Type 1: Direct price queries
"How much does Slack cost?" -- AI needs the exact price and tier structure to provide a correct answer.
Type 2: Budget-constrained recommendations
"Best project management tool under $20/month" -- AI must filter products by price, requiring machine-readable pricing data from multiple sources.
Type 3: Price comparisons
"Is Monday.com cheaper than Asana?" -- AI must extract and compare prices from two different sources, making structured pricing essential for accuracy.
Without Offer Schema, AI extracts prices from page text -- a process prone to errors. A page might mention a promotional price, a crossed-out original price, and a per-user price all in the same paragraph. Offer Schema removes this ambiguity by explicitly defining which price is the current offer.
For more on making pricing accessible to AI agents and automated buyers, see our guide on machine-readable pricing for AI agents.
Offer Schema: Complete Implementation
Here is a complete Offer Schema nested inside Product Schema:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "AImetrico Pro",
"offers": {
"@type": "Offer",
"url": "https://aimetrico.com/pricing",
"price": "99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"priceValidUntil": "2026-12-31",
"itemCondition": "https://schema.org/NewCondition",
"seller": {
"@type": "Organization",
"name": "AImetrico"
}
}
}
Property reference
| Property | Required | Description |
|---|---|---|
| price | Yes | Numeric price value (no currency symbols) |
| priceCurrency | Yes | ISO 4217 currency code (USD, EUR, GBP) |
| availability | Yes | Stock status URL from schema.org |
| url | Recommended | Direct link to the purchase page |
| priceValidUntil | Recommended | Date the price expires (ISO 8601) |
| itemCondition | Recommended | NewCondition, UsedCondition, RefurbishedCondition |
| seller | Recommended | Organization or Person selling the product |
AggregateOffer: Price Ranges
AggregateOffer is used when a product's price varies across configurations, sizes, or sellers. Instead of specifying a single price, AggregateOffer provides a price range with the lowest and highest values.
{
"@type": "Product",
"name": "AImetrico Platform",
"offers": {
"@type": "AggregateOffer",
"lowPrice": "0",
"highPrice": "299",
"priceCurrency": "USD",
"offerCount": "4",
"availability": "https://schema.org/InStock",
"offers": [
{
"@type": "Offer",
"name": "Free",
"price": "0",
"priceCurrency": "USD"
},
{
"@type": "Offer",
"name": "Starter",
"price": "49",
"priceCurrency": "USD"
},
{
"@type": "Offer",
"name": "Pro",
"price": "99",
"priceCurrency": "USD"
},
{
"@type": "Offer",
"name": "Enterprise",
"price": "299",
"priceCurrency": "USD"
}
]
}
}
When to use AggregateOffer vs. multiple Offers
- AggregateOffer with nested Offers -- Best for pricing pages with multiple tiers (SaaS, subscription services)
- Single Offer -- Best for products with one fixed price
- Multiple Offer objects (without AggregateOffer wrapper) -- Best when offers come from different sellers or represent different conditions (new vs. used)
SaaS and Subscription Pricing
SaaS pricing presents unique challenges for structured data because pricing is typically per-user-per-month with multiple tiers and optional annual billing discounts.
Best practices for SaaS Offer Schema
- Create one Offer per tier -- Starter, Pro, Enterprise each get their own Offer object
- Use the monthly price as the default
pricevalue -- this is what users most commonly query - Include annual pricing as a separate offer if it differs significantly from monthly
- Specify the billing period using the
billingPeriodproperty or include it in the offer name - Mark free tiers explicitly with
price: "0"-- AI models recommend free tools frequently
Example: SaaS pricing with annual discount
"offers": [
{
"@type": "Offer",
"name": "Pro Monthly",
"price": "99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
},
{
"@type": "Offer",
"name": "Pro Annual",
"price": "79",
"priceCurrency": "USD",
"description": "Billed annually at $948/year",
"availability": "https://schema.org/InStock"
}
]
Availability Values and Their Meaning
The availability property communicates stock status to both search engines and AI models. Use the correct value to prevent AI from recommending unavailable products.
| Value | URL | Meaning | |---|---|---| | InStock | https://schema.org/InStock | Available for immediate purchase | | OutOfStock | https://schema.org/OutOfStock | Currently unavailable | | PreOrder | https://schema.org/PreOrder | Not yet released, accepting advance orders | | BackOrder | https://schema.org/BackOrder | Temporarily out, accepting orders for later fulfillment | | Discontinued | https://schema.org/Discontinued | No longer sold | | SoldOut | https://schema.org/SoldOut | Permanently sold out | | OnlineOnly | https://schema.org/OnlineOnly | Available only through online channels | | LimitedAvailability | https://schema.org/LimitedAvailability | Low stock or limited quantities |
For SaaS and digital products, use InStock for active plans and Discontinued for deprecated plans.
Common Pricing Schema Mistakes
-
Price-content mismatch -- The Schema price differs from the visible page price. This triggers Google rich result removal and makes AI citations inaccurate. Automate synchronization between your pricing database and Schema output.
-
Missing currency code --
"price": "99"without"priceCurrency": "USD"is ambiguous. Always include the ISO 4217 currency code. -
Including currency symbols in the price -- Write
"price": "99", not"price": "$99". The price field is numeric; the currency is specified separately. -
Expired
priceValidUntildates -- An expired validity date tells AI the pricing is outdated. Either update the date or remove the property. -
No availability for out-of-stock products -- Removing Offer Schema when a product is out of stock is wrong. Instead, keep the Schema with
availability: OutOfStock. This tells AI the product exists but is currently unavailable. -
Single AggregateOffer without tier details --
"lowPrice": "0", "highPrice": "299"gives AI a range but no detail about what each tier includes. Nest individual Offer objects inside AggregateOffer for granular data.
For validation, use the tools in our testing structured data guide.
Frequently Asked Questions
What is Offer Schema?
Offer Schema is a structured data type that describes the commercial terms of a product: price, currency, availability, seller, condition, and valid dates. It is nested inside Product Schema as the offers property, making pricing machine-readable for AI models.
What is the difference between Offer and AggregateOffer?
Offer describes a single pricing option with one specific price. AggregateOffer describes a price range across multiple options. Use Offer for fixed-price products and AggregateOffer when pricing varies by configuration or tier.
Why does pricing Schema matter for AI search?
AI models answer price queries constantly. Offer Schema provides structured data AI can cite with confidence. Without it, AI must extract prices from text, risking errors like confusing promotional and regular prices.
What availability values can I use?
Schema.org defines: InStock, OutOfStock, PreOrder, BackOrder, Discontinued, SoldOut, OnlineOnly, and LimitedAvailability. Use the full URL format (e.g., "https://schema.org/InStock").
How do I handle SaaS pricing with multiple tiers?
Use an array of Offer objects, one per tier, inside the Product Schema. Each Offer has its own name, price, and description. This gives AI models specific tier-level data for accurate recommendations.
Ready to check your AI visibility?
Get your free AI Score in 60 seconds -- see how AI models understand your pricing.
Trusted by 2,400+ websites -- No credit card required