Skip to content
Issue docs

No HowTo schema on a tutorial page

Importanthowto_schema_instructionalIssue 100

What is this issue?

This issue reports a HowTo schema block your page already declares that is malformed — a missing name or step, an empty step list, a step with no text, or a broken position sequence — not a page with visible step-by-step instructions and no HowTo schema at all.

What this issue is not: it does not guess that a page titled "How to…", or one containing a numbered list, ought to declare HowTo schema. A page with none declared is never reported. totalTime is good practice but is not checked.

Why it matters

HowTo schema is important for instructional content visibility:

  • Step-expansion rich results: Google can display an expanded step list directly in SERPs
  • Voice search: Voice assistants can read steps aloud sequentially
  • User engagement: Users can see the process overview before clicking
  • AI search readiness: AI engines use HowTo schema to understand and cite instructional content
  • Featured snippets: Step-by-step content may appear in featured snippets
  • Visual appeal: Including images for each step increases rich result eligibility

Resolving this issue improves your SEO health score by ensuring instructional content is properly structured for maximum visibility.

How to fix it

If this issue was raised, your page already declares a HowTo missing name or step, or with a broken step — open the finding for specifics. The steps below are for a page that declares none yet: worthwhile to add, and never reported as a defect while absent.

  1. Identify how-to pages: Look for pages with:

    • How-to URL patterns (/how-to/, /tutorial/, /guide/)
    • Numbered step lists
    • Titles starting with "How to", "Steps to", "Guide to"
  2. Add HowTo JSON-LD structured data to the page's <head> or before </body>:

    {
      "@context": "https://schema.org",
      "@type": "HowTo",
      "name": "How to Change a Car Tyre",
      "totalTime": "PT30M",
      "step": [
        {
          "@type": "HowToStep",
          "name": "Loosen lug nuts",
          "text": "Before lifting the car, loosen the lug nuts slightly.",
          "image": "https://example.com/step1.jpg"
        },
        {
          "@type": "HowToStep",
          "name": "Jack up the car",
          "text": "Position the jack under the vehicle frame and raise it.",
          "image": "https://example.com/step2.jpg"
        },
        {
          "@type": "HowToStep",
          "name": "Remove the flat tyre",
          "text": "Fully remove the lug nuts and take off the flat tyre.",
          "image": "https://example.com/step3.jpg"
        }
      ]
    }
  3. Include required properties:

    • name: How-to title
    • step: Array of HowToStep items
  4. Add recommended properties:

    • totalTime: In ISO 8601 duration format (PT30M = 30 minutes)
    • image: For each step (increases rich result eligibility)
    • supply: List of supplies needed
    • tool: List of tools needed
  5. Only use on genuine instructional content (not for marketing or sales pages)

  6. Validate with Google's Rich Results Test

Examples

Example 1: No Schema Declared — Not This Issue

<!-- Tutorial page with a visible numbered list, but no HowTo schema -->
<html>
  <head>
    <title>How to Change a Car Tyre</title>
  </head>
  <body>
    <h1>How to Change a Car Tyre</h1>
    <h2>Step 1: Loosen lug nuts</h2>
    <p>Before lifting the car, loosen the lug nuts slightly.</p>
    <h2>Step 2: Jack up the car</h2>
    <p>Position the jack under the vehicle frame and raise it.</p>
  </body>
</html>

Nothing is reported, however clearly titled or numbered the page is.

Example 1b: The Same Page, With a Valid HowTo (passes)

{
  "@context": "https://schema.org",
  "@type": "HowTo",
  "name": "How to Change a Car Tyre",
  "totalTime": "PT30M",
  "step": [
    { "@type": "HowToStep", "name": "Loosen lug nuts", "text": "Before lifting the car, loosen the lug nuts slightly." },
    { "@type": "HowToStep", "name": "Jack up the car", "text": "Position the jack under the vehicle frame and raise it." },
    { "@type": "HowToStep", "name": "Remove the flat tyre", "text": "Fully remove the lug nuts and take off the flat tyre." }
  ]
}

Example 2: HowTo Schema with Supplies and Tools

Corrected state with supplies and tools:

{
  "@context": "https://schema.org",
  "@type": "HowTo",
  "name": "How to Bake Chocolate Chip Cookies",
  "totalTime": "PT45M",
  "supply": [
    { "@type": "HowToSupply", "name": "2 cups flour" },
    { "@type": "HowToSupply", "name": "1 cup chocolate chips" },
    { "@type": "HowToSupply", "name": "1/2 cup sugar" }
  ],
  "tool": [
    { "@type": "HowToTool", "name": "Mixing bowl" },
    { "@type": "HowToTool", "name": "Baking sheet" },
    { "@type": "HowToTool", "name": "Oven" }
  ],
  "step": [
    {
      "@type": "HowToStep",
      "name": "Preheat oven",
      "text": "Preheat oven to 350°F (175°C)."
    },
    {
      "@type": "HowToStep",
      "name": "Mix ingredients",
      "text": "Mix flour, sugar, and chocolate chips in a bowl."
    },
    {
      "@type": "HowToStep",
      "name": "Bake",
      "text": "Place on baking sheet and bake for 12-15 minutes."
    }
  ]
}

Example 3: Incomplete HowTo Schema

Problematic state:

{
  "@context": "https://schema.org",
  "@type": "HowTo",
  "name": "How to Fix a Leaky Faucet"
}

Missing required step property

Corrected state:

{
  "@context": "https://schema.org",
  "@type": "HowTo",
  "name": "How to Fix a Leaky Faucet",
  "step": [
    {
      "@type": "HowToStep",
      "name": "Turn off water supply",
      "text": "Locate and turn off the water supply valve under the sink."
    },
    {
      "@type": "HowToStep",
      "name": "Disassemble faucet",
      "text": "Remove the handle and disassemble the faucet to access the washer."
    }
  ]
}

How PixyScan detects this

  1. Read the declared structured data: every JSON-LD block is parsed, and @graph wrappers are flattened.

  2. Select declared HowTo entities: any schema block whose @type is HowTo. A page that declares none is not examined — this check does not infer a how-to page from its URL, its title ("How to…"), or a visible numbered list.

  3. Check the required properties: name and step must be present.

  4. Validate step, when present:

    • it must be a non-empty array
    • each entry needs text — either a text property directly, or an itemListElement whose own entries carry text or name
    • if any entry declares a position, positions must run 1, 2, 3… with no gaps or duplicates
  5. This is reported when: the page declares a HowTo missing name or step, with an empty step array, a step with no text, or a broken position sequence. A page with a numbered "Step 1, Step 2…" list and no HowTo schema at all is never reported. totalTime is not checked.

What we store

Storage Level

Page Level — This issue is evaluated for each individual URL that contains structured data.


Database Table / Prisma Model

PageStructuredData


Stored Fields

Field Type Description
schemaType SchemaType The type of schema (e.g., Organization, Person)
schemaFormat SchemaFormat The format of the schema (JSON-LD, Microdata, RDFa)
schemaIdentifier String? Unique identifier for the schema
rawJson Json? The raw JSON-LD or structured data content
schemaErrors Json? Array of validation errors found in the schema
isValidSchema Boolean? Whether the schema is valid according to validation
missingFields Json? Reserved for future use — the crawler always writes null here today; no check currently populates it

Detection Dependencies

  • The following data sources are required to evaluate this issue:
  • HTML Document — The crawler parses the HTML to find structured data (JSON-LD, Microdata, RDFa)
  • Structured Data Validation — The extracted schema is validated against Schema.org definitions
  • Schema Parser — JSON-LD scripts, Microdata attributes, and RDFa markup are parsed

Further reading