PROCEDURE 16 / 35
REVIEWED 1 NOVEMBER 2026

CONTENT · SOP

Structured data SOP

Add LocalBusiness structured data that states the business's facts in a form machines read directly, copied from the fact sheet and matched to the visible page.
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.
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

  1. Copy from the fact sheet

    Fill the template from the signed fact sheet only, never from another listing.

  2. 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.

  3. Add page-level markup

    Service pages can carry Service markup; FAQ sections can carry FAQPage markup matching the visible questions.

  4. 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.

  5. Compare with the page

    Read the markup and the visible page side by side. Every value in the markup must appear on the page.

  6. Log it

    Fill a validation log row for each page with the date and result.

Validation log: one row per check, kept with the date.
CheckTool or methodPass conditionResult and date
SyntaxSchema Markup ValidatorNo errors; the type is recognized
Google eligibilityRich Results TestThe page is read and the business type detected
Fact matchSide-by-side read against the fact sheetName, phone, address, hours and areas identical
Page matchSide-by-side read against the visible pageEvery marked-up value is visible on the page
Live checkView source on the published pageThe 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.