LocalBusiness schema has incomplete or invalid location data
What is this issue?
This issue reports the location block of a LocalBusiness schema your page
declares: the properties that place the business on a map and in the local pack — where
it is, how to reach it, and when it is open.
A LocalBusiness — or any of its schema.org subtypes, such as Dentist, Hotel,
Restaurant, Plumber, Attorney, ProfessionalService, Bakery or
ClothingStore — is checked for:
address.addressCountry— the country that decides which market Google places the business in, and the property a hand-writtenPostalAddressmost often omitsgeo— aGeoCoordinatesnode with alatitudeandlongitudethat are numbers in decimal degrees and inside the range the earth hastelephone— a value that contains an actual numberopeningHoursSpecification— entries that name adayOfWeekand giveopensandclosesas 24-hour times (09:00, not9am), or the legacyopeningHoursstring in its schema.org form (Mo-Fr 09:00-17:00)
What this issue is not:
- It does not guess. A page with no LocalBusiness schema is never reported, however much address, phone or opening-hours text sits in its body. Whether a page is meant to be a location page is an editorial decision the markup cannot settle, and the old heuristic that guessed it produced findings on pages that were correct as written.
- It does not repeat issue #89 (Organization/LocalBusiness schema). The identity
fields of the same schema —
name,url,logo, and whetheraddressis a well-formedPostalAddresswith a street, locality and postcode — belong there. Each fact is reported under one issue only. - It does not demand the recommended-but-optional properties. Google requires
nameandaddress; a business that publishes those and omitsgeo,telephone, hours orpriceRangehas published nothing wrong, so those absences are recorded as recommendations on the page record rather than raised as a defect.
Why it matters
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 to fix it
If the issue was raised, your page already declares a LocalBusiness — go to the finding, which names the properties at fault, and correct them in the block below. Steps 1 and 2 are for adding the schema to a page that has none: worthwhile for a location page, and never reported as a defect.
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
Examples
Example 1: Complete Location Data
Scenario: A restaurant declares the schema and fills in its location block.
Correct state (passes):
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Restaurant",
"name": "Joe's Pizza",
"url": "https://joespizza.example.com",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Main St",
"addressLocality": "New York",
"addressRegion": "NY",
"postalCode": "10001",
"addressCountry": "US"
},
"telephone": "+1-212-555-1234",
"geo": {
"@type": "GeoCoordinates",
"latitude": "40.7128",
"longitude": "-74.0060"
},
"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"
}
]
}
</script>Example 2: Address With No Country
Problematic state (fails):
{
"@context": "https://schema.org",
"@type": "Store",
"name": "Tech Startup",
"address": {
"@type": "PostalAddress",
"streetAddress": "789 Innovation Blvd",
"addressLocality": "San Francisco",
"postalCode": "94105"
}
}Reported: address.addressCountry missing.
Why it fails: without a country the address is ambiguous across markets, and Google cannot place the business.
Corrected state (passes): add "addressCountry": "US" to the PostalAddress.
Example 3: Coordinates That Are Not Coordinates
Problematic state (fails):
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Riverside Cafe",
"address": { "@type": "PostalAddress", "streetAddress": "1 Quay St", "addressLocality": "Bristol", "postalCode": "BS1 4DA", "addressCountry": "GB" },
"geo": { "@type": "GeoCoordinates", "latitude": "near the river", "longitude": "by the bridge" }
}Reported: geo.latitude "near the river" is not a number in decimal degrees.
Corrected state (passes):
"geo": { "@type": "GeoCoordinates", "latitude": 51.4499, "longitude": -2.5975 }Strings are accepted — "51.4499" is fine — as long as they are numbers in decimal
degrees and inside ±90 / ±180.
Example 4: Opening Hours a Machine Cannot Read
Problematic state (fails):
"openingHoursSpecification": {
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Monday",
"opens": "9am",
"closes": "5pm"
}Reported: openingHoursSpecification.opens "9am" is not a 24-hour time (expected HH:MM, e.g. 09:00).
Corrected state (passes):
"openingHoursSpecification": {
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Monday",
"opens": "09:00",
"closes": "17:00"
}The legacy string form is also accepted when it follows schema.org:
"openingHours": "Mo-Fr 09:00-17:00".
Example 5: A Contact Page With No Schema — Not This Issue
<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</p>Nothing is reported. Whether this page was meant to carry LocalBusiness schema is an editorial decision the markup cannot settle — adding the schema is worthwhile (see How to fix it), but its absence is not raised as a defect.
Example 6: Missing Recommended Properties — Not a Finding
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Corner Bookshop",
"url": "https://corner.example.com",
"address": {
"@type": "PostalAddress",
"streetAddress": "4 Market Row",
"addressLocality": "Leeds",
"postalCode": "LS1 6DG",
"addressCountry": "GB"
}
}Google requires name and address, and both are here. The absent geo, telephone,
opening hours and priceRange are recorded as recommendations on the page record, not
reported as an issue.
How PixyScan detects this
Read the structured data the page publishes: every JSON-LD block is parsed, and
@graphwrappers are flattened, so a LocalBusiness emitted by Yoast, RankMath or stock WordPress is seen as the entity it is.Select the declared LocalBusiness entities: any schema whose
@typeisLocalBusinessor any of its schema.org subtypes —Dentist,Hotel,Plumber,Attorney,ProfessionalService,Bakery,ClothingStore,VeterinaryCareand the rest of the roughly seventy the vocabulary defines, including a@typearray that contains one of them, and including types written as a full IRI (https://schema.org/Restaurant) or aschema:prefix. Nothing else on the page is examined, and a page with no such schema is not examined at all.The recognised set used to be four names —
LocalBusiness,Restaurant,Store,MedicalClinic— which is why this issue reported almost nothing in practice. A real site picks the specific subtype: a dentist publishesDentist, a hotelHotel. Those four names are what generic templates emit, so the short list matched the sites that had put the least thought into their markup and missed the ones that had put in the most.Validate the location properties:
address—addressCountrymust be present. A node that is only an@idpointer to an address defined elsewhere is followed, not flagged.addressRegionis a recommendation.geo— must be aGeoCoordinatesobject carryinglatitudeandlongitude. Values may be written as numbers or as strings ("40.7128"is how most templates emit them); they are rejected only when they are not numeric at all or fall outside ±90 / ±180.telephone— reported when it is declared but empty or contains no digits.openingHoursSpecification— each entry must name adayOfWeekand stateopensandclosesinHH:MM(orHH:MM:SS) form. A day written as closed (00:00to00:00) is valid. A legacyopeningHoursstring is checked against the schema.org form, e.g.Mo-Fr 09:00-17:00.
Keep the finding separate from #89: the location errors are never added to the schema's own validation errors, so a LocalBusiness missing both its
urland its country produces one #89 finding about the url and one #96 finding about the country — never the same fact under two headings.Report once per page: a store-locator page carrying twenty branches from one template produces one finding, naming the first businesses at fault and counting the rest. Every failing business is carried whole in the finding's details.
Record the recommendations: absent
geo,telephone, opening hours orpriceRangeare stored as schema warnings on the page record and never become a finding.
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? | Reserved for future use — the crawler always writes null here today; no check currently populates it |
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