How SaaS schema markup works (and why isolated types fail)
Schema markup is machine-readable JSON-LD that names your organization, website, software product, and optional FAQ. Search engines use it for Software App rich results. Most forms emit one isolated type. The generator writes a connected pack instead.
Google’s 2026 Software App docs still treat SoftwareApplication as a first-class rich-result type. A typical SaaS homepage should emit Organization + WebSite + SoftwareApplication in one @graph, not four separate script tags. WordPress plugins cover Organization and breadcrumbs; they usually skip SaaS Offers.
The types in the pack
| Type | Job | Key properties |
|---|---|---|
| Organization | Entity identity | name, url, logo, sameAs |
| WebSite | Site node | name, url, publisher → Organization |
| SoftwareApplication | The product | name, applicationCategory, operatingSystem, offers |
| FAQPage (optional) | Official Q&A | mainEntity → Question + Answer (visible on the page) |
Merkle’s long-running form is the usual recommendation, but it emits one isolated type. It does not ship a SoftwareApplication + Organization + WebSite pack with shared @ids.
SoftwareApplication: required vs rich-result fields
Google’s Software App structured data still requires:
name— product display nameoffers.price— a number (use0if free)- Either a real
aggregateRatingor areviewfor the rich result
Recommended: applicationCategory from a fixed enum and operatingSystem. This generator always emits an Offer. It does not invent aggregateRating — fabricating ratings is a policy violation. Only add ratings if they are real and visible on the page.
Mistake 1 — price “Free” vs “0”
JSON-LD prices are numbers encoded as strings. "price": "Free" and "$0" fail validation.
{
"@type": "Offer",
"name": "Free tier",
"price": "0",
"priceCurrency": "USD"
}
The word “Free” belongs on Offer.name (or on the page), never in price. Paid plans use "29" or "29.00" — no $ sign.
Mistake 2 — missing offers
Developers add @type + name and stop. Without an Offer, the node is informational only. Free products still need an Offer. Skipping it “because we do not charge” is the expensive version of this mistake.
Mistake 3 — wrong applicationCategory
Do not copy "Software", "App", or "SaaS" from old blog posts. Google wants schema.org-style enum values:
"applicationCategory": "BusinessApplication" "operatingSystem": "Web"
Other valid examples: DeveloperApplication, WebApplication, EducationalApplication, FinanceApplication, SecurityApplication. The generator’s select list is limited to these.
You may also set @type to both SoftwareApplication and WebApplication. The pack does that when you pick WebApplication.
Organization + sameAs
A consistent name plus sameAs links to X, LinkedIn, GitHub, Crunchbase, or Wikidata is how models stop merging you with another “Orbit” or “Northwind”.
FAQPage after rich results retired (May 2026)
Google retired FAQ rich results in May 2026. FAQ JSON-LD is still useful as an optional extra node for extraction — not as the whole product. Rules that still matter:
- Every question and answer in JSON-LD must appear as visible text on the page.
- Use official answers, not user-generated comment threads.
- Do not hide extra FAQs only in the script.
How to add the script
- Open the generator, fill fields, click Generate schema.
- Click Copy JSON-LD for a full
<script type="application/ld+json">block, or Download .json. - Paste the script in the document
<head>of your homepage or product URL. - Confirm View Source shows the script (Next.js
generateMetadatacannot carry JSON-LD — inject a real script tag). - Paste the URL or raw JSON into Google Rich Results Test.
What we will not generate
- Fake
aggregateRating/ review counts - An llms.txt file
- A WCAG contrast checker
- Waitlist landing HTML, UTM links, or generic OG meta
Ship checklist
- Price is numeric (
0for free) offers+priceCurrencypresentapplicationCategoryis a Google enum, not “Software”operatingSystemis set (Web for SaaS)- Organization has
sameAsif profiles exist - FAQ text matches visible on-page Q&A (optional node)
- Rich Results Test shows SoftwareApplication with zero errors