Your Google Business Profile hours and your website hours are two separate signals. When they don't match in structured data, AI engines either skip your business or surface the wrong information. The fix is openingHoursSpecification on your LocalBusiness schema block.
Why Hours Markup Matters More Than Most Owners Think
Google AI Overviews, ChatGPT, and Perplexity all pull operating hours from structured data when it's present. When it's not, they fall back to whatever text appears on the page, your GBP listing, or third-party directories. That fallback chain introduces errors.
On many local business sites, hours aren't machine-readable at all: they sit in footer text, in an image, or in a table no crawler can reliably parse. Those businesses are invisible to AI search at one of the most important query moments: "is [business] open right now?"
"Is [business name] open" queries carry high intent. Someone asking that question is ready to walk in. Getting that answer wrong costs a visit.
The Difference Between GBP Hours and Schema Hours
Your Google Business Profile hours are managed inside Google's ecosystem. Schema.org hours live on your own website. They're not the same thing, and they're not automatically synced.
GBP hours are what Google surfaces in the knowledge panel and Maps. Schema hours are what structured-data-aware systems read when they crawl your site. When the two match, AI systems treat your hours as confirmed. When they conflict, AI systems either hedge, pick one, or omit hours entirely.
The goal is alignment. Your site's schema should mirror your GBP exactly, including holiday exceptions and seasonal variations.
The Correct openingHoursSpecification Format
Schema.org uses openingHoursSpecification as a property on LocalBusiness. Each day or range of days gets its own object. Here's what a complete weekly schedule looks like in JSON-LD:
{
"@type": "LocalBusiness",
"name": "Your Business Name",
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "09:00",
"closes": "18:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "10:00",
"closes": "15:00"
}
]
}
Time values use 24-hour format. Days use full names from Schema.org's DayOfWeek enumeration: Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday. If you're closed a day, omit it entirely. Don't include a closed-day object with empty strings. That pattern confuses validators.
For businesses open past midnight, like a bar or a late-night restaurant, set closes to a time past opens using the next calendar day's time. A bar open until 2am uses "closes": "02:00" on the following day's specification, not "closes": "26:00". Schema.org doesn't support extended time notation.
Handling Holiday Closures and Special Hours
openingHoursSpecification supports validFrom and validThrough date properties. This is how you handle holiday closures, summer hours, and seasonal schedules.
To mark a business closed on a specific date:
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Monday",
"opens": "00:00",
"closes": "00:00",
"validFrom": "2026-07-04",
"validThrough": "2026-07-04"
}
Opening and closing at 00:00 on the same date signals a full-day closure. This matches Google's own GBP special hours behavior.
A business that keeps adjusted hours on holidays can add date-specific openingHoursSpecification blocks with validFrom and validThrough that match the closures on its Business Profile.
Validating Your Markup Before It Goes Live
Two tools catch errors before they cost you citations.
Google's Rich Results Test at search.google.com/test/rich-results reads your URL or raw JSON and shows exactly what structured data Google can parse. Run it against your homepage and any page that contains your hours.
Schema.org's validator at validator.schema.org checks conformance against the Schema.org specification itself. It's stricter than Google's tool. A result that passes both is production-ready.
Common failures to look for:
dayOfWeeklisted as an array when only one day is specified. Single-day entries should be a string, not an array.opensandclosesformatted as 12-hour time with AM/PM. Schema.org requires 24-hour format.- Hours block placed on a contact page only, not the homepage. AI crawlers prioritize the homepage. Hours schema belongs there.
What Happens When You Get It Right
Brooklyn BJJ Lessons, my own practice in Brighton Beach, added a complete openingHoursSpecification block alongside its LocalBusiness schema in August 2026, and brought the site's hours into line with its Business Profile on 28 Aug 2026.
The mechanism is simple. AI systems prefer authoritative, machine-readable sources. Your own website, marked up correctly, outranks a Yelp page that scraped your hours six months ago.
What This Means for Brooklyn Independent Businesses
Most Brooklyn business owners treat their GBP as the source of truth and let the website lag behind. That worked in 2022. It doesn't work when AI engines are deciding which business to surface in a conversational answer.
Your site needs to confirm what your GBP says. Schema.org is how it does that. openingHoursSpecification is not optional markup for advanced sites. It's the minimum standard for a business that wants to appear correctly in AI-generated local answers.
Update your hours schema every time you update your GBP. Treat them as one action, not two.