Skip to content
pageinspection

Procedural content that could be marked up as a HowTo

Somewhere on your site is a page that walks a reader through nine steps and declares nothing about it. Finding those pages takes a crawl. Deciding which of them deserve markup is the harder half, and for most sites the correct answer covers two or three pages, not fifty.

The short answer

A page is flagged when it contains an ordered sequence of instructions and no HowTo markup. The detection catches genuine procedures and also catches list shapes that impersonate one: numbered feature lists, ranked comparisons and timelines. Most of the list stays untouched, and that is the correct outcome rather than a failure of the check.

ImportantAudit check · HowTo opportunities

What gets read as a procedure

A procedure has a shape a parser can recognise without understanding the subject. Three or more items in sequence, each opening with an imperative verb, where the order is doing work. "Install the CLI", "authenticate", "push your first build" only makes sense in that order, and that dependency is the signal.

Supporting signals raise confidence: a heading containing "how to" or "setting up", an ordered list rather than a bulleted one, time or tool nouns near the top of the page, screenshots interleaved with the items. None of them is sufficient alone, which is why the check reports candidates rather than failures. A candidate is a page worth your judgement, not a bug.

The list shapes that impersonate a procedure

Every detector for this pattern produces the same three false positives, and knowing them in advance saves you triaging them one at a time.

  • The numbered listicle."Twelve ways to cut your cloud bill" is an ordered list of imperatives that reads as a twelve-step procedure and is nothing of the kind. The tell is swapping two items: if the page still makes sense, the order was decorative.
  • The table of contents. An on-page contents list built as an ordered list of anchor links mirrors the headings below it, so a detector counting sequences finds the same procedure twice. It is also why a page can come back with an implausible step count.
  • The changelog or timeline. Dated entries in sequence, often with imperative release notes inside them. Chronology is not instruction. Nobody follows a changelog.

One more that is not a false positive but is routinely mistriaged: a page whose questions each happen to be answered with a couple of steps. That is an FAQ opportunity with procedural answers, not a procedural page, and the two want different markup.

Listing the candidates on one page yourself

Before running anything site-wide it is worth seeing the pattern with your own eyes on a page you know. Paste this into the browser console. It lists ordered lists that look imperative and says whether the page already declares HowTo.

find-procedures.js
// Ordered lists on this page that read like instructions,
// plus whether any HowTo markup is present at all.
const declared = [...document.querySelectorAll(
  'script[type="application/ld+json"]'
)]
  .map((s) => s.textContent || '')
  .join(' ')
  .includes('"HowTo"')

const IMPERATIVE =
  /^(add|open|click|select|choose|install|run|copy|paste|set|enter|create|download|upload|connect|verify|check|remove|delete|deploy|configure|restart|sign|log|navigate|scroll|save)\b/i

const candidates = [...document.querySelectorAll('ol')]
  .map((ol) => {
    const items = [...ol.children].filter((el) => el.tagName === 'LI')
    const verbs = items.filter((li) =>
      IMPERATIVE.test((li.textContent || '').trim())
    ).length
    return { ol, steps: items.length, verbs }
  })
  .filter((row) => row.steps >= 3 && row.verbs / row.steps >= 0.6)

console.table(
  candidates.map((row) => ({
    steps: row.steps,
    imperative: row.verbs,
    first: (row.ol.textContent || '').trim().slice(0, 60),
    markup: declared ? 'HowTo declared' : 'none',
  }))
)

Two things to notice in the output. A nav or contents list will show up, which is the second false positive above arriving in practice. And a page whose procedure is written as paragraphs returns nothing at all, because there is no ol to find. An empty result is not necessarily a clean page.

Finding every candidate across a site

A console snippet answers one URL. The question this check exists for is which of your thousand pages contain a procedure, which needs the crawl.

This one needs the full crawl

Recognising a procedure means reading the page for an ordered sequence of instructions and checking whether any HowTo markup describes it, which the page-level audit does in one pass over the content.

