Free SEO Tools

Local Business Schema Generator

Build valid LocalBusiness JSON-LD with address, geo coordinates, and opening hours that merge by day.

Pick the most specific type that fits. A precise subtype is more useful to search engines than the generic LocalBusiness.

Include the country code.

A symbol range such as $$, or a text range.

State, province or county.

Two-letter ISO code, e.g. US, GB, DE.

Optional. Both coordinates are needed, or neither.

Times are local to the business. Days sharing the same hours are merged into one entry in the output.

One profile URL per line. Used for the sameAs property.

LocalBusiness JSON-LD
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "name": "Northfell Coffee",
  "url": "https://example.com",
  "telephone": "+1-555-010-9000",
  "priceRange": "$$",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "118 Harbour Road",
    "addressLocality": "Portland",
    "addressRegion": "OR",
    "postalCode": "97201",
    "addressCountry": "US"
  },
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": [
        "Monday",
        "Tuesday",
        "Wednesday",
        "Thursday",
        "Friday"
      ],
      "opens": "09:00",
      "closes": "17:00"
    }
  ]
}
</script>

What LocalBusiness markup does, and doesn’t do

LocalBusiness markup states the facts about the business a page represents: its name, address, phone number, hours and position on a map. Google describes it as a way to supply details that can appear in the knowledge panel when people search for the business. Your Google Business Profile is the main source for that panel and for map results, so the markup backs up your profile rather than replacing it.

Google requires two properties, name and address. It recommends geo coordinates, openingHoursSpecification, telephone, url and priceRange, adds menu and servesCuisine for places that serve food, and department for a business with distinct departments inside it.

There is no LocalBusiness report in Search Console. The Rich Results Test is where you confirm Google can read the markup. As of October 2026 Google’s support for this type is unchanged; the retirement of FAQ rich results in May 2026 didn’t touch it.

PropertyGoogle’s statusIn this generator
nameRequiredBusiness name
addressRequiredStreet, city, region, postal code, country
geoRecommended, at least 5 decimal placesLatitude and longitude
openingHoursSpecificationRecommendedHours per day, merged where identical
telephoneRecommended, with country codeTelephone
urlRecommendedWebsite URL
priceRangeRecommended, under 100 charactersPrice range
menu, servesCuisineRecommended for food businessesNot included; add by hand
aggregateRating, reviewOnly for sites that review other businessesLeft out on purpose

What the generator outputs

You get one item whose @type is the subtype you choose. The name is always printed. Every other field is printed only when you fill it in, so an empty field is absent rather than an empty string. The address fields become a PostalAddress, and the country code is converted to capitals. If every address field is blank, the output has no address and fails Google’s requirement, so fill in at least what you can publish.

Coordinates become a GeoCoordinates item with real numbers, printed only when both are filled in, both parse as numbers, latitude is within 90 and longitude within 180. Anything else and geo is left out. Social profiles become sameAs, one URL per line: lines that don’t start with http:// or https:// are skipped, and duplicates are removed.

The generator deliberately prints no @id. An @id copied from the wrong page can tie this business to a different entity, so the choice is left to you. If you add one, make it a stable URL for this location, such as the location page URL followed by #business, and reuse exactly that value anywhere else your markup refers to the business.

Choosing the business type

The type list has 30 options in six groups, from the generic LocalBusiness to specific types such as Dentist, Plumber and CafeOrCoffeeShop. Google asks for the most specific subtype that fits, and being precise has no downside.

Choose by what the business is, not by what you want to rank for. A dental practice is a Dentist. A café that also serves lunch is still a CafeOrCoffeeShop, and a restaurant with a bar is a Restaurant. Use ProfessionalService for a consultancy or agency only when nothing more specific fits.

If your type isn’t in the list, look it up in schema.org’s LocalBusiness hierarchy and replace the @type value by hand. Locksmith, AccountingService and InsuranceAgency are real subtypes the list leaves out. Copy the spelling exactly from schema.org, because a misspelled type isn’t a type.

Too generic

Before: "@type": "LocalBusiness" for a hair salon

After: "@type": "HairSalon"

Typed by hand from schema.org

Before: "@type": "HomeAndConstructionBusiness" for a locksmith

After: "@type": "Locksmith"

Locksmith isn’t in the generator’s list, so edit the output after copying it.

Opening hours: merged days, late nights, holidays

Set each day’s opening and closing time, untick the days you are closed, and use the shortcuts. Apply Monday to all copies Monday’s hours to every day and marks them all open. Mon–Fri only closes Saturday and Sunday. 24h sets a single day to 00:00 until 23:59, which is how Google’s documentation writes a day that is open around the clock.

