Fixing Missing Schema for AI Visibility
When AI assistants answer questions about your business, they sometimes leave out the facts that matter to a customer or state them wrongly: the wrong town, an old service, a price from two years ago, no mention of the product you are best known for.
Structured data will not force an assistant to include you, but it gives crawlers an unambiguous, machine-readable copy of those facts. This guide shows you how to start from what the answers actually say, work out which facts need backing up, and add the right schema properties so they agree with your visible pages.
What schema can and cannot do for AI answers
Structured data is a block of JSON-LD, or less often microdata, that describes a page in the schema.org vocabulary: this page is about a business called this, at this address, offering these services. Search engines have used it for years to understand pages and to produce rich results. For AI assistants the picture is less clear, and it is worth being honest about that before you spend time on it.
- Google has said that its AI features, such as AI Overviews and AI Mode, need no special markup, and that the usual search guidance applies. Structured data still helps Google understand a page, and it must match the visible content.
- Other assistant providers have not published detailed guidance on how, or whether, they use schema.org markup when choosing or summarising sources. Some fetch the raw HTML, where JSON-LD sits, and some convert pages to text in ways that may drop script blocks.
- Search indexes that assistants draw on, such as Google's and Bing's, do read structured data, so accurate markup can help indirectly by making your pages easier for those indexes to classify.
The sensible conclusion is to treat schema as supporting evidence rather than the main message. Every fact you want assistants to repeat should be written clearly in the visible text of the page. Schema then restates the same facts in a form machines cannot misread: a postcode is a postcode, an opening time is an opening time, and a price has a currency. Where the two agree, you have removed a source of ambiguity. Where they disagree, you have created one.
Start from a fact sheet, not a list of schema types
The usual approach to schema is to pick types from a list and fill them in. For AI visibility it works better the other way round: decide which facts about your business customers ask about, then find where each should live. A simple fact sheet does this.
| Fact customers ask about | Where it should be written | Schema property that backs it up |
|---|---|---|
| Official business name and any other name you trade as | Home and about pages, footer | name,
alternateName, legalName |
| What you do, in one sentence | First lines of the home and about pages | description,
and the most specific @type available |
| Where you are and which areas you serve | Contact page, service pages | address,
areaServed, geo |
| Opening hours | Contact page | openingHoursSpecification |
| Services or products you offer | One page per main service or product | Service
with provider, or Product with offers |
| Prices or starting prices | Service or product page | offers with price
or priceSpecification and priceCurrency |
| When the business started and who runs it | About page | foundingDate, founder |
| Official profiles elsewhere | Footer or about page links | sameAs |
Fill the middle column before you touch any code. If a fact has nowhere visible to live, create that place first. Marking up a service that is not described anywhere on the page breaks search engine guidelines and gives an assistant nothing to quote.
The fix, step by step
Step 1
Collect the facts assistants state about you
Run a set of branded prompts in the AI Visibility Tracker, such as what the business does, where it is based, what it costs and who it suits, and read every answer where you are mentioned or recommended. Copy each factual claim about your business into a spreadsheet, one row per claim, with the assistant that made it. Include facts from the comparison prompts too, because those often reveal missing details about your services or prices.
Step 2
Mark each fact as right, wrong or missing
Next to each claim, record whether it is right, wrong or out of date. Then add rows for important facts that no assistant mentioned at all, and mark those missing. For every wrong fact, search for where it might come from: an old page on your own site, an outdated directory listing, or a third-party article. Schema cannot correct someone else's page, so note those sources for separate follow-up.
Step 3
Put every key fact in visible text first
For each wrong or missing fact, make sure one obvious page on your site states it plainly in ordinary text near the top, not only in an image, a PDF or a script-loaded widget. Write the business name, what you do and where in the opening sentence of the about page. Put prices, hours and service areas on the pages customers would expect them. Remove or update old pages that still state the wrong version.
Step 4
Choose the schema type that matches each page
Use one site-wide Organization node, or the most specific LocalBusiness
subtype that is true, such as Plumber or AccountingService, for a business
customers visit or that serves an area. Use Service on each service page, Product
on pages where something can be bought, and Article on editorial pages. Check that your
theme or plugin is not already outputting a second, conflicting version of the same node.
Step 5
Add the properties that carry those facts
Map each row of your fact sheet to its property: address and areaServed
for location, openingHoursSpecification for hours, offers with priceCurrency
for prices, foundingDate and founder for history. Copy values from the visible
text so the two match exactly, down to the spelling of the business name and the format of the phone
number. Leave out properties you cannot fill with a true, current value.
Step 6
Connect the markup to your profiles with sameAs
Add a sameAs array to the Organization or LocalBusiness
node listing the full URLs of profiles that are definitely yours: your LinkedIn company page, main social
accounts, Companies House entry, trade association listing and any Wikidata item. This tells machines
that those pages describe the same business. Only include profiles you control or that are unambiguously
about you, and check that each one states the same name and details.
Step 7
Validate, publish and re-run branded prompts
Paste each changed page into the Schema Markup Validator and Google's Rich Results Test and fix every error. View the page source to confirm the JSON-LD is in the HTML the server sends, not added later by a script. Request indexing of the main pages in Search Console and Bing Webmaster Tools, then re-run the same branded prompts in the tracker over the following weeks and update the fact sheet with what changed.
A worked example
Here is markup for a fictional bookkeeping firm whose branded answers placed it in the wrong town and never mentioned its fixed-fee payroll service. The about page and the payroll page were first rewritten so both facts were stated in the opening text. The markup then repeats them.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "AccountingService",
"@id": "https://example.co.uk/#business",
"name": "Millbeck Bookkeeping",
"legalName": "Millbeck Bookkeeping Ltd",
"description": "Bookkeeping, VAT returns and payroll for small businesses in Matlock and the Derbyshire Dales.",
"url": "https://example.co.uk/",
"telephone": "+44 1629 555 014",
"foundingDate": "2016",
"address": {
"@type": "PostalAddress",
"streetAddress": "4 Bank Road",
"addressLocality": "Matlock",
"postalCode": "DE4 3AQ",
"addressCountry": "GB"
},
"areaServed": [
{ "@type": "AdministrativeArea", "name": "Derbyshire Dales" },
{ "@type": "City", "name": "Matlock" }
],
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "09:00",
"closes": "17:00"
}
],
"sameAs": [
"https://www.linkedin.com/company/example-millbeck",
"https://find-and-update.company-information.service.gov.uk/company/00000000"
]
},
{
"@type": "Service",
"@id": "https://example.co.uk/payroll/#service",
"name": "Fixed-fee monthly payroll",
"serviceType": "Payroll",
"description": "Monthly payroll for up to 20 employees, including payslips, RTI submissions and pension auto-enrolment.",
"provider": { "@id": "https://example.co.uk/#business" },
"areaServed": { "@type": "AdministrativeArea", "name": "Derbyshire Dales" },
"offers": {
"@type": "Offer",
"priceSpecification": {
"@type": "UnitPriceSpecification",
"price": "45.00",
"priceCurrency": "GBP",
"unitText": "per month"
}
}
}
]
}
</script>
Three details matter here. The business uses the specific subtype AccountingService rather
than a generic Organization. The service node points back to the business with provider
and a shared @id, so the two are clearly connected. And every value, including the town,
the price and the employee limit, is also written on the visible pages. The Companies House number shown
is a placeholder; use your real company page if you include one.
@id values, author entities and connecting
articles to their publisher, see the guide on schema for AI answers in the AEO section. This page concentrates
on business facts.Platform notes
WordPress
SEO plugins such as Yoast SEO and Rank Math output an Organization or Person
node from their settings, usually under a "site representation" or "knowledge graph" section. Fill in
the name, logo and social profiles there first, because a second hand-written Organization
block will often conflict with the plugin's. Rank Math can set a local business type; Yoast has a separate
local add-on. For Service markup on individual pages, use the plugin's schema options where
available or a custom JSON-LD block that references the plugin's organisation @id.
Shopify
Many themes output Organization and Product markup, and review and SEO apps
often add more. View the source of a product page and count the blocks before adding anything. Business-level
facts usually belong in the theme's layout file, edited with care, or in a single app you trust to own
the markup.
Wix and Squarespace
Both generate some structured data automatically from your business information settings, so complete
those settings accurately first. Both also let you add custom code or structured data to pages, which
is where a Service block can go.
Custom and static sites
Put the site-wide business node in the shared layout template and page-level nodes in each page template, generated from the same data your visible pages use. That way a price or address changed in one place updates both text and markup together.
Single-page applications
If JSON-LD is injected by JavaScript after load, crawlers that do not run scripts will not see it. Render it on the server, or pre-render the pages, so it appears in the HTML the server returns.
When markup and pages disagree
Conflicting information is worse than missing information, because a machine reading two different addresses has no way to know which is current. The most common conflicts found when auditing business markup are:
- Two organisation nodes with different names, one from a plugin and one pasted into the theme, often with an old trading name in one of them.
- An address in markup that no longer matches the contact page after a move, because the markup was hard-coded.
- Prices in markup that are lower than on the page, left over from a sale or an old price list.
- Opening hours for a business that no longer has premises, or a
LocalBusinesstype on a business that is entirely online. sameAslinks to abandoned or deleted profiles, which send machines to pages that say nothing or say something out of date.
Search every template for hard-coded values when anything about the business changes. If the same fact appears in three places, generate it from one.
What not to mark up
- Reviews about yourself. Google does not show review stars for
LocalBusinessorOrganizationmarkup where the business publishes reviews about itself on its own site. Adding them invites problems and gives nothing back. - Services you do not offer on that page. A long list of services in markup, with no matching text, is misleading and ignored.
- Invented people or credentials. Only name real founders and staff who have agreed to be named.
- Areas you do not really serve. Listing every town in the county in
areaServeddoes not make you local to them, and the answer an assistant gives a customer should be true. - Questions and answers written for machines. FAQ markup no longer produces rich results for most sites; if you have a genuine FAQ, mark it up for clarity, not as a trick.
1. Does schema markup make ChatGPT or Gemini mention my business?
Not on its own. None of the assistant providers has said that structured data earns a mention or a citation, and Google says its AI features need no special markup. What schema can do is give crawlers and search indexes an unambiguous copy of facts that are already written on your pages, such as your location, services and prices. That reduces the chance of an assistant getting those facts wrong when it does talk about you.
2. Which schema type should a small local business use?
Use the most specific LocalBusiness subtype that is true for you, such as Plumber, Dentist, AccountingService or HomeAndConstructionBusiness, rather than the generic type. Include name, address, telephone, opening hours and areaServed, and add sameAs links to your official profiles. If you work entirely online with no premises customers visit, Organization is usually the better choice, with areaServed describing where your customers are. Whichever you choose, keep every value identical to the details written on your contact and about pages.
3. Can AI assistants read JSON-LD at all?
Some probably can and some may not. JSON-LD sits inside a script tag in the HTML. Crawlers that store the raw HTML have access to it, and search engines such as Google and Bing read it when indexing. Tools that convert a page to plain text before passing it to a model may drop script blocks entirely. That uncertainty is exactly why every important fact should also be written in the visible text of the page.
4. Should I use Organization or LocalBusiness?
Use LocalBusiness, or one of its subtypes, when you have premises customers visit or you serve a defined area in person, such as a trades business covering a group of towns. Use Organization for businesses that operate nationally or online without a customer-facing location. Do not use both for the same business on the same site; pick one node, give it a stable @id, and reference that from every other block, such as Service, Product and WebSite nodes.
5. How do I stop an assistant repeating my old address?
Update the address everywhere you control it in the same week: the contact page, footer, schema markup, Google Business Profile, Bing Places, and the main directories and trade listings where you appear. Redirect or update any old pages that mention the former address. Then find third-party pages that still show it and ask them to correct it. Assistants will only stop repeating it once the sources they draw on have been updated and recrawled.
6. Is it worth adding Wikidata to sameAs?
Only if a Wikidata item for your business already exists and is accurate. Wikidata is a structured database that many systems use to identify organisations, so linking to your item can help machines connect your site to it. Do not create an item just to link to it: Wikidata has notability requirements and items without independent references can be deleted. Company registers and trade association listings are more realistic sameAs targets for most small firms.
7. How can I check which schema my site already outputs?
Paste a page URL into the Schema Markup Validator at validator.schema.org, which lists every structured data block it finds, or into Google's Rich Results Test, which also shows what Google can use. You can also view the page source and search for application/ld+json. Check several page types, such as the home page, a service page and a blog post, because themes and plugins often add different blocks on different templates.
The AI Visibility Tracker asks ChatGPT, Claude, Perplexity, Gemini, Copilot and Brave Leo your target prompts, records whether your brand is cited, mentioned, recommended or invisible, and surfaces answers that attribute the wrong claims to you.
Open AI Visibility Fixes โ