DEV Community

Cover image for Your crawl report averages out the bug: segment it by template
Jeremy Burgos
Jeremy Burgos

Posted on • Edited on

Your crawl report averages out the bug: segment it by template

TL;DR: Reading a crawl as one flat list averages out the problems that live inside a single template, and it makes every analysis pass run against pages it should ignore. Segment by template and role first. On one audit that cut AI analysis calls from roughly 312 to 111, a 64 percent reduction, with zero out-of-scope pages.

Run this first. One match rule per template, then a count check that proves the rule caught every page it should:

# One segment rule per template, matched on the URL path
Guides     Address matches regex   ^https://example\.com/guides/
Services   Address matches regex   ^https://example\.com/services/
Articles   Address matches regex   ^https://example\.com/blog/

# Validate the binding before trusting any per-segment number
Expected   ==   Crawl segment count
  Guides     5  ==   5
  Services   5  ==   5
  Articles  16  ==  16
# A short count means a slug slipped the pattern. Fix the rule first.
Enter fullscreen mode Exit fullscreen mode

That config is the whole move. One match rule per template, then a validation step so you know the rules caught every page they should. Everything below is why it changes your analysis and how far it scales.

The problem it solves is the default way most people read a crawl. A crawl of any real site returns one long list of issues, and reading it that way averages out the bugs that live inside a single template. A title-length warning on a deep archive page and the same warning on a core service page collapse into one undifferentiated line. The count went up. Which template caused it stays hidden.

Why a flat crawl hides your worst problems

When an issue lives inside one template, the duplicates a single template creates, a duplicate H2 from a shared component, schema emitted twice by one block, a flat view buries it among hundreds of unrelated rows. You triage by guessing and fix the loudest symptom instead of the template producing it.

There is a second cost that only shows up at scale. Every validation pass and every model prompt runs against every URL, including pages the check was never meant to evaluate. On a small crawl that waste is invisible. On a large one it decides whether the analysis is affordable.

A flat crawl issue list on the left versus the same issues grouped by template segment on the right, with one template carrying most of the issues

Segmenting in Screaming Frog, three ways

Segmentation groups URLs by template or role so every report, issue count, and score reads per template instead of averaged sitewide. It is the same logic as testing by template cohort: stop treating the site as one list, start treating it as a set of templates that each have their own contract.

In Screaming Frog this is the Segments feature, added in version 19.0. Define segments once and the tool adds a coloured segments column to every tab and a segments bar to the Issues tab. You can set a segment up at the start, during, or at the end of a crawl, so you can segment a crawl you already have without re-running it.

Three ways to define one:

  • URL pattern. The common case, templates encoded in the path. One regex match per template against the Address field, as in the block above. This only holds if your URL structure is predictable. If one template is served under several path shapes, a single rule catches one and misses the rest.
  • Custom extraction. When the template is not in the URL, pull an on-page signal that identifies it, a body class or the schema @type, and segment on that value.
  • API data. Screaming Frog joins GA4 and Search Console data to the crawl, so you can segment by a metric like sessions or impressions, not just by structure.

Database storage mode for large crawls

Segmentation pays off most on large crawls, and large crawls need database storage mode, which writes the crawl to disk instead of holding it all in memory. That is what lets you save a crawl, reopen it, and compare it against a later one. Screaming Frog's hardware guidance: 8GB of RAM is generally enough under 200,000 URLs, and crawling over one million URLs wants an SSD and 16GB or more, on a 64-bit operating system with at least 4GB as the floor.

A real four-segment model

From a sanitized end-to-end review of a production WordPress site. Four segments by role, each judged on different criteria, because the question you ask an article is not the one you ask a service page.

Segment URLs Judged on
Articles 16 Technical depth, information gain, claim accuracy
Guides 5 Hub purpose, audience, routing to the right pages
Service pages 5 Scope clarity, proof, CTA alignment
Trust core 5 Evidenced authority, credentials that verify

Four crawl segments, articles, guides, service pages, and trust core, each labeled with its URL count and the criteria it is judged on

The counts are not the point. A title warning on an article and a missing proof block on a service page are different problems with different fixes, and a flat crawl flattens them into one list. Per-segment reading also fed the schema work, since schema that breaks at the template level is exactly the kind of issue that hides in a flat view and snaps into focus when you read it per template.

The failure mode: rules skip slugs silently

URL-pattern rules have a quiet failure mode. A slug that does not follow the dominant naming convention is skipped. No error, no warning. The page falls out of the segment, and every per-segment number after that is wrong by however many slipped through. Validate the binding with the count check in the lead block before you trust anything. On the audit above, the binding was validated against the segment counts before anything ran, so every intended page was scored and none were missed.

Segmentation is cost control

Screaming Frog can run language-model prompts and other API-driven checks against page content at crawl time. They bill per call on your own key. Unbound, every prompt runs against every URL. Bound to segments, each runs only against the pages it was written for: the article prompts against articles, the trust prompts against trust pages.

On the audit above that cut the run from roughly 312 calls to 111, a 64 percent reduction, with zero out-of-scope URLs touched. Same coverage, a third of the calls. Reading per template also makes under-linked templates obvious, so you can route link equity toward priority pages instead of guessing.

Stat comparison showing 312 unbound AI calls reduced to 111 segment-bound calls, a 64 percent reduction

Track each template over time

Compare mode loads two saved crawls run with identical settings and reports the change per metric, issue, and segment. Watch one template's counts move between crawls and catch a regression in that template before it shows up as a sitewide number, or before it shows up in rankings. It needs database storage mode and a licensed version, and the second crawl has to use identical settings, or the diff measures your configuration change instead of the site. Per-segment comparison is how a crawl becomes an evidence trail of what changed rather than a snapshot.

Segment first. Validate the binding. Then every report reads per template, the analysis costs less, and fixes land on the template that produced the problem rather than the page where you happened to notice it.

Top comments (0)