The #1 reason contractor city pages don't rank is duplicate content โ the same text repeated across 15 pages with only the city name swapped. Google detects it, ignores it, or actively filters it. Here's what actually needs to be unique, and what you can reuse.
Here's what most contractor city pages look like under the hood:
"Looking for a reliable HVAC contractor in [CITY]? Smith HVAC has been serving [CITY] homeowners for over 15 years. Our expert technicians provide AC repair, furnace installation, and maintenance in [CITY] and surrounding areas. Call us today for same-day service in [CITY]!"
Identical across 15 pages, with only the city name token swapped. Google's duplicate content algorithm identifies these as near-duplicate pages and either doesn't index them or consolidates them into a single page (usually your homepage), stripping away the ranking benefit of the city-specific page entirely.
This is why contractors sometimes say "we built city pages and they didn't do anything." The pages exist, but they're effectively invisible to Google.
Google's stated goal is to show users the most relevant result for their specific query. When someone in Chandler searches "HVAC contractor Chandler," Google wants to show them a page that is genuinely about HVAC service in Chandler โ not a generic HVAC page that happens to mention Chandler once.
Genuine local relevance can't be faked with a city name token. It has to come from content that is actually specific to that location. The test is simple: if you removed every mention of the city name, would the content still clearly be about serving that specific location? If the answer is no, the page isn't locally relevant enough to rank.
At minimum, 200โ300 words of body content that is genuinely written for that city. This means referencing the community specifically. For an HVAC company, this might include:
None of this content can be reused across cities โ it's inherently city-specific. That's the point.
Your H1 should follow the pattern "[Trade] [City]" or "[Trade] in [City]" โ for example, "HVAC Contractor Chandler AZ" or "Air Conditioning Repair in Chandler." This is the primary keyword signal on the page. The page title (the `<title>` tag) should match or closely parallel the H1.
Clean, city-specific URL structure: /hvac-contractor-chandler/ or /chandler-hvac/. Not /service-area?city=chandler, not /locations/page-23. The URL is a ranking signal โ make it readable and keyword-relevant.
The meta description doesn't directly affect ranking, but it affects click-through rate from search results โ which does affect ranking indirectly. Write a unique meta description for each city page that references the city name and a specific service or value proposition. "Same-day HVAC repair in Chandler, AZ. Licensed Chandler AC and furnace technicians โ call for same-day service." This is far more clickable than a generic description.
LocalBusiness schema on each city page should specify that city's location, not just your headquarters. Use the areaServed property to name the city. This is often overlooked but it directly signals to Google's structured data parser that this page is specifically about serving that city.
You don't have to reinvent everything. These elements can be templated:
The rule of thumb: if a human reader would learn something city-specific from the content, it needs to be unique. If the content would be identical regardless of which city page they're on, templating it is fine.
There's no official word count from Google, and word count alone doesn't determine ranking. But based on what we observe: city pages with fewer than 300 words of genuinely unique content rarely rank well. Pages with 500โ700 words of unique local content, combined with correct technical implementation (URL, H1, schema), rank reliably in most mid-competition markets within 60โ90 days of publication.
In highly competitive markets (major metro areas, HVAC/plumbing/roofing), aim for 700โ1,000 words of unique content per city page, with more specific local references.
To check if your current city pages have a duplicate content problem, paste the body text of two different city pages into a text comparison tool. If they're more than 70% identical (excluding the city name), they have a duplicate content problem. Fix: rewrite the unique sections for each city with genuinely local content.
For a full city page strategy for your trade and service area, see our service area pages service.
FAQ
We'll check if your current city pages have duplicate content issues and show you which cities you're invisible in.
Free AuditFree coverage audit โ we'll check your city pages for duplicate content and show which cities you're losing calls from.