Days with identical hours are merged into one OpeningHoursSpecification with a list of days, always in Monday to Sunday order. That compact form is what Google’s own example uses; it isn’t an error. Closed days are left out entirely. Times must be 24-hour HH:MM, and a day with a time in any other form is dropped.

For late hours, such as 18:00 until 02:00, enter them on the day you open, with the closing time earlier than the opening time. The generator keeps them as entered.

Two things need hand edits. A lunch break needs two specifications for the same day, such as 09:00 to 12:30 and 13:30 to 17:00, because the form holds one window per day. Holiday and seasonal hours need a separate specification with validFrom and validThrough dates; for a day you are closed, set opens and closes both to 00:00 within those dates.

Weekday and Saturday hours, as generated

"openingHoursSpecification": [{"@type": "OpeningHoursSpecification", "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], "opens": "09:00", "closes": "17:00"}, {"@type": "OpeningHoursSpecification", "dayOfWeek": ["Saturday"], "opens": "10:00", "closes": "14:00"}]

Illustrative values. Sunday is closed, so it doesn’t appear at all.

Closed on a public holiday, added by hand

{"@type": "OpeningHoursSpecification", "opens": "00:00", "closes": "00:00", "validFrom": "2026-12-25", "validThrough": "2026-12-25"}

Illustrative date. Remove past holiday entries the next time you edit the block.

Address, phone and coordinates that match your profile

Write the address the way it appears on your Google Business Profile and in your site footer: the same street abbreviation, the same suite format, the same postal code. Google publishes no rule that the strings must be identical, but matching them removes a reason for doubt, and a mismatch usually means one of the two is out of date.

The country field takes a two-letter ISO code such as US, GB, DE or IN. The region is the state, province or county in the form your postal service uses, such as OR or CA in the United States.

Write the phone number with its country code, such as +1-555-010-9000. Google asks for the country and area code so the number works for anyone who finds it, wherever they are.

For coordinates, open Google Maps, right-click the spot where your entrance is, and click the coordinates at the top of the menu to copy them. Google asks for at least five decimal places, which pins the spot to about a meter. Paste the two numbers into the two fields; the generator leaves geo out if either is missing or out of range.

Phone and country

Before: "telephone": "(555) 010-9000", "addressCountry": "United States"

After: "telephone": "+1-555-010-9000", "addressCountry": "US"

Illustrative values. The generator capitalizes the country code, but it can’t turn a country name into one.

Service-area businesses and multiple locations

If you visit customers instead of receiving them, and your Business Profile hides your street address, don’t publish it in the markup either. Google still lists address as required and asks for as many address properties as you can give, so include the city, region, postal code and country and leave the street out. Add areaServed by hand to name the towns or regions you cover.

With several locations, give each one its own page and its own block: the branch’s name as signed, its address, phone and hours. Don’t put every branch on every page, and don’t put head office details on branch pages. The home page can describe the company as an Organization, with each branch marked up only on its own page.

Multi-location checklist

  • One location page per branch, each with one LocalBusiness block.
  • Each block uses that branch’s own phone number if it has one, not a central call center.
  • Hours are per branch. Don’t copy the flagship’s hours to every page.
  • The branch name matches its signage and its Business Profile, such as Northfell Coffee Pearl District.
  • No footer widget printing one branch’s markup on every page of the site.

Adding it in WordPress without a duplicate

Several WordPress plugins print LocalBusiness markup, so search the page source for your chosen type and your business name before you paste anything.

In Rank Math, switch on the Local SEO module under Rank Math SEO, Dashboard, Modules. That adds business fields to the Local SEO tab under Rank Math SEO, Titles & Meta, where you set the business type, address, phone, opening hours and price range, and Rank Math adds the business to the markup it prints on the home page. Multiple locations need Rank Math Pro.

In Yoast, LocalBusiness markup comes from Yoast Local SEO, included in Yoast SEO Premium as of October 2026, which adds the business to Yoast’s graph and handles one or many locations. In SEOPress, it comes from SEOPress PRO’s Local Business settings and its Local Business block.

If one of those already describes the business, fill in its fields instead of pasting the generator’s block, because two LocalBusiness items with different hours or phone numbers contradict each other. Use the generator when none of them is in use, or for location pages your plugin doesn’t cover. Paste it into a Custom HTML block on the location page, or a head snippet limited to that page. A footer widget is the wrong place, because it prints on every page.

What to leave out of LocalBusiness markup

Some of the most common LocalBusiness additions do nothing or work against you. Leave these out.

  • Star ratings for your own business. Since 2019 Google hasn’t shown review stars from LocalBusiness or Organization markup when the business hosts reviews about itself, which is why the generator has no rating fields.
  • Keywords in the name. Use the name on your sign, not Northfell Coffee – Best Coffee in Portland. Your Business Profile has the same rule.
  • An address customers can’t visit, such as a mailbox or a virtual office presented as a storefront.
  • Hours you don’t keep. If you close early in winter, change the markup with the season, or add a seasonal specification.
  • Every social profile you ever made. sameAs should list profiles you maintain, not dormant accounts.

aggregateRating does belong in LocalBusiness markup on one kind of site: one that reviews other businesses, such as a local directory or a restaurant guide, where each listing page marks up the business it reviews.

Worked example: a café with two locations

An illustrative case. Northfell Coffee has two cafés in Portland and one WordPress site with a page for each. Years ago someone pasted a LocalBusiness block for the first café into a footer widget, so it prints on every page, including the second café’s page. The second café stays open until 22:00 on Fridays and Saturdays and closes for lunch on Mondays.

Where the markup lives

Before: One CafeOrCoffeeShop block in the footer, printed on every page

After: One CafeOrCoffeeShop block on each café’s page, and nowhere else

Second café, Friday and Saturday

{"@type": "OpeningHoursSpecification", "dayOfWeek": ["Friday", "Saturday"], "opens": "07:00", "closes": "22:00"}

Illustrative values. The generator merged Friday and Saturday because their hours match.

Second café, Monday lunch break added by hand

{"@type": "OpeningHoursSpecification", "dayOfWeek": ["Monday"], "opens": "07:00", "closes": "12:00"}, {"@type": "OpeningHoursSpecification", "dayOfWeek": ["Monday"], "opens": "13:00", "closes": "18:00"}

After the change, the Rich Results Test on each café page shows one local business item with that café’s own address and hours, and the blog posts show none.

Checking LocalBusiness markup

With no Search Console report for this type, checking is manual. Do it once per location page after publishing, and again whenever hours change.

  1. 1.Test the live URL of the location page in the Rich Results Test and open the local business item.
  2. 2.Compare name, address, phone and hours with that location’s Business Profile, field by field.
  3. 3.Confirm there is one local business item on the page, and none on pages that aren’t about a location.
  4. 4.Run the URL through the Schema Markup Validator to check any type or property you typed by hand.
  5. 5.Schedule a check before each public holiday, since holiday hours are the part most often forgotten.

Troubleshooting LocalBusiness markup by symptom

Most problems here come from an address, coordinate or hours field the generator silently dropped, or from a plugin or footer widget printing a second business block.

SymptomLikely causeFix
No address in the outputEvery address field is blank.Fill in at least the city, region, postal code and country.
No geo in the outputA coordinate is missing, isn’t a number, or is out of range.Paste both numbers from Google Maps.
A day is missing from the hoursIt is unticked, or a time isn’t in HH:MM form.Tick the day and use 24-hour times.
Two local business items on one pageAn SEO plugin or a footer widget prints one too.Keep one source.
Google shows different hours from your siteThe Business Profile has other hours, and Google uses it for the panel.Update the Business Profile; markup won’t override it.
Unknown type in the validatorA hand-typed @type is misspelled.Copy the type name from schema.org.

FAQ about the Local Business Schema

Which business type should I choose?

The most specific subtype that genuinely fits. A dentist marked up as Dentist tells search engines more than the generic LocalBusiness, and there is no penalty for being precise. If your type isn’t in the list, copy it from schema.org and edit the output.

Does this schema get my business into the map pack?

No. Local pack placement is driven by your Google Business Profile, proximity and reviews. LocalBusiness markup helps search engines confirm your details are consistent, which supports that work rather than replacing it.

Which properties does Google require?

Only name and address. Google recommends geo coordinates, opening hours, telephone, url and priceRange, plus menu and servesCuisine for food businesses. This generator covers all of those except menu and servesCuisine.

Can I add review stars to my LocalBusiness markup?

Not for reviews of your own business on your own site. Google doesn’t show stars for those self-serving reviews in LocalBusiness or Organization markup. Ratings belong in LocalBusiness markup only on sites that review other businesses.

Should I put LocalBusiness markup on every page?

No. Put it on the page that represents the location: the home page or contact page for a single-location business, or each location page for several. A site-wide footer block repeats one location’s details everywhere.

I don’t show my street address. Can I still use it?

Yes. Google lists address as required but asks for as many address properties as you can give, so a service-area business can publish its city, region, postal code and country without the street, and add areaServed by hand.

How do I mark up holiday hours?

Add an OpeningHoursSpecification with validFrom and validThrough set to the holiday dates. For a day you are closed, set opens and closes to 00:00. The generator doesn’t build these, so add them by hand, and update your Business Profile too.