Schema Markup for SaaS and AI Tools: SoftwareApplication JSON-LD Examples
What Google needs for a software app rich result, which type fits a SaaS or AI tool, and JSON-LD you can copy for the app, its offer, your organization and breadcrumbs.
SoftwareApplication schema is a block of JSON-LD that tells Google your page describes an app: its name, category, operating system, price and rating. With the three required fields in place, Google may show the rating and price under your search result. For most SaaS and AI tools, the right type is WebApplication, a subtype of SoftwareApplication for apps that run in a browser.
Here is a short block that meets Google's requirements and recommendations for a free web app. The product, Tallyleaf, is invented, and so is its rating:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebApplication",
"name": "Tallyleaf",
"applicationCategory": "FinanceApplication",
"operatingSystem": "Any",
"offers": { "@type": "Offer", "price": "0", "priceCurrency": "USD" },
"aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.7", "ratingCount": "212" }
}
</script>The rest of this guide explains each field, gives fuller examples for the app, its offer, your organization and breadcrumbs, and shows how to test them. We checked every requirement against Google's documentation on October 19, 2026.
Know what Google requires for a software app rich result
Google's software app documentation splits the properties into required and recommended ones.
Software app properties Google uses (as of October 2026)
| Property | Status | What to put in it |
|---|---|---|
name |
Required | The app's name, as shown on the page |
offers.price |
Required | The price; 0 if the app is free |
aggregateRating or review |
Required, one of them | Real ratings or a real review shown on the page |
applicationCategory |
Recommended | One of Google's supported values, such as BusinessApplication |
operatingSystem |
Recommended | What the app runs on, such as Windows 10, Android or Any |
offers.priceCurrency |
Recommended when the price is above 0 | A currency code such as USD; otherwise Google tries to infer it |
The supported applicationCategory values are: GameApplication, SocialNetworkingApplication, TravelApplication, ShoppingApplication, SportsApplication, LifestyleApplication, BusinessApplication, DesignApplication, DeveloperApplication, DriverApplication, EducationalApplication, HealthApplication, FinanceApplication, SecurityApplication, BrowserApplication, CommunicationApplication, DesktopEnhancementApplication, EntertainmentApplication, MultimediaApplication, HomeApplication, UtilitiesApplication and ReferenceApplication. Pick the closest one. Values like SaaS or AIApplication are not on the list.
Choose the right type for your product
schema.org lists five more specific types under SoftwareApplication, including WebApplication, MobileApplication and VideoGame. Google treats the first two as software apps, just like the parent type.
Which type to use
| Your product | Type | Notes |
|---|---|---|
| SaaS or AI tool used in the browser | WebApplication |
Can add browserRequirements |
| iOS or Android app | MobileApplication |
Set operatingSystem to iOS or Android |
| Desktop app or CLI | SoftwareApplication |
Add downloadUrl and softwareVersion if useful |
| Browser extension | WebApplication or SoftwareApplication |
applicationCategory can be BrowserApplication |
| A game | VideoGame plus another type |
Google shows no rich result for VideoGame alone |
There is no schema.org type for AI tools. Describe an AI product as the kind of app it is, usually a WebApplication, and put the AI part in description and featureList, where it describes what the user gets. A video generator might use MultimediaApplication, a coding assistant DeveloperApplication and a writing tool BusinessApplication.
Copy a WebApplication example for a SaaS product
This fuller version adds the fields that help Google and other readers understand the product, and an @id so other blocks can refer to it. Replace the rating with your real numbers, or delete it.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebApplication",
"@id": "https://tallyleaf.example/#app",
"name": "Tallyleaf",
"url": "https://tallyleaf.example/",
"description": "Tallyleaf turns receipt photos into expense reports for teams of 2 to 50.",
"applicationCategory": "FinanceApplication",
"operatingSystem": "Any",
"browserRequirements": "Requires a current version of Chrome, Edge, Firefox or Safari.",
"featureList": [
"Reads the merchant, date, amount and tax from a receipt photo",
"One report per team member, approved in one click",
"Exports to QuickBooks, Xero and CSV"
],
"screenshot": "https://tallyleaf.example/images/report-screen.png",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD",
"description": "Free plan for one user"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"ratingCount": "212"
},
"publisher": { "@id": "https://tallyleaf.example/#organization" }
}
</script>Every value here should match what a visitor sees on the page. Google's general structured data guidelines say "Don't mark up content that is not visible to readers of the page", and markup that misrepresents the page can lead to a manual action that removes rich results.
Describe paid plans with Offer
Offer carries the price. For a paid product, give the price as a number and add the currency:
"offers": {
"@type": "Offer",
"price": "6.00",
"priceCurrency": "USD",
"url": "https://tallyleaf.example/pricing",
"description": "Team plan, per user per month"
}Most SaaS products have several plans. schema.org lets you list several Offer objects in an array, one per plan, but Google's software app documentation describes only a single offer and its price. The simplest choice is to mark up your entry price, such as the free plan or the cheapest paid plan, and to test any array in the Rich Results Test before you rely on it.
If a page sells one specific plan or license, Product with an Offer is an alternative. Google's product snippet rules require name plus one of review, aggregateRating or offers. We suggest one main type per page, so the price and rating are not described twice in different ways.
Use SoftwareApplication for apps people install
For a desktop app, a CLI or a companion app that people download, use the parent type and add download details:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "Tallyleaf for Mac",
"operatingSystem": "macOS 13 or later",
"applicationCategory": "FinanceApplication",
"softwareVersion": "2.4",
"downloadUrl": "https://tallyleaf.example/download/mac",
"offers": { "@type": "Offer", "price": "0", "priceCurrency": "USD" },
"review": {
"@type": "Review",
"author": { "@type": "Person", "name": "Dana Ortiz" },
"reviewRating": { "@type": "Rating", "ratingValue": "5" },
"reviewBody": "Scanning a week of receipts now takes me two minutes."
}
}
</script>This one uses a single review instead of aggregateRating, which also meets Google's requirement. The reviewer and quote are invented; use a real review that appears on the page.
Add Organization and BreadcrumbList markup
These two types do different jobs from the app markup, and they go on different pages.
Organization describes the company. Google's organization documentation says it has no required properties and belongs on your home page or a single page about the company, such as the about page. It does not need to be on every page. The logo helps Google pick the logo it shows in results; it must be at least 112 ร 112 px and crawlable.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"@id": "https://tallyleaf.example/#organization",
"name": "Tallyleaf",
"url": "https://tallyleaf.example/",
"logo": "https://tallyleaf.example/images/logo-512.png",
"description": "Expense reports from receipt photos for small teams.",
"email": "[email protected]",
"sameAs": [
"https://www.linkedin.com/company/YOUR-COMPANY",
"https://github.com/YOUR-ORG"
]
}
</script>Do not add star ratings to Organization about yourself. Google's review guidelines make self-reviewed Organization and LocalBusiness pages ineligible for review stars.
BreadcrumbList shows the page's place in your site. Google's breadcrumb documentation says position 1 is the start of the trail and the last item does not need an item URL. As of October 2026, Google lists the breadcrumb feature as available on desktop.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://tallyleaf.example/" },
{ "@type": "ListItem", "position": 2, "name": "Features", "item": "https://tallyleaf.example/features/" },
{ "@type": "ListItem", "position": 3, "name": "Receipt scanning" }
]
}
</script>One page can carry several blocks, in the <head> or the <body>. Google says it understands multiple items on a page and that you can connect them with @id, which is why the app above points to #organization as its publisher.
Test the markup and fix common errors
- Generate the blocks with the schema markup generator. It marks the fields Google requires and recommends, and lists what is still missing.
- Paste the code into Google's Rich Results Test. It should detect a software app. Errors usually mean a required field is missing or broken; warnings point to recommended fields.
- Check general schema.org syntax in the Schema Markup Validator.
- After you publish, test the live URL again and use URL Inspection in Search Console to confirm Google sees the markup.
- Watch the rich result reports in Search Console after deployment. As of October 2026 there is no separate software app report, so check Review snippets and Breadcrumbs. Retest whenever you change page templates.
The errors we see most often:
- Ratings that are not on the page, or that were copied from a review site.
- A price written as text, such as
"Free", instead of"0". - An invented category, such as
AIApplication, instead of a supported value. - App markup on every page, including blog posts. Google says structured data "must be a true representation of the page content", so put it on the page that describes the app.
- A price in the markup that differs from the pricing page, usually after a price change.
- Broken JSON: a trailing comma, curly quotes pasted from a document, or a missing bracket.
Structured data does not move a page up the rankings by itself, and Google says there is no special schema needed for AI Overviews. What it does is make the facts about your product unambiguous. Pair it with a clear title and description from the meta tag preview, a share image sized as in our OG image guide, and the same wording you use on directories, from our guide to writing product descriptions for launch sites.
To generate markup or check it across a whole site, these tools help:
FAQ
What schema markup should a SaaS website use?
WebApplication on the product page, Organization on the home or about page, and BreadcrumbList on deeper pages. Other types, such as Article for blog posts, belong only on pages of that kind.
Is SoftwareApplication schema needed for AI Overviews?
No. Google says there is no special schema.org markup for its AI features. Structured data still helps with rich results in regular search and makes your product facts clear.
Can I show star ratings if I have no reviews yet?
No. The software app rich result needs a real aggregateRating or review that visitors can see on the page. Leave the rating out until you have one; the rest of the markup is still valid.
Should a SaaS pricing page use Product or WebApplication?
Either can work. WebApplication with an Offer describes the app and its price; Product with an Offer suits a page that sells one plan or license. Pick one main type per page and test it in the Rich Results Test.
Where do I put the JSON-LD code?
Anywhere in the page's HTML, in the <head> or the <body>, inside a <script type="application/ld+json"> tag. Several blocks on one page are fine.