BestGEOAgencyBayArea.click The complete GEO handbook

Published by Bay Area AEO, Bay Area, California
52 chapters · reviewed 1 November 2026

Chapter25

Part · Technical

LocalBusiness markup

Structured data is the fourth of Bay Area AEO's five signals: schema markup tells AI the services, service area and hours. LocalBusiness markup is where it starts, and it should say exactly what the master business record says.

Bay Area AEO · generative engine optimization handbook · Reviewed

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

Table. LocalBusiness properties worth filling in, and where the value comes from.
PropertyWhat it statesSource in the master record
nameThe public business nameBusiness name, exactly
addressStreet, city, region, ZIP, countryAddress, in its fixed format
telephoneThe main phone numberPrimary phone
urlThe canonical home pageWebsite
openingHoursSpecificationRegular hours by dayRegular hours
geoLatitude and longitudeFrom the map pin
areaServedCities or regions servedService area list
priceRangeA general price levelMatches the listings' price level
sameAsOfficial profiles on other sitesProfile list
image, logoPhoto and logo URLsPhoto library
@idA stable identifier for the businessSet 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