Skip to main content
Lesson 4 of 8

Schema for local AI SEO

Published Last reviewed

LocalBusiness, Service, FAQPage and sameAs markup so AI engines can resolve your business as one entity, plus how to validate it and what not to mark up.

8 min read Free, no signup Written by Adam Yong
JSON-LD block connecting a business entity to address, hours, areaServed and external profile nodes
100% Free, no signup, no paywall
1,100+ readers
8 lessons · ~80 minutes
What it fixes

Entity problems LocalBusiness schema solves

Another business shares your name

Two plumbers called Halvorsen in the same state is enough for an engine to hedge or merge them. Structured data is often what lets it tell you apart.

You trade without a public address

Mobile and service-area businesses lose one of the strongest verification signals by default. Markup with areaServed puts a machine-readable version of your coverage back on the table.

You were told to add schema, not which fields matter

Most templates ship dozens of properties and a handful do the work. This lesson names the ones worth filling and the ones you can leave empty.

What this lesson covers

What structured data does, and what Google says it does not do for AI features

The LocalBusiness fields that actually matter

Service, FAQPage and sameAs, and when to use each

A copy-paste JSON-LD block for the plumber example

How to validate, and what not to mark up

Structured data is your facts, stated so they cannot be misread

Lesson 3 was about writing facts a human can read and an assistant can lift. This lesson is about stating the same facts a second time, in a format built for machines.

Schema.org is a shared vocabulary for describing things on the web. JSON-LD is the format used to write that vocabulary into a page: a small script block that says, in effect, this page is about a business, here is its name, here is its address, here are its hours. Engines read it directly rather than inferring it from your layout.

The honest framing first. Google states that there is no special schema.org structured data you need to add to appear in AI Overviews or AI Mode (Google Search Central, page updated 10 December 2025, checked 17 September 2026). So for a business whose facts are already clean and unambiguous, schema is a marginal gain. For a business that is hard to pin down, a service-area operator with no public address, a name shared with another business in the region, a recent move, it can be the thing that lets an engine resolve you as one entity at all. The guide on whether you need schema for AI Overviews gives the direct answer on where your site sits.

The fields that earn their place

Google's LocalBusiness documentation requires only two properties, name and address, and recommends geo, openingHoursSpecification, priceRange, telephone and url among others (Google Search Central, checked 21 September 2026). In practice these are the ones that consistently matter:

  • name and url, your trading name and canonical site URL.
  • telephone, matching your profile exactly, including format.
  • address as a PostalAddress, or areaServed if you hide your address.
  • openingHoursSpecification, matching the profile again.
  • geo as GeoCoordinates, useful for proximity understanding.
  • sameAs, an array of the external profiles you own.
  • image and logo, so the entity has a visual reference.
  • priceRange, a rough band rather than a precise figure.

Then there are the fields people add that change nothing. slogan: nobody retrieves a slogan. foundingDate on its own: fine to include, not worth debating. Elaborate makesOffer structures for a business with three services: the complexity outruns the benefit. And two blocks from two plugins, a common WordPress problem where the theme and an SEO plugin each emit their own LocalBusiness block and disagree about the hours. One block, one source of truth.

The block for Halvorsen Plumbing

Here is the block for the fictional Boise plumber this course follows. Schema.org has a Plumber type under LocalBusiness (via HomeAndConstructionBusiness), so it uses that. Use the most specific subtype that honestly fits you: Plumber, Electrician, HVACBusiness, Dentist, AccountingService, Attorney or LegalService, CafeOrCoffeeShop, AutoRepair. A cleaning business has no exact subtype, so it uses LocalBusiness and lets the services list carry the specifics. A wrong specific type misinforms; a correct general type plus clear content does not. The @id gives the business a stable identifier, so a Service or FAQPage block elsewhere on the site can point at the same entity instead of describing a second one. Replace the values, delete what does not apply, and validate before you ship it.

{
  "@context": "https://schema.org",
  "@type": "Plumber",
  "@id": "https://halvorsenplumbing.example/#business",
  "name": "Halvorsen Plumbing",
  "url": "https://halvorsenplumbing.example/",
  "telephone": "+1-208-555-0147",
  "email": "[email protected]",
  "image": "https://halvorsenplumbing.example/images/shop-front.jpg",
  "priceRange": "$$",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "1420 W Main Street, Suite B",
    "addressLocality": "Boise",
    "addressRegion": "ID",
    "postalCode": "83702",
    "addressCountry": "US"
  },
  "geo": { "@type": "GeoCoordinates", "latitude": 43.6166, "longitude": -116.2079 },
  "areaServed": [
    { "@type": "City", "name": "Boise" },
    { "@type": "City", "name": "Meridian" },
    { "@type": "City", "name": "Nampa" },
    { "@type": "City", "name": "Eagle" }
  ],
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
      "opens": "07:00",
      "closes": "18:00"
    },
    { "@type": "OpeningHoursSpecification", "dayOfWeek": "Saturday", "opens": "08:00", "closes": "14:00" }
  ],
  "sameAs": [
    "https://www.facebook.com/halvorsenplumbing",
    "https://www.yelp.com/biz/halvorsen-plumbing-boise"
  ]
}

