Overview
Local SEO ranks a business in the Google Map Pack, in Google Maps directly, and in localized organic results. The playbook differs from general SEO: Google Business Profile replaces the homepage as the primary ranking surface, reviews replace backlinks as the trust signal, and proximity to the searcher beats content depth. This applies only to businesses with a physical location or a defined service area; most developer-tool sites should skip this entirely.
Decide first: does local SEO apply at all?
Local SEO is a wrong fit for most sites. Apply only when one of the following is true.
- The business has a physical address customers visit (store, office, restaurant).
- The business serves customers in a defined geographic area (plumber, photographer, lawyer).
- The business is location-relevant even if remote (regional B2B with state-specific compliance).
If none apply, skip to content and internal-linking. A SaaS product, a developer tool, or a global brand does not benefit from Local SEO and should not pretend to be local.
Claim and complete Google Business Profile
Google Business Profile (GBP, formerly Google My Business) is the ranking surface for local intent. Without it, the Map Pack will not show the business.
- Claim at
business.google.comand verify by postcard, phone, or video call. - Complete every field: name, address, phone, hours, categories, attributes, description, photos.
- Categories matter more than the description. Pick the most specific primary category; add up to nine secondary categories.
- Upload at least 10 photos: exterior, interior, products, team. Photos increase clicks by 35%.
- Post weekly updates. Google’s freshness signals apply to GBP, not just the website.
Maintain NAP consistency across every citation
Name, Address, Phone (NAP) appearing identically across the web is the single strongest local ranking signal.
- One canonical NAP. Pick a phone number format, address format, and business name spelling; use them everywhere.
- Identical formatting:
123 Main St, Suite 4and123 Main Street #4are different to Google. - Audit with Moz Local, BrightLocal, or Whitespark. Fix mismatches; do not abandon old listings.
- The website’s footer and contact page must match GBP exactly. Drift here cascades to other citations.
Build citations on the directories Google actually reads
Citations are mentions of the business NAP on third-party sites. The signal is consistency, not volume.
- Tier 1 (always): Google Business Profile, Apple Maps, Bing Places, Yelp, Facebook.
- Tier 2 (vertical): Yellowpages, BBB, industry-specific directories (Avvo for lawyers, Houzz for contractors, OpenTable for restaurants).
- Tier 3 (local): Chamber of Commerce, local newspapers, regional directories.
- Skip paid citation services that publish to 500 random directories. Most are scraped and ignored.
Earn reviews on Google first, everywhere else second
Reviews drive both ranking and click-through rate in the Map Pack.
- Google reviews are the primary signal. Aim for 4.5+ stars and 50+ reviews in the first 12 months.
- Ask every customer at the moment of value delivery. A direct-link QR code beats a manual search.
- Respond to every review within 48 hours. Public responses are a ranking signal and a CRO win.
- Never buy reviews. Google’s review-fraud detection is good enough to nuke a profile on detection.
- Yelp and Facebook reviews matter for vertical visibility; do not prioritize them over Google.
Geo-target with hreflang for multi-region sites
Hreflang signals geographic and language variants of the same content. Use it when serving the same business across multiple regions or languages.
<link rel="alternate" hreflang="en-us" href="https://example.com/us/" />
<link rel="alternate" hreflang="en-gb" href="https://example.com/uk/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/" />- Every variant must hreflang-link to every other variant, including itself.
x-defaultis the fallback for unmatched locales; ship it.- Hreflang is for international SEO, not city-level targeting. For city pages, build per-city content and let internal linking handle the rest.
Mark up locations with LocalBusiness JSON-LD
LocalBusiness schema ties the website to the GBP entity in Google’s knowledge graph.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Example Cafe",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Main St",
"addressLocality": "Springfield",
"addressRegion": "IL",
"postalCode": "62701",
"addressCountry": "US"
},
"telephone": "+1-555-555-5555",
"openingHours": "Mo-Fr 08:00-18:00",
"geo": {
"@type": "GeoCoordinates",
"latitude": 39.7817,
"longitude": -89.6501
},
"sameAs": ["https://www.facebook.com/examplecafe"]
}
</script>- Use a more specific subtype if it matches:
Restaurant,Dentist,LegalService,Plumber. Schema.org has 100+ LocalBusiness subtypes. - The NAP in the JSON-LD must match GBP and the visible footer exactly.
- For multiple locations, ship one JSON-LD block per location, on each location’s dedicated page.
See schema-markup-deep for the full schema catalog.
Build per-city pages for multi-location service businesses
A service business serving multiple cities needs one page per city, not a “cities we serve” list.
- One URL per city:
/locations/austin/,/locations/dallas/. - Each page has unique content: photos, testimonials, local landmarks, city-specific pricing.
- Each page has its own
LocalBusinessJSON-LD with the city’s geo coordinates. - Avoid doorway pages: 50 near-identical pages with only the city name swapped will trigger a manual action.