Network disclosure
All ten sites in this network are published by Bay Area AEO. They cover answer engine optimization in the Bay Area from ten angles and link to one another so readers can move between related topics.
What structured data is
Structured data is a block of code on a web page that states facts in a fixed vocabulary, so a machine can read them without interpreting prose. The vocabulary used across the web is Schema.org, and the usual format is JSON-LD, a short script block placed in the page's HTML. A visitor never sees it. Search engines, and the crawlers and retrieval systems behind AI assistants, read it directly.
For a local business, the most important block is LocalBusiness: the name, address, phone, hours, location, service area and the official profiles that belong to the business. It confirms in a precise form what the page and the listings already say in words.
Why it helps AI answers
An assistant building an answer reads many sources about the same business and has to decide whether
they describe one thing. Markup helps in two ways. It removes ambiguity: an address marked up as an
address, with the city and ZIP in their own fields, cannot be confused with a street mentioned in a blog
post. And it connects: the sameAs property lists the business's profiles on other sites,
telling any machine that reads the page that the Yelp listing, the Facebook page and this website all
belong to the same business.
Bay Area AEO's FAQ lists structured data among the things the agency adds to an existing website, alongside clear service pages, FAQs and accurate business details. It is one of the cheapest signals to put in place, and it keeps working without attention as long as the facts in it stay current.
Choosing the type
Schema.org has many subtypes of LocalBusiness, and the most specific accurate one is the best choice:
Dentist, Plumber, Restaurant, Bakery,
AutoRepair, Attorney, AccountingService,
RealEstateAgent, HVACBusiness, Electrician,
RoofingContractor, HealthClub, Winery,
BarOrPub, CafeOrCoffeeShop and many more. Where no subtype fits, use
LocalBusiness itself or ProfessionalService. The type should match the primary
category on the listings in spirit, even though the names differ.
An example
Here is a LocalBusiness block for a fictional plumbing company in Hayward. Every value in it would come from the master business record in chapter 8.
{
"@context": "https://schema.org",
"@type": "Plumber",
"@id": "https://www.example-plumbing.com/#business",
"name": "Example Plumbing",
"url": "https://www.example-plumbing.com/",
"telephone": "+1-510-555-0100",
"address": {
"@type": "PostalAddress",
"streetAddress": "100 B Street, Suite 2",
"addressLocality": "Hayward",
"addressRegion": "CA",
"postalCode": "94541",
"addressCountry": "US"
},
"geo": {"@type": "GeoCoordinates", "latitude": 37.67, "longitude": -122.08},
"openingHoursSpecification": [
{"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "07:00", "closes": "18:00"}
],
"areaServed": ["Hayward", "San Leandro", "Castro Valley", "Union City"],
"priceRange": "$$",
"sameAs": [
"https://www.yelp.com/biz/example-plumbing-hayward",
"https://www.facebook.com/exampleplumbing"
]
}
The properties that matter most
| Property | What it states | Source in the master record |
|---|---|---|
name | The public business name | Business name, exactly |
address | Street, city, region, ZIP, country | Address, in its fixed format |
telephone | The main phone number | Primary phone |
url | The canonical home page | Website |
openingHoursSpecification | Regular hours by day | Regular hours |
geo | Latitude and longitude | From the map pin |
areaServed | Cities or regions served | Service area list |
priceRange | A general price level | Matches the listings' price level |
sameAs | Official profiles on other sites | Profile list |
image, logo | Photo and logo URLs | Photo library |
@id | A stable identifier for the business | Set once; reused on every page |
The @id and why it matters
The @id property gives the business a stable identifier, usually the home page address
with a fragment such as #business. Use the same @id on every page that refers to
the business. Service markup, FAQ markup and bios can then point to it as their provider or employer,
and every block on the site describes one entity. This handbook's own pages follow the same practice:
every page's markup refers to Bay Area AEO by a single identifier.
Holiday and special hours in markup
Opening hours in markup can carry dates as well as days. An
openingHoursSpecification entry with validFrom and validThrough
dates states a temporary schedule, such as reduced hours over the winter holidays or a closure for
renovation. Add these at the same time as the special hours on the listings, and remove them when the
period ends. A business that publishes holiday hours on Google but leaves its markup showing the regular
week has given machines two answers to the same question.
Filling in sameAs
List the business's own official profiles: the Yelp page, the Facebook and Instagram accounts, the LinkedIn company page, the trade directory profiles such as Healthgrades or Houzz. Include only profiles the business controls or that clearly belong to it. These links are how a machine connects the reviews and descriptions on those sites with the website. Keep the list in step with the master record's profile list.
Where to put it
Put the full LocalBusiness block on the home page and the contact or location page. Other pages can
refer to the business by its @id. A business with several locations should give each
location page its own LocalBusiness block with its own address, phone, hours and @id, and
can describe the overall brand with an Organization block that lists the locations.
Most website platforms allow a code block in the page header or have a plugin that generates markup. Plugin output is a good start, but check it: plugins often fill in defaults that do not match the real hours or category.
The markup must match the page
Every value in the markup should be visible somewhere on the site in words, and identical to the listings. Markup that says the business opens at 7:00 while the page says 8:00 creates the very conflict the markup exists to prevent. Search engines also treat markup that contradicts the visible page as misleading. When the master record changes, update the markup in the same pass as the pages and the listings.
Testing it
Two free tools check markup. Google's Rich Results Test shows whether Google can read the block and flags errors in the properties it uses. The Schema.org validator checks the markup against the full vocabulary. Paste the page address into each after every change. Then look at the output with the master record beside it and confirm every value.
Service-area businesses
A business that serves customers at their homes and does not receive visitors still has an address,
but it may not want to publish it. The markup should follow the same choice as the listings. If the
address is hidden on Google, include the city, region and ZIP in the markup without the street, and put
the weight on areaServed, listing each city by name. Some businesses describe the area with
a GeoCircle around a central point; a named list of cities is easier for an assistant to
match against a question that names one of them.
On common website platforms
Most small business sites run on a handful of platforms, and each handles markup differently. Some generate basic LocalBusiness markup from the business settings and allow extra code to be added in the page header. Others need a plugin or an app. Whichever route is used, the result should be checked with the testing tools, because two sources of markup on one page (the platform's own and a plugin's) can contradict each other. If that happens, switch one off and keep the one whose values can be edited to match the master record.
Common mistakes
A handful of errors appear again and again. Hours written in a free-text string instead of the
structured format. An address with the suite number missing, or formatted differently from the
listings. A sameAs list that still includes a closed account. A phone number in a format
that differs from everywhere else. Markup copied from a template that still names a different business,
which happens more often than anyone would like. Each takes minutes to fix once found.
Beyond the basics
LocalBusiness has many optional properties. Some are worth adding when they are true:
paymentAccepted, currenciesAccepted, hasMap,
founder, foundingDate, knowsLanguage and
amenityFeature for the attributes customers filter on, such as wheelchair access or free
Wi-Fi. Restaurants can add servesCuisine, acceptsReservations and a link to the
menu with hasMenu. Medical practices can use medicalSpecialty. The next chapter
covers markup for services and FAQ sections, and for menus.
Read your own markup
Run your home page through Google's Rich Results Test and read every value it finds aloud, with your master record open. If any value differs, by even one digit or one hour, fix it before doing anything else in this part of the handbook.
Related chapters26. Markup for services, FAQ sections and menus · 8. The master business record · 4. The five signals · 28. Pages machines can read