Skip to content
schemamarkup.info — structured data, better SEOschemamarkup.info — structured data, better SEORules current · 29 Aug

LocalBusiness schema markup generator

LocalBusiness markup describes a physical place a customer can visit. Its most common failure is not a syntax error — it is describing several locations, or none in particular, as though they were one.

Google Search features this type can produce

From the registry
FeatureStatusSurfaceLast verified
Local business (opens in a new tab)ACTIVEsearch2026-08-29
Organization (opens in a new tab)ACTIVEsearch2026-08-29

Meeting a feature’s documented requirements does not guarantee that the feature appears. No tool can promise that, and any that does is describing something it cannot know.

Generate the markup

Runs in your browser
Identity

The most specific type that genuinely applies.

The trading name, matching your Business Profile exactly.

Include the country code where you serve customers abroad.

One per line.

Address

Two letters — GB, US, DE.

Coordinates

Only if accurate to the building.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "CafeOrCoffeeShop",
  "name": "Marlow Road Coffee",
  "url": "https://example.com/",
  "address": {
    "@type": "PostalAddress",
    "addressCountry": "GB",
    "addressLocality": "London",
    "postalCode": "SE15 5AA",
    "streetAddress": "14 Marlow Road"
  },
  "priceRange": "££",
  "telephone": "+44 20 7946 0912"
}
</script>

Paste this into the <head> of the page it describes. Markup that describes a page must live on that page.

One entity, one location

A LocalBusiness entity describes a single physical location with a single address and a single set of opening hours. A business with six branches has six locations, and the markup should reflect that: one page per branch, each carrying its own LocalBusiness entity, each with its own address, phone number and hours.

What goes wrong is the contact page that carries one LocalBusiness entity while listing six addresses in the body copy. The markup says one thing, the page says another, and there is no way for a consumer to work out which of the six the entity refers to. If you have a location finder, give each location a real page with a real URL. If you cannot, an ItemList of Place entities describes the situation more honestly than a single LocalBusiness does.

The related mistake is putting LocalBusiness markup on every page of the site through a template or a tag manager. The home page and the blog post are not the business premises. Site-wide identity belongs in Organization markup on one page; LocalBusiness belongs on the page about the location.

Choose the most specific subtype that fits

schema.org defines a deep hierarchy under LocalBusiness: Restaurant, Dentist, HomeAndConstructionBusiness, ProfessionalService, Store and many more, several of which have their own sub-subtypes. Using the most specific type that genuinely applies gives consumers more to work with than the generic parent does.

The judgement call is what "genuinely applies" means. If you are a bakery that also serves coffee at three tables, Bakery is right and Restaurant is a stretch. Where two subtypes both fit, an entity can declare both by giving @type an array. Where none fits well, LocalBusiness itself is a perfectly acceptable answer, and forcing an approximate subtype is worse than using the general one.

Some subtypes bring extra properties. Restaurant has servesCuisine and menu, medical subtypes have their own vocabulary. Those properties are meaningless on other subtypes, so the generator only offers them when the type you have chosen accepts them.

Opening hours are a specification, not a sentence

openingHoursSpecification takes structured objects: a set of days, an opening time and a closing time, in 24-hour format. Several specifications describe a business that opens at different times on different days, which is most businesses. A single free-text string is the older openingHours property and is harder for consumers to read reliably.

The hours in the markup must match the hours on the page. That sounds obvious until a bank holiday, a seasonal change or a permanent adjustment updates the visible copy and leaves the JSON-LD behind — a common outcome when the hours were typed into the markup by hand a year ago. If your hours are stored anywhere structured, generate both from the same source.

A location closed on a given day is expressed by omitting that day rather than by giving it identical opening and closing times. Businesses open past midnight need two specifications, one either side of the boundary.

What this markup does and does not do

Structured data supplements a Business Profile; it does not replace one. For local results specifically, a verified profile is the mechanism, and markup on your own site is supporting information rather than an alternative route in. Anyone telling you that adding LocalBusiness markup will place you in a map pack is describing something the documentation does not claim.

Where the markup does earn its place is consistency. The name, address and phone number in your markup, on your page, and in your profile should agree exactly — same street format, same phone format, same trading name. The audit checks the first two against each other and shows you both strings when they differ, because differences at this level are usually invisible to the person who wrote them.

geo coordinates are recommended and worth adding if you have accurate ones. Coordinates that point at the middle of the postcode district rather than at the door are worse than no coordinates.

Mistakes worth avoiding

Address split across the wrong properties

streetAddress holds the street line, addressLocality holds the town or city, addressRegion holds the county or state, and postalCode holds the postcode. Putting the entire address into streetAddress as one string parses, but it makes the parts unusable.

A country name where a country code belongs

addressCountry expects the two-letter code — GB, US, DE — rather than the country name. "United Kingdom" is understood by people and not by consumers of the markup.

priceRange as a number

priceRange is a rough indicator such as ££ or $$$, or a range like "£10–£30". A single figure describes nothing useful, and an empty string is worse than omitting the property.

LocalBusiness for an online-only business

If customers cannot visit you, there is no local business to describe. Organization is the right type, and it carries the identity properties without claiming a physical presence that does not exist.

Hours in the markup that contradict the sign on the door

Of everything on this page, this is the one that generates complaints from actual customers rather than from tools.

Check what you already have

If the page you are marking up already carries structured data, audit it before adding more. Duplicate entities from a theme and a plugin are the most common finding on established sites, and adding a third block makes it worse rather than better.

Check a page