← Blog/Local SEO24 min read

The Local Service SEO Playbook: What Actually Moves Rankings, Clicks, and Leads

A practitioner's SEO guide: intent mapping, entity-graph keywords, AEO for AI search, schema, and a GSC diagnostic loop backed by real client data.

August 14, 2026

Most local SEO advice stops at generic checklists: write more content, build more links, add more keywords. This guide is different. It walks through the actual decisions that separate SEO work that moves rankings, clicks, and leads from work that just produces activity — starting with the business intake most agencies skip, through intent classification, entity-graph keyword research, on-page depth, AEO for AI assistants, schema markup, indexing, realistic timelines, and a diagnostic loop for reading Search Console data correctly. It's built from real client campaigns, not theory.

This guide is for you if

  • You run or manage SEO for a local service business — HVAC, plumbing, law, home services, or similar — and want a process, not a checklist.
  • You've seen rankings or impressions grow in Search Console without a matching increase in leads, and want to know why.
  • You want to understand AEO and schema markup well enough to implement them correctly, not just enable a plugin.

1. Start With the Business, Not the Keyword

Keyword research done before you understand the business produces a list of terms nobody at the company can actually fulfill, sell, or price. That's the failure mode, and it's more common than bad keyword tools.

A real intake looks like this, and it should happen before anyone opens a keyword tool:

  • Services offered, specifically. Not "HVAC repair" — "residential AC repair, commercial rooftop unit maintenance, emergency after-hours service, new install quoting." Each of those is a different page, a different buyer, and often a different intent.
  • Service radius. A 15-mile radius from a single location and a five-county coverage area are different SEO problems. One needs a strong single location page. The other needs a defensible multi-location strategy.
  • Average deal value. A $150 drain cleaning and a $12,000 HVAC replacement do not deserve the same content investment or keyword competitiveness tolerance. High-ticket services can justify harder, higher-volume terms even on a new domain, because one closed deal pays for months of the work.
  • Current lead sources. If 80% of current business comes from referrals and repeat customers, organic search is a growth channel, not a survival channel — that changes how aggressively to recommend spending.
  • What "good lead" means to this business. A personal injury law firm wants qualified case inquiries, not general legal questions. A plumber wants same-day service calls, not people three months out from a renovation. This definition is the one most agencies skip, and it's the one that determines which keywords are actually worth ranking for.

Skip this and you get keyword research that optimizes for search volume instead of the thing that actually pays the bill. Campaigns that chase "plumbing services near me" — a broad, competitive, low-specificity term — for a business that does 70% of its revenue from emergency water heater replacement are optimizing for the wrong target. Emergency water heater replacement has a fraction of the competition and a buyer who converts same-day. The keyword research wasn't wrong on volume. It was wrong on business fit, because nobody did the intake first.

2. Local vs. National — and How Many Location Pages You Actually Need

Build a location page when there's something genuinely unique to say there. Without that, it's a doorway page with extra steps, and Google has gotten good at recognizing the pattern.

GBP setup that isn't cosmetic. Most businesses fill in a Google Business Profile once and never touch it again. Three things matter more than people think:

  • Categories. Primary category should match the highest-value service, not the broadest one. Secondary categories should reflect the actual service list from the intake, not a generic "contractor" catch-all.
  • Services list with descriptions. Each service entry is a small piece of indexable content. Leaving them blank or one-word is wasted surface area.
  • USP in the business description and service area. "Family-owned since 2009, licensed and insured, same-day emergency service" tells both users and Google what differentiates this listing from the twelve others in the pack. A vague description doesn't.

The multi-location decision. The rule that actually works: build a separate location page only with a real address, real staff at that location, real local reviews, and real local proof — project photos, local certifications, a phone number that rings at that office. If all there is is "we also serve [City B]," that's a sentence on the main service page, not a page of its own.

The test to apply: strip the city name out of the page. If there's nothing left that couldn't apply to every other location, don't build the page.

The doorway page trap looks like this from the inside: fifteen city pages, each with the same 400 words reworded with a find-and-replace on the city name, no unique staff, no unique reviews, no unique service nuance. It might rank for a few weeks on sheer volume. It won't hold, because there's no actual signal underneath it, and it puts every page on the domain at risk when Google's local spam systems catch up to the pattern. Three genuinely strong location pages beat fifteen thin ones.

