All articles

Technical SEO

Why Your Schema Markup Isn't Working: A Diagnostic Checklist for Local Sites

Valid schema that still produces no rich results and no AI citations usually fails for one of nine specific reasons. A diagnostic order of operations for local service websites.

Lead Search Pros Editorial·September 5, 2026· 15 min read
Why Your Schema Markup Isn't Working: A Diagnostic Checklist for Local Sites

There is a specific kind of frustration that comes after doing structured data correctly. The markup validates. The testing tool shows green. And then nothing happens: no star ratings in the search results, no FAQ accordions, no sign that any AI assistant has noticed the page exists. Most guides stop at "add the markup." This one starts where that leaves off.

Valid markup and effective markup are different things. Validation only proves your JSON-LD is syntactically correct and contains the required properties for a type. It says nothing about whether the page qualifies for a rich result, whether the crawler actually saw the markup, whether the entity you described is recognizable, or whether the claims inside the markup match the visible page. Those are the failure points that keep working schema from producing results.

Below is a diagnostic order of operations, running from the cheapest checks to the ones that need real investigation. Work it top to bottom rather than jumping to the exotic explanations first, because in practice the boring causes account for most cases. If you have not yet built a foundation to debug, start with our guide to schema markup for local service websites and the layering patterns in structured data beyond LocalBusiness.

First: is the failure eligibility, rendering, or recognition?

Every schema problem falls into one of three buckets, and naming the bucket before touching code saves hours. An eligibility failure means the markup is fine but the page or the type does not qualify for the feature you are expecting. A rendering failure means the crawler never received the markup you think is on the page. A recognition failure means the markup was received and is valid, but the search engine or AI system does not trust or cannot resolve the entity it describes.

The three have completely different fixes. Eligibility problems are solved by changing expectations or changing page content. Rendering problems are solved in the build and delivery layer. Recognition problems are solved slowly, through consistency and corroboration across the web. Misdiagnosing between them is why so many teams keep re-editing JSON-LD that was never the problem.

Check 1: does the rich result you want still exist?

The single most common cause of "my schema is not working" is that the feature was retired or narrowed. Rich result programs are not permanent. Over the past several years the visible footprint of FAQ and HowTo results in particular has been sharply reduced for most site types, and several review-related displays have been restricted by category. Markup that once produced a visible enhancement can be perfectly valid and simply no longer eligible to draw anything on the results page.

This does not make the markup worthless. Structured data still functions as machine-readable clarification, which is precisely what generative systems consume when deciding what a page is and whether to cite it. But you have to separate two goals: earning a visual feature in traditional search, and being unambiguously understood by a system that reads rather than displays. Judge each piece of markup against the goal it can actually serve.

Practical fix: before you debug anything, confirm which enhancement reports exist for your property and which features are currently documented as supported for your content type. If the feature is gone, stop optimizing for a screenshot from 2021 and treat the markup as an extraction aid instead.

Check 2: does the markup match what a visitor can see?

Structured data is a description of the page, not an additional page. When the two disagree, the description loses. Marked-up FAQ answers that do not appear in the rendered content, an aggregate rating with no reviews visible anywhere, an offer price that contradicts the pricing table, opening hours that differ from the footer: each of these is a mismatch, and mismatches get markup ignored at best and treated as manipulation at worst.

The check is unglamorous. Load the page with JavaScript disabled if possible, read the visible text, and confirm every factual claim in your JSON-LD appears on screen in substantively the same form. Wording does not have to be identical, but the substance does. If an answer in your markup is 90 words and the visible version is a two-word bullet, that is a mismatch.

The most frequent version of this on service sites is stale content in a template. Someone updated the visible price range on a service page and left the offers block untouched, or added new service areas to the copy without touching areaServed. Any field that a human edits should have an owner responsible for updating the markup in the same pass.

The hidden-content trap

Content inside collapsed accordions is generally acceptable as long as it exists in the served HTML and a user can reveal it without leaving the page. Content that only exists in the markup, or that requires a separate request to appear, is not. If your FAQ answers load from an API after interaction, the safest fix is to render them server-side and let the accordion control only visibility.

Dates that quietly lie

dateModified that updates on every deploy, regardless of whether content changed, degrades into noise. Worse, a dateModified far newer than any visible change invites a credibility problem on exactly the pages where freshness matters most, like pricing and regulation. Update it on substantive revisions only, and show the same date to readers.

Check 3: did the crawler ever receive your JSON-LD?

This is the check almost nobody runs, and it explains a large share of silent failures. Testing tools frequently execute JavaScript. Crawlers do too, but on their own schedule and with their own budget, and anything that depends on a third-party tag manager, a consent gate, or a client-side hydration step can be absent in the version that gets indexed.

Fetch the raw response and look for your markup in it directly rather than in the browser inspector. A request with curl, or the raw HTML view in a crawling tool, tells you what the server actually sent. If your JSON-LD only appears in the DOM inspector and not in the raw response, it is being injected client-side, and that is a rendering dependency worth removing.

Two related traps: markup injected through a tag manager after a cookie consent decision will be missing entirely for any crawl that never consents, and markup rendered inside an iframe belongs to the iframe's document rather than the page you care about. Both fail quietly and look fine to a human tester.

Check 4: is anything blocking or overriding it?

