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

TypeJobKey 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:

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:

How to add the script

  1. Open the generator, fill fields, click Generate schema.
  2. Click Copy JSON-LD for a full <script type="application/ld+json"> block, or Download .json.
  3. Paste the script in the document <head> of your homepage or product URL.
  4. Confirm View Source shows the script (Next.js generateMetadata cannot carry JSON-LD — inject a real script tag).
  5. Paste the URL or raw JSON into Google Rich Results Test.

What we will not generate

Ship checklist

Open the generator