3. Search Intent Classification

Intent mismatch — not thin content, not low domain authority — is the single most common reason a well-written page fails to rank. The best-written page on the internet for the wrong intent will never outrank a mediocre page that matches what the searcher actually wants.

The four intent types, and the page type each demands:

Search intent and the page type that wins

IntentWhat the searcher wantsPage type that wins
InformationalAn answer or explanationBlog post, guide, FAQ
Commercial (investigation)Comparison before a decisionComparison page, "best X for Y," pricing breakdown
TransactionalReady to buy or bookService page with a clear CTA, pricing, booking
NavigationalA specific site or brandHomepage, branded landing page

Reading intent off the live SERP instead of guessing. Before writing anything, search the target term and look at what's actually ranking. If the top 10 results for "how much does AC repair cost" are all blog posts with pricing breakdowns, that's a commercial-investigation term — a transactional service page won't compete for it. If the top 10 for "emergency plumber [city]" are all service pages with phone numbers above the fold, that's transactional — a long blog post about the history of plumbing won't touch it. The SERP tells you the intent Google has already decided the term has. Guessing from the keyword phrase alone gets this wrong constantly, especially for ambiguous terms.

Case: what intent mismatch looks like in Search Console. One property in this data set — a large US media aggregator — pulled 1,090,000 impressions and just 4,480 clicks over a six-month window, a 0.4% CTR at an average position of 22.5. That's not a ranking problem in the sense most people think about ranking problems. Position 22.5 with over a million impressions means Google is surfacing this site for a huge volume of queries it has no real business ranking for — the content and the query set don't match closely enough to earn clicks even when shown. High impressions with a near-zero CTR is the signature of intent mismatch at scale, not a site that's "almost there." Fixing this isn't a title-tag tweak. It requires going back to the query set the site is actually being matched to and asking whether the content was ever built to answer those queries at all.

Google Search Console performance chart showing 4.48K clicks against 1.09M impressions, a 0.4% average CTR, and an average position of 22.5
The media aggregator from the intent-mismatch case: 1.09M impressions, 4.48K clicks, 0.4% CTR, position 22.5 — six-month window.

4. Keyword Research for a New Domain

Start with low-difficulty long-tail terms — not because it's the safe or humble choice, but because the competition math doesn't work any other way on day one.

Ranking for a competitive head term requires topical authority — a body of content and links that signals to Google you're a credible source on the broader topic — and link equity, which takes time to accumulate on any domain regardless of content quality. A brand-new domain has neither. Competing directly for "HVAC repair [major city]" against domains with years of backlinks and hundreds of indexed pages isn't a content quality contest; it's a resource gap that content alone doesn't close quickly.

Long-tail terms sidestep this because the competition set is thinner — fewer established domains have bothered to target "why does my AC blow warm air at night" specifically, even though the volume is a fraction of the head term. Ranking for a cluster of these builds two things simultaneously: real organic traffic sooner, and the topical authority signal that eventually makes the head term winnable. Skipping straight to head terms on a new domain usually means months of zero visibility while the domain waits for authority it hasn't built the foundation for.

The entity-graph angle. This is the part most keyword research skips entirely, and it's the difference between content that matches the keyword and content that actually competes. Every page that currently ranks for a term contains a set of entities — specific concepts, brands, sub-topics, named processes, related terms — that Google's systems associate with that query. Pull the top 5–10 ranking pages for the target term and identify what they consistently mention that a draft doesn't. If five of the top results for "tankless water heater installation cost" all mention permit requirements, venting type, and gas line sizing, and the draft doesn't cover any of the three, it isn't competing on the same entity set the algorithm has learned to associate with that query — regardless of how well-written the page is.

This is more useful than a keyword density check because it isn't about repeating the target phrase. It's about covering the same conceptual ground the ranking pages have already proven is relevant to that search, then going one level deeper than they did. That gap — entities present in the top results but absent from the draft — is the actual to-do list for the page, and it's usually more specific and more actionable than any generic content outline.

5. On-Page That Actually Matters