The instant search on this site audits a single page, so rather than show you a verdict it cannot support, this guide sends you to the place the check actually runs.

Triaging the list, and why most of it stays untouched

You will get more candidates than you expect and you should mark up fewer than you expect. The rich result that used to justify doing this in bulk is gone, so blanket coverage now costs maintenance and returns close to nothing. Work down the list with three questions.

  • Is the procedure the point of the page?A page whose whole job is one task is a real candidate. An installation section inside a forty-screen reference document is not: HowTo describes a task, and that page's task is "be a reference". If one page holds three unrelated procedures, the finding is that it should be three pages.
  • Does the page get traffic or support tickets? The pages worth the effort are the ones people already arrive at with the intent to follow along. A procedure nobody reaches gains nothing from a declaration about it.
  • Will it still be accurate in six months? This is the one people skip. Marked-up steps are a second copy of the procedure, and a UI change that updates the page but not the JSON-LD leaves you describing a flow that no longer exists. If the procedure churns, and product onboarding flows churn constantly, leave it alone.

What is left is usually a short list of stable, well-trafficked, single-task pages. Those are worth writing, and the markup itself, with the properties that matter is a separate guide because the decision and the implementation are separate jobs.

The fix that has to land before any markup

If the procedure is a run of paragraphs, the markup is not the first fix. The list is.

A candidate detected from prose, where the steps are separated by "then" and "next" rather than by list items, has a structural problem that JSON-LD papers over rather than solves. Marking it up gives a parser the sequence while every human reader, every screen reader and every extractor still gets one undifferentiated block.

Convert it to an ordered list first. That alone makes the page eligible for a list snippet and gives a retrieval pipeline clean item boundaries, which is most of the benefit people attribute to the markup. Then decide about the markup. Choosing the shape of an answer covers the conversion.

Why a finding you will mostly ignore is still Important

This looks like the weakest rating in the catalogue, and defending it means being clear about what is being rated. It is not the value of the markup, which the retirement of the rich result genuinely reduced. It is the value of knowing that a page teaches a procedure, because that fact changes how the page should be built, and the build is usually wrong.

A candidate is rarely just missing a script tag. It is missing an ordered list, or a heading that says what task it teaches, or it is three procedures sharing one URL. Those are real defects that a procedure detector happens to be very good at surfacing, which is why the check keeps its place above Refinement. Refinement is polish on something already correct; this regularly finds something that is not.

It stops short of Critical because acting on it is optional by design. Nothing is blocked, hidden or broken on a page that answers "no" to all three triage questions, and a check whose correct outcome is often no action cannot be rated as a blocker. The rest of the scale is on the audit page.

Closing out a candidate

A candidate is closed either way, and recording which way matters more here than on most checks. If you marked it up, the confirmation is that the declared step count matches the visible one and the block parses. If you decided against it, the confirmation is that the decision is written down, because the same page will resurface on the next crawl and someone will re-triage it from scratch.

Do not watch the candidate count as a score. It falls when you mark pages up and it also falls when you delete a good procedure, and the number cannot tell the difference. The figure worth tracking is narrower: of the pages where a procedure is the whole point, how many are ordered lists with a task-shaped heading. That one only moves when the page genuinely improved.

Questions this check raises

What content counts as a procedure?
Steps that have to happen in order, where doing step three before step two does not work. A numbered list of reasons, features or examples is a list with numbers on it, and marking it up as a procedure claims an ordering that does not exist.
Is HowTo markup worth adding now that the rich result is gone?
On a genuine procedure, yes, though the payoff has changed. There is no carousel any more. What remains is an explicit ordered sequence with a name and text per step, which is what an assistant needs to relay instructions accurately rather than inferring the order from heading positions.
What should I fix before adding the markup?
The steps themselves. A procedure whose steps are three-word headings with the real instruction buried in a paragraph will produce step objects whose text repeats their name and carries nothing. If the markup would be empty, the content is the thing to fix first.