How to Add LocalBusiness Schema Markup to Your Website (Including Holiday Hours)

Tutorials October 5, 2026 • 11 min read • Kodbee Team Kodbee Team
How to Add LocalBusiness Schema Markup to Your Website (Including Holiday Hours)

A step-by-step guide to adding LocalBusiness schema to your small business website, with copy-and-paste code, platform instructions, and holiday hours for the 2026 season.

When someone searches "plumber near me" or asks an AI assistant which bakery is open late on Christmas Eve, the answer comes from data. Some of it is your Google Business Profile. Some of it is your reviews. And a surprising amount of it is whatever machines can reliably read off your website.

LocalBusiness schema markup is the cleanest way to hand that information over. It is a small block of code that tells search engines, in a format they don't have to guess at, exactly who you are, where you are, and when you're open.

This guide walks through what LocalBusiness schema is, what to include, how to add it on WordPress, Webflow, Squarespace, Shopify, or a custom site, and how to add holiday hours before the November and December rush. You don't need to be a developer to follow along, but we'll include the actual code so you (or whoever manages your site) can copy, edit, and ship it.

What LocalBusiness Schema Actually Is

Schema markup is a shared vocabulary, maintained at schema.org, that search engines use to understand web pages. Instead of inferring that "Mon–Fri 8–5" in your footer means business hours, a crawler reads a structured field that says openingHours with exact days and times.

LocalBusiness is the schema type built for businesses with a physical location or a defined service area. It has dozens of more specific subtypes, such as Dentist, Plumber, Restaurant, AutoRepair, HairSalon, LegalService, and RealEstateAgent. Using the most specific type that fits gives search engines one more clear signal about what you do.

The format Google recommends is JSON-LD: a script block that sits in your page's HTML and doesn't affect how the page looks. Visitors never see it. Search engines and AI tools do.

Why it matters more in 2026

Structured data has been around for over a decade, but a few things have made it more relevant for small businesses lately:

  • AI search reads it. Google's AI Overviews and AI-powered assistants pull business details from many sources. Clean, consistent structured data on your own site makes it easier for those systems to get your hours, address, and phone number right.
  • Google keeps pruning other markup types. Google has retired or restricted several rich result types over the past few years (FAQ rich results, for example, are now limited mostly to authoritative government and health sites). LocalBusiness and Organization markup remain core, supported types, so they're a safe place to invest.
  • Consistency is a trust signal. When your website, Google Business Profile, and directory listings all agree on your name, address, and phone number, you remove doubt. Schema makes your website's version of that data explicit.
Schema markup won't rescue a thin website or override a weak Google Business Profile. Think of it as removing friction: it makes the facts about your business easier to read correctly, everywhere they get read.

Before You Start: Gather Your Business Facts

The most common schema mistake isn't a code error. It's inconsistent information. Before writing a line of markup, open your Google Business Profile and write down exactly how each of these appears there:

  • Business name, exactly as it appears on your signage and profile (no keyword stuffing like "Best Denver Dentist – Smith Family Dental").
  • Street address, including suite number, city, state abbreviation, and ZIP code.
  • Primary phone number, ideally a local number, in the same format you use elsewhere.
  • Website URL, using your canonical version (https, with or without www, whichever your site actually uses).
  • Regular hours for each day of the week.
  • Holiday or special hours for the coming months.
  • Latitude and longitude. Right-click your location in Google Maps and the coordinates appear at the top of the menu.
  • Logo and a representative photo, with their full URLs.
  • Social and directory profiles you actively maintain (Facebook, Instagram, LinkedIn, Yelp, and so on).
  • Price range, if relevant, like "$$" or "$50–$150".

If anything on your website currently disagrees with your Google Business Profile, fix the visible website content first. Schema should describe what's on the page, not contradict it.

Step 1: Pick the Right Business Type

Browse the LocalBusiness subtypes on schema.org and pick the most specific one that accurately describes you. A few examples:

  • A family dental practice: Dentist
  • An HVAC contractor: HVACBusiness
  • A coffee shop: CafeOrCoffeeShop
  • An accounting firm: AccountingService
  • A boutique clothing store: ClothingStore

