Claude Code Local SEO: Google Business Profile, Map Pack Rankings, and City × Service Pages
Local SEO is one of the highest-ROI channels for service businesses. You are not chasing the entire internet — you are competing for a city, a map pack, and a handful of money keywords people type when they are ready to hire. This playbook consolidates the workflow into four moves: an optimized Google Business Profile (GBP), automated GBP posting, a review velocity engine, and a matrix of city × service pages plus localized blogs. AI tooling (Claude Code and similar agents) compresses work that used to take agencies weeks into repeatable prompts — as long as you still do the “BS test” and ship static, crawable pages.
Those click-share figures vary by SERP and industry, but the shape never changes: the top of local results is digital real estate. The rest of this guide is how to compete for it without inventing fake listings or thin doorway pages.
Local SEO vs general SEO
General SEO
- Rank anywhere Google serves the query
- Compete with national and global sites
- Organic blue links dominate the story
- Higher effort, longer timeline, higher cost
Local SEO
- Rank for a city / region + Maps results
- Compete with businesses in that trade area
- Map pack + organic local pages both matter
- Lower barrier — still competitive, faster wins
Proximity remains a major map ranking factor and you cannot “hack” it. What you can control: categories, services, service areas (when eligible), reviews, photos, posts, citations, and on-site content that matches how locals search.
Storefront vs service-area. A barbershop mostly ranks near its door. A plumber or mobile photographer who travels to the customer can often win broader city coverage — if the profile stays legitimate and service areas stay within a realistic drive time (rule of thumb: ~2 hours).
The four pillars of this system
1. Optimize Google Business Profile (the map pack goal)
Claim and verify your profile at Google Business Profile. Verification can take days (sometimes mail). Goal: the Local Map Pack — the top three map results under/near the map. Those listings capture a disproportionate share of local clicks (often cited around half of map-related attention, with ads and organic sharing the remainder of the SERP).
The four fields that do most of the work
| Field | Why it matters | Practical max |
|---|---|---|
| Primary category | Strongest single signal for which searches you enter | 1 primary + up to 9 secondary |
| Services | Surfaces you for service-intent local queries | ~10–50 (only real services) |
| Service areas | Defines where a traveler business is eligible | Up to ~20 (drive-time honest) |
| Reviews | Trust for users + velocity signal for Google | Steady monthly flow > one-time spike |
Other levers that routinely move the needle:
- Photos — real job photos beat stock. Profiles with rich photo sets tend to earn more calls; fake stock can hurt trust.
- Hours — if you show “closed,” Maps filters often hide you. After-hours AI receptionists exist so some shops advertise wider hours honestly.
- Products / offers — rarely inflate impressions; they can lift CTR once someone is already looking.
- Citations — consistent Name / Address / Phone on Yelp, Bing Places, Facebook, BBB, directories, etc. strengthen the “this is a real business” graph.
Suspension landmines. No fake listings. No PO boxes / UPS / co-working as a pretend storefront. No stacking unrelated profiles at one desk. No “I serve every city in the country.” Play for durable rankings, not disposable spam.
Use Claude Code (or any coding agent) to draft the profile brief
Create a project folder and a setup markdown file describing how you want the agent to research competitors and output categories, services, areas, and copy. Prompt along these lines:
Please read @google-business-profile-setup.md
Here is my business: https://example.com
Research the top local competitors in my city for my primary trade.
Output:
1) Primary + secondary GBP categories (only ones that exist in Google)
2) 20–40 candidate services with plain-English names
3) Service areas within ~2 hours drive
4) Short business description (no keyword stuffing)
5) Photo subjects I should upload this month
Flag anything that smells like exaggeration. Prefer copy-worthy truths.Then validate services in a keyword tool (Semrush, Ahrefs, etc.). Paste [service] + [primary city]. Drop zero-volume fluff. Keep “couples therapy Toronto”-class terms that show real volume over inventing phrases nobody searches.
The BS test. If it is real, keep it. If you added it only to game coverage, delete it. Google’s spam systems punish cartoon profiles.
2. Automate GBP posts (conversion, not vanity views)
Posts rarely multiply impressions by themselves. They convert existing viewers into clicks and calls — and indirectly help if engagement signals rise, AI overviews / feeds pick up your content, Google treats you as “open for business,” or a post-matching badge draws a Maps hover.
Ship a reference/ kit so the AI stops sounding like generic sludge:
tone.md— direct, plain, confidentvocabulary.md— words you actually sayhumor.md— what “funny” means for your brandbeliefs.md— positions you will defendbusiness-context.md— scraped from your site
Feed LinkedIn posts, emails, or call transcripts and ask the agent to extract those files. Prefer real photos; stock is a last resort. Automate delivery with Make.com (or native APIs once approved) so a month of drafts can schedule without a $500/mo retainer.
3. Reviews: threshold + velocity
Research in the space commonly treats ~10 reviews as the floor for being taken seriously in many verticals. After that, velocity matters more than a one-time dump: aim for a steady cadence (practitioners often target something like ~8 reviews/month — adjust to your volume). Psychologically, many buyers trust 4.7–4.9 more than a perfect 5.0 with a tiny sample.
Build a review gate (not a spam faucet)
- Ask every finished client (CRM automation > manual email).
- Send them to a one-page form: 1–5 likelihood to refer + open feedback.
- 1–3 stars → Slack/email you privately. Fix it. Do not shove them to Google.
- 4–5 stars → redirect to your Google “Write a review” link.
- Auto-reply to positive Google reviews with Make/Claude in your voice; handle 1–3 manually.
Build a one-page Next.js form:
1) Scale 1–5: “How likely are you to refer us?”
2) Long-text feedback field
If rating ≤ 3, POST to this Make webhook: …
If rating ≥ 4, redirect to: https://g.page/r/YOUR_REVIEW_LINK
Style it like our brand (clean, mobile-first).4. City × service pages and localized blogs
Map pack wins visibility. Organic listings below (and alongside) still print money when someone searches emergency plumber Toronto. Those “money” pages are transactional. Localized blogs capture adjacent research intent (best wedding venues in Toronto) so a photographer or caterer can intercept demand before the booking.
Only ship SSG (or equivalent pre-rendered HTML)
SSG
HTML ready at request time — Google grabs a slice and leaves. Indexable and fast.
SSR
Server bakes each request. Workable, but slower than a static build for brochure pages.
CSR-only
Browser assembles the pizza. Crawlers often see empties. Local money pages die.
When prompting Claude Code for a landing page, explicitly say: static site generation (Next.js output / App Router static generation, Astro, classic WordPress templates — pick one stack and stick to crawlable HTML).
The zipper matrix: cities × services
Zip services down one side and municipalities down the other. Each cell can become a page — carefully.
| Toronto | Mississauga | Brampton | Oakville | |
|---|---|---|---|---|
| Emergency plumbing | Page | Page | Page | Page |
| Drain cleaning | Page | Page | Page | — |
| Water heater | Page | Page | — | Page |
Conservative range: roughly 10–400 pages depending on real coverage and uniqueness. Beyond that, thin duplicate content risks a quality problem. Each page should have unique proof: neighborhoods served, photos, FAQs, review embeds, driving notes — not a find/replace city name.
Find winners in Keyword Magic / equivalent: sort by commercial intent (CPC is a useful proxy), export a CSV of keywords you actually sell, then:
Create a statically generated service page for:
Primary keyword: "plumbing services Toronto"
Mirror the layout in this Dribbble screenshot: [attach]
Include a keyword cluster of 4–5 related phrases
(unclog kitchen sink, slow drain, etc.) without stuffing.
Use @tone.md @humor.md @business-context.md
Internal-link to related services. Real CTAs only.Localized blogs that do not read like AI sludge
- Always attach the city: “best wedding venues in Toronto,” not “best wedding venues.”
- Target adjacent industries when they share buyers (venues → photographers).
- Research top-3 ranking posts: average word count, H2 count, image count — meet or beat the bar.
- Rewrite with your humor/tone files. Engagement (depth, time) is a ranking signal.
- Avoid cannibalization: one URL per clear intent.
On-page + technical SEO in one loop
- Paste an on-page checklist into Claude (titles, meta, H1/H2, internal/external links, schema where relevant).
- Run Chrome DevTools → Lighthouse on mobile.
- Copy the failing opportunities and ask Claude to fix performance (unused JS, image sizes, contrast).
- Re-run until performance sits in a healthy band (iterate toward 90–100).
WordPress angle. Many local service sites run WordPress + ACF for location and service modules. After you generate dozens of city pages, editors drown in per-page field edits. That is exactly when Quickfields Bulk Editor for ACF pays for itself — spreadsheet bulk updates to hero copy, CTAs, and local blurbs across the matrix. Stack: Sage / classic theme + ACF + Quickfields; see Quickfields Pro for CSV and image workflows.
Turn the workflow into a reusable “skill”
Do not re-explain the entire pipeline every morning. Ask Claude Code to create slash-commands / skills such as /blog-post, /service-page, and /gbp-post that:
- Pick the next unused keyword from your CSV list
- Research top SERP averages
- Write in your voice
- Apply on-page + Lighthouse feedback loops
- Log finished keywords so you never duplicate
Deploy so Google can find it
Push the repo private if you want, connect Vercel (or your WordPress host), set the framework preset correctly, attach a real domain, submit the sitemap in Search Console. Localhost pages do not rank.
Quick checklist
- Verified GBP with correct primary category
- Services validated with city-qualified search volume
- Honest service areas; citations NAP-consistent
- Photo-rich profile; posts in your real voice
- ≥10 reviews, then monthly velocity — gated so 1–3 never hit Google cold
- City × service pages on SSG/crawlable HTML — unique, not spun
- Localized blogs with city tokens + competitor-informed depth
- Lighthouse mobile loop; on-page checklist applied
- Skills/automation so the system repeats without heroics
Local SEO still rewards patience and legitimacy. AI collapses the busywork — drafting categories, posts, gates, and page shells — so you can spend time on proof: jobs completed, photos uploaded, reviews earned, and pages that help a real neighbor find a real contractor.
Related: Quickfields for bulk ACF edits · indexing / sitemap basics · do not ship AI hallucinations