
Quick answer: how do I add schema markup to a local business website?
Add one LocalBusiness JSON-LD block to your homepage and contact page with your exact name, address, phone and hours, then add FAQPage markup only where the same questions are visible on the page. Test with the Rich Results Test, and expect 30 to 90 minutes for a first block.
Schema markup local business owners add is a short block of JSON-LD code that tells search engines exactly who you are, where you are and what you do. It sits in the page head, invisible to visitors, and it states your details in a format machines read without guessing. It is a core step in the structured data side of our AI search optimization work.
London and Southwestern Ontario owners are often told to "add schema" without seeing what that means. This guide shows a working block, field by field, then covers testing, mistakes and upkeep. It also supports consistent, machine-readable business details across your site and listings.
What schema markup local business pages need, and what it does for you
Schema markup labels the facts on your page so a search engine can read them as data instead of inferring them from prose. It is written in the Schema.org vocabulary, and JSON-LD is the format Google recommends for it.
Google says structured data is not a ranking factor by itself. What it does is remove ambiguity: your business name, your address in London rather than London, England, your hours, and the questions you answer. Clear data can make a page eligible for enhanced displays and gives other systems a clean source to read.
It sits between content and technical work. The wording still comes from your on-page SEO checklist, and the crawling and indexing basics sit in our technical SEO guide for London. For why AI tools care about clear entity data, read our AI SEO overview rather than repeating it here.
A local business needs three types in practice. LocalBusiness (or a more specific subtype) describes the company. FAQPage describes questions answered on a page. Article and BreadcrumbList describe blog posts and where they sit in the site.
LocalBusiness schema field by field
A LocalBusiness block is a list of properties, and each one must match what a customer sees on your site and Google Business Profile. The sample below is a template with placeholder details, not a real business.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"@id": "https://www.example.ca/#business",
"name": "Your Business Name",
"url": "https://www.example.ca/",
"telephone": "+1-519-555-0100",
"image": "https://www.example.ca/images/storefront.jpg",
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Example Street",
"addressLocality": "London",
"addressRegion": "ON",
"postalCode": "N6A 0A0",
"addressCountry": "CA"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 42.9849,
"longitude": -81.2453
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "08:00",
"closes": "17:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "09:00",
"closes": "13:00"
}
],
"areaServed": [
{ "@type": "City", "name": "London" },
{ "@type": "City", "name": "St. Thomas" },
{ "@type": "City", "name": "Strathroy" }
],
"sameAs": [
"https://www.google.com/maps?cid=YOUR_PROFILE_ID",
"https://www.facebook.com/yourbusiness",
"https://www.linkedin.com/company/yourbusiness"
]
}
</script>
Here is what each field does and where owners go wrong.
Identity fields: @type, @id, name, url
@type should be the most specific Schema.org subtype that fits, such as Dentist, Plumber, LegalService or Restaurant, and LocalBusiness only when nothing narrower applies. @id is a stable identifier you can reference from other pages. name must be the trading name you use everywhere, character for character, which is the same rule behind our guide to NAP consistency.
Contact fields: telephone, address, geo
Write the phone number in international format, +1 then the ten digits. The address uses PostalAddress with addressRegion set to ON and addressCountry set to CA. The geo block takes latitude and longitude with four to six decimal places, which you can copy from the pin on your Google Business Profile. The coordinates in the sample are the London city centre, so replace them.
Time and place fields: openingHoursSpecification, areaServed
List hours in 24-hour time, and give each different pattern its own block, as the sample does for weekdays and Saturday. When hours change, for example over the holidays, update the code and the profile together, as covered in our holiday hours guide. areaServed is useful for tradespeople who drive to Byron, Lambeth, Masonville, Wortley Village, Old East Village or out to St. Thomas, Strathroy, Woodstock and Ingersoll. List only places you genuinely serve.
Profile fields: image, priceRange, sameAs
image should point to a real photo of your premises or work. priceRange is optional, and a symbol such as $$ is enough. sameAs lists the official profiles that belong to the same business: your Google Business Profile, Facebook page and LinkedIn page. Do not list directories you do not control.
FAQPage schema: mirror the on-page questions exactly
FAQPage markup must contain only questions and answers that are visible on the same page, written word for word as they appear. If the schema says something the page does not, Google treats it as a mismatch and may ignore the block.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Do you serve Strathroy and St. Thomas?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. We serve London, St. Thomas and Strathroy, and we book visits Monday to Saturday."
}
}
]
}
</script>
One honest caveat. Since 2023 Google shows expandable FAQ results mainly for well-known government and health sites, so a London accountant or contractor should not expect that display. The markup is still worth adding where you have a real FAQ, because it keeps your questions and answers in a clean, machine-readable form that any system can parse.
To build it correctly, follow these rules:
- Write the question as a customer would type it, in the same words on the page and in the code.
- Keep each answer self-contained, around 40 to 60 words, so it still makes sense when quoted on its own.
- Use plain text in the answer. Avoid line breaks, tables and promotional wording.
- Mark up four to six questions per page, not twenty, and never repeat the same FAQ on every page.
This page follows its own rule. The five questions in the FAQ below appear in the visible accordion and in the FAQPage block in the page head, with identical wording.
Article and BreadcrumbList for blog posts: when to use each
Use Article on every blog post and BreadcrumbList on every page that sits below another page, because the first describes the content and the second describes its place in your site. Neither replaces LocalBusiness, which describes the company that publishes the post.
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Exact H1 text of the post",
"datePublished": "2026-11-09",
"dateModified": "2026-11-09",
"image": ["https://www.example.ca/assets/blog/post-hero.webp"],
"author": { "@type": "Person", "name": "Author Name" },
"publisher": { "@id": "https://www.example.ca/#business" },
"mainEntityOfPage": "https://www.example.ca/blog/post-slug/"
}
The headline should match the visible H1. The datePublished and dateModified values use the YYYY-MM-DD format and should reflect real changes, not an automatic refresh each week. The author is the named person who wrote the post, and the publisher points back to your LocalBusiness through its @id rather than repeating the address.
That reference is the practical trick. On this site the homepage defines the business once, and every other page points to it by @id. If your phone number changes, you edit one block instead of fifty pages.
BreadcrumbList is simple. It lists each step from the homepage to the current page, with position, name and URL. For a post, that is Home, then Blog, then the post. Matching the visible breadcrumb on the page keeps the two in agreement.
Add it yourself, use a plugin or hire it out
A single-location business can add basic schema markup local business code in under an hour, and the choice comes down to your platform and how often your details change. The table compares the three routes with planning estimates, not measured results.
| Route | First setup time | Upkeep per month | Cost | Best fit |
|---|---|---|---|---|
| Hand-written JSON-LD | 30 to 90 minutes | Under 15 minutes | No licence cost | Static or custom sites with one location |
| Plugin or SEO plugin fields | 20 to 60 minutes | Under 15 minutes | Plugin licence varies, often free tier | WordPress sites with standard needs |
| Agency set-up | 1 to 2 hours of your time, then handled | Handled for you | AI search add-on $150 to $400 per month, or $300 to $800 as a standalone project | Multi-location, service-area or custom schema needs |
Plugins save time, but they can output duplicate or conflicting blocks if two plugins both write schema. Check the rendered page source, not the settings screen, to see what is really being published.
How to test and validate schema markup local business owners publish
Test every block with Google's Rich Results Test first and the Schema Markup Validator second, then monitor Google Search Console after launch. The three tools answer different questions, so use all three.
| Tool | What it checks | When to use it | Cost |
|---|---|---|---|
| Rich Results Test | Whether Google can read the code and which enhancements the page qualifies for | Before and right after publishing | Free |
| Schema Markup Validator (validator.schema.org) | Syntax and Schema.org vocabulary for every type, not only Google features | Before publishing and when debugging | Free |
| Google Search Console, Enhancements reports | Errors and warnings across the whole site as Google crawls it | Weekly for the first month, then monthly | Free |
A save-and-reuse testing checklist
- Open the Rich Results Test and test the live URL, or paste the raw code if the page is not published yet.
- Confirm the detected types match what you added, for example LocalBusiness and FAQPage.
- Fix every error, then read each warning and decide whether the optional field is worth adding.
- Run the Schema Markup Validator on the same URL and look for syntax problems the first tool ignores.
- Compare each value against the visible page: name, phone, address, hours and every FAQ answer.
- Request indexing for the page in Google Search Console, then check the Enhancements reports after one to two weeks.
If you want a second pair of eyes on the result, our free SEO audit includes a structured data check.
Common schema markup local business mistakes
Most schema failures come from three causes: content that does not match the page, invalid JSON, and reviews that break Google's guidelines. Each is easy to avoid once you know it.
Mismatched content
The schema says Monday to Saturday and the page says Monday to Friday, or the code lists a suite number the Google Business Profile does not. Mismatches confuse every system that compares sources, so edit code and visible text in the same sitting.
Invalid JSON
A single missing comma or an extra trailing comma breaks the whole block, and nothing warns you on the page itself. Straight quotation marks matter too, because curly quotes pasted from a word processor are not valid JSON. Run the validator after every edit.
Fake or self-written reviews
Marking up reviews you wrote yourself, or copying testimonials into aggregateRating, risks a manual action. Google's guidelines also exclude self-serving reviews of a LocalBusiness from star results. Only mark up ratings that come from real customers and that visitors can see on the page, and leave the field out if you are unsure.
Other errors that turn up often
- Marking up services, prices or offers that are not on the page.
- Leaving a placeholder such as "Your Business Name" or the sample phone number in the live code.
- Using different business names in schema, footer and Google Business Profile.
- Adding a second LocalBusiness block with a different @id on the same page.
- Leaving old schema from a previous theme or plugin after a redesign.
Where to put schema markup local business code and how to keep it current
Place the JSON-LD script in the page head, or anywhere in the body if your platform does not allow head access, and revisit it whenever a business fact changes. Google reads both locations, and the head keeps the code tidy and easy to find.
Put the full LocalBusiness block on your homepage and contact page. Put Article and BreadcrumbList on blog posts. Put FAQPage on any page that has a real visible FAQ. On other pages, a short WebPage block that references your business by @id is enough.
Update triggers
Update the code on the same day that any of the following happens:
- You change your phone number, address or business name.
- Your opening hours change, including seasonal and holiday hours.
- You add or drop a service area such as Woodstock or Ingersoll.
- You open a second location, which needs its own block and @id.
- You change social profiles or move your Google Business Profile.
- You redesign the site or switch themes or plugins.
Add one line to your quarterly business checklist: view the page source of your homepage and confirm the schema still matches reality. That ten-minute check prevents most of the drift we see.
A first-week plan
- Collect the exact name, address, phone, hours and profile links you use on Google Business Profile.
- Fill in the LocalBusiness template and place it on your homepage and contact page.
- Add FAQPage to any page with a real visible FAQ, matching the words exactly.
- Test with both tools and fix every error.
- Check Search Console in one to two weeks and note any warnings.
- Set a quarterly reminder to re-check the block against the live page.
Want someone to check your schema?
Request our free SEO audit and we will review the structured data on your homepage and contact page. If you want it built and maintained, see how our AI search optimization service handles structured data and consistent business details, or call (647) 692-2131.
Schema is a small amount of code with a large amount of attention to detail. Get the facts right, keep them matching your visible pages and your Google Business Profile, and check them whenever something changes.