No LocalBusiness schema on a location page
What Is This Issue
LocalBusiness schema is missing from pages that have a physical business location. This schema helps search engines understand your business details like address, phone number, opening hours, and geographic coordinates.
Without LocalBusiness schema:
- Your business won’t appear in Google’s local 3-pack results
- You won’t be eligible for Google Maps knowledge panels
- Voice search results won’t be able to provide your business details
- Rich snippets showing business hours, contact info won’t appear
A proper LocalBusiness schema should include: @type (specific subtype like Restaurant, Store, MedicalClinic), name, address (with PostalAddress), telephone, openingHoursSpecification, geo (latitude/longitude), and optionally priceRange, hasMap, review, etc.
Why Is This Important
LocalBusiness schema is critical for local SEO and user experience:
- Local search visibility: Businesses with LocalBusiness schema are 2.7x more likely to be in the local 3-pack
- Voice search optimization: Voice assistants rely on structured data to answer “near me” queries
- Rich results: Enables business hours, contact info, and location in search results
- AI search readiness: AI engines use LocalBusiness schema to provide accurate business information
- Competitive advantage: Many businesses still don’t implement this schema correctly
Resolving this issue improves your local SEO health score by ensuring search engines can properly identify and display your business information.
How XeoPix Detects This
XeoPix follows these logical steps to detect missing LocalBusiness schema:
-
Scan for physical location signals: The crawler checks if the page contains:
- A physical address (street address, city, state, zip)
- A phone number
- Business hours information
- Map embeds or directions links
-
Extract structured data: The crawler looks for JSON-LD, Microdata, or RDFa blocks on the page
-
Check for LocalBusiness schema: The crawler verifies if any schema block has:
@typeset toLocalBusinessor a recognized subtype- Required properties:
name,address,telephone
-
Validate schema completeness: If LocalBusiness schema is found, the crawler checks for:
- Proper
addresswithPostalAddresstype geocoordinates (latitude/longitude)openingHoursSpecificationwith proper formatpriceRange(optional but recommended)
- Proper
-
Trigger conditions: The issue is flagged when:
- Physical location signals are detected BUT no LocalBusiness schema is present
- LocalBusiness schema exists but is missing required properties
- The schema type is too generic (just
LocalBusinessinstead of a specific subtype)
How To Fix
-
Identify pages with physical location information (Contact page, About page, Store locator)
-
Choose the correct LocalBusiness subtype from Schema.org:
Restaurant,Store,MedicalClinic,Hotel,HairSalon, etc.- Use the most specific type that matches your business
-
Add JSON-LD structured data to your Contact or About page:
{ "@context": "https://schema.org", "@type": "Restaurant", "name": "Your Business Name", "address": { "@type": "PostalAddress", "streetAddress": "123 Main St", "addressLocality": "City", "addressRegion": "State", "postalCode": "12345", "addressCountry": "US" }, "telephone": "+1-555-123-4567", "openingHoursSpecification": [ { "@type": "OpeningHoursSpecification", "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], "opens": "09:00", "closes": "17:00" } ], "geo": { "@type": "GeoCoordinates", "latitude": "40.7128", "longitude": "-74.0060" } } -
Validate with Google’s Local Business Structured Data Testing Tool
Notes
- Use the most specific LocalBusiness subtype (e.g.,
Restaurantinstead of genericLocalBusiness) - Ensure
geocoordinates are accurate for your business location - Keep
openingHoursSpecificationupdated with holiday hours - Link to your Organization schema via
@idfor entity consistency
What We Store
Storage Level
Page Level — This issue is evaluated for each individual URL that contains structured data.
Database Table / Prisma Model
PageStructuredData
Stored Fields
| Field | Type | Description |
|---|---|---|
| schemaType | SchemaType | The type of schema (e.g., Organization, Person) |
| schemaFormat | SchemaFormat | The format of the schema (JSON-LD, Microdata, RDFa) |
| schemaIdentifier | String? | Unique identifier for the schema |
| rawJson | Json? | The raw JSON-LD or structured data content |
| schemaErrors | Json? | Array of validation errors found in the schema |
| isValidSchema | Boolean? | Whether the schema is valid according to validation |
| missingFields | Json? | Array of required fields that are missing |
Detection Dependencies
- The following data sources are required to evaluate this issue:
- HTML Document — The crawler parses the HTML to find structured data (JSON-LD, Microdata, RDFa)
- Structured Data Validation — The extracted schema is validated against Schema.org definitions
- Schema Parser — JSON-LD scripts, Microdata attributes, and RDFa markup are parsed
Examples
Example 1: Missing LocalBusiness Schema on Contact Page
Problematic state:
<!-- Contact page without LocalBusiness schema -->
<html>
<head>
<title>Contact Us - Joe's Pizza</title>
</head>
<body>
<h1>Contact Us</h1>
<p><strong>Address:</strong> 123 Main St, New York, NY 10001</p>
<p><strong>Phone:</strong> +1-212-555-1234</p>
<p><strong>Hours:</strong> Mon-Sat 11am-10pm, Sun 12pm-9pm</p>
</body>
</html>Corrected state:
<!-- Contact page with LocalBusiness schema -->
<html>
<head>
<title>Contact Us - Joe's Pizza</title>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Restaurant",
"name": "Joe's Pizza",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Main St",
"addressLocality": "New York",
"addressRegion": "NY",
"postalCode": "10001",
"addressCountry": "US"
},
"telephone": "+1-212-555-1234",
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
],
"opens": "11:00",
"closes": "22:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Sunday"],
"opens": "12:00",
"closes": "21:00"
}
],
"geo": {
"@type": "GeoCoordinates",
"latitude": "40.7128",
"longitude": "-74.0060"
}
}
</script>
</head>
<body>
<h1>Contact Us</h1>
<p><strong>Address:</strong> 123 Main St, New York, NY 10001</p>
<p><strong>Phone:</strong> +1-212-555-1234</p>
<p><strong>Hours:</strong> Mon-Sat 11am-10pm, Sun 12pm-9pm</p>
</body>
</html>Example 2: LocalBusiness Schema for Medical Clinic
Corrected state:
{
"@context": "https://schema.org",
"@type": "MedicalClinic",
"name": "Downtown Medical Center",
"address": {
"@type": "PostalAddress",
"streetAddress": "456 Health Ave",
"addressLocality": "Austin",
"addressRegion": "TX",
"postalCode": "78701",
"addressCountry": "US"
},
"telephone": "+1-512-555-7890",
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "08:00",
"closes": "18:00"
}
],
"medicalSpecialty": ["Cardiology", "Dermatology"]
}Example 3: Incomplete LocalBusiness Schema
Problematic state:
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Tech Startup"
}Missing required properties: address, telephone
Corrected state:
{
"@context": "https://schema.org",
"@type": "Store",
"name": "Tech Startup",
"address": {
"@type": "PostalAddress",
"streetAddress": "789 Innovation Blvd",
"addressLocality": "San Francisco",
"addressRegion": "CA",
"postalCode": "94105",
"addressCountry": "US"
},
"telephone": "+1-415-555-9876"
}Unit Test
Test File
xeopix-crawling-v2/__tests__/seo-audit-checks/structuredDataRichResults/issue-75-localbusiness-schema-location.test.js
Purpose
Validates that the crawler correctly validates LocalBusiness JSON-LD schemas on location pages and does not report false positives when the schema is properly formed.
Tested Function
runStructuredDataRichResults()
Issue Information
- Issue Number: 75
- Issue Code:
localbusiness_schema_location - Toggle Group:
structuredDataRichResults
Test Scenarios
Positive Test Cases
- Valid LocalBusiness schema: Page has a
LocalBusinessschema withnameandaddress— no issue reported.
Negative Test Cases
None — the test only validates that valid schemas pass.
Boundary Cases
None.
Edge Cases
- Empty HTML:
<html></html>— no crash.
Expected Outcome
Pass
Issue should not be reported when a valid LocalBusiness schema with required properties is present.
Fail
No negative test cases are defined.
Validation
- Correct pass-through of valid LocalBusiness schemas
- Graceful handling of empty HTML
Related Production Files
xeopix-crawling-v2/toggleGroups/structuredDataRichResults.jsxeopix-crawling-v2/issueCodes.jsxeopix-crawling-v2/utils/context.jsxeopix-crawling-v2/utils/issues.jsxeopix-crawling-v2/utils/schema.js
Coverage Summary
- Covers valid LocalBusiness schema detection
- Covers empty HTML resilience
References
- Google: Local Business Structured Data — Google Search Central
- Schema.org: LocalBusiness — Schema.org
- Google Rich Results Test — Google Search Central