On-page SEO · Playbook
SERP thresholds — the numbers On-page SEO grades on, and where they come from
Issue #70: every threshold in this skill was hardcoded in orbeetle.mjs and visible nowhere else, so
a client asking “why is 65 characters a warning?” got an answer nobody could check. Since 0.102.0
each finding carries a source and a lastVerified date; this file is the reader-facing side of the
same data.
Read the caveat before quoting a number. These are defaults tuned for a general site, not standards. Google publishes none of them as a limit — it publishes guidance, and truncation is a rendering outcome that varies by query, device and how much Google decides to rewrite. A brand with a long name, a site whose titles are mostly one wide word, or a market where the SERP renders a different font all have a different right answer. The right band depends on the site.
Title
| Check | Threshold | Level | Source |
|---|---|---|---|
| Missing | — | error |
Google — title links |
| Too short | < 30 characters | warn |
as above |
| Too long | > 65 characters | warn |
as above |
| Too wide | > 620 px | warn |
pixel budget — see below |
| Wide-ish | > 580 px | info |
pixel budget — see below |
Verified 2026-08-05.
Why both characters and pixels
SERP truncation is a pixel budget. illillill and WWWWWWWWW are the same length and nowhere
near the same width, so a character count alone gets both kinds of case wrong:
| Title | Chars | Width | Character rule | Pixel rule |
|---|---|---|---|---|
WOMEN’S MAMMOGRAPHY, MRI & WELLNESS — WOLLONGONG MEDICAL GROUP |
62 | 639px | passes | truncates |
Dental Implants in Chicago | Smile Dental Partners Downtown Ltd |
63 | 466px | passes | comfortable |
ilinis institute litigation list infinite title still in it li |
62 | 326px | passes | comfortable |
Worth knowing which way the two rules actually disagree: for ordinary mixed-case copy the character rule is the stricter of the two — 63 characters of normal title text is only ~466px, well inside the budget. The pixel rule earns its place on the wide outliers: all-caps titles, em dashes, and brand names in capitals. That is why it is additive, not a replacement. Character length stays the signal you can explain to a client; pixel width is the truncation predictor.
The estimate uses Arial advance widths at 16px (scripts/lib/pixel-width.mjs) — the desktop
rendering. Mobile renders a different face at a different size, and Google rewrites titles it judges
unhelpful, so treat the number as a strong hint rather than a measurement.
Meta description
| Check | Threshold | Level | Source |
|---|---|---|---|
| Missing | — | warn |
Google — snippets |
| Outside range | < 50 or > 160 characters | warn |
as above |
Verified 2026-08-05.
Deliberately not graded on pixels. Snippet length varies with the query, the device and whether Google generates its own text from the page instead — far more than the title’s does. A single pixel budget here would be false precision, so the width is not used for a verdict.
Headings
| Check | Threshold | Level | Source |
|---|---|---|---|
| No H1 | — | warn |
Google — SEO starter guide |
| More than one H1 | > 1 | info |
as above — multiple H1s are valid HTML5 and Google states it handles them |
Verified 2026-08-05.
Tuning
The thresholds live in orbeetle.mjs; the pixel budgets live in SERP in
scripts/lib/pixel-width.mjs. There is no per-site config file yet — when one arrives it should read
from here rather than adding a second set of numbers, so this table stays the single answer to “why
is that a warning?”.