Two rules that matter more than the syntax. Everything in that block must match your visible page, and everything must match your Google Business Profile. Google's general guidelines say not to mark up content that is not visible to readers of the page (Google Search Central, checked 21 September 2026), and markup that disagrees with the page it sits on creates exactly the contradiction Lesson 2 told you to eliminate. Note the hours block says nothing about 24-hour emergency service, because the shop is not open 24 hours. That fact lives in the visible text and in the Service markup below.

Service and FAQPage, and when to add them

Two more types are worth a few minutes each.

Service describes one thing you do. On Halvorsen's water heater page, a Service node with name "Water heater replacement", provider pointing at the business @id, areaServed the same four cities, and an offers node with a priceSpecification of $1,600 to $2,900 restates the page's own table in machine form. One Service node per service page, never a list of twenty on the homepage.

FAQPage wraps the question-and-answer pairs you wrote in Lesson 3. Each Question carries the heading text and each acceptedAnswer carries the paragraph under it, word for word. If the visible answer changes, the markup changes.

Neither type will get you named on its own. They make an engine's job of matching a page to a query slightly easier, and they cost about ten minutes once the LocalBusiness block exists.

Installing it

Wrap the JSON in a script tag with type="application/ld+json" and put it in the page. Head or body both work, despite the confident advice you will read elsewhere. What matters is that it renders in the served HTML and that the page it sits on is the page it describes.

On WordPress, a schema plugin or a snippet in the theme header both work, though a plugin that also generates its own competing block is a common source of duplication. On a hosted builder, look for a custom code or head-injection setting. On a hand-coded or static site, add it to the layout template. The guide on adding JSON-LD to a local business site walks each path and lists the mistakes that silently invalidate a block.

Validate, then check it is actually live

Two checks, both free, both quick.

Google Rich Results Test. Paste the live URL. It tells you whether Google can parse the markup and whether the page is eligible for any rich result (checked 21 September 2026).

Schema Markup Validator. The validator at validator.schema.org reports structural problems that the Google tool skips, because it checks the vocabulary rather than one search product's requirements (checked 21 September 2026).

Then view the rendered page source and confirm the block is present on every page it should be. Markup that only exists in a plugin preview helps nobody. Re-run both checks any time you change a fact.

sameAs and entity resolution

The sameAs array is how you tell an engine that the business on your site, the one on your Google profile, the one on Facebook and the one on Yelp are all the same organisation. For a local business it is the highest-value part of the block after the basics.

List only profiles you genuinely own and maintain, typically three to eight. Dead or abandoned profiles are weak signals worth cleaning up. Almost no local business needs a Wikidata item, despite what you may have been told. The guide on using sameAs explains when it is worth the effort and when it is not.

Going deeper. Entity work past sameAs, building and reconciling a Knowledge Graph presence across many sources, is where AI SEO Rainmakers picks up; it covers this with weekly tested playbooks at seo.stream.

What not to mark up

It will not make a thin page quotable. It will not rescue a business whose listings contradict each other. And it cannot invent authority. Google's review snippet guidelines say ratings must be sourced directly from users, and that when the entity being reviewed controls the reviews about itself, pages using LocalBusiness or Organization markup are ineligible for the star feature (Google Search Central, checked 21 September 2026). Marking up your Google rating on your own site is the most common version of this mistake.

ProblemDoes schema fix it?What actually fixes it
Facts are correct but ambiguous to a machineYes, this is its jobA validated LocalBusiness block
Listings contradict each otherNoThe NAP audit in Lesson 2
Pages contain nothing specific to quoteNoRewriting passages, per Lesson 3
You want stars in search resultsNo, not from your own reviewsReviews on Google itself, per Lesson 6

Treat schema as what it is: the cheapest way to remove ambiguity about facts you have already made true elsewhere.

Exercise

Get one valid block live on your homepage.

  1. Copy the Halvorsen block above into a text editor. Change @type to the most specific subtype that fits you, or LocalBusiness if none does.
  2. Replace every value with yours, copied character for character from your Google Business Profile. Delete address and keep areaServed if you hide your address.
  3. Delete sameAs entries you do not own. Add the ones you do.
  4. Install it through whichever route your site uses, then load the live page and confirm the block is in the served source.
  5. Run the Rich Results Test and the Schema Markup Validator. Fix every error. Warnings about optional fields can wait.

