← Field Notes · June 21, 2026

Product schema for SaaS: turning your pricing page into a citable answer

Three stacked rectangles on a green-to-yellow brand gradient representing SaaS pricing tiers as structured data
Part ofSchema for AI Search →
Updated August 20, 2026Originally published June 21, 2026
Key Takeaways
Your SaaS pricing page is the most-asked-about page by AI engines. Product schema makes it citable. Here is the working JSON-LD and what most agencies miss.

If you sell SaaS, your pricing page is one of the two or three pages on your site that AI engines query the most. The queries are predictable: “how much does [product] cost,” “what plans does [product] offer,” “is [product] worth it.” These are commercial-intent questions, and AI engines re-rank candidate documents aggressively before deciding what to extract and cite.

Here’s what most B2B SaaS companies don’t realize: the pricing pages that get cited are the ones with structured pricing data. The ones that get summarized incorrectly (or worse, contradicted by a competitor’s cleaner page) are the ones without it.

Product schema with sub-Offer markup is the structured data that makes the difference. Most SaaS sites don’t ship it. The ones that do ship something usually ship a generic Product schema that misses the SaaS-specific fields.

Let me walk you through what to ship instead.

Why SaaS product schema is its own thing

Generic e-commerce Product schema is well-documented. You have a product, a price, an availability status, sometimes a rating. Schema.org’s examples cover it.

SaaS is different because SaaS products don’t have a single price. You have tiers. The tiers have different features. Some are monthly, some are annual. Some have setup fees, some don’t. The user is choosing between options, not buying one product. The schema has to model that.

You have two paths. Use the generic Product type with multiple Offers, or use SoftwareApplication (a subtype of Product specific to software) with multiple Offers.

Use SoftwareApplication. It adds fields like applicationCategory, operatingSystem, featureList, and softwareVersion that AI engines reference when ranking for software-related queries.

What the working block actually looks like

Here’s a complete SoftwareApplication schema with multiple Offers. This is what to ship on your pricing page, ready to adapt:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "SoftwareApplication",
  "@id": "https://yourdomain.com/#software",
  "name": "Your Product Name",
  "applicationCategory": "BusinessApplication",
  "applicationSubCategory": "Customer Relationship Management",
  "operatingSystem": "Web",
  "url": "https://yourdomain.com/",
  "description": "One-line description of what the software does, who it's for, and what the primary value is.",
  "image": "https://yourdomain.com/wp-content/uploads/product-screenshot.png",
  "softwareVersion": "2026.6",
  "datePublished": "2024-01-15",
  "dateModified": "2026-06-01",
  "publisher": {
    "@type": "Organization",
    "@id": "https://yourdomain.com/#organization"
  },
  "featureList": [
    "Feature one as a short noun phrase",
    "Feature two as a short noun phrase",
    "Feature three as a short noun phrase",
    "Feature four as a short noun phrase"
  ],
  "offers": [
    {
      "@type": "Offer",
      "name": "Starter Plan",
      "price": "29",
      "priceCurrency": "USD",
      "priceSpecification": {
        "@type": "UnitPriceSpecification",
        "price": "29",
        "priceCurrency": "USD",
        "unitText": "MONTH",
        "billingDuration": "P1M"
      },
      "availability": "https://schema.org/InStock",
      "url": "https://yourdomain.com/signup?plan=starter",
      "description": "Best for solo founders. Up to 100 contacts, core features.",
      "category": "Starter"
    },
    {
      "@type": "Offer",
      "name": "Growth Plan",
      "price": "99",
      "priceCurrency": "USD",
      "priceSpecification": {
        "@type": "UnitPriceSpecification",
        "price": "99",
        "priceCurrency": "USD",
        "unitText": "MONTH",
        "billingDuration": "P1M"
      },
      "availability": "https://schema.org/InStock",
      "url": "https://yourdomain.com/signup?plan=growth",
      "description": "Best for growing teams. Up to 2,500 contacts, advanced features.",
      "category": "Growth"
    },
    {
      "@type": "Offer",
      "name": "Scale Plan",
      "price": "299",
      "priceCurrency": "USD",
      "priceSpecification": {
        "@type": "UnitPriceSpecification",
        "price": "299",
        "priceCurrency": "USD",
        "unitText": "MONTH",
        "billingDuration": "P1M"
      },
      "availability": "https://schema.org/InStock",
      "url": "https://yourdomain.com/signup?plan=scale",
      "description": "Best for scaling companies. Unlimited contacts, all features.",
      "category": "Scale"
    }
  ],
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.7",
    "reviewCount": "183",
    "bestRating": "5",
    "worstRating": "1"
  }
}
</script>