A robots.txt rule that blocks a script or a JSON endpoint your markup depends on can neutralize structured data without producing any validation error. So can a noindex on the page, a canonical pointing somewhere else, or a redirect chain that lands on a different URL than the one you tested. Structured data is evaluated for the canonical version of a page, so markup unique to a non-canonical duplicate is generally wasted work.

Check the canonical first. On templated location and service pages this is where multi-page programs go wrong: several URLs share a canonical, so only one version's markup is ever considered. If you run city or state pages, our guides on city and service page structure and scaling service area pages safely cover the canonical patterns that keep those pages independently eligible.

Check 5: are there duplicate or conflicting entities on the page?

Multiple plugins, a theme, and a hand-written block can each emit their own Organization or LocalBusiness node. The result is two or three descriptions of the same business with different names, phone numbers, or logos, and no indication of which is authoritative. Search engines resolve this by picking one or by trusting none of them.

The fix is consolidation, not addition. Emit one graph per page, assign a stable @id to each entity, and have every other node reference those identifiers instead of repeating fields. A Service node points at the business with provider and an @id. A BlogPosting points at the same node with publisher. Once identifiers are consistent site-wide, a crawler can assemble one coherent picture of the business from many pages instead of a pile of near-duplicates.

Audit for this by counting script blocks of type application/ld+json in the raw HTML. If a page has more than one and you did not deliberately author each, you have found a real problem.

Check 6: is the entity recognizable outside your own website?

Markup asserts. Corroboration confirms. When a business claims a name, address, and phone number in JSON-LD but no other source on the web agrees, there is nothing to validate the assertion against, and the entity stays weak. This is the failure mode that no amount of code editing fixes.

Consistency across your Google Business Profile, major directories, licensing bodies, trade associations, and your own site is what turns markup into a recognized entity. Our guides on NAP consistency in the AI era and building an entity search engines and AI systems recognize go deeper on this work, which is slower than markup but far more durable.

Check 7: how long has it actually been?

Structured data is processed on a crawl, and a crawl is not instant. For a page that gets crawled frequently, changes can be reflected within days. For a low-traffic location page on a small site, several weeks is normal, and enhancement reports lag further behind still. Judging a change after 48 hours produces false conclusions and, usually, a second round of unnecessary edits.

Set a review date instead of refreshing reports. Make one deliberate change, record what you changed and when, and evaluate after a full crawl cycle. Changing five things at once and then rolling half of them back guarantees you will never know which one mattered.

Check 8: are you measuring the right outcome?

Many teams conclude schema "is not working" because no visual enhancement appeared, while ignoring the outcome that has become more valuable: being read correctly by systems that answer questions. Those systems do not report back. Absence of a star rating is not absence of effect.

Useful proxies for the AI side of the picture include running a fixed set of buying-intent prompts monthly and logging whether your business appears, watching branded search volume, and watching direct traffic in your service area. Our guide to tracking whether AI assistants recommend your business lays out that measurement routine. On the traditional side, watch impressions and click-through rate for the specific pages you marked up rather than sitewide totals, which drown the signal.

A repeatable audit you can run quarterly

Turn the checks above into a short recurring pass rather than a one-time project. Fifteen minutes per template, four times a year, catches nearly everything before it compounds.

The pass, in order

Pull the raw HTML for one URL per template and confirm your JSON-LD is present in the server response. Count ld+json blocks and confirm you authored each one. Verify the canonical matches the URL. Read the visible page against every claim in the markup. Check that identifiers are stable and referenced rather than duplicated. Then, and only then, run a validator.

What to log

Keep a plain record of template, date, what you changed, and the review date. This is the artifact that turns schema work from guesswork into something you can reason about across a year, and it fits naturally into the routine described in our monthly local SEO operating cadence.

Frequently Asked

Questions & answers

My structured data passes validation but no rich result appears. Why?

Validation only confirms syntax and required properties. A rich result also requires that the feature still exists for your content type, that the page is the canonical version, and that the markup matches visible content. Check eligibility and canonical status before editing the markup again.

Does schema markup still help if rich results are not shown?

Yes. Structured data functions as machine-readable clarification of what a page contains, which is what AI answer engines consume when deciding what to cite. The absence of a visual enhancement does not mean the markup has no effect.

Can JavaScript-injected JSON-LD be indexed?

Sometimes, but it depends on rendering and is far less reliable than markup in the server response. If your JSON-LD is added by a tag manager or after consent, crawls that skip that step see nothing. Render it server-side.

How many JSON-LD blocks should a page have?

Ideally one, containing a graph of connected entities with stable identifiers. Multiple blocks from plugins, themes, and hand-written code often describe the same business inconsistently, which forces a search engine to guess which version is authoritative.

How long should I wait before deciding schema changes failed?

Allow a full crawl cycle for the specific page, which can be days for frequently crawled URLs and several weeks for low-traffic pages. Enhancement reporting lags further. Change one thing, note the date, and review after that window rather than daily.

Will incorrect schema hurt my rankings?

Markup that misrepresents the page, such as ratings that appear nowhere on the site or FAQ content that is not visible, can trigger a structured data manual action and lose rich result eligibility. Ordinary mistakes usually just get ignored rather than penalized.

Should every page on a local service site have markup?

Every page should have the markup that genuinely describes it, and nothing more. A service page gets Service plus a reference to the business. A post gets BlogPosting. Adding FAQPage to a page that is not structured as questions and answers creates risk without benefit.

Put this into practice

Check your market for exclusive leads

See whether your service area and category are still open for exclusive representation.

Check availability