Anatomy of an EPC Lead-Gen Town Page That Doesn't Read Like Spam
Anatomy of an EPC lead-gen town page that doesn't read like spam
Programmatic location pages have a reputation problem. Generate a few hundred "boiler grants in [town]" pages from one template and you're most of the way to what Google calls doorway abuse. But a West Midlands EPC and retrofit lead-gen site has a legitimate reason to have a Birmingham page and a Dudley page, because the funding routes, the housing stock and the council differ. The difference between "useful local page" and "spam" is not whether you template; it's what the template varies and what the data layer actually contains.
This is an anatomy of a real build, measured from the build folder on 3 September 2026, with Google's own policy text held against it.
What sits in the repo
The site lives at /Users/jamiemac/Projects/epcleadgen. Five files matter:
generate-locations.js(12,820 bytes): the generator, one template function plus a data array of six towns (Birmingham, Solihull, Coventry, Wolverhampton, Dudley, Walsall).locations/: six generated pages, between 9,593 and 14,606 bytes each./index.html index.html(25,714 bytes): the hub, a four-step eligibility calculator that all town pages funnel into.worker.js: a Cloudflare Worker that receives the lead POST, rejects it if name, phone or postcode is missing, and emails the full lead record (income, property type, source page, timestamp) to the assessor.sitemap.xmland `robots.txt`: discovery plumbing.
Running a line diff between the Birmingham and Solihull pages returns 54 differing lines out of 155. They are unmistakably the same template. The question is whether that's a problem, and more on that below.
The data layer is the product
Each town is a record with seven fields: city, `slug`, `county`, `postcodes`, `population`, `localAuthority`, `specificText`. The last one is doing the heavy lifting. Birmingham's text says the city has some of the oldest housing stock in the West Midlands, Victorian terraces and post-war estates qualifying under ECO4, and WMCA retrofit accelerator priority. Solihull's is about older semis in Shirley and Olton with cavity-wall grants combined with boiler upgrades. Coventry's is about post-war council housing and LA Flex nominations. None of it is interchangeable.
The postcode list varies too: Birmingham carries 39 area codes (B1 through B48), Solihull five (B90–B94). Those aren't SEO decoration. They answer the actual question a searcher from that town has: do you cover me?
| Page element | What varies per town | Where it comes from |
|---|---|---|
| Title + meta description | City name, first postcode district | Template + city, `postcodes` |
| LocalBusiness JSON-LD | areaServed City, address locality, serviceType | city, `county` |
| Funding intro paragraph | Housing stock, scheme priority, grants | specificText |
| Postcode chips | 5 to 39 area codes | postcodes |
| "How it works" steps | Council named in the application step | localAuthority |
| "About" section | Population figure, WMCA partnership line | population, `localAuthority` |
| Footer disclaimer | "Not affiliated with [council]" | localAuthority |
| Conversion tracking | event_label per slug on every click | slug |
Every CTA carries a per-town analytics label (phone_click tagged `header-coventry`), so the site owner can see which town page actually produces calls. That is a measurable performance difference, not a vibe.
What Google actually says
From the Spam policies for Google web search page, fetched 3 September 2026, doorway abuse includes: "Having multiple domain names or pages targeted at specific regions or cities that funnel users to one page" and "Creating substantially similar pages that are closer to search results than a clearly defined, browseable hierarchy." The scaled content abuse policy covers "many pages generated for the primary purpose of manipulating search rankings and not helping users", explicitly including pages made with generative AI tools "without adding value for users". Google's March 2024 announcement strengthened that policy to apply "whether automation or humans are involved": templating your way to a thousand pages no longer hides behind "a person wrote the template once".
So six town pages, genuinely varied, in a browseable hierarchy from a real hub, with a working tool behind them, sit on the right side of that line. Three hundred postcode-district pages with one swapped noun would not. The line isn't page count; it's whether each page could stand alone as an answer for someone in that town.
The honest weak points
The same inspection shows where this build is still exposed. The Google reviews badge and the 4.9 rating with 47 reviews are hardcoded into the template, identical on every town page, which fails the "does this page know something the other one doesn't" test. The hub carries an urgency banner reading "ECO4 funding closes March 2026" and Coventry's text promises "LA Flex nominations are available for 2025"; both are stale as of today and a visitor who checks will notice. sitemap.xml lists only the root URL, so the six location pages are discovered solely through links. None of these are fatal, but each is exactly the kind of seam a manual reviewer looks for. Scheme copy on a lead-gen site needs a refresh date the way milk does.
The checklist we run before shipping a location page
- Does the page state something true about this town that would be false next door?
- Does it answer the local-intent question (coverage: postcode chips; cost: the calculator)?
- Is it reachable from a real hub with a browseable hierarchy, not just the sitemap?
- Is every trust element (reviews, ratings, schemes) live and per-location honest?
- Does every date-bound claim have someone responsible for updating it?
- Does the conversion path actually work end to end: form, worker, email, phone?
If the answer to the first bullet is no, you are building a doorway page with better CSS. The fix is rarely a rewrite. It's more real data in the record, which is what the rest of this site's funnel exists to collect.
Related: why a calculator pre-qualifies better than a contact form, the hub this build funnels into, and how the rented lead-gen model works. For the service this anatomy belongs to, see APX lead generation and SEO.
---
Want location pages that pass the smell test? APX builds and maintains EPC and retrofit lead-gen sites for West Midlands trades, one business per area, real data in every page. Email Info@apxdigital.io or call 07753 226214. Start with the lead-gen service page →
Need a straight answer on this for your business?
Talk to APX Digital