If your business serves customers in a physical location or a defined service area, local business schema markup in WordPress is one of the fastest technical wins available to you. It takes about twenty minutes, it costs nothing, and it does not require a single line of PHP.
This guide is a practical walkthrough written for owners and marketers, not developers. You will learn which LocalBusiness properties actually matter for local visibility, how to add them with a free plugin or with Google Tag Manager, how to validate the result with the Rich Results Test, and the three mistakes that make Google quietly ignore your markup. Local business listings with schema structured data covers this in more depth.
What LocalBusiness Schema Actually Does (And What It Does Not Do)
Schema markup is structured data: a block of machine readable code that describes your page to search engines. The recommended format is JSON-LD, a small script placed in your page source. Google, Bing and AI answer engines read it to understand entities instead of guessing from your text.
Let us be honest about the outcome, because most articles are not:
- LocalBusiness schema is not a direct ranking factor in the local pack. Proximity, prominence and relevance still drive the map results, and your Google Business Profile remains the primary source of truth.
- It is a strong corroboration signal. Google cross checks your name, address and phone number across your website, your Business Profile and third party citations. Consistent structured data removes ambiguity and strengthens the entity association between your website and your listing.
- It unlocks rich results on classic search: sitelinks, knowledge panel details, opening hours in some layouts, and product or service specific enhancements when combined with other types.
- It feeds AI search surfaces. AI Overviews, assistants and LLM based answers rely heavily on clean structured data to extract hours, location and contact details. In 2026 this is arguably the biggest practical reason to implement it.
So the realistic goal is: make your business unambiguous to machines, and stop leaving your NAP data buried in a footer image.

The Properties That Actually Influence Local Visibility
Schema.org lists dozens of properties for LocalBusiness. You do not need them all. Here is what matters, ranked by real world impact.
| Property | Priority | Why it matters |
|---|---|---|
@type |
Critical | Use the most specific subtype available (Dentist, Plumber, Restaurant, Attorney, HairSalon) instead of the generic LocalBusiness. |
name |
Critical | Must match your Google Business Profile name exactly. No keyword stuffing. |
address (PostalAddress) |
Critical | Street, locality, region, postal code and country as separate fields. This is the core entity anchor. |
telephone |
Critical | Use international format with country code. Same number as your listing. |
url and @id |
High | The @id is a unique identifier for the entity and prevents duplicate nodes across your site. |
geo (GeoCoordinates) |
High | Latitude and longitude disambiguate similar addresses, which is useful in dense urban areas. |
openingHoursSpecification |
High | Preferred over the older openingHours string. Supports special hours and holiday closures. |
image / logo |
Medium | Use an absolute URL to a real, high resolution image. Required by Google for several rich results. |
sameAs |
Medium | Links to Facebook, LinkedIn, Instagram, industry directories. Reinforces the entity graph. |
areaServed |
Medium | Essential for service area businesses with no walk in address. |
priceRange, hasMap, paymentAccepted |
Low | Nice to have. Fill them if the information is visible on the page. |
aggregateRating / review |
Careful | See the warning below. Self serving reviews are ignored for LocalBusiness. |
The Review Property: Read This Before You Add Stars
Google does not display review rich results for reviews that a business collects and publishes about itself. This rule has applied to LocalBusiness and Organization markup since the self serving review update, and it still holds. Marking up your own testimonials will not produce stars in the search results, and aggressive fake ratings can trigger a structured data manual action.
What you can legitimately do:
- Include
aggregateRatingonly if it reflects genuinely collected reviews that are visible on the same page. - Reference third party review platforms through
sameAsso search engines can find your real reputation sources. - Use review schema where it is allowed, for example on Product or Service pages where the reviewed item is not the business itself.