Word count is not a ranking factor. Depth relative to what's already ranking is. That needs to be stated plainly, because "aim for 1,000 words" is still common advice, and it produces padded pages that add nothing the top results don't already have.

H1 and the first 100 words. The primary keyword belongs in the H1, and the first 100 words need to directly answer what the page is about — no scene-setting, no "when it comes to."

Before: "When it comes to finding a reliable plumber, there are a lot of things homeowners need to consider before making a decision. In today's world, plumbing issues can strike at any time, and having a trusted professional on call is more important than ever."

After: "We provide licensed emergency plumbing repair across [service area], with same-day response for burst pipes, water heater failures, and blocked drains. Call [phone] for immediate dispatch, or request a quote online."

The second version answers the query in the first sentence. The first version is 44 words before it says anything.

Depth over word count. Match the depth of the current top 5 results for the target term, then add information gain — something specific those five don't already cover: a real pricing range, a step the competitors skip, an answer to a follow-up question they leave unaddressed. A transactional page can win at 300 words if those 300 words are more specific and more complete than what's currently ranking. A thin 1,200-word page that restates the same five points as everyone else in more sentences doesn't out-rank anyone.

Natural usage. The keyword should appear where it would naturally appear in a sentence a human would actually write — the H1, the first paragraph, a subheading or two, the meta description. Repeating it every third sentence doesn't help rankings and reads badly to the person you're trying to convert.

Internal linking. This is the part most on-page checklists skip, and on a new domain it matters more than backlinks do, because it's the one ranking factor fully under your control from day one.

Structure it hub-and-spoke: a core service or category page (the hub) links out to related, more specific pages (the spokes), and each spoke links back to the hub and sideways to its closest siblings. A "Plumbing Services" hub links to "Water Heater Repair," "Drain Cleaning," and "Pipe Replacement" spokes; each spoke links back to the hub and mentions the other two where relevant.

Anchor text should be descriptive — "water heater repair pricing," not "click here" or a bare "learn more." Descriptive anchors tell both the user and Google what the linked page is about before they click, and they compound: every new page published that links into the hub adds a little more relevance signal to the pages already there. A new domain has no backlink profile to lean on yet. It does have full control over its own internal link graph from the first page published, and that graph is doing real ranking work while the backlink profile is still empty.

6. AEO — Getting Cited by AI Assistants

The mechanism is chunk-level retrievability, not keyword density. AI Overviews, Perplexity, and browsing-enabled ChatGPT don't ingest a page as a whole document — they retrieve individual chunks, usually a paragraph or a section, that are semantically relevant to the query, independent of everything around them. If a paragraph only makes sense after reading the paragraph before it, it won't retrieve cleanly on its own, and it won't get cited on its own.

That has a direct writing implication: every section needs to state its claim first, then support it, rather than building up to a point across several paragraphs — the same answer-first discipline as Section 5, applied at the section level instead of just the page level. A reader, or a retrieval system, should be able to land on any H2 and get a complete answer to that section's question without needing the sections before it.

Tables and original data as citation bait. This isn't just a formatting preference — it's about how retrieval systems handle ambiguity. A table row is a clean semantic unit: one entity, a defined set of attributes, no inference required to extract "the number." A paragraph that says "clicks improved substantially" requires the model to infer what "substantially" means. A table cell that says "336,000 clicks" doesn't. Structured data gets lifted verbatim far more often than prose does, because there's nothing to interpret.

Comparison tables that name real competitors. If a buyer's actual query is "LeadOrigins vs CallRail" or "best lead attribution tool for HVAC companies," and the content never names the competitors by name, it cannot be retrieved for that query — not because the content is worse, but because there's no lexical or semantic match to the comparison being asked for. Naming competitors directly, and being fair about what they do well, is a prerequisite for showing up in comparison-intent retrieval, not a risk to avoid.

Specific numbers beat generic claims, structurally. "SEO takes time" exists, worded almost identically, on tens of thousands of pages. It has no retrieval value because it's not unique to any one page — a model can cite that claim from anywhere. "A B2B services site went from flat impressions to a 4–5x step-change in eleven days after crossing an authority threshold" exists nowhere else. Specificity isn't just more convincing to a human reader; it's the only thing that makes a chunk citable instead of interchangeable with ten thousand other chunks saying the same generic thing.

