- Owner
- Web developer or site admin
- Cadence
- Once, then after any fact sheet change
- Time box
- Two hours plus testing
- Output
- Validated markup and validation log
What structured data does
Structured data is code in a page that states facts in a fixed vocabulary, schema.org, so that a machine does not have to infer them from prose. JSON-LD is the format Google prefers: a block of JSON in a script tag that does not change how the page looks. Bay Area AEO lists structured data among the five AEO signals, describing it as schema markup that tells AI the services, service area and hours.
The rule for this procedure is simple: the markup says exactly what the fact sheet says and what the visible page says. Markup that claims more than the page shows is a mismatch that search engines treat as spam, and it makes the business's record less trustworthy.
Choose the most specific type
LocalBusiness has many subtypes, and the most specific one that fits is best: Plumber, Electrician, HVACBusiness and RoofingContractor for trades; Dentist, Physician and MedicalClinic for health; Restaurant, Bakery and CafeOrCoffeeShop for food; Attorney or LegalService for law; AccountingService for CPAs; RealEstateAgent for agents. If nothing specific fits, LocalBusiness itself is correct.
The template
This block is the starting point for a service business with a storefront in Hayward that serves nearby cities. Square brackets mark values to copy from the fact sheet.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Plumber",
"name": "[Business name, exactly as on the fact sheet]",
"url": "https://[canonical domain]/",
"telephone": "[+1 phone from the fact sheet]",
"address": {
"@type": "PostalAddress",
"streetAddress": "[street and suite]",
"addressLocality": "Hayward",
"addressRegion": "CA",
"postalCode": "[ZIP]"
},
"areaServed": [
{"@type": "City", "name": "Hayward"},
{"@type": "City", "name": "San Leandro"},
{"@type": "City", "name": "Fremont"}
],
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "07:00",
"closes": "18:00"
}],
"sameAs": ["[Google profile URL]", "[Yelp URL]", "[Bing Places URL]"]
}
</script>Field notes
Use areaServed for the cities the business covers; it should list the same cities as the
Google profile's service area and the website's service-area text. Use
openingHoursSpecification with one entry per distinct schedule, and add special hours
entries for holidays when the site supports updating them. The sameAs list connects the
website to the business's profiles on other platforms, which helps systems confirm they are looking at
one business. Restaurants add servesCuisine, priceRange and
hasMenu; practices with several providers can add a Person block per provider on each bio
page.
Procedure
- Copy from the fact sheet
Fill the template from the signed fact sheet only, never from another listing.
- Place it
Put the block on the home page for a single-location business, or on each location page for several locations, with one block per location.
- Add page-level markup
Service pages can carry Service markup; FAQ sections can carry FAQPage markup matching the visible questions.
- Validate
Run each page through the Schema Markup Validator at validator.schema.org and Google's Rich Results Test. Fix every error; read every warning.
- Compare with the page
Read the markup and the visible page side by side. Every value in the markup must appear on the page.
- Log it
Fill a validation log row for each page with the date and result.
| Check | Tool or method | Pass condition | Result and date |
|---|---|---|---|
| Syntax | Schema Markup Validator | No errors; the type is recognized | |
| Google eligibility | Rich Results Test | The page is read and the business type detected | |
| Fact match | Side-by-side read against the fact sheet | Name, phone, address, hours and areas identical | |
| Page match | Side-by-side read against the visible page | Every marked-up value is visible on the page | |
| Live check | View source on the published page | The script block is present in the HTML the server sends |
When to re-run
Re-run the validation log after any change to the fact sheet, any site redesign and any change of content management system or theme, since templates sometimes drop or duplicate script blocks. A duplicate block with old hours is worse than none, so the live check matters.
Done when
Several locations and several providers
A business with locations in, say, Pleasanton and Dublin gets one LocalBusiness block per location
page, each with its own address, phone, hours and @id, and a parent Organization block on
the home page that lists the locations. Practices with several dentists, attorneys or injectors can
mark up each provider's bio page with a Person block giving the name, job title and credentials, and a
link back to the location they work from. Keep the provider details identical to their directory
profiles.
Errors the validation log catches
The same few errors recur: hours written as text in place of the structured format, a phone number in
a different format from the listings, a service area that lists counties on one page and cities on
another, and a sameAs link to a profile that has since moved. Each is easy to fix once
seen, and each makes the business's record slightly less consistent while it stays.