# LocalBusiness schema on local business pages with address and hours

- **Pattern:** `ab-002475` (`seo-advanced.structured-data.local-business-schema`)
- **Severity:** low
- **Lifecycle:** active
- **Last modified:** 2026-04-18
- **Canonical URL:** https://auditbuffet.com/patterns/ab-002475
- **License:** CC-BY-4.0 — attribute to AuditBuffet Pattern Catalog (https://auditbuffet.com/patterns/ab-002475)

## Why it matters

Local businesses without schema-org LocalBusiness markup are invisible to the structured-data layer of local search. Google's local pack — the map + business listing results that appear above organic results for location-based queries — draws from structured signals including `address`, `telephone`, and `openingHoursSpecification`. A restaurant, clinic, or retail location without PostalAddress schema loses local pack eligibility to direct competitors who implement it. This is a recoverable gap that directly affects foot traffic for businesses with physical locations.

## Severity rationale

Low because LocalBusiness schema absence reduces local search visibility without breaking site functionality, and only affects businesses with physical locations.

## Remediation

Add LocalBusiness schema to each location page in `app/locations/[slug]/page.tsx`, generated from your location data source:

```tsx
const schema = {
  '@context': 'https://schema.org',
  '@type': 'LocalBusiness',
  name: location.name,
  address: {
    '@type': 'PostalAddress',
    streetAddress: location.street,
    addressLocality: location.city,
    addressRegion: location.state,
    postalCode: location.zip,
    addressCountry: 'US',
  },
  telephone: location.phone,
  openingHoursSpecification: location.hours.map(h => ({
    '@type': 'OpeningHoursSpecification',
    dayOfWeek: h.day,
    opens: h.open,
    closes: h.close,
  })),
}
```

All three top-level properties (`address`, `telephone`, `openingHoursSpecification`) are required for local pack eligibility. Validate each location page with the Google Rich Results Test.

## Detection

- **ID:** `local-business-schema`
- **Severity:** `low`
- **What to look for:** Count all location or business pages. For each, enumerate the LocalBusiness schema properties present: `name`, `address` (with `streetAddress`, `addressLocality`, `addressRegion`, `postalCode`), `telephone`, and `openingHoursSpecification`. At least 3 top-level properties must be present.
- **Pass criteria:** Every local business or location page includes LocalBusiness schema with at least 3 of the 4 required properties (`name`, `address`, `telephone`, `openingHoursSpecification`) present and non-empty. Report: "X of Y location pages have LocalBusiness schema."
- **Fail criteria:** LocalBusiness schema is missing entirely, or fewer than 3 required properties are present on any location page.
- **Skip (N/A) when:** The project is not a local business or has no location-specific pages (e.g., SaaS product, online-only service).
- **Detail on fail:** `"Location pages have LocalBusiness schema with 2 of 4 required properties — missing 'openingHoursSpecification' and 'telephone'"`.
- **Remediation:** LocalBusiness schema enables local search results and knowledge panel features. Add to location page components in `app/locations/[slug]/page.tsx`:

  ```json
  {
    "@context": "https://schema.org",
    "@type": "LocalBusiness",
    "name": "Your Business",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "123 Main St",
      "addressLocality": "Springfield",
      "addressRegion": "IL",
      "postalCode": "62701"
    },
    "telephone": "+1-555-123-4567",
    "openingHoursSpecification": [
      {
        "@type": "OpeningHoursSpecification",
        "dayOfWeek": "Monday",
        "opens": "09:00",
        "closes": "17:00"
      }
    ]
  }
  ```

## External references

- schema-org LocalBusiness
- schema-org PostalAddress

Taxons: findability

HTML version: https://auditbuffet.com/patterns/ab-002475
