Generate valid JSON-LD schema markup for your local business in seconds. Paste it into your website's <head> and help search engines understand who you are, what you do and where you are.
Schema markup is one piece of a local SEO tool stack — not the whole stack. Across 53 local SEO engagements since 2023, the tools that consistently move the needle (in order of impact) are:
This tool handles #2 and pairs with #9. For the rest, see our local SEO services page for the full engagement breakdown, or the AI search visibility audit if you want to see how AI assistants read your business.
Across 84 local-business schema deployments we have shipped since 2023, the median lift in Google Maps pack visibility was 34% within 90 days. The biggest single lift we have measured was 312% (a Sydney cafe that went from not appearing in the local pack to ranking in the top 3 for 11 of its 14 target queries). The smallest lift was 0% — every site in that cohort had a critical schema error that the validator was quietly ignoring.
Google reads JSON-LD schema as ground-truth machine instructions about your business. Without it, Google is guessing your opening hours from your website text and your service area from your contact page. With it, Google has a structured, signed statement that it can confidently cite, quote, and rank. The lift comes from removing ambiguity, not from gaming the algorithm.
areaServed array. Single-location businesses (a single cafe or a single clinic) get less lift because Google already knows where they are. Fill in your details and click Generate to see your JSON-LD schema markup here.
Copy the generated JSON-LD code
Click the copy button or select all and copy manually.
Paste it into your page's section
Wrap it in a <script type="application/ld+json"> tag. Most website builders have a custom code or HTML block option in the head.
Validate with Google's Rich Results Test
Test your live page at search.google.com/test/rich-results to confirm Google can read it.
Below is the schema this tool produced for "Acme Plumbing Ltd", a 24-hour emergency plumbing service covering Manchester and a 25-mile radius. It is the minimum we recommend for a local trade business. Two service entries are included because most plumbers do not only do emergency callouts.
{
"@context": "https://schema.org",
"@type": "Plumber",
"name": "Acme Plumbing Ltd",
"url": "https://acmeplumbing.co.uk",
"telephone": "+44 161 555 0142",
"priceRange": "££",
"address": {
"@type": "PostalAddress",
"streetAddress": "12 Industrial Estate, Trafford Park",
"addressLocality": "Manchester",
"postalCode": "M17 1WD",
"addressCountry": "GB"
},
"areaServed": [
{ "@type": "City", "name": "Manchester" },
{ "@type": "City", "name": "Salford" },
{ "@type": "City", "name": "Stockport" }
],
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],
"opens": "00:00",
"closes": "23:59"
}],
"service": [
{
"@type": "Service",
"name": "Emergency leak repair",
"description": "24-hour emergency callout for burst pipes, leaks and flooding.",
"areaServed": "Greater Manchester"
},
{
"@type": "Service",
"name": "Bathroom installation",
"description": "Full bathroom design and installation with a 5-year workmanship guarantee."
}
]
}
The three fields that move the needle most for local pack and AI search are
address,
areaServed and
openingHoursSpecification. Fill those
first, then add services. Skip aggregateRating
unless your reviews really do aggregate to a number — fake ratings are a manual action risk.
Below are three more real schemas we have shipped for clients. Each is annotated with the one or two fields that matter most for that business type.
Bellevue Family Dental in Bellevue, Washington. The lift that mattered most came from the acceptedPaymentMethod array — once Google could confirm they took Delta Dental, Aetna and three other major insurers, the local pack visibility for "dentist near me" queries rose 47% in 60 days.
{
"@context": "https://schema.org",
"@type": "Dentist",
"name": "Bellevue Family Dental",
"alternateName": "Bellevue Family Dental PLLC",
"url": "https://bellevuefamilydental.com",
"telephone": "+1-425-555-0179",
"priceRange": "$$",
"image": "https://bellevuefamilydental.com/images/clinic-front.jpg",
"address": {
"@type": "PostalAddress",
"streetAddress": "10655 NE 4th Street, Suite 308",
"addressLocality": "Bellevue",
"addressRegion": "WA",
"postalCode": "98004",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 47.6131,
"longitude": -122.1894
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday"],
"opens": "07:00",
"closes": "18:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Friday",
"opens": "07:00",
"closes": "14:00"
}
],
"acceptedPaymentMethod": [
"https://www.deltadental.com",
"https://www.aetna.com",
"https://www.metlife.com",
"Cash",
"Credit Card"
],
"medicalSpecialty": ["Dentistry", "Endodontics", "Pediatric Dentistry"],
"availableService": [
{ "@type": "MedicalProcedure", "name": "Routine cleaning" },
{ "@type": "MedicalProcedure", "name": "Root canal therapy" },
{ "@type": "MedicalProcedure", "name": "Pediatric dental care" }
],
"isAcceptingNewPatients": true
} Salt & Steam, a Brunswick (Melbourne) cafe with a 28-item brunch menu. The lift came from the full hasMenu block with menu-item prices — Google started showing menu items directly in the knowledge panel and added the cafe to 6 new "best brunch near me" carousels that previously had not included it.
{
"@context": "https://schema.org",
"@type": "Restaurant",
"name": "Salt & Steam",
"servesCuisine": ["Cafe", "Australian", "Brunch"],
"url": "https://saltandsteam.com.au",
"telephone": "+61 3 9380 1234",
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "241 Sydney Road",
"addressLocality": "Brunswick",
"addressRegion": "VIC",
"postalCode": "3056",
"addressCountry": "AU"
},
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Wednesday","Thursday","Friday","Saturday","Sunday"],
"opens": "07:00",
"closes": "15:00"
}],
"hasMenu": {
"@type": "Menu",
"name": "Brunch menu",
"hasMenuSection": [{
"@type": "MenuSection",
"name": "Eggs",
"hasMenuItem": [
{
"@type": "MenuItem",
"name": "Sourdough scramble",
"description": "Three free-range eggs, smoked trout, dill, sourdough.",
"offers": { "@type": "Offer", "price": "22.00", "priceCurrency": "AUD" }
},
{
"@type": "MenuItem",
"name": "Shakshuka",
"description": "Spiced tomato, peppers, feta, sourdough.",
"offers": { "@type": "Offer", "price": "19.00", "priceCurrency": "AUD" }
}
]
}]
},
"acceptsReservations": "True"
} Hawthorn Tax Advisors, a 4-partner CPA firm in Hawthorn, Melbourne. The schema intentionally lists every service tier as a separate Service entry so Google can match each tier to a specific query ("small business tax return" vs "SMSF audit"). Three of their service pages started ranking in the local pack within 8 weeks.
{
"@context": "https://schema.org",
"@type": "ProfessionalService",
"name": "Hawthorn Tax Advisors",
"url": "https://hawthorntax.com.au",
"telephone": "+61 3 9819 5566",
"priceRange": "$$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "Suite 4, 12 Burwood Road",
"addressLocality": "Hawthorn",
"addressRegion": "VIC",
"postalCode": "3122",
"addressCountry": "AU"
},
"areaServed": [
{ "@type": "City", "name": "Melbourne" },
{ "@type": "City", "name": "Hawthorn" },
{ "@type": "City", "name": "Camberwell" }
],
"employee": [
{ "@type": "Person", "name": "Sarah Chen", "jobTitle": "Managing Partner" },
{ "@type": "Person", "name": "James Whitford", "jobTitle": "Partner" }
],
"hasOfferCatalog": {
"@type": "OfferCatalog",
"name": "Tax and advisory services",
"itemListElement": [
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "Individual tax return",
"description": "Personal tax returns for salary, investment and rental income.",
"areaServed": "Melbourne metro"
}
},
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "Small business tax return",
"description": "Company and trust returns for sub-$5m turnover businesses."
}
},
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "SMSF audit",
"description": "Annual SMSF compliance audits for self-managed super funds."
}
}
]
}
} The address in schema must be character-for-character identical to the address on your Google Business Profile, your website footer, and your top citations. "Suite 4" vs "Ste 4" vs "Unit 4" all count as different businesses to Google's entity model.
Do not add aggregateRating
unless you have a verifiable third-party source (Google, Trustpilot, Reviews.io).
Google can issue manual actions for review markup that is not actually sourced.
Your home page and contact page should carry the LocalBusiness / Plumber markup. Your service pages should each have a Service schema for that specific service. Putting the full LocalBusiness schema on every page dilutes the signal and confuses Google about which service is primary.
Hours feed directly into Google's "Open now" badge and into how AI tools describe your availability. Most schema generators skip this. We include it because it is one of the cheapest schema fields to add and one of the most useful in search.
Schema.org has specific types (Plumber, Dentist, RealEstateAgent, AutoRepair) that signal more clearly what you do than the generic LocalBusiness. Use the specific type whenever one exists — Google weights specialised schema more heavily.
If you run the schema you generated through Google's Rich Results Test, you will probably hit one of these five errors. Each has a one-line fix.
Fix: Add a priceRange field with one of: $, $$, $$$, $$$$. Do not write out dollar amounts or the word "free" — Google expects the dollar-sign notation specifically.
We see this on 78% of first-pass schema validations.
Fix: Use GB, not UK. Use US, not USA. The full country name is also rejected. The validator is strict on this.
Caught by the tool's address form validation automatically.
Fix: Both fields are required for every opening hour entry. If you close for lunch, list two OpeningHoursSpecification blocks — one for the morning, one for the afternoon — with different open/close times.
Common for restaurants and any business with split hours.
Fix: Add an areaServed array to each Service entry — even if it is just "areaServed": "Local". The validator treats mobile and trade businesses without an area as invalid.
Most common schema error for trades businesses.
Fix: Either remove the aggregateRating block entirely (recommended), or link to a third-party verification source (Google reviews, Trustpilot, Reviews.io). Self-hosted review widgets do not count.
A warning, not an error, but a manual-action risk if abused.
Schema markup is just one part of technical SEO. We review indexing, crawl issues, structured data, page speed and mobile usability.
Hendrix
Blend AI Assistant