Method 1: Add Local Business Schema With a Free WordPress Plugin
This is the right approach for 90% of small businesses. The markup is rendered server side, which is the most reliable way for search engines to see it.
Which plugin should you choose?
| Plugin | Cost | Best for | Limitation |
|---|---|---|---|
| Rank Math SEO | Free | Sites without an SEO plugin yet. LocalBusiness schema is included in the free tier. | Multiple locations require the Pro version. |
| Local Business Schema (JSON-LD) Lite | Free | Adding schema without changing your existing SEO stack. Lightweight and focused. | Fewer subtypes and advanced fields than premium tools. |
| Yoast SEO (free) + Yoast Local SEO | Add on is paid | Sites already on Yoast that want a clean, unified schema graph. | Full LocalBusiness support is behind the paid Local SEO add on. |
| All in One SEO (AIOSEO) | Freemium | Multi location businesses that want location post types and store locators. | Local Business module requires a paid plan. |
| Schema Pro / WPSchema | Paid | Sites needing many schema types with conditional display rules. | Overkill for a single location business. |
Step by step with a free plugin
- Install and activate. Go to Plugins > Add New, search for your chosen plugin, install and activate it. If you already run an SEO plugin, do not install a second one that also outputs LocalBusiness markup. Duplication is the number one cause of ignored schema.
- Open the local settings. In Rank Math it is Rank Math > General Settings > Local SEO. In dedicated schema plugins it is usually a top level menu item.
- Set the entity type to Person or Organization. Choose Organization, then pick the most specific business type from the dropdown. If your exact trade is not listed, choose the closest parent type rather than the generic LocalBusiness.
- Fill in name, address, phone and email. Copy the values character for character from your Google Business Profile. Include the country code in the phone number.
- Add latitude and longitude. Open Google Maps, right click your exact entrance, and click the coordinates to copy them. Paste them in the geo fields.
- Set opening hours. Enter each day separately. Use 24 hour format such as 09:00 and 18:00. Mark closed days as closed rather than leaving them blank.
- Add your logo and a business photo using absolute URLs from your media library. Aim for at least 1200 pixels wide.
- Add your social profiles in the social or sameAs fields, including your Google Business Profile short URL if you have one.
- Set price range using a simple format such as $$ or a currency range like €€.
- Save and clear every cache: your caching plugin, your CDN, and your object cache. Schema is often served from cached HTML.
What the output should look like
After saving, view the page source and search for application/ld+json. You should find something close to this:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Plumber",
"@id": "https://example.com/#localbusiness",
"name": "Dupont Plumbing Services",
"url": "https://example.com/",
"telephone": "+33123456789",
"priceRange": "$$",
"image": "https://example.com/img/storefront.jpg",
"address": {
"@type": "PostalAddress",
"streetAddress": "12 Rue des Lilas",
"addressLocality": "Lyon",
"postalCode": "69003",
"addressCountry": "FR"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 45.7578,
"longitude": 4.8320
},
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "08:30",
"closes": "18:00"
}],
"sameAs": [
"https://www.facebook.com/example",
"https://www.linkedin.com/company/example"
]
}
</script>
Method 2: Add It With Google Tag Manager (No Plugin At All)
Sometimes you cannot install a plugin: a locked down site, a client environment, or a page builder that fights your SEO plugin. Google Tag Manager is a valid workaround because Google renders JavaScript before indexing.
The GTM walkthrough
- Confirm GTM is installed on your WordPress site. Most sites already have it through a header scripts plugin or their theme options.
- In your GTM container, go to Tags > New > Custom HTML.
- Paste your full JSON-LD block, including the opening and closing
scripttags. Use a generator or the example above as a base. - Tick Support document.write? No. Leave it unchecked.
- Under Advanced Settings, set the Tag firing priority to a high value so it loads early.
- Create a trigger. For a single location business, use a Page View trigger limited to your homepage and contact page rather than All Pages. For multi location, create one tag and one trigger per location page using a Page Path trigger.
- Preview the container, confirm the tag fires, then Publish.
- Validate the rendered output with the Rich Results Test using the live URL option, not the code snippet option.
Honest caveats about the GTM method
- Google renders JavaScript, but rendering is queued and can be delayed. Server side markup from a plugin is always the safer default.
- Some non Google crawlers and AI agents do not execute JavaScript, so your structured data will be invisible to them.
- If a plugin already outputs LocalBusiness markup, adding a GTM version creates duplicates. Pick one source and stick with it.

How to Validate Your Markup Properly
Validation is not optional. Run all three checks in this order:
- Rich Results Test (search.google.com/test/rich-results). Paste the live URL. This tells you whether Google can parse the markup and whether the page qualifies for a rich result. Use the rendered HTML tab to confirm GTM injected code is visible.
- Schema Markup Validator (validator.schema.org). This checks syntax against the full schema.org vocabulary, including properties Google does not use. Perfect for catching typos in property names.
- Search Console URL Inspection. Run a live test on the URL and open the rendered HTML. This is the only tool showing exactly what Googlebot received. Then check Enhancements reports over the following weeks for errors at scale.
Set a reminder to re validate after any theme update, plugin update or migration. Structured data breaks silently.