If nothing fits precisely, plain LocalBusiness is fine. Don't pick a subtype just because it sounds more impressive. Accuracy beats specificity.

Step 2: Write Your JSON-LD Block

Here's a complete, realistic example for a fictional HVAC company. Swap in your own details:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "HVACBusiness",
  "@id": "https://www.examplehvac.com/#business",
  "name": "Example Heating & Air",
  "url": "https://www.examplehvac.com/",
  "logo": "https://www.examplehvac.com/images/logo.png",
  "image": "https://www.examplehvac.com/images/storefront.jpg",
  "telephone": "+1-303-555-0142",
  "priceRange": "$$",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "1234 Main Street, Suite 200",
    "addressLocality": "Denver",
    "addressRegion": "CO",
    "postalCode": "80202",
    "addressCountry": "US"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 39.7392,
    "longitude": -104.9903
  },
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
      "opens": "08:00",
      "closes": "17:00"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Saturday",
      "opens": "09:00",
      "closes": "13:00"
    }
  ],
  "sameAs": [
    "https://www.facebook.com/examplehvac",
    "https://www.instagram.com/examplehvac",
    "https://www.yelp.com/biz/example-heating-and-air-denver"
  ]
}
</script>

What each part does

  • @type: your business category from Step 1.
  • @id: a stable identifier for your business entity. Using your homepage URL plus #business is a common, simple convention. It lets other markup on your site reference the same business.
  • name and address: Google lists these as required for local business markup. Everything else is recommended.
  • telephone: include the country code (+1 for the US).
  • geo: coordinates with at least five decimal places are ideal for precision.
  • openingHoursSpecification: your regular weekly hours, using 24-hour time. Leave out days you're closed.
  • sameAs: links to profiles that represent the same business. Only list ones you control and keep current.

Service-area businesses

If you travel to customers and don't serve people at your address (many contractors, cleaners, and mobile groomers work this way), you can add an areaServed property listing the cities or regions you cover:

"areaServed": [
  { "@type": "City", "name": "Denver" },
  { "@type": "City", "name": "Aurora" },
  { "@type": "City", "name": "Lakewood" }
]

Keep this aligned with the service area set in your Google Business Profile. If you hide your street address on Google because you work from home, think carefully before publishing it in schema. Your website and your profile should tell the same story.

Step 3: Add Holiday Hours Before the Rush

This is the part most small businesses skip, and it's exactly what customers look for between Thanksgiving and New Year's. Schema.org has a property for it: specialOpeningHoursSpecification. Each entry uses validFrom and validThrough dates to override your normal hours.

Here's how to say you're closed on Thanksgiving and Christmas Day, and open short hours on Christmas Eve:

"specialOpeningHoursSpecification": [
  {
    "@type": "OpeningHoursSpecification",
    "validFrom": "2026-11-26",
    "validThrough": "2026-11-26",
    "opens": "00:00",
    "closes": "00:00"
  },
  {
    "@type": "OpeningHoursSpecification",
    "validFrom": "2026-12-24",
    "validThrough": "2026-12-24",
    "opens": "09:00",
    "closes": "12:00"
  },
  {
    "@type": "OpeningHoursSpecification",
    "validFrom": "2026-12-25",
    "validThrough": "2026-12-25",
    "opens": "00:00",
    "closes": "00:00"
  }
]

Setting both opens and closes to 00:00 is the convention for "closed all day." Add this array alongside your regular openingHoursSpecification, not in place of it.

A few practical tips:

  • Update your Google Business Profile too. Google displays special hours from your profile, so use its "Special hours" feature for each holiday. Schema on your website supports that information; it doesn't replace it.
  • Show the hours on the page. Add a visible "Holiday Hours" note on your contact or location page. Markup should reflect content visitors can actually see.
  • Clean up in January. Old holiday entries won't break anything, but stale data is clutter. Put a reminder on your calendar to remove past dates.

Step 4: Add the Markup to Your Website

Where you paste the code depends on your platform. For a single-location business, the homepage or the contact/location page is usually the right spot. You only need it on one main page, not every page on the site.

WordPress

