Structured data (JSON-LD)
5 min read
The step Structured data describes each page to search engines as a product, local business, FAQ, how-to and so on, so that results can show stars, prices or questions. The plugin prints it as JSON-LD, merged into the graph of Yoast SEO, Rank Math or All in One SEO, or on its own when no SEO plugin prints JSON-LD.
Switch Add structured data to the pages on, then choose how to build it.
Builder
Under How to build it choose Builder. Click Add a type (“What do the pages describe? Choose a type…”) and pick a type. A task can have up to 5 types (+ Add another type…), for example a Product and an FAQ.
Type | Required properties | Recommended |
|---|---|---|
Product | Name, Image | Description, Brand, SKU, Offer, Rating (GTIN and Manufacturer part number optional) |
Service | Name | Description, Area served |
Local business | Name, Address | Image, Phone, Website, Coordinates, Opening hours |
FAQ | Questions | |
How-to | Name, Steps | Description, Image, Total time |
Article | Headline | Image, Author, Published, Modified |
Event | Name, Start, Place | End, Description, Image, Organizer, Tickets |
Job posting | Job title, Description, Posted, Employer, Location | Valid through, Employment type, Salary |
Course | Name, Description | Provider |
Recipe | Name, Image | Description, Ingredients, Steps, Total time, Servings, Category, Cuisine, Author |
Software / app | Name, Offer | Category, Operating system, Rating |
Several types accept a More specific type: Local business (Restaurant, Store, Hotel, Medical clinic, Dentist, Legal service, Auto repair, Real estate agent, Home and construction business, Professional service, Beauty salon, Sports activity location) and Article (Blog posting, News article, Tech article). The default is Any Local business / Any Article.
Required and recommended follow Google's rich result documentation. The card shows the required and recommended properties first; Show %d optional properties reveals the rest.
Mapping a property
Every property row has a source:
Source | Meaning |
|---|---|
Not used | The property is left out |
From a data column | Pick a Column (of the task's sources; in combination mode choose which source's column) |
Fixed value / Fixed value or template | Text, optionally with |
Written by AI / Written by AI (Pro) | An AI value per page, with optional Instructions for AI (for example "questions buyers ask before ordering"); see AI briefs and runs |
Properties that are objects (Offer, Rating, Address, Coordinates, Place, Salary) open a sub-form with their own properties, for example Offer › Price, Currency, Availability.
Values are cleaned for the property's kind, so imported data does not have to be perfect:
Kind | What it accepts |
|---|---|
Text, long text | HTML is stripped, whitespace collapsed (500 / 5,000 characters) |
Number |
|
Date, date and time | Turned into ISO 8601 |
Duration |
|
URL | Absolute URLs |
Image | An image URL or a media library ID ("Image URL or media ID") |
Choice (availability, status…) | A label or a schema.org URL ( |
A value that is empty or cannot be understood leaves that property out; the rest of the node is still printed.
Lists (FAQ questions, steps, ingredients)
List properties take several items. Choose a List format for the column:
Format | Column holds |
|---|---|
One per line | One item per line (text lists, how-to steps with a single text) |
Separated by | / Separated by commas | Items in one line |
JSON list | A JSON list of objects, one per item, for example |
With JSON list you can name the JSON key of each item value ("leave empty when the key is the property name"). At most limits the number of items (1 to 20, default 5).
Output example
A task with a Product node (name, description and price from columns, currency fixed) and breadcrumbs, on a site without an SEO plugin:
{"@context":"https://schema.org","@graph":[
{"@type":"Product","@id":"https://example.com/guides/lyon/#product",
"mainEntityOfPage":"https://example.com/guides/lyon/","name":"Lyon",
"offers":{"@type":"Offer","price":12,"priceCurrency":"EUR"},"description":"Food capital."},
{"@type":"BreadcrumbList","@id":"https://example.com/guides/lyon/#breadcrumb",
"itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://example.com/"},
{"@type":"ListItem","position":2,"name":"Visit Lyon","item":"https://example.com/guides/lyon/"}]}]}The ID of every node is the page URL plus # and the node's id; mainEntityOfPage links it to the page.
JSON-LD template
Under How to build it choose JSON-LD template for full control. You write the JSON and use variables inside quotes:
{
"@context": "https://schema.org",
"@type": "Place",
"name": "{{ pseo.src.cities.name }}"
}Every value is escaped for JSON, so a quote in the data cannot break out. Notes:
- Up to 20,000 characters.
- A template that is not valid JSON prints nothing and is reported in Settings › Health (once an hour per task): "The structured data template of “…” is not valid JSON: …". The preview shows "The JSON-LD template is not valid JSON on this page, so nothing is printed: …".
- The output is wrapped like the builder's: your template above prints
{"@context":"https://schema.org","@graph":[{"@type":"Place","name":"Lyon"}]}. With an SEO plugin the node joins the plugin's graph.
Preview
The panel on the side shows Structured data of the sample page: the JSON for one real row, with ‹ Previous row and Next row ›, Copy JSON-LD ("Copied.") and Test in Google’s Rich Results Test. A summary says Required properties present, "%d required property missing" or "%d recommended property empty". Missing required properties do not stop the node from being printed, but Google may then show no rich result. In the example above the Product has no Image and the preview reports it.
Other options
Option | Behaviour |
|---|---|
Replace the SEO plugin’s article markup (default on) | "SEO plugins describe every generated page like the template (often as an Article). Recommended: let these types describe the page instead." The plugin drops the SEO plugin's own Article, Product, Event, … node for the page when your task adds nodes. Organization, WebSite and Person nodes stay. |
Breadcrumb structured data (default on) | "Home › parent pages › this page, from the URL. SEO plugins print their own breadcrumbs, filled with the same trail." |
On a site without an SEO plugin (or with one that is not supported) the plugin prints one <script type="application/ld+json"> block in the head with your nodes; the BreadcrumbList is added when no SEO plugin at all prints its own.
Per-page values
In the page editor section Structured data every property that the task maps can be edited per page (Set by hand values are locked and survive runs and AI). AI-mapped properties show Written by AI.
Still stuck? Contact support