Fixing HowTo Schema Errors
HowTo markup describes a set of steps that someone follows to get something done: the steps in order, how long it takes, what it costs and what you need. Google no longer shows HowTo rich results, but the markup is still read by other search engines and AI answer engines, and a broken block still fills audit reports with errors.
This guide covers every common HowTo error, the exact fix for each, a correct example you can copy, and how to decide whether a page should carry HowTo markup at all.
- What HowTo markup is, and what Google does with it now
- The fields HowTo needs
- The errors you will see, and what each one means
- Durations, costs, supplies and tools
- Fixing JSON that cannot be read
- Making the steps match the page
- The fix, step by step
- Long guides: HowToSection and HowToDirection
- Stopping it from coming back
- Questions and answers
What HowTo markup is, and what Google does with it now
HowTo is a schema.org type for instructions: a page that walks the reader through a task one step
at a time, such as replacing a tap washer, setting up two-factor sign-in or planting a hedge. The markup
is a HowTo object with a name and a step list. Each step is usually
a HowToStep with the instruction in text, and long guides can group steps into
HowToSection items.
In August 2023 Google limited HowTo rich results to desktop, and in September 2023 it stopped showing them altogether. At the same time it removed HowTo from the Rich Results Test and from the Search Console enhancement reports. That is why many site owners saw their step-by-step search results vanish, and why the Rich Results Test now says it detects no rich result items on a page that has perfectly good HowTo markup.
The markup has not become useless. It is still valid schema.org, other search engines read it, and AI answer engines use clearly ordered steps when they quote a page as a set of instructions. A clean HowTo block also keeps your audit reports honest: a broken block is reported every time the page is scanned and hides real problems in the noise.
When HowTo is the wrong type
- Cooking: a recipe uses
Recipe, which has its own ingredients, cooking times and nutrition. Do not mark a recipe up as HowTo, and do not add both to the same page. - Questions and answers: a list of questions with one answer each is
FAQPage, not HowTo. - A single tip or a list of ideas: "ten ways to save energy" is not a sequence of steps. It has no order and no finished result, so it is an article, not a HowTo.
- Advertising: instructions whose purpose is to sell a product, where the steps are "buy our product", are not HowTo content.
The fields HowTo needs
HowTo has two fields it cannot do without and a handful that make it useful. Most audit errors come
from a missing step, a step with no text, or a duration written in the wrong
format.
| Type | Field | What it holds |
|---|---|---|
HowTo | name | The title of the task, as shown on the page, such as "How to replace a tap washer". |
HowTo | step | An array of HowToStep or HowToSection items, in the order the reader follows them. |
HowToStep | text | The full instruction for that step. Required on every step. |
HowToStep | name, url, image | Recommended. A short title for the step, a link to the step on the page (an anchor), and a picture of it. |
HowToSection | name, itemListElement | A group of steps with a heading. itemListElement holds the HowToStep items in the group. |
HowTo | totalTime | Recommended. How long the whole task
takes, as an ISO 8601 duration such as PT45M. |
HowTo | estimatedCost, supply, tool | Recommended. What it costs, what is used up (HowToSupply) and what is needed but kept (HowToTool). |
A correct block you can copy
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to replace a tap washer",
"description": "Stop a dripping tap by fitting a new washer in about 30 minutes.",
"image": "https://example.com/images/tap-washer.jpg",
"totalTime": "PT30M",
"estimatedCost": { "@type": "MonetaryAmount", "currency": "GBP", "value": "3" },
"supply": [ { "@type": "HowToSupply", "name": "Replacement tap washer" } ],
"tool": [
{ "@type": "HowToTool", "name": "Adjustable spanner" },
{ "@type": "HowToTool", "name": "Flat-head screwdriver" }
],
"step": [
{
"@type": "HowToStep",
"name": "Turn off the water",
"text": "Turn off the isolation valve under the sink, then open the tap to drain what is left in the pipe.",
"url": "https://example.com/tap-washer#step-1",
"image": "https://example.com/images/tap-washer-step-1.jpg"
},
{
"@type": "HowToStep",
"name": "Remove the tap head",
"text": "Prise off the decorative cap, undo the screw beneath it and lift the head off the valve.",
"url": "https://example.com/tap-washer#step-2"
},
{
"@type": "HowToStep",
"name": "Fit the new washer",
"text": "Unscrew the headgear nut with the spanner, swap the old washer for the new one and reassemble the tap.",
"url": "https://example.com/tap-washer#step-3"
}
]
}
</script>
Each step has its own anchor in url. Give the matching heading or list item on the page
the same id (here step-1, step-2 and step-3) so the
link goes to the right place.
The errors you will see, and what each one means
These are the messages the Schema Markup Validator, older Search Console reports and the Schema Debugger give for HowTo, with the cause behind each one.
| Message | Cause | Fix |
|---|---|---|
| Missing field "step" | The HowTo has a name but no steps, or the steps are under a made-up
field such as steps or instructions. | Put the steps in a field called
step (singular). |
| Missing field "text" (in "step") | A HowToStep has only a name, or its text
is in description. | Put the full instruction in text on every step. |
| Either "text" or "itemListElement" should be specified | A step is empty, or a HowToSection was typed as HowToStep. | Give a HowToStep its text; give a HowToSection its itemListElement. |
| Invalid value in field "totalTime" | The duration is written as words, such as "30 minutes" or "1 hour". | Use ISO 8601: PT30M, PT1H, PT1H30M, P2D. |
| Invalid object type for field "estimatedCost" | The cost is a bare number, or a MonetaryAmount without a currency. | Use a MonetaryAmount with currency (such as GBP) and value. |
| Invalid URL in field "image" | A relative path, a placeholder, or an image that returns an error or is blocked by robots.txt. | Use a full https address to an image that loads for anyone. |
| The property steps is not recognised by the schema | A misspelt or invented property name. | Rename
it to the schema.org property, here step. |
| Unparsable structured data / Parsing error | The JSON is broken: a trailing comma, a curly quote, an unescaped quote or a raw line break. | See the parsing section below. |
| Duplicate HowTo | Two HowTo blocks on one page, often a tutorial block and a schema plugin both adding one. | Keep one source and switch the other off. |
Durations, costs, supplies and tools
HowTo carries more typed values than most schema types, and each one has a format that validators check strictly.
Durations
totalTime, prepTime and performTime take an ISO 8601 duration.
It starts with P (period); a T separates days from hours, minutes and seconds.
| You mean | Write | Common mistake |
|---|---|---|
| 20 minutes | PT20M | P20M means 20 months, not minutes |
| 1 hour 15 minutes | PT1H15M | PT1.25H or 1:15 |
| 90 seconds | PT90S | PT1.5M |
| 2 days | P2D | PT48H is valid but harder to read |
| 1 day 4 hours | P1DT4H | P1D4H without the T |
P20M without the T is the most common HowTo mistake
we see. It is valid ISO 8601, so some validators pass it, but it says the task takes twenty months. Always
put the T before hours, minutes and seconds.Cost
estimatedCost is either plain text or a MonetaryAmount. Use MonetaryAmount
with a three-letter currency code and a numeric value written as a string or
number without the currency sign. For a range, use minValue and maxValue in
place of value.
Supplies and tools
A HowToSupply is used up by the task (a washer, paint, screws). A HowToTool
is needed but kept (a spanner, a brush, a drill). Both need a name, and both take an array
when there is more than one. Plain strings are allowed by schema.org, but typed objects are clearer and
let you add a requiredQuantity to a supply.
Fixing JSON that cannot be read
An unparsable block is the worst HowTo error: the whole script is ignored, including every other type in the same block, such as your Organization, BreadcrumbList or Article. HowTo blocks are long, and long blocks break more often. Four mistakes cause almost all of them.
1. A comma after the last step
{ "@type": "HowToStep", "text": "Reassemble the tap." },
] <-- the comma before ] breaks the JSON
JSON does not allow a comma after the last item in a list or the last field in an object. It happens when a step is deleted by hand and the comma before it is left behind.
2. Curly quotes
Editors and word processors turn " into โ and โ. JSON only
accepts straight double quotes around names and values. Curly quotes are fine inside the text of a step,
but never as the quotes that open or close a value.
3. A double quote inside a step
"text": "Set the dial to "Eco" and press start." <-- broken
"text": "Set the dial to \"Eco\" and press start." <-- fixed
Instructions often quote a button label or a setting name, so this is more common in HowTo than in any other type.
4. A line break inside the text
A raw line break inside a value ends the string. Keep each step's text on one line. If a step has
several parts, split it into separate steps, or use a HowToStep with an itemListElement
of HowToDirection items.
json_encode() in PHP or JSON.stringify() in JavaScript.
Both escape quotes and line breaks for you, so a quote typed into a step can never break the block again.Making the steps match the page
Structured data must describe what the reader can see. Steps in the markup that are not on the page, are in a different order, or say something different from the visible instructions are treated as misleading markup, which can lead to a manual action that removes rich results from the whole site.
- Same steps, same order. If the page has seven steps, the markup has seven steps, in the same order. Do not add steps to the markup that the page does not show.
- Full text, not a summary. The
textof each step can be the whole instruction the reader sees. A one-word step in the markup against a paragraph on the page is a mismatch. - Images of the step, not the product. A step image should show that step being done. Reusing one product photo on every step adds nothing and can be reported as a mismatch.
- Steps behind tabs or accordions are fine as long as the reader can open them without leaving the page.
- Videos: if the instructions are in a video, add a
video(VideoObject) to the HowTo, and usehasPartClip items for the start time of each step.
The fix, step by step
Step 1
Find every HowTo block on the page
Open
the page source (Ctrl+U, or Cmd+Option+U on a Mac) and search for HowTo. Note each match
and where it comes from: an SEO plugin (Yoast, Rank Math, All in One SEO), a how-to block from the editor,
the theme, a recipe plugin that also outputs HowTo, or code added by hand. The Schema Debugger lists
every block with its source position, which is quicker on long pages.
Step 2
Fix JSON that cannot be read
Paste the block into the Schema Markup Validator. A parsing error gives the line and column; the fault is almost always one of the four in the parsing section: a trailing comma, a curly quote, an unescaped quote or a raw line break. Fix it at the source, in the template or the plugin field, not in a saved copy of the HTML, then paste the block in again until it reads cleanly.
Step 3
Add the required fields
Check
the HowTo has name and step, and that every HowToStep has text
holding the full instruction. If a guide has more than about ten steps with headings between them, group
them into HowToSection items, each with a name and an itemListElement
of steps. Rename invented fields such as steps or instructions to the schema.org
property step. Then re-run the validator to confirm no step is empty.
Step 4
Correct durations, costs and images
Rewrite
every duration as ISO 8601 with the T in place, such as PT30M or PT1H15M.
Give estimatedCost a MonetaryAmount with a currency code and a value. Open each image address
in a private browser window to confirm it loads without a login, and replace relative paths with full
https addresses. Check that each step image shows that step, not the finished product.
Step 5
Make the steps match the page and keep one block
Read the visible steps and the markup side by side and bring them into line: the same steps, in the same order, with the same wording. If two sources output HowTo, keep the one that is easiest to keep in line with the page and switch the other off. A how-to block in Yoast or Rank Math adds its own markup, so do not also add HowTo by hand.
Step 6
Validate and request a recrawl
Test the live URL in the Schema Markup Validator and re-run the Schema Debugger; the Rich Results Test no longer checks HowTo, so do not rely on it. When both are clean, use URL Inspection in Search Console and choose Request indexing so the corrected markup is read on the next crawl. Re-check the page after a plugin or theme update, which is when duplicate blocks usually return.
Long guides: HowToSection and HowToDirection
A guide with forty steps under five headings reads better, and validates more cleanly, when the markup
follows the same structure. HowToSection is a named group of steps; HowToDirection
and HowToTip split one step into smaller parts.
"step": [
{
"@type": "HowToSection",
"name": "Prepare the wall",
"itemListElement": [
{ "@type": "HowToStep", "text": "Fill holes with filler and leave it to dry." },
{ "@type": "HowToStep", "text": "Sand the filled areas smooth." }
]
},
{
"@type": "HowToSection",
"name": "Paint",
"itemListElement": [
{ "@type": "HowToStep", "text": "Cut in around the edges with a brush." },
{
"@type": "HowToStep",
"itemListElement": [
{ "@type": "HowToDirection", "text": "Roll the first coat in a W pattern." },
{ "@type": "HowToTip", "text": "Keep a wet edge to avoid lap marks." }
]
}
]
}
]
- A HowToSection uses
itemListElement, notstepand nottext. - A HowToStep that uses
itemListElementmay leave outtext; the directions carry the instruction. - Do not nest a HowToSection inside another HowToSection. Keep one level of groups.
- Add
positionto steps only if you number them on the page; the order of the array already gives the order.
Stopping it from coming back
- One source. Decide which tool outputs HowTo across the site and switch HowTo output off in every other plugin and theme.
- Build it from the page. If the visible steps and the markup come from the same data, they cannot drift apart.
- Escape at output. Generate the JSON with
json_encode()orJSON.stringify(), never by joining strings. - Store durations as numbers. Keep minutes as a number in the CMS and convert to
PTโฆMin the template, so an editor can never type "half an hour" into the markup. - Test after updates. Plugin and theme updates are the most common cause of a new duplicate block. Re-run the Schema Debugger on one how-to page after each update.
1. Why did my HowTo rich results disappear from Google?
Google limited HowTo rich results to desktop searches in August 2023 and stopped showing them altogether in September 2023, for every site. Nothing on your page caused the change, and fixing or rewriting the markup will not bring the step-by-step results back in Google Search. The markup is still valid schema.org, so keep it clean for other search engines, AI answer engines and your own audit reports, and judge it with the Schema Markup Validator.
2. Is HowTo markup still worth adding?
Yes, on pages that really are step-by-step instructions. HowTo markup is still valid schema.org, it is read by other search engines and by AI answer engines, and it states the order of the steps, the time and the tools without any guesswork, which makes the page easier to quote as a set of instructions. Keep it accurate and matching the visible steps. Do not add it to pages that are not instructions just to get markup on them.
3. Why does the Rich Results Test say no items were detected?
Google removed HowTo from the Rich Results Test when it retired the HowTo rich result in 2023. The test no longer looks for HowTo at all, so it reports that no rich result items were detected even when the markup is perfectly correct. That message is not an error. Test HowTo markup with the Schema Markup Validator at validator.schema.org and with the Schema Debugger instead, both of which still read and check every HowTo field.
4. What does "Missing field text" in a step mean?
It means one of your HowToStep items has no instruction in its text field. It usually comes from an empty step box in a plugin, or from the instruction being placed in name or description instead of text. Open the step, put the full instruction the reader sees on the page into text, or delete the step if it is empty. A step that uses itemListElement with HowToDirection items is the one case where text can be left out.
5. How do I write 45 minutes in totalTime?
Write PT45M. The P starts the duration, the T marks the start of the time part, and M after the T means minutes. The T matters: without it, P45M means 45 months, which some validators accept without warning. For longer tasks combine the parts, such as PT1H30M for an hour and a half or P1DT2H for a day and two hours. Words such as 45 minutes or clock times such as 0:45 are invalid.
6. Should a recipe use HowTo or Recipe?
Use Recipe. It has its own fields for ingredients, preparation and cooking times, yield, nutrition and ratings, and it is the type Google still uses for recipe rich results, which HowTo no longer gets. A recipe marked up as HowTo loses all of that. Do not add HowTo to a recipe page as well as Recipe; the recipe instructions already use HowToStep items inside the Recipe, so a second HowTo block only creates a duplicate.
7. How long before the fix is picked up?
After you request indexing with URL Inspection in Search Console, Google usually recrawls the page within a few days, and other search engines follow on their own schedule. Because HowTo no longer has a Search Console enhancement report, there is no report to watch change. Check the live page with the Schema Markup Validator and the Schema Debugger straight after the fix, and re-run them after the next crawl to confirm the corrected markup is being served.
The Schema Debugger lists every structured data block on a page, shows each missing or invalid field, checks durations and image addresses, and compares your HowTo steps with the visible instructions.
Open Schema Debugger Fixes โ