FAQ blocks written as real questions. Not "Benefits of Lead Attribution" as a heading with bullet points under it — the literal question a buyer or a voice query would ask: "How does lead attribution work if a customer calls instead of filling out a form?" Conversational search and AI assistant queries are phrased as questions. Content phrased as an answer to that exact question has a much shorter distance to travel to become the cited answer.

Where llms.txt actually stands. It's a proposed root-level file, formatted like robots.txt, meant to give LLM crawlers a curated summary of a site and its most important pages. As of this writing, no major LLM provider has confirmed they parse or prioritize it. Treat it as a low-cost hedge, not a requirement — publishing one costs almost nothing, but its absence is not a confirmed ranking or citation problem, and it shouldn't be prioritized over the structural work in this section.

7. Schema Markup and the Entity Graph

Schema's job here is not rich-result decoration — it's telling machines explicitly what entity you are and what you're connected to, instead of leaving them to infer it from prose.

The five schema types that matter for a local service business:

Schema types that matter for a local service business

Schema typeWhat it establishes
LocalBusinessThe core entity: name, address, phone, service area, hours, price range.
ServiceOne instance per service offered, each tied back to the LocalBusiness via provider.
FAQPageStructures FAQ content so it can be extracted as discrete Q&A pairs, matching the AEO retrieval mechanism from Section 6.
OrganizationThe brand-level entity, distinct from any single location — useful once there's more than one LocalBusiness instance.
BreadcrumbListDeclares the page's position in the site hierarchy, reinforcing the hub-and-spoke internal linking structure from Section 5 in machine-readable form.

AggregateRating and Review are deliberately left off this list. They're common additions, but only worth using with genuine, verifiable review data behind them — fabricated or lightly-massaged review schema is one of the more obvious spam patterns Google's systems watch for, and it's not worth the risk for a marginal rich-result gain.

sameAs, about, mentions — wiring the entity graph on purpose. These three properties do the actual connective work:

  • sameAs links your entity to authoritative external profiles of the same entity — your Google Business Profile, Wikipedia or Wikidata if you have one, verified social profiles. This disambiguates which "Smith Plumbing" you are, out of every business with a similar name.
  • about declares the primary subject entity of a piece of content — what the page is fundamentally about, distinct from what it merely references.
  • mentions declares secondary entities the content references without being centrally about them — the specific brands, tools, or concepts that show up in the body.

Used together, these three properties tell a knowledge graph what you are, what you're the authoritative source on, and what you're topically connected to — the same entity-graph logic from Section 4, now expressed in markup instead of inferred from content alone. A combined @graph block wiring Organization, LocalBusiness, Service, FAQPage, and BreadcrumbList together in one JSON-LD payload is the practical way to ship all five at once on a service page.

8. Indexing and Links

Indexing is a byproduct of sitemap and internal-link health, not a button you press. That needs to be said directly because Search Console's "Request Indexing" feature is still widely treated as a real lever, and it's been heavily throttled for a long time now — it's mostly decorative at this point. A clean XML sitemap and a well-connected internal link structure (the hub-and-spoke pattern from Section 5) do the actual work of getting new pages discovered and crawled. Requesting indexing on individual URLs one at a time doesn't scale past a handful of pages and isn't a substitute for either.

Anchor text, corrected. Using the exact target keyword as anchor text on every backlink is not the move. A natural anchor text profile is varied: mostly branded ("Example Plumbing"), a meaningful share of naked URLs and partial matches, and exact-match keyword anchors kept low — roughly 10–15% of the total profile, not the default. A link profile heavily weighted toward exact-match anchors is one of the more recognizable manual-manipulation signals, precisely because it doesn't occur naturally. Nobody linking to a business organically writes "best emergency plumber austin tx" as their link text — they write the business name, or "check them out," or the raw URL. A profile that looks unnaturally optimized reads to Google's systems the same way it reads to a person: like it was built, not earned.

Quality over volume. A single link from a page that's actually relevant to the industry and gets real traffic is worth more than a dozen links from low-relevance directories or link farms. The link's value comes from what it tells Google about topical association and from whatever residual traffic and trust the linking page itself has — not from being one more line item in a link count.

