Most guides to LocalBusiness schema markup cover the obvious fields: name, address, telephone, openingHours. Most implementations stop there. And most businesses that implement only those fields are still invisible to AI engines, not because their schema is wrong, but because it is incomplete in the ways that specifically matter for AI citation.
The fields that AI engines weight most heavily for local query resolution are the location-specific ones: geo, hasMap, areaServed, and sameAs. These are the fields that allow AI engines to resolve your business as an unambiguous geographic entity, to match it against location-specific queries, and to confirm its existence across multiple authoritative sources. This guide gives you the complete, copy-paste JSON-LD implementation, including every location field, with an explanation of what each field does for your AI visibility.
Why Location Fields Are Uniquely Important for AI
Traditional SEO schema guides treat geo coordinates as optional. For Google's rich results, coordinates are indeed optional, Google can geocode your address. For AI engines, coordinates serve a fundamentally different function: entity disambiguation.
Consider a business named "The Blue Door Café." There may be dozens of businesses with this name or similar names across Europe. When an AI engine receives the query "café near me with good coffee," it needs to resolve the correct entity. Address strings help, but they are prone to formatting inconsistencies, "123 High St" versus "123 High Street" versus "123 High St, 1st floor" are technically different strings even if they describe the same location.
Geocoordinates are unambiguous. "latitude": 52.3676, "longitude": 4.9041 cannot be confused with any other point on Earth. When your schema includes precise coordinates that match your Google Business Profile pin and your Apple Maps location, AI engines can resolve your entity with certainty, and citation confidence rises accordingly.
This entity resolution process is explained in detail in our guide to how Gemini recommends local businesses and in the broader context of what AEO means for local businesses.
The Complete LocalBusiness JSON-LD Implementation
The following is a complete, production-ready JSON-LD block for a LocalBusiness. Adapt the @type to your specific business type (see the section below on choosing the right type). Every field is annotated with its purpose.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Maison Durand",
"alternateName": "Maison Durand Brasserie",
"description": "Traditional French brasserie in central Lyon serving seasonal Lyonnais cuisine since 1984. Reservations available for groups.",
"url": "https://www.maisondurand.fr",
"telephone": "+33-4-72-00-00-00",
"email": "contact@maisondurand.fr",
"address": {
"@type": "PostalAddress",
"streetAddress": "14 Rue Mercière",
"addressLocality": "Lyon",
"addressRegion": "Auvergne-Rhône-Alpes",
"postalCode": "69002",
"addressCountry": "FR"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 45.7640,
"longitude": 4.8357
},
"hasMap": "https://maps.google.com/?q=45.7640,4.8357",
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday"],
"opens": "12:00",
"closes": "14:30"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday"],
"opens": "19:00",
"closes": "22:30"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Friday", "Saturday"],
"opens": "12:00",
"closes": "23:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Sunday"],
"opens": "12:00",
"closes": "15:00"
}
],
"servesCuisine": ["French", "Lyonnais"],
"priceRange": "€€",
"menu": "https://www.maisondurand.fr/menu",
"acceptsReservations": true,
"areaServed": {
"@type": "City",
"name": "Lyon"
},
"image": [
"https://www.maisondurand.fr/images/exterior.jpg",
"https://www.maisondurand.fr/images/interior.jpg",
"https://www.maisondurand.fr/images/menu-dish.jpg"
],
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"reviewCount": "284",
"bestRating": "5",
"worstRating": "1"
},
"sameAs": [
"https://www.google.com/maps/place/Maison+Durand+Lyon",
"https://www.facebook.com/MaisonDurandLyon",
"https://www.tripadvisor.com/Restaurant_Review-maisondurand",
"https://www.yelp.com/biz/maison-durand-lyon"
],
"founder": {
"@type": "Person",
"name": "Pierre Durand"
},
"foundingDate": "1984",
"currenciesAccepted": "EUR",
"paymentAccepted": "Cash, Credit Card, Visa, Mastercard",
"amenityFeature": [
{
"@type": "LocationFeatureSpecification",
"name": "Outdoor seating",
"value": true
},
{
"@type": "LocationFeatureSpecification",
"name": "Wheelchair accessible",
"value": true
},
{
"@type": "LocationFeatureSpecification",
"name": "Wi-Fi",
"value": true
}
]
}
</script>

