All posts

7 min read

One Page Per Service and City: The Local SEO Structure That Ranks

One page cannot rank for ten cities. The service-by-city page structure that ranks home-services contractors in local search, and the duplicate trap to avoid.

The structure: one page for every service and every city you serve

A home-services site ranks in local search when it gives Google one dedicated page for each service-and-city combination it wants to win, like "AC Repair Cape Coral" or "Furnace Replacement Fort Myers," instead of asking a single page to cover ten towns at once. One page cannot rank for ten cities. Google reads relevance from the page that matches the searcher's exact words, and a page titled "Service Areas" with a list of city names matches nothing.

Map the grid before you write a word. List your services down one axis and your real cities down the other. A plumber serving six cities with five services has thirty target pages. That number scares owners, and it should temper the plan. Build the pages for the cities and services that drive your best jobs first, then expand. A thin grid of ten strong pages beats a sprawl of fifty empty ones.

We learned this running our own HVAC company before we ran it for clients. The service-by-city page is the unit of local SEO for contractors. Get the structure right and every other tactic in this article has something solid to attach to.

Find the keywords that have buying intent, city by city

Open Semrush and run the Keyword Magic Tool. Seed it with your service, like "ac repair," set the database to the US, and filter Intent to Commercial and Transactional so you target people ready to call, not students writing a how-to. Sort by volume and keyword difficulty, then build a service-plus-city list: "ac repair fort myers," "emergency hvac cape coral," "ac installation estero." Save it to a keyword list you reuse across the whole project.

Each saved keyword maps to one page. That mapping is the spine of your site plan. When a keyword has real volume in a city, it earns a page. When it does not, you fold that city into a broader page or skip it. The research decides the structure, so you never guess which pages to build.

Run Keyword Gap against the two or three local shops outranking you. The Missing tab shows terms they rank for and you do not, which reads as a ready-made list of pages to add. Local competitors tell you more than national brands here, so compare against the contractor down the road, not a franchise headquartered three states away.

What a real city page needs (and a template does not)

A city page earns its rank on local trust signals, the same proof a customer looks for before they dial. Name the license number and write "licensed and insured" in plain text. Name the neighborhoods and subdivisions you cover inside that city. State your response time and whether you run 24/7 emergency service. List the equipment brands you install and repair. Mention financing if you offer it. Most keyword tools miss these entities, and they are the lines that separate a page Google trusts from a stub it ignores.

Ground the page in that one city. Reference a local landmark, the climate problem you solve there, a recent job in a named neighborhood, a review from a customer in that zip. A reader should feel the page was written for their town. So should Google. Generic copy with the city name dropped in five times fools no one anymore.

Add LocalBusiness schema with the matching name, address, and phone, and embed a map. These small structured signals tell search engines the page belongs to a real business that serves a real place.

Make the page good enough to rank with Surfer

Open Surfer SEO and start a new Content Editor. Enter the keyword the way people search it, "ac repair cape coral," not the bare "ac repair," then set location to United States and English and run the deep analysis. Surfer scores your draft against the pages already ranking for that term and lists the topics and phrases they cover. Write into the editor and watch the Content Score climb as you address what the page is missing.

Match or slightly beat the average score of the top-ranking pages. Do not chase 100. A perfect score reads as keyword stuffing and the page sounds robotic, which scares off the customer you wrote it for. Use Surfer's Customization Panel to drop national and irrelevant competitors from the analysis so the guidelines reflect the local shops you compete with.

Surfer in 2026 also tracks whether ChatGPT, Google AI Overviews, and Perplexity cite you. Load the prompts your customers type, like "best HVAC company in Fort Myers," and watch which city pages get named. A growing share of "near me" searches now starts inside an AI assistant, and the same trust-entity-rich page that ranks on Google is the one those assistants quote.

The find-and-replace trap that gets your pages ignored

The fastest way to kill a city-page strategy is to write one page, then find-and-replace the city name to spin out the rest. Google's systems read these near-identical pages as thin, duplicated content and bury most of them. You end up with thirty pages and one that ranks. The shortcut that felt efficient produces the exact outcome you built the pages to avoid.

Watch for the technical fingerprint of this trap in Semrush Site Audit. Crawl the site and check for missing and duplicate title tags across city pages, the tell-tale sign that pages share a skeleton with only a swapped town name. Fix titles, meta descriptions, and H1s so each is written for its own city, and re-crawl monthly to catch the problem before it spreads to a new batch of pages.

The honest fix takes longer and it is the only one that works. Give every page its own neighborhoods, its own local job example, its own review, its own first paragraph. The structure repeats; the substance does not. Build ten genuine pages a quarter rather than fifty hollow ones in a weekend.

Track each city at the city level, or a winning page looks like a loser

Set up Position Tracking in Semrush at the city level, not country or state, with the device set to mobile, since most home-services searches happen on a phone. Import your service-plus-city keyword list, include the "near me" variants, and enter your exact business name so the tool tracks your spot in the local pack. Add the local competitors who outrank you so every report shows the real gap.

Tracking at country or state level is the mistake that makes a strong local business look like it is losing. A page ranking number two in Cape Coral can read as page-three nowhere when the tool averages it across the whole country. Set the location precisely for each city page and judge it against the town it targets.

Count every lead once: the golden rule of tracking

City pages only pay off if you can prove which one made the phone ring, and that depends on one rule: one tracking system per conversion action. Calls run through CallRail, which swaps the displayed number per visitor and ties each call to the source, keyword, and landing page that produced it. Forms run through one source, CallRail or a GA4 import, never both. A lead gets counted once, never twice.

Double-counting is not a rounding error. When a form fires into two systems, your reporting inflates and your ad bidding over-optimizes toward junk. Pick one path for each action, wire it through Google Tag Manager, and test it as a fresh incognito visitor so you know the count is clean.

This is where honest marketing draws its line. The structure makes your phone ring, and CallRail tells you which city page and which source did it. We report calls and forms by source. We do not dress up a guess as booked-job attribution, because a number you can trust beats a number that sounds good.

Build the grid, then keep it fed

A service-by-city structure is a system, not a one-time build. Each month, run Semrush Site Audit and clear the top errors, glance at Position Tracking for movement, and run Keyword Gap for fresh city-and-service pages your competitors already rank for. In Surfer, pull a Content Audit and re-optimize two to four city pages that have impressions but weak scores. Refresh seasonal pages ahead of demand, AC tune-ups in spring and "heater not working" before the first cold snap.

A competitive software stack to run this well costs around $1,550 a month, and the work behind it runs 15 to 25 hours a month of research, writing, tracking, and reporting. Most contractors start strong and quit by month two, because local SEO compounds slowly and shows little for a while. The owners who keep feeding the grid are the ones who pull away.

We build and run this structure for home-services contractors, every city page written for its town and every lead tracked to its source. See how the system works, then decide whether to run it yourself or hand it to us.

See the full owner's playbook

Call NowFree Audit