Most popular SEO plugins (Yoast, Rank Math, All in One SEO, and others) can generate Organization or LocalBusiness markup from a settings screen, sometimes through a paid local SEO add-on. Check whether your plugin already outputs business markup before adding your own; two competing blocks describing the same business can send mixed signals. If you prefer to add custom JSON-LD, a header-and-footer code plugin or your theme's header settings will let you paste the script on a specific page.

Webflow

Open the page settings for your homepage or contact page and paste the full script block into the "Before </body> tag" or "Inside <head> tag" custom code field. Publish the site for the change to go live. Custom code requires a paid site plan.

Squarespace

Use Code Injection at the page level (Page Settings → Advanced) to add the script to a single page. Code injection is available on paid business-tier plans; check your plan if you don't see the option.

Shopify

Many Shopify themes already output some Organization markup. For LocalBusiness details, you can edit your theme's theme.liquid file to add the script, ideally wrapped in a condition so it only loads on the homepage, or use a reputable structured data app. Always duplicate your theme before editing code.

Custom-built sites

Add the JSON-LD script into the page template's <head> or near the end of the <body>. On frameworks like Next.js or Laravel, it's worth generating the block from the same data source that renders your visible hours and address, so updating one place updates both.

Multiple locations

If you have more than one location, give each location its own page with its own LocalBusiness block, address, hours, and phone number. Don't stack every location onto the homepage. Each location page should stand on its own, both for visitors and for search engines.

Step 5: Test and Validate

Never assume markup works because it looks right. Two free tools will tell you for sure:

  • Google's Rich Results Test (search.google.com/test/rich-results): enter your page URL to confirm Google can read your markup and flag any errors or warnings.
  • Schema Markup Validator (validator.schema.org): checks your markup against the full schema.org vocabulary, which is useful for properties Google doesn't specifically report on.

Fix every error. Warnings about missing optional fields are worth reviewing, but they aren't failures. A missing comma or an unescaped quotation mark is the most common culprit when the whole block fails to parse.

After the page is live, use the URL Inspection tool in Google Search Console to request indexing so Google sees the update sooner. Keep in mind that valid markup makes your page eligible for enhanced display; it doesn't guarantee Google will show it.

Common Mistakes to Avoid

  • Marking up your own reviews. Adding star ratings to your own LocalBusiness markup from testimonials you collected yourself is considered "self-serving," and Google won't show review stars for it. Let reviews live on your Google Business Profile and third-party sites.
  • Mismatched NAP data. If your schema says "Suite 200" and your Google profile says "Ste. 200 B," tighten it up. Small inconsistencies add up across the web.
  • Describing content that isn't on the page. Hours, address, and phone in your markup should also appear visibly on the page where the markup lives.
  • Duplicate blocks from plugins and themes. Search your page source for application/ld+json and see how many business entities appear. One clean block beats three overlapping ones.
  • Set-and-forget. Moved, changed your phone number, or extended Saturday hours? Update the schema the same day you update your Google Business Profile.
  • Keyword stuffing. The name field is your actual business name, not a place to sneak in service keywords.

A 30-Minute Checklist

If you want the short version, here's the whole process:

  1. Copy your business details exactly as they appear on your Google Business Profile.
  2. Choose the most specific accurate LocalBusiness subtype.
  3. Fill in the JSON-LD template above with your name, address, phone, URL, geo coordinates, hours, and profiles.
  4. Add specialOpeningHoursSpecification entries for Thanksgiving, Christmas Eve, Christmas Day, New Year's Eve, and New Year's Day as they apply to you.
  5. Paste the script on your homepage or location page using your platform's custom code option.
  6. Run the Rich Results Test and the Schema Markup Validator, and fix any errors.
  7. Update Google Business Profile special hours and add a visible holiday hours note on your site.
  8. Set a January reminder to clear old dates.

The Bottom Line

LocalBusiness schema is one of the rare SEO tasks that's low cost, low risk, and genuinely useful. It doesn't take a site rebuild. It just makes the facts about your business unambiguous to Google, to AI search tools, and to whatever comes next. Doing it now, with holiday hours included, means fewer customers showing up to a locked door in December.

If you'd rather have someone handle the markup, check your existing plugins for conflicts, and make sure your site and Google Business Profile line up, the Kodbee team can help. Get in touch and we'll take a look at your site.

#schema markup #local seo #structured data #google business profile #holiday hours