9. Timeline and Patience

Plan on 3–6 months for meaningful movement on a new domain, and 6–12 weeks on an established one with existing authority. This needs to be specific, because setting a 6-week expectation is the single fastest way to get an agency fired in week seven, for work that was often on track and simply hadn't had time to show up yet.

SEO moves in steps, not a smooth line, and the data backs that up better than the assertion alone would. One property in this data set — a US B2B services site — ran flat and low on impressions for roughly three months, then hit a hard inflection point around May 22: impressions stepped up 4–5x almost overnight and held at that level, with clicks following the same pattern. That's what real authority growth looks like in Search Console — nothing, nothing, nothing, then a step, then a new plateau. It rarely looks like gradual daily improvement, which is exactly why a 6-week window catches almost nothing: most domains are still in the "nothing" phase at week six, not because the work isn't working, but because the step hasn't arrived yet.

The honest part, worth saying out loud because a competent client will notice it anyway: that same property was sitting at a 1.8% CTR at an average position of 9.8 after the authority step-change resolved. The authority problem got fixed. The SERP-presentation problem — covered in the next section — didn't get fixed by the same work, because it isn't the same problem. Reporting the win without naming what's still broken is how you end up promising results a client won't actually get from the next round of work.

Google Search Console performance chart showing impressions and clicks flat for three months, then stepping up 4-5x around May 22 and holding at the new plateau
The B2B services property's authority step-change: flat through late May, then a 4-5x jump around 5/22 that holds — 7.75K clicks, 420K impressions, 1.8% CTR, position 9.8.

10. The Diagnostic Loop

Pull Search Console, match the symptom to the fix — that's the whole method, and it only works if you resist the pull to report the biggest number in the account as the win.

Before the four cases, one framing example. A large US content property in this data set posted 54,200,000 impressions over the six-month window — the single largest number across every property looked at — against 287,000 clicks and a 0.5% CTR, with both metrics trending downward across the period. Fifty-four million impressions sounds like a headline. It isn't one. It's the clearest demonstration in this entire data set of why impressions are the easiest metric to inflate and the least useful one to report to a client on their own: a page can be shown to an enormous number of people for queries that don't want it, and the impression count will look identical to genuine demand until you check the CTR next to it.

Google Search Console performance chart showing 54.2M impressions and 287K clicks trending downward over six months, a 0.5% average CTR at position 9.3
The framing example: 287K clicks against 54.2M impressions, 0.5% CTR — both metrics trending down across the window.

The four Search Console symptom-to-fix cases

CaseSymptomThe actual problemThe fix
1Impressions rising, position stuckTopical authority and link problemMore quality backlinks, stronger internal links, deepening the surrounding content cluster
2Good position and impressions, no clicksSERP-presentation problem, not a ranking problemTitle-and-meta rewrite, schema for rich results, check whether an AI Overview is absorbing the click
3Clicks coming, no leadsIntent mismatch or weak on-page conversion — invisible to GSC, which stops at the clickJoin click data to what happened after the visit — a lead-tracking layer, not a ranking fix
4Rankings decaying over timeContent refresh problem — competitors updated, the page didn'tA refresh cadence: revisit ranking pages on a schedule, update data and examples, close the gap to current top results

Case 1 — impressions rising, position stuck. The B2B services property from Section 9 is this case resolving in real time: three flat months, then the step-change once enough authority signal had accumulated. Nothing about the page itself needed to change — the surrounding authority did.

Case 2 — good position and impressions, no clicks. This is the cleanest case in the whole data set. A US retail chain in this data pulled 336,000 clicks against 5,000,000 impressions over the window — a 6.7% CTR at an average position of 11.9 — but the shape of the trend is what matters: impressions actually trended down over the six months while clicks trended up. Early in the window the two lines sit on top of each other; by July and August, clicks are clearly running above impressions, meaning the effective click-through rate roughly doubled from the February–March baseline. Nothing about how often the site was shown improved — what improved was how often people clicked once shown.

