Install
$ agentstack add skill-mshahiddigital-agentic-local-seo-audit-multi-location-seo ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Multi-Location SEO Audit — Phase 21
Executive Summary
Multi-location SEO is exponentially more complex than single-location — each additional location adds citation management, content differentiation, schema isolation, and cannibalization risk. In 2025, proximity weight for mobile local search increased to ~35% of local pack ranking (up from ~25% in 2023), meaning geographic optimization at each location matters more than ever. AI Overviews appear for ~35% of local service queries (Q1 2025) and pull directly from GBP data + location landing pages. Businesses with template-cloned location pages face active suppression under Google's Helpful Content System (integrated into core algorithm March 2024). The 60% unique content threshold is now a hard floor — below it = Helpful Content System penalty risk.
2025 multi-location benchmarks per location: | Metric | Minimum Viable | Competitive | Market Leader | |--------|---------------|------------|---------------| | GBP review count | 25 reviews | 75–100 | 200+ | | GBP review rating | 4.0 stars | 4.5 stars | 4.7–5.0 stars | | Review velocity | 2/month | 5–8/month | 15+/month | | GBP photos | 10 photos | 25+ photos | 50+ photos | | Location page word count | 600 words | 1,000–1,500 words | 2,000+ words | | Unique content vs. other pages | 60% | 80%+ | 90%+ | | Citations per location | 40 | 75–100 | 150+ | | NAP consistency | 85% | 95% | 99–100% |
Numbered Action Plan:
Immediate (Week 1, Per-Location Wins)
- Run NAP consistency audit — BrightLocal or Whitespark → check all active citations for each location → identify and flag inconsistencies (wrong address, old phone, variant business names). Effort: 30 min/location. Priority: 25 (5×5).
- Verify all GBPs are claimed and verified — each location must have its own GBP with verified address. Unclaimed GBP = competitor can claim it. Effort: 30 min/location.
- Audit location page unique content — Screaming Frog → compare content similarity across location pages. Any page ` tag + footer
- ✅
LocalBusinessschema with this location's unique data and@id - ✅
FAQPageschema with 3–5 location-specific FAQs (AIO optimization — 35% of local queries trigger AIO) - ✅ Location-specific reviews/testimonials from real customers in that area
- ✅ Staff photos/bios specific to that location (E-E-A-T signal)
- ✅ Location-specific CTAs (click-to-call this location's number)
Content Differentiation Test
Run each location page pair through a diff tool (use Siteliner free up to 250 pages or Copyscape):
| Location Pair | Unique Content % | Pass/Fail | Action | |--------------|----------------|----------|--------| | [Loc 1 vs. Loc 2] | [X%] | ✅/❌ | | | [Loc 1 vs. Loc 3] | [X%] | ✅/❌ | | | [Loc 2 vs. Loc 3] | [X%] | ✅/❌ | |
Thresholds: Locations > [City] on all location pages?
- Footer: list all locations (if ≤ 10) or link to location hub?
- Service pages link to all relevant location pages?
- Crawl depth to location pages: ≤ 3 clicks from homepage?
Run Screaming Frog → Crawl Analysis → identify orphaned location pages (pages with 0 inlinks).
Step 6: Local Citation Strategy Per Location
For each location, citations must use THAT location's exact NAP. Use BrightLocal or Yext to audit:
Tier 1 — Data Aggregators (Fix First — Feed Hundreds of Directories)
| Aggregator | Location 1 Status | Location 2 Status | Fix Priority | |-----------|------------------|------------------|-------------| | Data Axle (infoUSA) | | | Critical | | Neustar/Localeze | | | Critical | | Acxiom | | | Critical | | Foursquare (feeds Apple Maps) | | | Critical |
Tier 2 — Core Platforms
| Platform | Loc 1 | Loc 2 | NAP Correct? | |---------|-------|-------|-------------| | Google Business Profile | | | | | Apple Maps | | | | | Bing Places | | | | | Yelp | | | | | Facebook | | | | | BBB | | | |
Common multi-location NAP errors:
- All locations using same 1800/toll-free number (kills local relevance — each location needs unique local number)
- Citations showing old address for relocated branch
- Duplicate GBP listings for same location
- HQ address appearing on branch location citations
- NAP consistency rate target: ≥95% across all tracked citations
Step 7: Cannibalization Prevention Framework
Location pages cannibalize when they compete for identical keywords without geographic separation.
Keyword-to-URL Mapping Matrix
Build this matrix for all location × service combinations:
| Keyword | Assigned URL | Location Owner | No Other Page Targets This? | |---------|------------|--------------|---------------------------| | plumber chicago il | /locations/chicago-il/ | Chicago | ✅/❌ | | plumber chicago north side | /locations/chicago-il/north-side/ | Chicago | ✅/❌ | | plumber evanston il | /locations/evanston-il/ | Evanston | ✅/❌ |
Detection: Run Ahrefs → Site Explorer → Organic Keywords → filter for keywords where 2+ URLs rank on same page. Each keyword should have exactly one canonical page targeting it.
Prevention rules:
- Each location page targets geographically distinct primary keyword
- Use
areaServedin schema to isolate geographic scope per location - Consolidate overlapping pages with 301 redirect to the stronger location page
- Use Local Falcon geographic grid to identify where locations compete within same service area
Step 8: Service × Location Matrix Pages
For businesses with multiple services and locations, deep service+location pages drive the most traffic:
domain.com/locations/chicago-il/ ← Location hub
domain.com/locations/chicago-il/drain-cleaning/ ← Service × Location
domain.com/locations/chicago-il/water-heater/ ← Service × Location
domain.com/locations/evanston-il/drain-cleaning/ ← Service × Location
Matrix Gap Analysis
| Service | Chicago | Evanston | Oak Park | % Complete | |---------|---------|---------|---------|-----------| | Drain Cleaning | ✅/❌ | ✅/❌ | ✅/❌ | | | Water Heater | ✅/❌ | ✅/❌ | ✅/❌ | | | Emergency Plumbing | ✅/❌ | ✅/❌ | ✅/❌ | |
Priority: High-traffic service × high-competition location combinations first. Use Ahrefs Keyword Explorer to validate search volume for each combination.
Step 9: AIO Optimization Per Location
AI Overviews appear for ~35% of local service queries (Q1 2025). Each location page needs:
- FAQPage schema with 3–5 location-specific questions (direct AIO citation trigger)
- Structured content: Use H2/H3 headers that match common "near me" query patterns
- Review mentions: AIO typically features businesses with ≥4.3 stars and ≥20 reviews per location
- Proximity data: Precise latitude/longitude in GeoCoordinates schema
- Unique expertise signals: Location-specific staff credentials, certifications, licenses displayed on page
AIO test per location: Search best [service] in [city] in Google → does this location appear in AIO? Document status for each location.
Step 10: Competitor Comparison
| Signal | Client (All Locs) | Comp 1 | Comp 2 | Gap | |--------|-----------------|--------|--------|-----| | Total locations | | | | | | GBP completeness avg (%) | | | | | | Avg review count per location | | | | | | Avg rating per location | | | | | | Location page unique content % | | | | | | Service × location pages (count) | | | | | | Local pack appearances (all locs) | | | | |
Scoring
| Category | Weight | Score | |----------|--------|-------| | GBP per-location completeness (12-point checklist) | 30% | /30 | | Location page uniqueness ≥80% (vs. 60% floor) | 25% | /25 | | URL structure & architecture (subdirectory preferred) | 15% | /15 | | Citation accuracy per location (Tier 1 aggregators first) | 15% | /15 | | Cannibalization prevention (mapping matrix in place) | 10% | /10 | | Schema per location (parentOrganization, unique @id, FAQPage) | 5% | /5 |
Priority Matrix: | Action | Impact (1–5) | Feasibility (1–5) | Priority Score | Effort | |--------|-------------|-------------------|----------------|--------| | Fix branchOf → parentOrganization schema | 4 | 5 | 20 | 30 min/location | | Add unique local phone per location | 5 | 4 | 20 | 1–2 hrs | | Rewrite thin location pages (>80% unique) | 5 | 3 | 15 | 3–5 hrs/page | | Submit Tier 1 aggregators per location | 4 | 4 | 16 | 2–4 hrs | | Add FAQPage schema to all location pages | 4 | 5 | 20 | 30 min/page | | Build service × location matrix pages | 5 | 3 | 15 | 4–8 hrs/page | | Fix cannibalization via keyword mapping | 4 | 4 | 16 | 2–3 hrs |
If single location: mark as N/A — award 100/100.
Output
Write to {AUDIT_DIR}/multi-location-findings.md with YAML frontmatter:
---
skill: local/multi-location-seo
phase: 21
date: [YYYY-MM-DD]
business: [Business Name]
url: [URL]
score: [X/100]
status: [healthy|needs-attention|critical|not-applicable]
locations_audited: [X]
avg_content_uniqueness_pct: [X%]
---
Include:
- Score X/100 with per-location breakdown
- Location-by-location GBP audit table (12-point checklist)
- Location page quality assessment (content uniqueness %)
- Schema audit (branchOf → parentOrganization correction status)
- Cannibalization keyword mapping matrix
- Service × location matrix gap analysis
- Tier 1 citation status per location
- AIO optimization status per location
- Priority recommendations per location (Impact × Feasibility scored)
- Competitor comparison table
- 30/90-day multi-location improvement plan
Output files:
{AUDIT_DIR}/multi-location-findings.md— findings with per-location scores{REPORTS_DIR}/phase-21-multi-location.pdf— auto-generated PDF after phase completes
Key consumers:
local/local-seo— single-location baseline for comparisonlocal/entity-audit— entity isolation per locationoutput/report-generation— master report section 21
Citation Tool Comparison (2025 Pricing)
| Tool | Best For | Locations | Price (2025) | Key Strength | |------|---------|----------|-------------|--------------| | Yext | Enterprise (50+ locations) | Unlimited | $500–$999/location/yr | Real-time sync to 200+ publishers | | BrightLocal | Agencies, SMBs (1–100 locations) | Up to 100 | $29–$79/location/mo | Best reporting + NAP audit quality | | Whitespark | Agencies needing manual quality | Any size | $30–$50/location/mo | Highest accuracy, best for niche dirs | | Data Axle (Localeze) | Chain businesses with data feeds | 10+ | Custom enterprise | Feeds GPS/navigation systems | | Semrush Listing Management | Existing Semrush users | Up to 50 | $20/location/mo (add-on) | Integrated SEO workflow; Yext backend | | Moz Local | Small chains (1–20 locations) | Up to 20 | $14–$33/location/mo | Simple Google/Facebook/Apple sync |
2025 recommendation by use case:
- 50+ locations → Yext (only tool with real-time sync at scale)
- Agency managing multiple clients (2–15 locations each) → BrightLocal + Whitespark combination
- Single business with 2–10 locations → BrightLocal or Semrush Listing Management
- Franchise system → Data Axle + Yext combination
SAB vs. Storefront — Critical 2025 Distinction
| Business Type | Address in GBP | Service Area Setting | |--------------|---------------|---------------------| | Storefront (customers visit) | Show address | Set service areas as supplemental | | Pure SAB (no walk-ins at all locations) | Hide address | Set service area only | | Mixed (some storefronts, some SABs) | Show on storefronts; hide on SABs | Per-location setting |
2025 GBP ruling (confirmed): SABs must NOT set service areas broader than 2-hour drive time from the business location. Google reconfirmed this via GBP Help Community Q1 2025. Violations result in Map Pack suppression.
Critical mistake: Hiding the address on a storefront location (where staff/customers are present) causes significant Map Pack ranking drop for proximity searches.
GBP Location Groups — Management Structure (10+ Locations)
For chains with 10+ locations, use proper account hierarchy:
Owner Account (1 account only)
└── Location Group 1 (Region A)
├── Manager Account (Regional Manager)
└── Individual GBP listings (locations in Region A)
└── Location Group 2 (Region B)
├── Manager Account (Regional Manager)
└── Individual GBP listings (locations in Region B)
Rules:
- Maximum 20 manager accounts per location group (more triggers spam flags)
- Bulk verification threshold: 10+ locations via GBP API
accounts.locations.list - Never add more than 1 owner account — ownership conflicts cause verification suspension
- Use
updateMaskin GBP API to bulk-update specific fields (hours, services, photos) without full listing resubmission
Common 2025 Multi-Location Mistakes (Top 10)
| # | Mistake | Impact | Fix | Effort | |---|---------|--------|-----|--------| | 1 | Template-cloned location pages (<60% unique) | HCS penalty, page 4+ rankings | Rewrite with location-specific content | 3–5 hrs/page | | 2 | Same phone number across all locations | Duplicate signal, local relevance loss | Assign unique local number per location | 1–2 hrs | | 3 | GBP links to homepage (not location page) | Map Pack click-through loss | Update GBP website URL to /locations/city-state/ | 5 min/location | | 4 | branchOf schema (deprecated 2025) | Entity graph confusion | Replace with parentOrganization | 30 min/location | | 5 | Same @id value across all location schemas | Google cannot distinguish locations | Use unique @id per location URL fragment | 30 min/location | | 6 | GBP Q&A left unmanaged | Misinformation damages conversion | Seed 5–10 Q&As + answer within 24hrs | 30 min/location | | 7 | Service areas overlap between locations | Cannibalization in entity model | Assign distinct areaServed per location schema | 30 min/location | | 8 | No UTM on GBP website URL | Cannot measure GBP traffic per location in GA4 | Add ?utm_source=gmb&utm_medium=organic&utm_campaign=[city]-gbp | 5 min/location | | 9 | Orphaned location pages (0 internal links) | Not crawled/indexed | Add to hub + sitemap + breadcrumb | 30 min/page | | 10 | Review gating (only asking happy customers) | FTC violation (2025) + GBP suspension risk | Send requests to all customers | Policy change |
GBP Website URL — UTM Parameter Template
For each location's GBP "Website" field, use:
https://domain.com/locations/[city-state]/?utm_source=gmb&utm_medium=organic&utm_campaign=[city]-gbp
This enables GA4 to measure GBP-specific traffic per location — essential for proving ROI at the location level.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: mshahiddigital
- Source: mshahiddigital/agentic-local-seo-audit
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.