Check your work

  • @type is a real Schema.org type and the most specific one that honestly describes you.
  • Name, phone, address or areaServed, and hours match your profile and your visible page exactly.
  • The block appears in the served HTML of the live page, not only in a plugin preview.
  • Both validators pass with zero errors.
  • No aggregateRating or review markup unless the reviews are collected on your own site.
  • sameAs lists only profiles you own and keep current.
  • If you added Service or FAQPage, the marked-up text matches the visible text word for word.

Sources

Annotated LocalBusiness JSON-LD code panel with high-value fields highlighted
Annotated LocalBusiness JSON-LD code panel with high-value fields highlighted
Visual reference

Figures from this lesson

Diagrams you can screenshot and keep beside you while you work through the steps.

Why it matters

Why structured data earns its place for a local business

It removes ambiguity

If two businesses in your region share a name, or you trade without a public address, structured data is often what lets an engine tell you apart.

It is a one-time job

Written once, validated once, then touched only when a fact changes. Few things in this course have that profile.

It keeps your facts in sync

Markup that mirrors your profile gives engines a second, machine-readable copy of the same story. Agreement is the signal.

It is honest about its limits

This lesson quotes Google on what schema does not do for AI features, which saves you an afternoon if content work should come first.

Steps

How to add LocalBusiness JSON-LD and validate it

  1. 1

    Pick the right type

    Use the most specific LocalBusiness subtype that genuinely describes you, such as Plumber, and fall back to LocalBusiness when none fits.

  2. 2

    Fill the high-value fields

    Name, address or areaServed, telephone, openingHoursSpecification, url and geo. Match your profile exactly.

  3. 3

    Add sameAs links

    List the external profiles you actually own and maintain, so an engine can resolve them all to one entity.

  4. 4

    Install it

    Drop the JSON-LD script into the page. Head or body both work, sitewide on the homepage plus per-page where the facts differ.

  5. 5

    Validate and re-check

    Run the Rich Results Test and the Schema.org validator. Fix errors, then confirm the block is live on every page it should be.

Markup live? Now build the site around it.

Lesson 5 covers the structure, crawler permissions and llms.txt basics, then builds the plumber site in one afternoon.

Reader feedback

What readers said about the schema lesson

Feedback from owners and SEOs working through the lessons. These are reader comments, not Google Business Profile reviews.

"I am not technical and I still got the block live in an hour. The part that saved me was the list of what to leave out, because our old plugin had marked up a rating we never collected."
Priya S.
Manager, mobile detailing business
Common questions

LocalBusiness schema for AI SEO: common questions

Do I need schema to appear in AI Overviews?

No. Google states there is no special schema.org structured data you need to add to appear in AI Overviews or AI Mode. Schema helps at the margin and helps most when your entity is ambiguous. The guide on whether you need schema for AI Overviews gives the direct answer.

Should I use LocalBusiness or a more specific subtype?

Use the most specific subtype that genuinely fits, such as Plumber, Dentist or HVACBusiness, and fall back to LocalBusiness when none does. A wrong specific type is worse than a correct general one.

Where does the JSON-LD script go?

Head or body both work. What matters more is that it is present on the pages it describes, that it is valid, and that it does not contradict the visible content.

Do I need aggregateRating markup?

Only if the reviews are genuinely collected on your own site. Google's review snippet guidelines say pages using LocalBusiness or Organization markup are ineligible for star features when the business controls the reviews about itself.

Can I have more than one schema block on a page?

Yes, as long as each describes a distinct entity and they do not contradict each other. A LocalBusiness block plus an FAQPage block on the same page is normal.

My markup validates but nothing changed. Why?

Validation confirms syntax, not eligibility or impact. If your pages have nothing specific to quote, correct markup will not create something. Go back to Lesson 3 first.

I serve several towns. How do I mark that up?

Use areaServed with named places rather than inventing a page per town. The guide on marking up areaServed covers named places versus a geo radius and how many to list.

Does schema need to be on every page?

The business block belongs on the pages that describe the business, the homepage and contact page at minimum, and often sitewide through a shared template. Service pages can carry a Service block that references the same entity by its @id rather than repeating a second full business description.

Portrait of Adam Yong

Adam Yong

Founder, LocusPilot

Founder of LocusPilot and Agility Writer; leads GEO strategy at ADE Marketing.

Founder, LocusPilot (AI website builder for local businesses)

More about the author
Open access · immediate start

Ready for Lesson 5?

Build a local site AI can find. It picks up exactly where this lesson stops.

No signup. No paywall. 8 lessons, ~80 minutes.