Short answer: LocalBusiness structured data states a business's name, address, phone, hours and service area in a form a machine can read, and NAP consistency means those facts are identical on the site, in the markup, on the Google Business Profile and in directories.
Neither makes a business rank in local results: Google says that depends mainly on relevance, distance and prominence, and that there is no way to request or pay for a better local ranking. Do it because accurate facts help users and engines, not as a ranking lever.
When does LocalBusiness markup apply, and when does it not?
It applies to businesses customers visit or that travel to customers, such as trades, clinics, restaurants and shops. If the business is online-only, with no location or service area, use Organization markup instead. Putting LocalBusiness on a business that has no place to go is wrong, not harmless.
It needs care when the owner does not want the address public. Google's Business Profile guidance for service-area businesses is to hide the business address. Do not put a home address in your markup either. Ask the owner before you publish any address, and never decide the answer yourself.
No audit will tell you this is missing
Our scoring engine has no local-business rule yet, so a site audit will not fail a site for lacking LocalBusiness markup. Detection is manual: view the page source, look for a LocalBusiness node, and compare the facts. Do not read a clean audit as proof the markup is right or present.
Does LocalBusiness schema improve local rankings?
Google says local results rely mainly on relevance, distance and prominence, and that there is no way to request or pay for a better local ranking. Markup is not on that list. (Google Business Profile Help: tips to improve local ranking)
So the markup is not the lever. What it does is state facts unambiguously, so that when a system does read your page it reads the right hours and the right address. That has real value when an assistant is asked about opening times, and it is the reason to implement it carefully. It is not a reason to promise a client a better position.
Which properties does Google list for LocalBusiness?
Google requires name and address, where the address is a PostalAddress filled in as completely as possible. It recommends several others. Use the most specific LocalBusiness subtype available, such as Dentist, Store, LegalService or HomeAndConstructionBusiness. For more than one type, use an array in @type, because Google notes additionalType is not supported.
| Status | Properties | Notes |
|---|---|---|
| Required | name, address | address as a PostalAddress, as complete as possible |
| Recommended | telephone | Include the country and area code, for example +12122459600 |
| Recommended | url, geo | geo as latitude and longitude with at least five decimal places |
| Recommended | openingHoursSpecification, priceRange | priceRange under 100 characters |
| Recommended | department | Name it as the store name followed by the department name, unless it has its own brand |
| Careful | aggregateRating, review | Only for sites that capture reviews of other local businesses. Never on your own business node |
areaServed is valid schema.org and sensible for a service-area business, but it is not in Google's property tables for this type. Including it is harmless and may help other consumers of the data. Do not expect a Google feature from it.
What does a correct block look like?
This example uses a placeholder business. Replace every value with facts the owner has confirmed, and put the same facts in visible HTML on the page.
{
"@context": "https://schema.org",
"@type": "Dentist",
"name": "Example Dental",
"url": "https://example.com/",
"telephone": "+15195550100",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Example Street, Suite 4",
"addressLocality": "London",
"addressRegion": "ON",
"postalCode": "N6A 0A0",
"addressCountry": "CA"
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "09:00",
"closes": "17:00"
}
]
}For hours, omit validFrom and validThrough for year-round hours. For a business open past midnight, use one specification, such as opens 18:00 and closes 03:00. For closed all day, use 00:00 for both. For a seasonal closure, use 00:00 for both with validFrom and validThrough in YYYY-MM-DD form.
How do you reconcile NAP across sources?
Collect the name, address and phone from the site footer, the contact page, the schema, the Google Business Profile, and two or three directories. Put them in a table and compare them character by character: suite numbers, abbreviations, phone formatting and name variants such as "Smith Plumbing", "Smith Plumbing Ltd." and "Smith Plumbing Guelph".
Then ask the owner which version is true. This step is not optional and it is not yours to decide. Once the true version is confirmed, update every source to match it.
| Source | Rule from Google's Business Profile guidelines |
|---|---|
| Business name | Should reflect the real-world name used consistently on the storefront and website. No keywords, taglines or phone numbers in the name |
| Address | Precise, with no P.O. boxes or virtual offices. Service-area businesses should hide a home address |
| Service area | One profile with a service area is allowed, not much beyond about two hours' drive |
| Phone and URL | Use a local phone number and the location-specific website URL |
| Categories and hours | Choose few, specific categories and keep hours, including holiday hours, current |
A note on directories: Google lists links and reviews among prominence factors, but it does not publish a citations rule, so do not claim directory listings are a ranking factor. Consistent real-world facts are the goal.
How do you implement it, in order?
Confirm scope and privacy with the owner
Check the business has a location or service area, and ask whether the address may be published. Use Organization markup for online-only businesses.
Audit the facts across every source
Tabulate name, address and phone from the site, markup, Business Profile and directories. Get the owner to confirm the true version.
Pick the most specific subtype
Choose the most specific LocalBusiness subtype that fits. Use one node per location, each with its own page, phone and hours.
Add one JSON-LD block per location
Include name, address, telephone, url and openingHoursSpecification, using exactly the same name string as the storefront and the Business Profile.
Show the same facts in visible HTML
Put the name, address and phone in the footer or contact page. Markup must describe visible content.
Fix the Business Profile and directories to match
Claim and verify the profile, correct hours and holiday hours, and update the main directories to the confirmed facts.
How do you verify it, and what can you not claim?
Run the page through Google's Rich Results Test and validator.schema.org, fix errors and read the warnings. Confirm the hours and phone in the markup equal the visible page and the Business Profile. If an assistant states wrong hours or an old address, the cause is usually an outdated directory, not your site, so search for the fact and trace where the engine read it.
Our AEO Toolkit's visibility checks query Perplexity only, and each run is one sample. If you test with location-specific prompts written the way a customer would ask, repeat them, record which sources are cited, and compare before and after rather than claiming a cause. Several runs on one engine say nothing about ChatGPT or Google.
Do not add your own star rating
If a business controls the reviews about itself, its LocalBusiness or Organization pages are ineligible for star results, including through an embedded third-party widget. Leave aggregateRating off your own business node.
Where is the full implementation guide?
This article covers what the markup is for and how to reconcile the facts. The WordPress and static HTML recipes, and the full verification checklist, are in the documentation.
Read the LocalBusiness schema implementation guideThe same guide is an agent skill, so a coding agent can implement it in your repository. The skill source is public.
View the skill source on GitHubThe skills can be installed into Claude Code and other coding agents. Install details are in the skills index.
See how to install the AEO skillsCommon questions
Does LocalBusiness schema help me rank in local results?
Not directly. Google says local results rely mainly on relevance, distance and prominence, and that there is no way to request or pay for a better local ranking. Markup helps by stating accurate facts clearly, which matters when a system reads your hours or address.
Which properties are required for LocalBusiness in Google's documentation?
name and address, with the address as a PostalAddress filled in as completely as possible. Recommended properties include telephone, url, geo, openingHoursSpecification, priceRange and department. Use the most specific LocalBusiness subtype you can.
Should I use LocalBusiness or Organization schema?
Use LocalBusiness for a business with a physical location or a service area that customers visit or that travels to them. Use Organization for an online-only business with no location. If the owner does not want the address public, do not publish a home address in the markup.
Can I add aggregateRating to my own business?
No. If the business controls the reviews about itself, its LocalBusiness or Organization pages are ineligible for star results, including via an embedded third-party widget. Google lists aggregateRating and review for sites that capture reviews of other local businesses.
Sources
Related guides
Want it done for you
Want this done and re-checked every month? Our monthly maintenance re-runs your buying questions in ChatGPT, Perplexity and Google, ships the fixes that keep you out of the answers, and reports what moved. Or run the free check on your site first at advancelabs.dev/tools/audit.
See how it works
