The Service Area Page

One template for every town page we build, for any local service business. Every number on this page was measured off four town pages the operator approved: Roofer A (two towns), Roofer B (one town, the same as one of Roofer A's) and Plumber (one town). A pest control town page is measured too, as the example of what went wrong. Numbers are floors and ceilings, never targets. A page that pads up to a number is the page this template exists to stop.

Bands12 + 2required + optional
Words1,230 to 1,920measured 1,369 to 1,744, FAQ answers included
H2s7 to 10measured 8 to 9
Photos9 to 14incl. service thumbnails
Links in the page15 to 41header and footer not counted
Height, desktop10,000px ceiling; phone 15,000

The Whole Page, Top to Bottom

Each block is one band, drawn to its measured height. Red edge: required. Dashed: optional. Tap a block for its spec.

The Plan: What Goes Where

The default order. The first two bands and the last three are fixed. The middle can move, as long as the layout rules hold: four or more layout families, never three photo splits in a row.

1
Hero first
H1: [Trade] in [Town], TX. One H1 on the page, at most 60 characters.
Words
30 to 120
Characters, at most
750
Images
One. A real crew, truck or work photo from this company, full bleed, loaded eagerly (fetchpriority high, never lazy). No real photo? Use the map variant: the town drawn from Census TIGER lines with the shop marked. Never a stock skyline.
Links
1 tel: button. 0 to 2 contact or booking buttons. Nothing else.
2
No H2. A small label ("The Short Version") over 3 to 5 lines.
Words
60 to 120
Characters, at most
600
Images
None.
Links
None.
3
H2 that names what this town does to the trade's work: water, soil, weather, age of the houses.
Words
80 to 150
Characters, at most
800
Images
0 or 1 photo of work or a local place, placed opposite the copy.
Links
0. When this band also carries the service menu (the Roofer A shape), it links every built service once.
4
H2 "Where We Work" or the town plus its neighbors.
Words
50 to 100
Characters, at most
600
Images
The drawn map (SVG, no Google embed), shop marked, built towns clickable.
Links
Every built town page once (map and list may repeat it). Unbuilt towns as plain text, never a link. The hub once.
5
H2 "Every Job We Run in [Town]", grouped under 2 or 3 H3s (for example Water / Drains and Leaks / Fixtures).
Words
220 to 390
Characters, at most
2,100
Images
1 photo opposite the list (work in the area or a CC place photo with its credit).
Links
Every built service page exactly once in this band.
6
H2 "What Happens When You Call" (optionally "From [Town]"), 3 or 4 steps as H3s.
Words
100 to 300
Characters, at most
1,550
Images
0 or 1.
Links
0 or 1 tel: button at the end of the steps. 0 or 1 contact link.
7
H2 "Your [Thing]'s Year in [Town]", four seasons as H3s, one sourced fact each.
Words
130 to 170
Characters, at most
900
Images
None, or 4 small season icons.
Links
None.
8
H2 that names roads, neighborhoods or landmarks: "[Town], Road by Road", "Up the Highway From [City]".
Words
100 to 240
Characters, at most
1,450
Images
1 CC place photo (Wikimedia Commons) with its credit: author, license and source, rendered as a caption.
Links
The photo's license and source links only.
9
H2 "[Town], in Plain Facts", 3 facts as H3s: numbers and drive time.
Words
110 to 200
Characters, at most
1,100
Images
None. A strip, no boxes.
Links
None.
10
H2 that names the owner or the family: "Why [Town] Homeowners Call [Owner]", "The Family on the Truck".
Words
120 to 170
Characters, at most
900
Images
1 photo of the owner, crew or van. No person may repeat across this client's town pages.
Links
0 or 1 (About page, or the Google Business Profile map link).
11
Bar variant: no H2, one Title Case line. Schedule variant: H2 "Schedule a [Service] in [Town]".
Words
20 to 140
Characters, at most
750
Images
None (bar) or 1 (schedule).
Links
1 tel: button. 0 or 1 contact link.
12
FAQ third from last
H2 "[Town] [Trade] Questions". 3 to 6 questions about serving THIS town, Title Case, each ending in a question mark.
Words
220 to 360
Characters, at most
1,900
Images
None. A single-column accordion.
Links
1 "View All FAQs" link to this town's group on the FAQ hub. 0 to 2 service links inside answers.
13
H2 "Explore Our [Town] [Trade] Services" or "The [N] Trades, Page by Page". "Other Areas We Serve" as an H3 or its own short row.
Words
100 to 270
Characters, at most
1,450
Images
One thumbnail per service card.
Links
Every built service once. Every other built town once. Unbuilt towns as plain text.
14
Close last
No H2 (photo CTA) or H2 "Book a Free [Service] in [Town]". One line and the phone.
Words
20 to 50
Characters, at most
300
Images
1 full-bleed photo (crew or the owner).
Links
1 tel: button. 0 or 1 contact link.

Band by Band, With the Evidence

Every band gets three reasons, its numbers, and the real bands those numbers came from. Gray rows share one band with another job, so they never widen the range.

1

Hero

requiredvariants: photo, map

For the homeowner. Tells them in one second that this company works in their town, and puts the phone number where the thumb is.

For Google and AI. The H1 and title carry the town query. Google and AI read the first screen as the page's claim.

If you cut it. Without it the page opens on paragraphs and the call rate falls off the first screen.

Words30 to 120measured 39 to 108
Characters, ceiling750write under it, never to it
Height, desktop / phone780px at most measured; 1,195 on a phone (1.4 screens)

Heading H1: [Trade] in [Town], TX. One H1 on the page, at most 60 characters.

Real headings Roofing in [Town], TX Plumbers in [Town] TX

Images One. A real crew, truck or work photo from this company, full bleed, loaded eagerly (fetchpriority high, never lazy). No real photo? Use the map variant: the town drawn from Census TIGER lines with the shop marked. Never a stock skyline.

Links 1 tel: button. 0 to 2 contact or booking buttons. Nothing else. Measured: tel 1, contact 0‑2.

Layout families allowed hero

Measured onH2WordsCharsPhotosLinksHeight px, 1440 / 390
Roofer A, town 1(no H2)603271tel 1, contact 2764 / 654
Roofer A, town 2(no H2)603301tel 1, contact 2764 / 690
Roofer B, town 2(no H2)1086490 + maptel 1, contact 1623 / 1,195
Plumber, town 3(no H2)392032tel 1780 / 648
2

Quick answers

required

For the homeowner. Answers the four questions they came with before they scroll: do you come here, how fast, what does it cost to come out, who shows up.

For Google and AI. Short, quotable lines are what AI answers lift word for word. This is the answer-first block (WebPage speakable).

If you cut it. AI assistants quote a competitor whose page answers first.

Words60 to 120measured 89 to 89, one source
Characters, ceiling600write under it, never to it
Height, desktop / phone393px at most measured; 629 on a phone (0.7 screens)

Heading No H2. A small label ("The Short Version") over 3 to 5 lines.

Real headings The Short Version

Images None.

Links None. Measured: none.

Layout families allowed band

Measured onH2WordsCharsPhotosLinksHeight px, 1440 / 390
Plumber, town 3(no H2)894680none393 / 629
3

Local problem pressure

required

For the homeowner. Shows the company knows their town's actual problem, not the trade in general.

For Google and AI. This is where the town-only facts live. It is the band that fails the swap test first if it is generic.

If you cut it. The page becomes a service page with a town name pasted on. That is the doorway pattern.

Words80 to 150measured 99 to 136
Characters, ceiling800write under it, never to it
Height, desktop / phone661px at most measured; 1,043 on a phone (1.2 screens)

Heading H2 that names what this town does to the trade's work: water, soil, weather, age of the houses.

Real headings Why [Town] Roofs Take a Beating Plumbers in [Town] Know the Water Hail, Claims, and [Town] Roofs

Images 0 or 1 photo of work or a local place, placed opposite the copy.

Links 0. When this band also carries the service menu (the Roofer A shape), it links every built service once. Measured: none.

Layout families allowed prose, split, band

Measured onH2WordsCharsPhotosLinksHeight px, 1440 / 390
Roofer A, town 1 shares a bandWhy [Town] Roofs Take a Beating2841,5591service 10916
Roofer A, town 2 shares a bandHail, Claims, and [Town] Roofs3081,6741service 10943
Roofer B, town 2Why [Town] Roofs Take a Beating1366831none661 / 1,043
Plumber, town 3Plumbers in [Town] Know the Water995350none410 / 514
4

Where we work (map)

required

For the homeowner. Lets them see their street is inside the area before they call.

For Google and AI. Links the hub and every built town page from inside the content. That is the browseable hierarchy Google asks for.

If you cut it. Town pages become orphans reachable only from the menu.

Words50 to 100measured 79 to 79, one source
Characters, ceiling600write under it, never to it
Height, desktop / phone610px at most measured; 1,066 on a phone (1.3 screens)

Heading H2 "Where We Work" or the town plus its neighbors.

Real headings Where We Work

Images The drawn map (SVG, no Google embed), shop marked, built towns clickable.

Links Every built town page once (map and list may repeat it). Unbuilt towns as plain text, never a link. The hub once. Measured: town 14.

Layout families allowed map

Measured onH2WordsCharsPhotosLinksHeight px, 1440 / 390
Plumber, town 3Where We Work794790 + maptown 14610 / 1,066
5

Services menu

required

For the homeowner. A menu: find their exact problem and tap into its page.

For Google and AI. The town page is a hub. This is where it links down to every service page.

If you cut it. A hub with no spokes is a dead end with a schema block.

Words220 to 390measured 306 to 306, one source
Characters, ceiling2,100write under it, never to it
Height, desktop / phone953px at most measured; 1,576 on a phone (1.9 screens)

Heading H2 "Every Job We Run in [Town]", grouped under 2 or 3 H3s (for example Water / Drains and Leaks / Fixtures).

Real headings Every Job We Run in [Town] Every Service We Run in [Town]

Images 1 photo opposite the list (work in the area or a CC place photo with its credit).

Links Every built service page exactly once in this band. Measured: service 6, source 2.

Layout families allowed split, band

Measured onH2WordsCharsPhotosLinksHeight px, 1440 / 390
Roofer A, town 1 shares a bandWhy [Town] Roofs Take a Beating2841,5591service 10916
Roofer A, town 2 shares a bandHail, Claims, and [Town] Roofs3081,6741service 10943
Plumber, town 3Every Job We Run in [Town]3061,6681service 6, source 2953 / 1,576
6

What happens when you call

required

For the homeowner. Takes the fear out of the call: who answers, when someone comes, when they hear a price.

For Google and AI. Process copy is mostly town-neutral. Keep it short so the local bands carry the page.

If you cut it. The reader who is ready but nervous leaves.

Words100 to 300measured 122 to 269
Characters, ceiling1,550write under it, never to it
Height, desktop / phone1,289px at most measured; 2,214 on a phone (2.6 screens)

Heading H2 "What Happens When You Call" (optionally "From [Town]"), 3 or 4 steps as H3s.

Real headings What Happens When You Call What Happens When You Call From [Town]

Images 0 or 1.

Links 0 or 1 tel: button at the end of the steps. 0 or 1 contact link. Measured: tel 0‑1, contact 0‑1.

Layout families allowed steps, split

Measured onH2WordsCharsPhotosLinksHeight px, 1440 / 390
Roofer A, town 1What Happens When You Call2571,3411tel 1, contact 11,030 / 2,187
Roofer A, town 2What Happens When You Call2691,4041tel 1, contact 11,030 / 2,214
Roofer B, town 2What Happens When You Call2331,1771contact 11,289 / 2,008
Plumber, town 3What Happens When You Call From [Town]1226240none486 / 855
7

The town's year

optional

For the homeowner. Tells them what to watch for this month.

For Google and AI. Seasonal facts (freeze dates, hail months, rainfall) are cheap to source and swap-proof.

If you cut it. Optional. Use it when the trade is seasonal (roofing, HVAC, pest). Plumbing can skip it.

Words130 to 170measured 145 to 149
Characters, ceiling900write under it, never to it
Height, desktop / phone614px at most measured; 1,470 on a phone (1.7 screens)

Heading H2 "Your [Thing]'s Year in [Town]", four seasons as H3s, one sourced fact each.

Real headings Your Roof's Year in [Town] Your Roof's Year in [Town]

Images None, or 4 small season icons.

Links None. Measured: none.

Layout families allowed strip, band

Measured onH2WordsCharsPhotosLinksHeight px, 1440 / 390
Roofer A, town 1Your Roof's Year in [Town]1487870none464 / 1,196
Roofer A, town 2Your Roof's Year in [Town]1498050none490 / 1,227
Roofer B, town 2Your Roof's Year in [Town]1457720none614 / 1,470
8

Home turf (named places)

required

For the homeowner. Recognizes their own roads and subdivisions. That is the proof the company is really here.

For Google and AI. The densest band of place names. Most swap-test failures are caught here.

If you cut it. Nothing on the page proves presence.

Words100 to 240measured 112 to 218
Characters, ceiling1,450write under it, never to it
Height, desktop / phone941px at most measured; 1,648 on a phone (2.0 screens)

Heading H2 that names roads, neighborhoods or landmarks: "[Town], Road by Road", "Up the Highway From [City]".

Real headings [Town], Road by Road Home Turf in [Town] Up the Highway From [City]: Getting to [Town]

Images 1 CC place photo (Wikimedia Commons) with its credit: author, license and source, rendered as a caption.

Links The photo's license and source links only. Measured: source 0‑2.

Layout families allowed split, band

Measured onH2WordsCharsPhotosLinksHeight px, 1440 / 390
Roofer A, town 1Home Turf: [Town], East and West of MoPac1377980source 1479 / 990
Roofer A, town 2Up the Highway From [City]: Getting to [Town]1821,0630none533 / 1,126
Roofer B, town 2Home Turf in [Town]1125831none692 / 1,239
Plumber, town 3[Town], Road by Road2181,2861source 2941 / 1,648
9

Town facts strip

optional

For the homeowner. Three things they already know are true about their town. Trust by recognition.

For Google and AI. The three assigned facts from the town facts file render here word for word.

If you cut it. Optional when the three assigned facts render elsewhere on the page.

Words110 to 200measured 154 to 154, one source
Characters, ceiling1,100write under it, never to it
Height, desktop / phone530px at most measured; 987 on a phone (1.2 screens)

Heading H2 "[Town], in Plain Facts", 3 facts as H3s: numbers and drive time.

Real headings [Town], in Plain Facts

Images None. A strip, no boxes.

Links None. Measured: none.

Layout families allowed strip

Measured onH2WordsCharsPhotosLinksHeight px, 1440 / 390
Plumber, town 3[Town], in Plain Facts1548790none530 / 987
10

Who shows up

required

For the homeowner. A person, a license, a van. The reason to call this company and not the next one.

For Google and AI. License, years in business and insurance are the trust facts AI answers repeat.

If you cut it. The page proves the town but not the company.

Words120 to 170measured 143 to 154
Characters, ceiling900write under it, never to it
Height, desktop / phone941px at most measured; 1,576 on a phone (1.9 screens)

Heading H2 that names the owner or the family: "Why [Town] Homeowners Call [Owner]", "The Family on the Truck".

Real headings The Family on the Truck Why [Town] Homeowners Call Matt Why [Town] Homeowners Call Us

Images 1 photo of the owner, crew or van. No person may repeat across this client's town pages.

Links 0 or 1 (About page, or the Google Business Profile map link). Measured: about 0‑1, maps 0‑1.

Layout families allowed split, band

Measured onH2WordsCharsPhotosLinksHeight px, 1440 / 390
Roofer A, town 1Why Neighbors in [Town] Call Matt1487510maps 1626 / 1,092
Roofer A, town 2Why [Town] Homeowners Call Matt1497820maps 1626 / 1,118
Roofer B, town 2Why [Town] Homeowners Call Us1548040none864 / 1,471
Plumber, town 3The Family on the Truck1437961about 1941 / 1,576
11

Mid-page call

requiredvariants: bar, schedule

For the homeowner. A place to call without scrolling back up.

For Google and AI. None. This is for calls.

If you cut it. Readers who decide mid-page have to scroll to the top.

Words20 to 140measured 28 to 126
Characters, ceiling750write under it, never to it
Height, desktop / phone676px at most measured; 1,123 on a phone (1.3 screens)

Heading Bar variant: no H2, one Title Case line. Schedule variant: H2 "Schedule a [Service] in [Town]".

Real headings [Town] Is Two Miles from the Shop. Schedule a Roof Inspection in [Town]

Images None (bar) or 1 (schedule).

Links 1 tel: button. 0 or 1 contact link. Measured: tel 1, contact 0‑1.

Layout families allowed band, split

Measured onH2WordsCharsPhotosLinksHeight px, 1440 / 390
Roofer A, town 1Schedule a Roof Inspection in [Town]1236561tel 1, contact 1676 / 1,123
Roofer A, town 2Schedule a Roof Inspection in [Town]1266621tel 1, contact 1676 / 1,096
Plumber, town 3(no H2)281470tel 1209 / 290
12

FAQ

required

For the homeowner. The last doubts: do you come out to my neighborhood, how fast, are you actually local.

For Google and AI. Questions are how people ask AI. The first sentence of each answer is the answer, 20 words or fewer. FAQPage schema lives on the site FAQ hub, not here.

If you cut it. The questions AI gets asked about this town have no answer on this page.

Words220 to 360measured 253 to 326
Characters, ceiling1,900write under it, never to it
Height, desktop / phone1,076px at most measured; 1,298 on a phone (1.5 screens)

Heading H2 "[Town] [Trade] Questions". 3 to 6 questions about serving THIS town, Title Case, each ending in a question mark.

Real headings [Town] Questions, Straight Answers [Town] Roofing Questions

Images None. A single-column accordion.

Links 1 "View All FAQs" link to this town's group on the FAQ hub. 0 to 2 service links inside answers. Measured: service 0‑2, faq-hub 0‑1, other 0‑1.

Layout families allowed accordion

Measured onH2WordsCharsPhotosLinksHeight px, 1440 / 390
Roofer A, town 1[Town] Roofing Questions2561,4170faq-hub 11,076 / 1,298
Roofer A, town 2[Town] Roofing Questions2531,3790faq-hub 11,076 / 1,218
Roofer B, town 2[Town] Roofing Questions3261,7200other 1604 / 635
Plumber, town 3[Town] Questions, Straight Answers2901,5720service 2, faq-hub 1892 / 912
13

Explore: services and other towns

required

For the homeowner. A last route to the exact service, or to the next town over.

For Google and AI. Second path down to every service, and sideways to the built towns only.

If you cut it. The page ends in a dead end.

Words100 to 270measured 112 to 237
Characters, ceiling1,450write under it, never to it
Height, desktop / phone943px at most measured; 2,985 on a phone (3.5 screens)

Heading H2 "Explore Our [Town] [Trade] Services" or "The [N] Trades, Page by Page". "Other Areas We Serve" as an H3 or its own short row.

Real headings The Six Trades, Page by Page Explore Our [Town] Roofing Services Other Areas We Serve

Images One thumbnail per service card.

Links Every built service once. Every other built town once. Unbuilt towns as plain text. Measured: service 5‑10, town 0‑5, hub 0‑1.

Layout families allowed split, rail, band

Measured onH2WordsCharsPhotosLinksHeight px, 1440 / 390
Roofer A, town 1Explore Our [Town] Roofing Services2371,28810 + mapservice 10, town 2943 / 951
Roofer A, town 2Explore Our [Town] Roofing Services2371,28810 + mapservice 10, town 2943 / 951
Roofer B, town 2Our Roofing Services / Other Areas We Serve1126015service 5, town 5, hub 1813 / 2,985
Plumber, town 3The Six Trades, Page by Page1539197service 6838 / 1,098
14

Close

required

For the homeowner. The last thing they see is a person and a number.

For Google and AI. None.

If you cut it. The page ends on a list instead of an ask.

Words20 to 50measured 24 to 43
Characters, ceiling300write under it, never to it
Height, desktop / phone499px at most measured; 584 on a phone (0.7 screens)

Heading No H2 (photo CTA) or H2 "Book a Free [Service] in [Town]". One line and the phone.

Real headings [Town] Is on the Truck. Book a Free Inspection in [Town]

Images 1 full-bleed photo (crew or the owner).

Links 1 tel: button. 0 or 1 contact link. Measured: tel 1, contact 0‑1.

Layout families allowed photocta, band

Measured onH2WordsCharsPhotosLinksHeight px, 1440 / 390
Roofer B, town 2Book a Free Inspection in [Town]432381tel 1, contact 1475 / 584
Plumber, town 3(no H2)241251tel 1499 / 360

The Schedule

Every band in one table. This is the checklist an agent writes against.

#BandNeedPositionWordsChars maxImagesLinksLayout
1Herorequiredfirst30 to 120750One1 tel: buttonhero
2Quick answersrequiredsecond60 to 120600NoneNoneband
3Local problem pressurerequiredfree80 to 1508000 or 1 photo of work or a local place, placed opposite the copy0prose, split, band
4Where we work (map)requiredfree50 to 100600The drawn map (SVG, no Google embed), shop marked, built towns clickableEvery built town page once (map and list may repeat it)map
5Services menurequiredfree220 to 3902,1001 photo opposite the list (work in the area or a CC place photo with its credit)Every built service page exactly once in this bandsplit, band
6What happens when you callrequiredfree100 to 3001,5500 or 10 or 1 tel: button at the end of the stepssteps, split
7The town's yearoptionalfree130 to 170900None, or 4 small season iconsNonestrip, band
8Home turf (named places)requiredfree100 to 2401,4501 CC place photo (Wikimedia Commons) with its credit: author, license and source, rendered as a captionThe photo's license and source links onlysplit, band
9Town facts stripoptionalfree110 to 2001,100NoneNonestrip
10Who shows uprequiredfree120 to 1709001 photo of the owner, crew or van0 or 1 (About page, or the Google Business Profile map link)split, band
11Mid-page callrequiredfree20 to 140750None (bar) or 1 (schedule)1 tel: buttonband, split
12FAQrequiredthird from last220 to 3601,900None1 "View All FAQs" link to this town's group on the FAQ hubaccordion
13Explore: services and other townsrequiredsecond from last100 to 2701,450One thumbnail per service cardEvery built service oncesplit, rail, band
14Closerequiredlast20 to 503001 full-bleed photo (crew or the owner)1 tel: buttonphotocta, band

Page limits Title 50 to 60 characters (measured 58, 55, 55, 55). Meta description 150 to 160 (measured 151, 150, 160, 156). H1 at most 60 (measured 21, 25, 25, 23). Every H2 at most 60. Words 1,230 to 1,920. H2s 7 to 10. Height at most 10,000 px on desktop and 15,000 px on a phone.

The Rules That Do Not Move

Layout can change from town to town. These cannot. Each one names the check that enforces it.

The swap test

Swap the town for a neighbor the client also serves and reread every sentence. At least 20 sentences must become false. Record it in the town facts file as a destructive_read block: the sentence, the swap town, true or false.

Checked by check-template: swap-read. It is the only test that separates a town page from a doorway page. Layout does not.

The town facts file

8 or more facts, each fetched live on the date shown from a named primary source, with the source's own sentence as evidence. Exactly 3 are assigned and render word for word on the page. Evidence lines are tested against the saved fetch before they enter the file.

Checked by check-template: facts-file, facts-verbatim. Every local claim can be traced. A research agent that stitches two sentences together is caught before the copy.

Thin towns

6 or 7 facts: build it, record the shortfall in the file. Under 6: do not build. List the town as plain text on the hub and tell the operator.

Checked by check-template: facts-file. A town we cannot say 8 true things about is a doorway page waiting to happen.

FAQPage schema lives on the hub

The town page shows its FAQ but carries no FAQPage JSON-LD. The site FAQ hub holds every question once, grouped by town, and the town page links to its group.

Checked by check-template: no-faqpage. The same question marked up on two URLs competes with itself.

Link built towns only

A town gets a link only when its page is built and live. Every other town is plain text in the map, the menu, the chips and the footer.

Checked by check-template: town-links. A link to a page that is not there is a broken promise to the reader and to Google.

Photo hero, or the map

A real photo from this company (crew, truck, work in the area) when one exists. The drawn map when it does not. Never a stock skyline, never a Google Maps embed.

Checked by check-template: hero-image. A stock city photo is the clearest sign of a page built at scale.

No person twice

Across one client's town pages, no person is the main subject of more than one photo.

Checked by eye review (not mechanical). The same technician on six town pages reads as a template.

Place photos carry credits

Every Creative Commons photo carries author, license and source, rendered on the page.

Checked by check-template: photo-credits. It is the license condition, and it is proof the place is real.

Phone in buttons only

tel: links sit in the hero, the call steps, the mid-page call and the close. Never mid-paragraph.

Checked by check-template: tel-placement. A number buried in a sentence is not tappable intent.

Schema on the shipped file

One business block (the real address of the one office, never an invented one) with areaServed, plus BreadcrumbList and WebPage. Checked on the file that ships, not on a source file.

Checked by check-template: business-schema. A pest control page's gate passed a file that never shipped. The shipped page carried zero JSON-LD.

Layout variety

At least 4 layout families on the page. Never three copy-and-photo splits in a row. Photo sides alternate.

Checked by check-template: layout-families, split-run. Alternating left and right forever is what people mean by templated.

Two clients, one town

Two of our clients may both have a page for the same town. They may share a source, never a sentence: 8-word shingle overlap under 15 percent. Which client takes a contested town is the operator's call.

Checked by check-template --against <other page>. We are the common author. Our own pages must not look like one network.

Copy floor

No em dashes. No dollar figures without the client's approval. No 24/7 promise the client does not keep. Title Case on every heading. No office-proximity pitch ("our office is close"): nobody drives to a plumber's office.

Checked by check-template: copy-bans. Each of these has been corrected by the operator on a live build.

Build Order for Agents

Eight steps. Each has a pass condition. An agent does not start a step until the one before it passes.

  1. Pick the townMonthly searches for "[trade] [town]" from Search Atlas, and the client's Google Business Profile service areas. A town not on the profile needs the operator's yes.
    the town is on the profile and has a recorded search number
  2. Research the factsFetch primary sources (state historical handbook, the city site, Census QuickFacts, the county, TxDOT, USGS or NOAA). Save every fetch. Write the town facts file.
    node check-facts.mjs towns/<town>.facts.json exits 0 (8+ facts, 3 assigned)
  3. Write the specFill the kit, band by band, inside each band's word floor and ceiling. Every local sentence cites a fact.
    node specs.mjs --validate exits 0
  4. BuildRun the client's generator. No code changes: a new town is data.
    the page exists at /areas-served/<town>/ and git diff shows no generator change
  5. Check it against the templatenode docs/output/service-area-template/check-template.mjs <built page> --facts <facts file>
    every line PASS
  6. Run the swap testSwap to two neighbor towns, record the result in the facts file.
    20 or more sentences false
  7. Link itRemove it from any hidden or never-link list. It appears in the menu, the map, the chips and the footer.
    every page on the site links it once in the nav
  8. Operator reviewScreenshots at 1440 and 390, then local links. Nothing is deployed without the operator's yes.
    the operator's words recorded

The Fill-In Kit

A new town is data, never code. These two files are all an agent writes.

Town spec pages/<town>.json ([Town] pipeline) or towns/<slug>.json (Roofer A kit)

{
  "type": "town",
  "url": "/areas-served/kerrville/",
  "town": "[Town]",
  "status": "live" once approved,
  "title": "50 to 60 characters, town and trade first",
  "metaDescription": "150 to 160 characters",
  "h1": "Plumbers in [Town] TX", at most 60 characters,
  "hero.photo": "a real crew or work photo, or hero.map: true",
  "quick": "3 to 5 [label, sentence] pairs",
  "local.h2 + local.body": "the pressure band",
  "menu.groups": "2 or 3 groups, every built service once",
  "process.steps": "3 or 4 steps",
  "places": "3 named places with drive times and one CC photo with credit fields",
  "facts": "the 3 assigned facts, word for word",
  "who": "owner, license, years, insurance",
  "bar": "one Title Case line",
  "faq": "3 to 6 [question, answer] pairs, answers at most 60 words, first sentence at most 20",
  "services.h2": "the explore band",
  "closer": "one Title Case line"
}

Town facts file towns/<town>.facts.json

{
  "town": "[Town]",
  "shop": "the one real office address, from the Google Business Profile",
  "facts[]": "claim, verification 'fetched', url, publisher, date, evidence (the source's own sentence), assigned (exactly 3 true), drive_time (at least one)",
  "destructive_read": "swap_to (two towns), sentences[] with text, swapped text, false (true or false); the count of false at the end",
  "shortfall": "present only when fewer than 8 facts: the number and the sources tried"
}

Words We Use

Band
One full-width horizontal section of the page. The page is a stack of bands.
Job
What a band is for. The template is a list of jobs; the look of each band can change from page to page.
Hub
The page that links down to others. The site Where We Work page is the hub for town pages; a town page is a hub for service pages.
Spoke
A page a hub links down to.
Town facts file
The research file behind a town page: every local claim with its source, date and the source's own sentence.
Assigned fact
One of the three facts that must appear on the page word for word.
Swap test (destructive read)
Change the town name to a neighbor and count the sentences that become false. Under 20 is not a town page.
Layout family
The shape of a band: hero, band, prose, map, split, steps, strip, accordion, rail, photo CTA.
Split
A band with copy on one side and a photo on the other.
Shingle overlap
The share of 8-word runs two pages have in common. The copy-paste detector.
Floor and ceiling
The smallest and largest number a band may carry. Numbers are never targets to pad toward.
CC photo
A Creative Commons photo, usually from Wikimedia Commons, used under its license with a visible credit.

The Five Pages Measured

Headless Chrome innerText per band, whitespace collapsed; words split on whitespace; FAQ answers counted separately with <details> opened. Measured 2026-09-24 in Chrome at 1440 and 390. One page was measured from its last committed build, because its folder was being rebuilt at the time.

PageTradeBandsWords, shown + in FAQH2PhotosLinksHeight 1440 / 390JSON-LD
Roofer A, town 1roofing91,482 + 168814327,632 / 13,415LocalBusiness, WebPage, BreadcrumbList, HomeAndConstructionBusiness+RoofingContractor
Roofer A, town 2roofing91,557 + 176814317,739 / 13,668LocalBusiness, WebPage, BreadcrumbList, HomeAndConstructionBusiness+RoofingContractor
Roofer B, town 2roofing101,075 + 29499177,195 / 13,816RoofingContractor, WebPage, FAQPage, BreadcrumbList
Plumber, town 3plumbing131,546 + 198913379,093 / 13,733Plumber, LocalBusiness, FAQPage, BreadcrumbList, WebPage
Pest control, town 4 counter-examplepest control101,402 + 215123227,680 / 15,126none
First screen of the Roofer A, town 1 page at 1440 pixels wide, blurred so only the layout shows
Roofer A, town 1. Operator Gate B, 2026-09-23: "Okay this is good".
First screen of the Roofer A, town 2 page at 1440 pixels wide, blurred so only the layout shows
Roofer A, town 2. Built from the same town kit, Gate B passed 2026-09-23.
First screen of the Roofer B, town 2 page at 1440 pixels wide, blurred so only the layout shows
Roofer B, town 2. Two operator punch-list rounds applied (Gate B and B2).
First screen of the Plumber, town 3 page at 1440 pixels wide, blurred so only the layout shows
Plumber, town 3. Approved after eight review rounds.
First screen of the Pest control, town 4 page at 1440 pixels wide, blurred so only the layout shows
Pest control, town 4. Counter-example: the gate read a different file than the one that shipped, and it shipped zero JSON-LD.

What we do not know yet. None of these pages has ranking, call or indexing data. The template is built from what the operator approved, not from results. The read comes after launch: Google Search Console impressions for "[trade] [town]" at 30 and 90 days, and calls from the page.

Book a call