[Image: Browser developer tools showing the Elements panel with the HTML head section open, and the LocalBusiness JSON-LD script tag visible and expanded, showing the geo, sameAs, and openingHoursSpecification fields highlighted]
Field-by-Field Breakdown: The Location Fields That Matter
geo, Geocoordinates
"geo": {
"@type": "GeoCoordinates",
"latitude": 45.7640,
"longitude": 4.8357
}
What it does: Provides the precise geographic location of your business as a machine-readable coordinate pair. AI engines use this for entity disambiguation and for resolving location-specific queries.
How to find your coordinates: Open Google Maps, right-click your business location, and select "What's here?" The coordinates appear at the bottom of the screen. Alternatively, your Google Business Profile pin location has coordinates accessible via the GBP dashboard.
Common mistake: Using approximate coordinates (e.g., city centre coordinates) rather than your actual building location. AI engines cross-reference coordinates across sources, an imprecise match reduces confidence.
hasMap, Map Link
"hasMap": "https://maps.google.com/?q=45.7640,4.8357"
What it does: Provides a direct link to your location on a mapping platform. This serves as a verification signal, AI engines and crawlers can follow this link to confirm your geographic location.
Best practice: Use a coordinate-based Google Maps URL rather than a place-name URL, as coordinates are unambiguous. You can also add a second hasMap value pointing to your MapAtlas or OpenStreetMap location for additional corroboration.
areaServed, Service Area
"areaServed": {
"@type": "City",
"name": "Lyon"
}
For businesses with a delivery or service radius, use GeoCircle:
"areaServed": {
"@type": "GeoCircle",
"geoMidpoint": {
"@type": "GeoCoordinates",
"latitude": 45.7640,
"longitude": 4.8357
},
"geoRadius": "15000"
}
What it does: Tells AI engines the geographic area your business serves. This is essential for service businesses (plumbers, cleaners, delivery services) that cover an area beyond their physical address, and for "near me" query matching. A restaurant might use City. A delivery service covering a 15km radius would use GeoCircle with a radius in metres.
Common mistake: Omitting areaServed entirely. Without it, AI engines can only associate your business with queries containing your exact address or locality, not with the broader area you actually serve.
sameAs, Authoritative Profile Links
"sameAs": [
"https://www.google.com/maps/place/YOUR_PLACE_ID",
"https://www.facebook.com/yourbusiness",
"https://www.tripadvisor.com/Restaurant_Review-yourbusiness",
"https://www.yelp.com/biz/your-business"
]
What it does: Creates a corroboration network, links from your schema to the same entity appearing on authoritative external platforms. AI engines follow these links to verify that the entity on your website is the same as the entity on Google Maps, Facebook, and TripAdvisor. Each corroborating source increases citation confidence.
Minimum recommended sameAs links: Google Business Profile, Facebook, one industry-relevant directory (TripAdvisor for hospitality, Zocdoc for healthcare, Houzz for home services).
Common mistake: Including sameAs links that go to pages where your NAP information does not match your website. A mismatch in a sameAs target actively reduces confidence rather than increasing it.
The full NAP consistency picture is covered in our NAP consistency guide for AI search.
Choosing the Right @type
LocalBusiness is the base type. Using a more specific subtype gives AI engines better category signals. The most commonly used subtypes:
| Business Type | @type Value |
|---|---|
| Restaurant, café, bar | Restaurant, CafeOrCoffeeShop, BarOrPub |
| Hotel, B&B, hostel | Hotel, BedAndBreakfast, Hostel |
| Doctor, clinic | MedicalClinic, Physician |
| Dentist | Dentist |
| Gym, fitness studio | SportsActivityLocation, HealthClub |
| Lawyer | LegalService |
| Accountant | AccountingService |
| Retail shop | Store, or more specific: ClothingStore, ElectronicsStore |
| Museum, gallery | Museum |
| Tourist attraction | TouristAttraction |
| Real estate agency | RealEstateAgent |
If your specific type is not listed here, check the full Schema.org type hierarchy at schema.org/LocalBusiness.
How to Add JSON-LD to Your Website
Place the <script type="application/ld+json"> block inside the <head> element of every page that represents your business, at minimum your homepage and your contact/location page.
Static HTML sites: Paste the script tag directly into the <head> of your HTML file.
WordPress: Use the Yoast SEO or RankMath plugins (both have LocalBusiness schema fields in their settings), or add the raw JSON-LD via a header injection plugin.
Next.js / React: Add the script tag inside the <head> using next/head or the App Router's metadata API with a <script> element:
export default function Page() {
const schema = {
"@context": "https://schema.org",
"@type": "LocalBusiness",
// ... all fields
};
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }}
/>
{/* page content */}
</>
);
}
Shopify: Add via the theme.liquid file's <head> section, or use a schema markup app from the Shopify App Store.

