Example rebuild

The same clinic, built twice. Only one can be read.

We build your site before we talk, and that build is the reference. Here is one, made before there is a client to point at: a clinic homepage in the shape the audit kept finding, and the same content rebuilt the way we build. Both are real pages you can open. What separates them is counted further down.

A specimen, not a case study. We have written both sides, and we say so at the top.

The two builds

Open them both. They say the same thing.

Same practice, same six services, same hours, same headline. One of them hands all of that to a machine. The other hands over an empty box and a container that is filled in later. Both are a single page on purpose — a real build follows the structure of the site it came from, and each says so at the top.

/clinics/example/before/ — the live page, and it scrolls Open in a new tab ↗

Before. The headline is a picture. The six services are written into the carousel by a script after the page arrives. There are no questions answered anywhere on it.

/clinics/example/after/ — the live page, and it scrolls Open in a new tab ↗

After. The headline is text, set to look like a headline. Every service is its own heading. The four questions patients actually ask are answered on the page, and marked up so they can be quoted.

The difference, measured

What each build hands to a machine.

Five counts, taken from the HTML each of those two URLs serves — the bytes, before any JavaScript runs. That is where a crawler starts, and on the before build it is also where it stops. Three of them are given against the total on the page, so you can see how much is being lost and not only which way it goes.

Counted on each build Before After

Headings a machine can readEvery h1–h6 element whose text is not empty, against every heading on the page.

3 of 5 headings

17 of 17 headings

Headings shipped as a pictureEvery h1–h6 element with no text in it, holding an image instead.

2 of 5 headings

0 of 17 headings

FAQ schemaA JSON-LD block declaring itself an FAQPage.

None

Present

Structured data blocksJSON-LD scripts. In the after build: a practice record and the questions.

0

2

Body text a crawler receivesCharacters in the HTML body, against every character a visitor can read once the page has loaded.

716 of 1,506 characters

2,629 of 2,629 characters

How these five numbers were counted

Each URL was fetched and parsed as text with Python's standard-library HTML parser — no browser, no JavaScript, nothing rendered. Every row is a count over that document, so you can reproduce all five from the same two pages. The script that produced them is at /tools/measure-specimen.py, and it needs nothing installed.

Headings a machine can read
Every h1h6 element whose text content is not empty after collapsing whitespace. The denominator is every h1h6 element in the document, readable or not.
Headings shipped as a picture
Every h1h6 element whose text content is empty and which contains at least one img, against the same denominator. Two of them in the before build: the hero headline and the services title.
FAQ schema
Whether any application/ld+json block declares "@type": "FAQPage".
Structured data blocks
Every script type="application/ld+json" element. The after build has two: a Dentist record carrying the hours and services, and the FAQPage record carrying the four answers.
Body text a crawler receives
Every text node inside body and outside script and style, joined, whitespace collapsed to single spaces, then counted in characters. The title is head, not body, and is not counted.
… against what a visitor can read
The same body text, plus whatever the page's own script writes into it after loading. In the before build that is the six services, held in a JavaScript array in before.js and injected into the carousel: 790 characters that a visitor swipes through and a crawler is never handed. The after build has no such script, which is why its two figures are the same number.

One thing to subtract yourself. 878 of the after build's 2,629 characters are the four patient questions and their answers — content the before build never carried in any form, because it answered nothing. Take those out and it is 1,751 characters against 716: the same services, the same hours, the same headline, and nearly two and a half times as much of it reaching a machine. The first four rows are unaffected by that subtraction.

And two notes on the last row. Both builds carry the same two specimen banners at the top of the page, which is why both totals include them. Open the before build with JavaScript turned off and a browser reports 716 characters, exactly the figure above; turn JavaScript on and it reports 1,507 rather than our 1,506, because inserting the six slides splits one run of whitespace into two. We count the strings, not the gap between them.

Why it happens

Nothing in the before build is broken. That is the problem.

It loads fast, it reads well, it works on a phone. Every one of its problems is invisible to the person who owns it, because every one of them is in the markup — and the markup is the only part a machine ever sees.

  • The headline is a picture

    Custom type, exact spacing, perfectly on brand — and set into the page as an image with no text alternative. A patient reads it. A crawler receives a heading with nothing in it. 17 of 19 clinic sites we audited hid their main headline from search engines as an image.

  • The services arrive after the page does

    Six services, one at a time, in a carousel a visitor swipes through. The copy lives in a script and is written into the page once it has loaded. What the visitor swipes through, the crawler was never handed.

  • Nothing answers a question

    Cost, how long it takes, whether you can be seen today, where to park. The before build never answers any of them, so nothing can quote it on any of them. 0 of 42 clinic homepages we audited answered patient questions on the page (no FAQ).

  • No structure a machine can read

    No question-and-answer markup, no practice record, no opening hours in any parseable form. Organised to a patient, one undifferentiated blob to a machine.

Two of the five patterns we describe on the product page are not reproduced here — answers locked inside a PDF, and having no way to measure what visitors do. Those need a file and an audience, not markup, so a specimen cannot honestly show them.

Yours is the one that counts.

This page is a specimen, and a specimen only proves we can build. We build your site first — from what you already have, or from scratch. This one is a rebuild because there was a site to start from; when there is no site, or nothing on it can be reached, we build from nothing instead. Either way it is the build we send you, not this page, that you should judge us on.

A link if you have one, the name of the practice if you don't. Back to the clinics page →