All fix guides
WarningLocal SEO

Add LocalBusiness Schema: Fix Guide

Your page is missing LocalBusiness structured data, or it has the schema but is missing key fields like address, telephone, opening hours, or geo coordinates. This is machine-readable JSON-LD that tells Google and AI answer engines where your business is, when it's open, and how to reach it. A complete LocalBusiness block strengthens your eligibility for the Google local pack, Maps, and citations in AI Overviews, ChatGPT, and Perplexity. The fix is one script tag with correct name, address, geo, telephone, and openingHoursSpecification values that match what's visible on the page.

What this means

This warning means our crawler didn't find valid LocalBusiness structured data on your page, or it found the schema but key properties are missing or empty.

LocalBusiness schema is a block of JSON-LD (JavaScript Object Notation for Linked Data) you embed in your page's HTML. It describes your business as a structured entity that search engines and AI crawlers can parse without guessing: the name, physical address, phone number, geographic coordinates, and opening hours. A human reads "123 Main St, open till 9" as plain text. A machine needs it labeled with address, telephone, geo, and openingHoursSpecification so it can trust and reuse the data.

The specific sub-codes tell you what's missing:

  • missing_localbusiness_schema — no LocalBusiness JSON-LD block at all.
  • missing_local_address — the schema exists but has no address (or an incomplete PostalAddress). Google requires address, so without it the block isn't eligible for rich results.
  • missing_local_phone — no telephone property.
  • missing_opening_hours — no openingHoursSpecification.
  • missing_geo_coordinates — no geo block with latitude and longitude.

Google requires only name and address for a valid LocalBusiness (plus the @type and @context that make it valid JSON-LD). Everything else is recommended. But for a local business, the recommended fields are what actually move you into the map pack and AI answers, so treat them as required in practice.

Why it matters

Structured data turns a page a machine reads into an entity a machine understands. For a business with a physical location or service area, that difference decides whether you show up in the results that convert.

Google ranking and the local pack. Google uses LocalBusiness schema as a supporting signal for your name, address, and phone (NAP) and to reconcile your page with your Google Business Profile. Consistent, structured NAP plus geo coordinates helps Google connect your website, your profile, and Maps to the same real business. That confidence feeds eligibility for the local 3-pack, the "Open now" badge, and knowledge-panel details. openingHoursSpecification is what lets Google show live open/closed status in search.

AI answer engines. This is where geo coordinates earn their keep. When someone asks ChatGPT, Perplexity, or Google's AI Overviews for "best plumber near [neighborhood]" or "is [business] open right now," these systems resolve a location and need an unambiguous anchor. A text address can be parsed, but latitude and longitude are machine-exact and remove the ambiguity about which "Main Street" in which city you mean. Complete LocalBusiness JSON-LD with coordinates and hours is a strong signal for being named in AI answers to local queries. If your competitors have the schema and you don't, they're the ones the AI cites.

Low effort, high leverage. Unlike content or link work, this is a one-time markup change you fully control. There's no ranking gamble. You're making facts machine-readable that are already true.

How to fix it

  1. 1

    Gather your real business facts first

    You need five things, exactly as they should appear publicly: legal business name, full street address (street, city, region or state, postal code, country), primary phone in international format (e.g. +1-512-555-0142), opening hours per day, and your latitude and longitude. To get coordinates, open Google Maps, right-click your exact building, and click the lat/long pair at the top of the menu to copy it. Use at least five decimal places, which Google recommends for accuracy. Make every value match your Google Business Profile, because inconsistent NAP across sources is worse than missing schema.

  2. 2

    Pick the most specific @type

    Don't default to generic LocalBusiness if a narrower subtype fits. Google recommends the most specific applicable type: Restaurant, Dentist, Plumber, HealthClub, DaySpa, LegalService, AutoRepair, and dozens more. A specific type gives engines richer context and can unlock type-specific fields, like servesCuisine or menu for a Restaurant. If nothing fits, LocalBusiness is a valid fallback.

  3. 3

    Add the JSON-LD block to your page

    Place a single <script type="application/ld+json"> block in the page, ideally on your homepage and a dedicated contact or location page. Use the code example below as a template and swap in your real values. Keep the JSON valid: no trailing commas, straight quotes only (not smart quotes), and times in 24-hour HH:MM format. For a multi-location business, put a separate location-specific block on each location's own page rather than listing every location everywhere.

  4. 4

    Match the schema to your visible page content

    Google's structured data guidelines require marked-up data to reflect content that is actually on the page and true of the business. The address, phone, and hours in your JSON-LD should also be visible to human visitors somewhere on the site. Don't mark up a location you don't have or hours you don't keep. Mismatches can get the markup ignored or trigger a manual action.

  5. 5

    Validate before and after you publish

    Paste your URL or code into Google's Rich Results Test and the Schema.org validator to confirm the block parses with zero errors and the required properties (name, address) are present. Then re-run this audit. In Search Console, watch for the item to appear under the relevant enhancement report once Google recrawls. Warnings on recommended fields are fine to ship, but errors on required fields mean the block won't count.