[Image: Screenshot of search.google.com/test/rich-results showing a LocalBusiness schema validation result with a green "Valid items detected" message and the detected fields listed: name, address, geo, openingHoursSpecification, aggregateRating]
Verifying Your Implementation
After adding your JSON-LD, verify it with two tools:
1. Google Rich Results Test, search.google.com/test/rich-results
Enter your page URL or paste your JSON-LD directly. The tool shows detected schema types, validates all fields, and flags errors. A valid LocalBusiness result means Google can read your markup correctly.
2. Schema.org Validator, validator.schema.org
More strict than Google's tool. Will flag deprecated properties and type mismatches that Rich Results Test sometimes misses.
3. MapAtlas AEO Checker, /aeo-checker
Specifically audits the AI citation signals, including location fields, NAP consistency against external sources, and review freshness, that Rich Results Test does not cover. Use this after Google validation to check the AI-specific layer.
Common Mistakes That Undermine AI Visibility
Using prose opening hours instead of openingHoursSpecification: "Mon–Fri 9am–6pm, Sat 10am–4pm, closed Sunday" is human-readable but not machine-readable. AI engines cannot reliably parse it for temporal query filtering.
Omitting geo because your address is complete: The address is for human comprehension. Geocoordinates are for machine resolution. You need both.
Mismatching sameAs targets: If your Facebook page has a different phone number than your website, the sameAs link creates a contradiction rather than corroboration. Fix the source before linking to it.
Stale aggregateRating values: Some implementations hardcode the rating count. A static "reviewCount": "47" that was accurate in 2023 but is now incorrect creates a data quality signal that reduces AI confidence. Either use a dynamic value or omit the field if you cannot keep it current.
Multiple JSON-LD blocks per page: If you have multiple schema scripts on one page, make sure they do not contradict each other. A page with one block saying "telephone": "+33-4-72-00-00-00" and another block saying "telephone": "+33 4 72 00 00 01" creates a conflict.
The Long-Term Compounding Effect
JSON-LD schema is not a one-time tactic. Each time an AI engine crawls your website and finds a complete, consistent, accurate schema block, the confidence score for your entity increases incrementally. Over time, this compounding builds a citation presence that becomes self-reinforcing: more citations generate more visits, more reviews, more mentions, which in turn generate more structured signal for AI engines to find.
The complete AEO guide for local businesses walks through how to build this compounding system across all the channels that feed AI citation engines, not just your website schema.
Start with the free MapAtlas AEO Checker to see your current schema completeness score, then use the AI Search Visibility solution to implement and monitor the full structured data stack. The JSON-LD above is the foundation, build on it consistently and your AI citation presence will grow with every engine update.