Ship this on the pricing page. Reference it from the homepage and the features page via @id so the schema graph stays connected.

The four fields that do the most work

Of everything in that block, four fields are doing disproportionate work for AI citation. Spend extra care on these.

applicationCategory and applicationSubCategory are how AI engines slot you into a category. “Business Application > Customer Relationship Management” tells the engine you’re a CRM. When the query is “best CRM for small business,” your candidacy gets filtered correctly. Most SaaS sites either skip these or use generic values like “WebApplication.” The specific values are doing the work.

featureList is a list of short noun phrases. AI engines extract from this list when the query is “what features does [product] have.” Without featureList, the engine has to scrape feature descriptions from your body content, which is less reliable. With it, the answer is structured. Keep each feature short (under 10 words) and concrete.

offers with priceSpecification is where pricing tiers live. The nested priceSpecification with unitText and billingDuration is what lets the engine answer “how much does this cost per month” correctly. Without unitText: "MONTH", the engine guesses based on the price field and often produces wrong answers like “$29 one-time.”

aggregateRating is the quality signal. If you have public reviews on G2, Capterra, or another platform, mirror the aggregate rating into your schema. AI engines that re-rank candidates use rating data as a trust signal. A page with aggregateRating is treated as more trustworthy than a page without, even when the content is otherwise identical.

Five common mistakes I see in SaaS audits

A single price field with no priceSpecification is everywhere. The schema validates, but the engine extracts the wrong number or wrong context. About half of audited SaaS pages have this problem.

priceCurrency mismatching the displayed currency. The schema says “USD,” the page displays “$” without further context. For US-only SaaS this is usually fine. For SaaS with international pricing, the mismatch produces wrong answers in international queries.

Hidden setup fees not represented in the schema. If your $29/month plan has a $300 setup fee mentioned in fine print but not in the schema, AI engines cite “$29/month” as the answer. The first time a prospect signs up and gets a $329 charge, the support ticket points back at the AI engine’s misleading citation. This is a self-inflicted wound.

Outdated dateModified. Some sites set datePublished correctly but leave dateModified blank or matching the original publish date. AI engines that weight recency mark the page as stale and de-prioritize it. Update dateModified every time the pricing page changes.

Missing or invented aggregateRating. If you don’t have aggregated public reviews, leave the field out. Inventing a rating is worse than not having one, because it eventually gets compared against G2 and Capterra and the discrepancy hurts trust. Honest schema is more durable than aspirational schema.

What you can do this week if you sell SaaS

If your pricing page doesn’t have product schema today, shipping it is a 2-4 hour job. Pull the block above, adapt it to your tiers, validate with Google’s Rich Results test, ship it, then keep your dateModified honest going forward.

A few additional moves compound with the schema work.

Write the first 100 words of your pricing page body in answer-first format. The first 100 words should answer “what does this product cost.” Specific numbers, specific plans, specific value. The body content backs up the schema and gives AI engines extractable language.

Add FAQPage schema for the common pricing questions. “Is there a setup fee?” “Can I switch plans?” “Do you offer annual discounts?” These FAQs, with FAQPage schema, get extracted as the AI’s answer when prospects ask. Adding FAQPage schema on top of SoftwareApplication compounds the citation lift.

Link from other pages to the pricing page with descriptive anchor text. The homepage, features pages, comparison pages, and blog posts should all link to pricing with anchors like “[Product] pricing” or “view [Product] plans.”

In our audits, brands that ship complete product schema correctly typically see a 5-15 percent lift in pricing-page-attributed AI citations over a 30-day window, plus a meaningful drop in cases where the AI engine cites wrong pricing. That second one is the cleanest defense against bad AI citations damaging buyer trust.

If you want us to ship complete product schema across your SaaS pricing page (SoftwareApplication, Offer with priceSpecification, FAQPage, and the surrounding body content), book the fit call.

Start ranking easier →


Sources and further reading

Related reading:
Your Organization schema is probably costing you AI citations
“Pricing starts at” is the worst pricing page pattern
ItemList schema for comparison and vs pages
Schema markup for AI search 2026: field guide

Like this:

Discover more from Net Page Two

Subscribe now to keep reading and get access to the full archive.

Continue reading