Example

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Restaurant",
  "@id": "https://www.example.com/#business",
  "name": "Maple & Oak Kitchen",
  "url": "https://www.example.com",
  "telephone": "+1-512-555-0142",
  "priceRange": "$$",
  "image": "https://www.example.com/storefront.jpg",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "123 Main Street",
    "addressLocality": "Austin",
    "addressRegion": "TX",
    "postalCode": "78701",
    "addressCountry": "US"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 30.267153,
    "longitude": -97.743057
  },
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
      "opens": "09:00",
      "closes": "21:00"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Saturday", "Sunday"],
      "opens": "10:00",
      "closes": "22:00"
    }
  ],
  "sameAs": [
    "https://www.facebook.com/yourbusiness",
    "https://www.instagram.com/yourbusiness"
  ]
}
</script>

Complete LocalBusiness JSON-LD covering every field the audit checks. Replace all values with your own and validate before publishing.

Platform-specific steps

WordPress (Yoast / Rank Math)

Both plugins output LocalBusiness schema without hand-coding. In Yoast, you need the paid Yoast Local SEO add-on: configure your business type, address, phone, and hours under SEO > Local SEO, and it injects the JSON-LD. Rank Math includes local business schema free: go to Rank Math > Titles & Meta > Local SEO, set the site to represent a local business, and fill in address, phone, hours, and coordinates. Both let you paste latitude and longitude directly. For a single page only, use Rank Math's Schema Generator on that page instead of the global setting.

Shopify

Shopify themes ship Product and Organization schema but rarely LocalBusiness. Add it manually: edit theme.liquid (or a snippet included in the head) and paste the JSON-LD script inside the <head>. Use Liquid variables where they help (e.g. {{ shop.name }}, {{ shop.phone }}) but hardcode geo coordinates and hours, since Shopify doesn't store them. Apps like Schema Plus or JSON-LD for SEO can inject it if you'd rather not edit theme code.

Wix

Wix supports custom structured data natively: open your page, go to the SEO panel (or Settings > SEO), and use the Custom Structured Data / Advanced SEO section to paste your LocalBusiness JSON-LD. Wix also auto-generates some local markup from your business info under Settings, but it's often incomplete, so add a custom block to guarantee geo and openingHoursSpecification are present.

Squarespace

Squarespace has no schema UI, so inject it via code. Go to Settings > Advanced > Code Injection and paste the <script type="application/ld+json"> block into the Header field to apply it sitewide, or use a Code Block on a single location page. Because the header is global, keep a sitewide block to your primary location only.

Raw HTML / Next.js / React

For static HTML, paste the script tag directly into the page. In the Next.js App Router, render it with <script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }} /> inside your layout or page component. Keep the object in a typed constant so values stay consistent, and never build the JSON from unescaped user input. Server-render it so AI crawlers that don't execute JavaScript still see it.

Free tool
Check this with the Schema Markup Generator

Frequently asked

Do I still need LocalBusiness schema if I have a Google Business Profile?

Yes. They complement each other. Your Business Profile controls how you appear in Maps and the local pack, while LocalBusiness schema on your website corroborates the same information and feeds AI answer engines that crawl your site directly. Keeping the two in sync (identical name, address, phone, and hours) strengthens Google's confidence that they describe the same entity. Schema also reaches ChatGPT, Perplexity, and other crawlers that never read your Google profile.

Will adding this schema guarantee I show up in the local pack?

No. Structured data makes you eligible and improves Google's understanding, but it is not a ranking guarantee. Local pack placement also depends on proximity to the searcher, relevance, Business Profile completeness, reviews, and NAP consistency across the web. Schema removes a barrier rather than overriding those factors, but its absence can hold you back.

Are opening hours and geo coordinates actually required?

No. Google requires only name and address for the markup to be valid; hours and geo are recommended. But for a local business, openingHoursSpecification powers the live 'Open now' status in search, and geo coordinates give AI systems an exact anchor for 'near me' queries. Our audit flags them because omitting them leaves real visibility on the table, so treat them as required in practice.

I have multiple locations. Do I put every location in one schema block?

No. Put a separate, location-specific LocalBusiness block on each location's own page, each with its own address, phone, geo, and hours. Don't list every location in a single block that appears on every page. If a corporate entity sits above the locations, use Organization schema for the parent and LocalBusiness for each branch, linking them with @id references.

Does the schema have to match what's visible on the page?

Yes. Google's guidelines require structured data to represent information that is present on the page and true of the business. Your address, phone, and hours should be visible to human visitors somewhere on the site, not hidden only in the markup. Marking up hours or a location that don't really exist risks the markup being ignored or a manual action.

Does your site have this issue?

Run a free, AI-powered audit and we’ll flag this and 150+ other checks in about a minute. No signup.

No signup needed. Results in under 60 seconds.

Related fixes