Google Search Console performance chart showing clicks trending upward while impressions trend downward, crossing over mid-window, ending at 336K clicks and 5M impressions
The retail chain's SERP-presentation fix: impressions trend down while clicks trend up — 336K clicks, 5M impressions, 6.7% CTR, position 11.9.

Case 3 — clicks coming, no leads. This is where Search Console runs out of answers, and it's the most consequential case in this list because it's invisible if you're only looking at the report everyone defaults to. The cause is usually intent mismatch — informational traffic landing on a page built for transactional buyers — or a page that gets the right visitor but converts them poorly once they arrive. GSC cannot tell you which. It stops at the click by design; it has no visibility into what happened after the visitor landed, whether they called, filled out a form, or left. There's no way to diagnose this case correctly without joining click data to what actually happened afterward. A perfect Case 1 and Case 2 fix can still leave you not knowing if any of it produced a paying customer.

No Search Console chart for this one — that's the point. GSC has nothing to show here by design; diagnosing it means joining click data to what happened after the visit, which is outside what Search Console reports on at all.

Case 4 — rankings decaying over time. A US site with heavy returning-visitor demand in this data set posted a genuinely excellent 13.5% CTR at an average position of 7.8 — a number worth citing on its own — but daily clicks declined substantially from the February peak through August, on top of a strong weekly sawtooth pattern from weekday-driven traffic. The CTR being strong doesn't mean the trend is fine; a page can convert every impression it gets exceptionally well while still losing relevance and impression volume over time as competitors refresh their content and the page doesn't.

Google Search Console performance chart showing a strong weekday sawtooth pattern with daily clicks gradually declining from a February peak through August, 13.5% average CTR at position 7.8
The returning-visitor property's decay pattern: a strong weekday sawtooth with clicks gradually declining from the February peak — 1.21M clicks, 8.96M impressions, 13.5% CTR, position 7.8.

Across the five properties in this data set, the six-month totals come to roughly 1.85 million clicks and 69 million impressions. Not one of those five charts tells you whether a single lead came in. Every one of them stops at the click. That's what Search Console is — it reports on search behavior, not on what happened next. If the diagnostic loop is going to mean anything past Case 2, something has to pick up where GSC stops.

Takeaway

The businesses that win with local SEO aren't the ones with the biggest content budget — they're the ones who do the intake before the keyword research, match content to the intent the SERP has already decided a term has, write for chunk-level retrievability instead of keyword density, and read Search Console as a diagnostic tool instead of a scoreboard. Rankings, clicks, and leads are three different metrics that fail independently, and Search Console only ever tells you about the first two. Closing the loop past the click — knowing whether a ranking win actually produced a paying customer — is the part most SEO reporting still skips.

Frequently asked questions

How long does local SEO actually take to show results?

Plan on 3–6 months for a new domain and 6–12 weeks for one with existing authority. It moves in steps, not a straight line — flat for months, then a step-change once enough authority has accumulated — which is exactly why a 6-week timeline usually catches nothing.

Should I build a separate landing page for every city I serve?

Only if you have something genuinely unique to say there — a real address, real local staff, real local reviews. If stripping the city name out would leave a page identical to every other location page, don't build it; that's a doorway page, not a location page.

Can Google Search Console tell me if a keyword generated a lead?

No. GSC stops at the click by design. It has no visibility into whether that visitor called, filled out a form, or left. Diagnosing clicks-coming-no-leads requires joining click data to what actually happened after the visit.

Is word count a ranking factor?

No. Match the information depth of the current top 5 results for your target term, then add something they don't cover. A transactional page can win at 300 words if those words are more specific than what's currently ranking.

What percentage of my backlinks should use exact-match anchor text?

Roughly 10–15%, not the majority. A natural link profile is mostly branded anchors, naked URLs, and partial matches. A profile weighted heavily toward exact-match keyword anchors is a recognizable manual-manipulation signal, because it doesn't happen that way organically.

Do I need an llms.txt file?

It's a proposed file, not a confirmed standard — no major LLM provider has confirmed they parse or prioritize it as of this writing. It costs almost nothing to publish one, but treat it as a low-cost hedge, not a requirement your SEO is missing without it.

Fix your SEO attribution with LeadOrigins

Connect keywords, landing pages, and leads to the revenue they actually generated.