Local SEO & Google Business Profile
Optimize for local searches and map results.
Local SEO helps businesses rank for location-based searches like "coffee shop near me" and appear in the Google map pack.
Google Business Profile
A free Google Business Profile is the foundation. Claim it and keep it complete and accurate:
- Correct name, address, phone (NAP) and hours.
- The right categories and service areas.
- Photos, products and regular posts.
- Reviews - encourage them and reply to all.
Other local signals
- NAP consistency across directories and citations.
- Local, relevant backlinks.
- LocalBusiness structured data on your site.
Example
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "SoundsCode Coffee",
"address": {
"@type": "PostalAddress",
"streetAddress": "12 Bean Street",
"addressLocality": "Portland",
"addressRegion": "OR",
"postalCode": "97201"
},
"telephone": "+1-503-555-0142",
"openingHours": "Mo-Fr 07:00-18:00"
}When to use it
- A plumber optimises their Google Business Profile with service categories, photos, and a consistent NAP citation, moving from position 8 to position 2 in the local map pack.
- A restaurant chain uses LocalBusiness schema across all location pages so each branch appears in Google Maps results with opening hours and menu links.
- A dentist practice encourages satisfied patients to leave Google reviews, raising their star rating from 3.8 to 4.7 and increasing phone calls from local search by 40%.
More examples
LocalBusiness schema for a location page
LocalBusiness schema with address, phone, hours, and coordinates gives Google the structured data it needs to display the location in Maps results and the Knowledge Panel.
{
"@context": "https://schema.org",
"@type": "Dentist",
"name": "Bright Smile Dental — Shoreditch",
"address": {
"@type": "PostalAddress",
"streetAddress": "42 Brick Lane",
"addressLocality": "London",
"postalCode": "E1 6RF",
"addressCountry": "GB"
},
"telephone": "+44-20-7946-0958",
"openingHours": ["Mo-Fr 08:30-18:00", "Sa 09:00-13:00"],
"geo": {"@type": "GeoCoordinates", "latitude": 51.5227, "longitude": -0.0712},
"url": "https://example.com/locations/shoreditch/"
}Consistent NAP in HTML footer
Name, Address, and Phone (NAP) must be identical across the website, Google Business Profile, and all citations; inconsistencies suppress local rankings.
<!-- Footer on every location page — NAP must match GBP exactly -->
<footer>
<address itemscope itemtype="https://schema.org/LocalBusiness">
<span itemprop="name">Bright Smile Dental</span><br>
<span itemprop="streetAddress">42 Brick Lane</span>,
<span itemprop="addressLocality">London</span>
<span itemprop="postalCode">E1 6RF</span><br>
<a itemprop="telephone" href="tel:+442079460958">+44 20 7946 0958</a>
</address>
</footer>Fetch nearby competitors via Places API
Querying nearby competitors with the Places API reveals the average rating and review count you need to match or exceed to rank in the local map pack.
# Google Places API: find competitors in the local pack
curl -s \
"https://maps.googleapis.com/maps/api/place/nearbysearch/json\
?location=51.5227,-0.0712&radius=1000&type=dentist&key=YOUR_KEY" \
| python3 -c "
import sys, json
for p in json.load(sys.stdin).get('results', [])[:5]:
print(f"Rating={p.get('rating','?')} Reviews={p.get('user_ratings_total',0):4} {p['name']}")
"
Discussion