APX.
Blog / Lead Generation / 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

Published 03 September 2026  ·  APX Digital

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:

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 elementWhat varies per townWhere it comes from
Title + meta descriptionCity name, first postcode districtTemplate + city, `postcodes`
LocalBusiness JSON-LDareaServed City, address locality, serviceTypecity, `county`
Funding intro paragraphHousing stock, scheme priority, grantsspecificText
Postcode chips5 to 39 area codespostcodes
"How it works" stepsCouncil named in the application steplocalAuthority
"About" sectionPopulation figure, WMCA partnership linepopulation, `localAuthority`
Footer disclaimer"Not affiliated with [council]"localAuthority
Conversion trackingevent_label per slug on every clickslug

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

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