The Three Errors That Make Your Schema Get Ignored
Error 1: Markup that does not match visible page content
This is the most common and the most damaging. Google explicitly requires structured data to represent content that a user can actually see on the page. If your JSON-LD declares opening hours, an address and a phone number that appear nowhere in the HTML, the markup can be disregarded or flagged as spammy.
The fix: display your full NAP and hours in real HTML text on the page you mark up, typically the homepage, contact page or location page. Never put the address only inside an image or an embedded map.
Error 2: Duplicate or conflicting LocalBusiness nodes
A typical WordPress site accumulates markup from three sources at once: the theme, the SEO plugin, and a dedicated schema plugin or GTM tag. Google then sees two or three competing definitions of the same business with slightly different data and has no way to know which one is authoritative.
The fix:
- Search the page source for
application/ld+jsonand count the blocks. - Disable schema output in the theme options or in the redundant plugin.
- Keep one LocalBusiness node with one stable
@idacross the whole site, referenced by other entities rather than repeated. - If you must keep several nodes, connect them properly with
@idreferences so they form a single graph.
Error 3: Invalid values in otherwise correct fields
The structure is fine, the values are not. Frequent offenders:
- Relative image URLs such as
/logo.pnginstead of the full absolute URL. - Opening hours written as
9am to 6pminstead of09:00and18:00. - Latitude and longitude entered as text with commas as decimal separators.
- A country written as
Francein one place andFRin another across pages. - Using
LocalBusinesswhen a precise subtype exists, which loses semantic value. - Fake or unverifiable
aggregateRatingvalues, which risk a manual action. - Markup placed inside a page builder module that is lazy loaded and never rendered in the initial HTML.
Special Cases: Multi Location and Service Area Businesses
Multiple locations
Do not stack every branch into one homepage schema block. The correct pattern:
- Create a dedicated page for each location with unique content, its own NAP block and its own map.
- Add one LocalBusiness node per location page, each with a unique
@idsuch ashttps://example.com/lyon/#localbusiness. - Link each branch to the parent brand with the
parentOrganizationorbranchOfproperty. - Keep the homepage limited to Organization or WebSite markup.
Service area businesses without a public address
If you visit customers and have no storefront, omit streetAddress and rely on:
areaServedwith cities, regions or aGeoCircledefined by coordinates and a radius.addressLocalityandaddressRegionto anchor your base city.- Consistency with the service area configuration in your Google Business Profile.

Your 10 Minute Implementation Checklist
- Only one LocalBusiness JSON-LD block exists in the page source.
- The
@typeis the most specific subtype available. - Name, address and phone match your Google Business Profile character for character.
- The same information is visible as HTML text on the page.
- Geo coordinates point to your actual entrance.
- Opening hours use
openingHoursSpecificationwith 24 hour values. - Image and logo use absolute HTTPS URLs.
sameAslists your real, active profiles.- No self serving review or fabricated rating markup.
- Rich Results Test and Schema Markup Validator both return zero errors.
- All caches cleared and the page resubmitted through URL Inspection.
FAQ
How do I add schema markup in WordPress without coding?
Install a free plugin such as Rank Math or a dedicated JSON-LD schema plugin, fill in the business fields in the settings panel, and save. The plugin generates and injects the JSON-LD automatically. The alternative is a Custom HTML tag in Google Tag Manager, which also requires no PHP editing.
How do I know if my website already has schema markup?
Open your page, view the source code, and search for application/ld+json. Alternatively paste your URL into the Rich Results Test or the Schema Markup Validator, which will list every detected entity type on the page.
Should local business schema be sitewide or page specific?
Page specific is better. Place the LocalBusiness node on your homepage or contact page for a single location, and on individual location pages for multi location businesses. Repeating the same block on every blog post adds noise without benefit. Use a single stable @id so other pages can reference the same entity.
Does FAQ schema still work?
FAQ rich results are now shown only for a narrow set of authoritative government and health sites. For most businesses, FAQ markup no longer produces the expandable snippets it once did. It still has value for entity understanding and AI answer engines, but it should not be your priority. LocalBusiness markup delivers far more for a local company.
How long before Google picks up my schema?
Usually a few days to a few weeks, depending on your crawl frequency. You can speed this up by requesting indexing through the URL Inspection tool in Search Console. Rich result eligibility does not guarantee display: Google decides case by case.
Do I still need schema if I have a Google Business Profile?
Yes. The Business Profile powers the map pack, while schema powers the classic organic results, the knowledge panel connection between your site and your listing, and increasingly the AI generated answers. They reinforce each other, and inconsistencies between them weaken both.
Can bad schema markup hurt my rankings?
Invalid markup is simply ignored, which is a wasted opportunity rather than a penalty. Deceptive markup, such as fake ratings or data that contradicts the visible page, can trigger a structured data manual action that removes all your rich results. Accuracy is the only safe policy. Business schema: is some better than none covers this in more depth.
Final Word
Local business schema markup in WordPress is one of the rare SEO tasks that is cheap, fast and fully within your control. Choose one source of truth, mirror your Google Business Profile exactly, validate the output, and re check after every major update. Do that and you remove all technical ambiguity about who you are, where you are, and when you are open.
Need a hand auditing your structured data or fixing duplicate schema conflicts on a WordPress site? The team at Webvog handles technical local SEO implementations every week. Get in touch and we will review your markup. Local Business Schema: Boost Local SEO Rankings tackles the same question from another angle.