By Chris Leo, Movou

Here’s a pattern we found in our own search data, and it changed how we think about local pages. People searching for marketing help almost never search by city alone. They search by trade. “SEO for movers.” “SEO for pool contractors.” “SEO for restaurants.” Yet the entire local SEO industry, us included, has spent a decade building city pages. If you’re doing SEO for contractors or any other trade, the way you organize your pages is probably costing you the exact customers you’re trying to reach.

Key takeaways

What we found in our own data

We went through our Search Console data looking at which queries bring people to us. A clear pattern showed up: a whole set of searches qualified by trade, and every single one of them was landing on a page about a city instead.

Searches like “seo for contractors long beach ca,” “seo for movers phoenix,” “seo for restaurants tampa fl,” and “seo for pool contractors in gilbert” were all being answered by generic city pages. The average position across those trade-qualified searches was around 72. That’s page seven or eight. Effectively invisible.

The reason is simple once you see it. We had no page about movers. No page about pool contractors. No page about restaurants. Google had nothing better to offer, so it reached for a page that matched the city and ignored the more important half of the query.

Why does the trade matter more than the city?

Because the trade carries the intent.

Someone searching “SEO in Phoenix” could be anyone. A student, a competitor, a business owner idly curious, someone comparison shopping with no budget. It’s a broad, low-commitment query.

Someone searching “SEO for movers in Phoenix” is a moving company owner with a specific problem. They’ve already decided they need help. They’re now looking for someone who understands their business. That’s a dramatically more qualified visitor, and there are far fewer pages competing to serve them.

This holds for your customers too. “Plumber Dallas” is a huge, brutal search. “Emergency slab leak repair Dallas” is smaller, easier to win, and the person searching it is ready to pay today. The specific query is almost always the better business.

Why do city pages underperform?

Programmatic city pages are seductive because they scale. Write one template, swap the city name, publish two hundred pages. It feels like leverage.

The problem is that they’re all the same page. If your Dallas page and your Houston page differ only by a city name, neither one contains anything a searcher couldn’t get from the other, and neither demonstrates knowledge of anything. Google is good at spotting this.

There’s a second cost that’s harder to see. Those pages compete with each other. Twenty near-identical pages targeting variations of the same phrase split your signals across all twenty, so none of them accumulates enough strength to rank. That’s keyword cannibalization, and Google’s documentation on consolidating duplicate URLs is explicit that you should pick one canonical page rather than leave Google to guess between near-duplicates.

The result is a large site that looks productive in a report and generates nothing.

What does a trade page actually contain?

This is where trade pages earn their keep, because you can write things that are true for movers and false for roofers. A city page can’t do that.

A real page for, say, moving companies should cover:

Now compare that to what a city page says: “We offer SEO services in Phoenix. Phoenix is a growing city. Contact us for Phoenix SEO.” A moving company owner reads the first version and thinks these people get it. They read the second and close the tab.

How should you combine trade and location?

Not by multiplying them into infinity. The trade-plus-city combination works, but only where it’s real.

A sensible structure looks like this:

  1. One strong trade page per trade you actually serve. “SEO for Moving Companies.” Deep, specific, genuinely useful.
  2. Trade plus city pages only for markets where you have real presence, meaning actual clients, actual results, actual local knowledge. Maybe three to five, not fifty.
  3. A single well-built location page for your primary market, rather than a page for every town within a hundred miles.

The test is simple. If you can’t write three paragraphs about that specific trade in that specific market that would be wrong if you swapped either variable, the page shouldn’t exist.

How do you know if this is your problem?

Open Search Console and go to Performance, then Queries. Look for searches that include a trade, a vertical, or a specific service, not just a location. Click one, switch to the Pages tab, and see what Google is serving.

If a generic page is answering a specific query, that’s your gap. If several of your pages show up for one query, that’s cannibalization on top of it.

We ran exactly this check on ourselves and found around seventy impressions a month sitting at position 72 on trade-qualified searches, all served by the wrong page type. Not a huge number in isolation, but it’s demand we already have, being handed to competitors because we built the wrong page.

What we’re changing

We’re building trade pages before we build another city page, starting with the trades our search data says people are already looking for. We’d rather have eight pages that genuinely serve eight industries than two hundred that serve nobody.

If you’re running a service business, the same logic applies to your site. Your customers aren’t searching for your city. They know what city they’re in. They’re searching for the specific thing they need, and the business that named that thing usually gets the call.

Pull up Search Console this week and sort your queries by whether they name a service or just a place. If the service-specific ones are ranking worse than the generic ones, you’ve found the same problem we did. Our local SEO services start with this exact audit, and our organic traffic services page covers how we build out the structure once the gaps are clear.

Leave a Reply

Your email address will not be published. Required fields are marked *