Schema markup is structured data — a hidden description layer written for machines, not humans. When an AI system crawls your website, it reads both the text your customers see and the machine-readable signals embedded in your HTML. Schema markup is those signals. It tells AI systems precisely what type of business you are, where you operate, what hours you keep, what questions you answer, and how your content should be understood. Without it, AI systems make inferences. Inferences get excluded. Schema gets cited.
Why schema markup is the single highest-ROI AIO fix
Schema markup is structured data that tells AI systems exactly what your business is, does, and offers — in machine-readable language. FAQPage schema produces a 2.1× citation lift across all AI platforms. LocalBusiness schema is the foundation everything else builds on. Without it, AI systems guess — and guesses get excluded.
Traditional SEO operates on keywords and backlinks — signals that tell Google's ranking algorithm which pages are authoritative. AI citation engines operate on a different layer entirely. They parse your content, compare it against structured signals like schema markup, and decide whether your business can be confidently represented in an answer. Confidence is the key word. AI systems are built to avoid hallucination. If they can't be confident about who you are, what you offer, and where you operate, they default to sources that make it easy — sources with schema.
The gap between what a human reads on your website and what a machine reads is significant. A human sees "Family-owned plumbing company serving Dallas since 1998." A machine without schema sees an ambiguous string of text. The same content with LocalBusiness schema tells the machine: this entity is of type Plumber, located at a specific address with a specific service area, reachable at a specific phone number, with operating hours and a verified URL. These are not the same inputs. One earns citations. The other earns nothing.
The @graph pattern is how schema works at its most powerful. Rather than embedding individual schema blocks in isolation, the @graph array bundles your structured data into a connected knowledge graph. A single page can declare that it belongs to an Article, which is published by an Organization, authored by a Person, containing FAQPage content, all tied together with BreadcrumbList navigation. AI systems treat these connected entities as a more complete, trustworthy source than disconnected fragments.
For local businesses specifically, the ROI on schema is unmatched by any other technical change. It requires no new content, no link building, no paid promotion. It requires editing a single JSON block in your HTML. The lift it produces — especially from FAQPage schema's 2.1× citation multiplier — is measurable within weeks on Google AI Overviews and within months on Perplexity and ChatGPT.
LocalBusiness schema: the essential template
LocalBusiness schema tells AI systems your business name, type, location, phone number, hours, and service area. These seven fields — @type, name, address, telephone, geo, openingHours, and url — are the minimum viable schema for AI citation eligibility. Missing any one reduces your citation probability significantly.
Every field in your LocalBusiness schema serves a specific machine-readable purpose. @type is the most important: it identifies what kind of business you are within the schema.org taxonomy. Rather than using the generic LocalBusiness type, use the most specific subtype that applies. A plumber should declare Plumber. A dentist should declare Dentist. A hair salon should declare HairSalon. AI systems are more specific than people expect — they evaluate schema subtypes when determining which businesses to cite for particular queries. Using the right subtype puts you in the right pool.
address uses the PostalAddress type with individual fields for street, city, region, postal code, and country. Do not paste the full address as a single string — AI systems parse the sub-fields individually and use them to verify your location against Google Maps data and directory listings. geo adds latitude and longitude coordinates, which are particularly important for Gemini and Google AI Overviews, which weight geographic signals heavily for local queries. openingHoursSpecification is structured differently from the simpler openingHours string — it uses day names and open/close times and is more reliably parsed by newer AI systems. sameAs is your entity glue: an array of URLs pointing to your Google Business Profile, Yelp listing, Facebook page, LinkedIn profile, and other verified presence points. This is how AI systems confirm your business exists beyond your own website.
The template below is production-ready. Replace the capitalised placeholder values with your actual business data. Deploy it inside a <script type="application/ld+json"> tag in your page's <head>.
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Plumber",
"@id": "https://www.cityproplumbing.com/#business",
"name": "City Pro Plumbing",
"url": "https://www.cityproplumbing.com/",
"telephone": "+1-214-555-0192",
"email": "[email protected]",
"description": "Licensed plumber serving Dallas and surrounding areas since 1998. Emergency callouts, drain cleaning, water heater installation, and full re-pipes.",
"address": {
"@type": "PostalAddress",
"streetAddress": "4821 Elm Street",
"addressLocality": "Dallas",
"addressRegion": "TX",
"postalCode": "75226",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 32.7767,
"longitude": -96.7970
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "07:00",
"closes": "18:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Saturday"],
"opens": "08:00",
"closes": "14:00"
}
],
"areaServed": [
{ "@type": "City", "name": "Dallas" },
{ "@type": "City", "name": "Irving" },
{ "@type": "City", "name": "Garland" },
{ "@type": "City", "name": "Mesquite" }
],
"sameAs": [
"https://www.google.com/maps/?cid=YOUR_GBP_CID",
"https://www.yelp.com/biz/city-pro-plumbing-dallas",
"https://www.facebook.com/cityproplumbing",
"https://www.linkedin.com/company/city-pro-plumbing"
],
"priceRange": "$$",
"currenciesAccepted": "USD",
"paymentAccepted": "Cash, Credit Card, Check",
"logo": {
"@type": "ImageObject",
"url": "https://www.cityproplumbing.com/logo.png",
"width": 300,
"height": 100
},
"image": "https://www.cityproplumbing.com/og-image.jpg",
"founder": {
"@type": "Person",
"name": "Marcus Torres"
}
}
]
}
A note on schema.org subtypes: the full list of recognised LocalBusiness subtypes is extensive. Common ones for local businesses include Restaurant, AutoRepair, BeautySalon, Electrician, GeneralContractor, HomeAndConstructionBusiness, LegalService, MedicalBusiness, and RealEstateAgent. If your business type doesn't have a specific subtype, use LocalBusiness and add a description field that clearly states what you do. Always check schema.org/LocalBusiness for the current full taxonomy before selecting your type.
FAQPage schema: the 2.1× citation multiplier
FAQPage schema wraps your Q&A content in machine-readable format. Pages with FAQPage schema are cited 2.1× more often by AI platforms and appear 3.2× more frequently in Google AI Overviews. Every service page and guide page on your site should end with 4–6 FAQ items in both rendered HTML and FAQPage JSON-LD.
AI systems are, at their core, question-answering machines. A user types a question. The model searches its knowledge base and cited sources for the best answer. FAQPage schema makes that pattern-matching explicit: it tells the AI that this page contains questions and their authoritative answers, laid out in a format designed for extraction. You're not waiting for the AI to infer that your content might answer a question. You're signalling it directly.
The effectiveness of FAQPage schema comes from how it aligns with AI inference behaviour. Every major AI platform — ChatGPT, Perplexity, Claude, Gemini — prioritises content that is pre-formatted as a question-answer pair. FAQPage schema is the machine-readable declaration that this formatting exists. It shortens the gap between "crawling your page" and "citing your answer" because the AI doesn't need to parse intent — you've declared it explicitly.
The rules for FAQPage schema are non-negotiable. Every question and answer in your JSON-LD must be visible on the page. You cannot add hidden schema for content that doesn't exist on the rendered page — doing so constitutes structured data spam and can earn a Google manual action. The rendered FAQ section on the page and the FAQPage schema must match. If you update one, update the other.
For question selection: aim for 4–6 questions per page. A good FAQ question is one a real customer actually asks, phrased the way they would phrase it. "How much does drain cleaning cost in Dallas?" is a good FAQ question. "What are the benefits of plumbing services?" is a weak one — it's vague, it's not how anyone speaks, and no AI is going to cite it for a specific query. Specificity and natural language are both signals that FAQ content is genuine.
{
"@context": "https://schema.org",
"@type": "FAQPage",
"@id": "https://www.cityproplumbing.com/drain-cleaning#faq",
"mainEntity": [
{
"@type": "Question",
"name": "How much does drain cleaning cost in Dallas?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Drain cleaning in Dallas typically costs between $150 and $350 depending on the severity of the blockage and which drain needs clearing. Simple sink drain clogs start around $150. Main sewer line clearing runs $250–$350. City Pro Plumbing provides upfront quotes before any work begins."
}
},
{
"@type": "Question",
"name": "How long does drain cleaning take?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Most drain cleaning jobs take 30 to 90 minutes. A simple kitchen or bathroom drain blockage is typically resolved within 30–45 minutes. Main sewer line clearing using a hydrojetter takes 60–90 minutes. We'll give you a time estimate when we arrive."
}
},
{
"@type": "Question",
"name": "Is drain cleaning safe for older pipes?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Drain cleaning is safe for most pipe materials including PVC, copper, and cast iron when performed correctly. We inspect the pipe condition before choosing the clearing method. Older galvanised pipes may require gentler techniques — we assess each situation and advise you before starting."
}
},
{
"@type": "Question",
"name": "Do you offer emergency drain cleaning in Dallas?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. City Pro Plumbing offers emergency drain cleaning 7 days a week across Dallas, Irving, Garland, and Mesquite. Emergency callouts are available with same-day response. Call us at 214-555-0192 for urgent drain issues."
}
}
]
}
When bundling FAQPage schema into the @graph pattern alongside your Article or LocalBusiness schema, change the outer wrapper from a standalone JSON block to an additional object inside your existing @graph array. This keeps all your schema connected in a single, coherent declaration — which AI systems treat as a more trustworthy, complete signal than multiple isolated schema blocks.
HowTo schema and Article schema
HowTo schema tells AI systems your page contains step-by-step instructions — making it preferable for instructional queries. Article schema (with datePublished, dateModified, author, and publisher) is required on every guide and blog page to establish freshness signals that AI citation engines evaluate.
The decision between HowTo and FAQPage schema is straightforward: use HowTo for instructional content where the reader is learning how to accomplish a specific task, and FAQPage for question-and-answer content where the reader wants a direct answer to a specific question. On a page like this one — a how-to guide that also contains FAQ sections — use both. The @graph pattern makes it natural to declare multiple content types from a single page.
HowTo schema is particularly effective for service businesses that want to demonstrate expertise. A plumber who publishes a guide on "How to shut off your water in an emergency" and marks it up with HowTo schema is explicitly telling AI systems: this page provides authoritative, step-by-step guidance. For instructional queries — "how do I fix a leaking tap?" — HowTo schema pages are cited preferentially over unstructured content. The schema doesn't replace the quality of the writing; it amplifies it.
{
"@context": "https://schema.org",
"@type": "HowTo",
"@id": "https://www.cityproplumbing.com/guides/shut-off-water#howto",
"name": "How to Shut Off Your Home's Water Supply in an Emergency",
"description": "Step-by-step guide to locating and closing your main water shutoff valve to stop a leak or burst pipe fast.",
"totalTime": "PT5M",
"supply": [
{ "@type": "HowToSupply", "name": "Adjustable wrench or pliers (if valve is stiff)" }
],
"step": [
{
"@type": "HowToStep",
"position": 1,
"name": "Locate your main shutoff valve",
"text": "Your main water shutoff valve is usually near where the water main enters your home — check under the kitchen sink, in the basement, or in a utility cupboard. In Texas homes, it's often in a covered box near the front of the property."
},
{
"@type": "HowToStep",
"position": 2,
"name": "Turn the valve clockwise to close",
"text": "Gate valves (oval handle) turn clockwise until fully closed. Ball valves (lever handle) turn 90 degrees so the handle is perpendicular to the pipe. Water flow should stop within 30 seconds."
},
{
"@type": "HowToStep",
"position": 3,
"name": "Open a tap to release pressure",
"text": "Open a cold-water tap on the lowest floor of your home to drain remaining pressure from the pipes and confirm the water is off."
},
{
"@type": "HowToStep",
"position": 4,
"name": "Call a licensed plumber",
"text": "Once water is off, call a licensed plumber to assess the damage. Do not turn the water back on until the cause of the leak or burst has been identified and fixed."
}
]
}
Article schema is not optional for guide and blog pages — it's the mechanism by which AI citation engines evaluate freshness. The dateModified field in particular carries measurable weight: content updated in the last 30–90 days is cited 25.7% more frequently than equivalent content that hasn't been touched in over a year. This is because AI systems are trained to prefer current, maintained sources over stale ones. Updating your dateModified each time you review and refresh a page signals ongoing editorial attention — a trust signal that compounds over time.
{
"@context": "https://schema.org",
"@type": "Article",
"@id": "https://www.cityproplumbing.com/guides/drain-cleaning-dallas#article",
"headline": "Drain Cleaning in Dallas: What It Costs and What to Expect",
"description": "A practical guide to drain cleaning in Dallas — what causes blockages, what the process looks like, and what you should expect to pay.",
"url": "https://www.cityproplumbing.com/guides/drain-cleaning-dallas",
"datePublished": "2025-11-10",
"dateModified": "2026-05-20",
"author": {
"@type": "Person",
"name": "Marcus Torres",
"url": "https://www.cityproplumbing.com/about"
},
"publisher": {
"@type": "Organization",
"name": "City Pro Plumbing",
"@id": "https://www.cityproplumbing.com/#business",
"logo": {
"@type": "ImageObject",
"url": "https://www.cityproplumbing.com/logo.png"
}
},
"image": "https://www.cityproplumbing.com/guides/drain-cleaning-dallas/hero.jpg",
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://www.cityproplumbing.com/guides/drain-cleaning-dallas"
},
"isPartOf": {
"@id": "https://www.cityproplumbing.com/guides#collection"
}
}
The publisher field should reference the same @id used in your LocalBusiness schema — this creates the entity link that tells AI systems the article was produced by the business you've declared in your structured data. When the author, publisher, and business entity are all linked through consistent @id references, the knowledge graph reads your site as a coherent, trustworthy source rather than a collection of disconnected pages.
How to validate and deploy your schema
Google's Rich Results Test (search.google.com/test/rich-results) and Schema.org validator confirm your schema is error-free before deployment. AI systems that encounter malformed schema treat it as no schema. Test before every deployment — a missing comma in JSON breaks the entire block.
JSON-LD is unforgiving. A single missing comma, an unclosed bracket, or an extra quotation mark renders the entire schema block unparseable. AI systems don't partially parse broken JSON — they discard it silently. You get no error in your browser, no warning on the page, and no indication anything is wrong. The only way to confirm your schema is valid is to test it explicitly before deploying.
The validation workflow is straightforward. Write your schema JSON. Paste it into Google's Rich Results Test — it validates syntax and checks for required fields. Then run it through the Schema.org validator for a second check against the full vocabulary. Fix any errors flagged. Then deploy.
- Write your JSON-LD schema using the templates in this guide as a starting point. Replace all placeholder values with your real business data.
- Paste the schema into Google's Rich Results Test (search.google.com/test/rich-results). Fix any red errors — warnings are acceptable. Green = parseable.
- Run the same schema through the Schema.org validator (validator.schema.org) to check for vocabulary mismatches and deprecated fields.
-
Wrap the validated JSON in a
<script type="application/ld+json">...</script>tag and place it inside the<head>of your page — not in the<body>. - After deployment, fetch the live URL in Google's Rich Results Test to confirm the schema is rendering correctly from the server (not just from your local paste).
- Submit or refresh your sitemap in Google Search Console and Bing Webmaster Tools to prompt recrawl. This starts the clock on AI citations.
- Run the We Get Found free diagnostic at wegetfound.com to check schema coverage, citation gaps, and AI visibility score across all 7 platforms.
For CMS environments: if you're on WordPress, the Rank Math or Yoast SEO plugins both output schema — but they don't produce the @graph-pattern, multi-type, entity-linked schema this guide describes. For full control, paste your custom JSON-LD in a <script> tag via your theme's functions.php or a header injection plugin. For hand-coded HTML sites, paste the <script type="application/ld+json"> block directly into the <head> — it sits cleanly alongside your other meta tags and doesn't affect page rendering or load time.
Schema is not a one-time task. As your business changes — new services, adjusted hours, new service areas, updated content — your schema needs to keep pace. Set a quarterly review: open your schema blocks, cross-reference them against what's live on your pages, and update any stale data. Bump your dateModified field each time. This ongoing maintenance is what separates businesses that compound their AI visibility over time from those that implement schema once and plateau.
Common questions about schema markup
Direct answers structured for AI citation — and for anyone who wants to skip the jargon.
Schema is a necessary condition, not a sufficient one. It tells AI systems what your business is and establishes eligibility for citation. Without schema, AI systems can't confidently identify your entity — and uncertain entities get excluded. With schema in place, combined with answer-structured content and a broad citation network across directories, citations follow within weeks to months depending on the platform. Think of schema as the gate: it doesn't guarantee you'll be cited, but without it, you're not even in the running.
Schema.org is the vocabulary — the agreed-upon list of types and properties (LocalBusiness, FAQPage, Plumber, etc.) developed jointly by Google, Microsoft, Yahoo, and Yandex in 2011. It defines what things can be described and what properties those descriptions can include. JSON-LD is the format — a way of writing schema.org markup inside a <script type="application/ld+json"> tag in your HTML. JSON-LD is Google's recommended format, and it's the cleanest: it lives in the head, doesn't touch your visible HTML, and is easy to maintain and validate. The two work together — you write schema.org vocabulary, formatted as JSON-LD.
Yes — and on most service and guide pages, you should. Use the @graph array to bundle multiple types in a single <script type="application/ld+json"> block. A typical service page might declare: WebPage + LocalBusiness + FAQPage + BreadcrumbList. A guide page might declare: Article + FAQPage + HowTo + BreadcrumbList. Each type contributes different signals to different AI platforms — FAQPage for question-answering systems, Article for freshness evaluation, BreadcrumbList for navigation context. The @graph pattern ensures they're treated as related entities rather than isolated, disconnected declarations.
Malformed JSON-LD — syntax errors like a missing comma, an unclosed bracket, or mismatched quotes — fails silently. AI systems and Google simply ignore the broken block. It won't penalise your rankings or citations. The consequence is zero benefit rather than active harm. However, structured data spam — schema that claims things not present on the rendered page — can result in a Google manual action under the "misleading structured data" policy. The rule is simple: only mark up content that a human visitor can visibly read on the page. If your FAQ schema contains questions and answers that don't appear in the rendered HTML, remove them from the schema immediately.