The Four Schema Types Every Local Business Needs
LocalBusiness Schema
The foundation. Declare the business name, address (or service area designation), phone number, URL, primary business type, and geographic coordinates. Use the most specific available schema type, "RoofingContractor" rather than "LocalBusiness" if a specific type exists for your category.
{
"@context": "https://schema.org",
"@type": "RoofingContractor",
"name": "Example Roofing Company",
"url": "https://example.com",
"telephone": "+1-555-555-5555",
"areaServed": {
"@type": "City",
"name": "Dallas"
},
"priceRange": "$$"
}Service Schema
One block per service page, declaring the service name, description, and provider entity. Links each service page to the parent business entity.
{
"@type": "Service",
"name": "Asphalt Shingle Roofing Installation",
"description": "Complete asphalt shingle roofing installation for residential properties in the Dallas metro area.",
"provider": {
"@id": "https://example.com/#business"
}
}FAQPage Schema
Applied to every page with a FAQ section. Enables the page to appear in rich FAQ snippets in search results and provides structured Q&A content for AI Overview citation.
{
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "How long does a roof replacement take?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Most residential roof replacements take one to two days depending on roof size, pitch, and materials. We schedule replacements around confirmed clear weather windows."
}
}
]
}Speakable Schema
Marks specific content sections as optimized for voice and AI citation. Applied to the AEO nugget and headline on every page.
{
"@type": "Speakable",
"cssSelector": [".aeo-nugget", "h1"]
}Stacking Schema in a Single @graph Block
The most efficient implementation wraps all schema types for a page into a single @graph array. This tells Google's parser that all entities on the page are related, reducing the likelihood of misattribution.
{
"@context": "https://schema.org",
"@graph": [
{ "@type": "RoofingContractor", "@id": "https://example.com/#business", "..." },
{ "@type": "WebPage", "@id": "https://example.com/asphalt-shingle-roofing/#page", "..." },
{ "@type": "Service", "..." },
{ "@type": "FAQPage", "..." },
{ "@type": "Speakable", "..." }
]
}Validation and Testing
Every schema implementation must be validated before publishing. Use Google's Rich Results Test (search.google.com/test/rich-results) to confirm schema is parsed correctly. Schema errors, missing required properties, invalid types, malformed JSON, prevent rich result eligibility and may be ignored by the crawler entirely.
Common validation errors: missing required properties (name, url on LocalBusiness), JSON formatting errors (trailing commas, unclosed brackets), using a schema type that does not exist in schema.org's vocabulary.
Frequently Asked Questions
Schema markup is a supporting signal, not a primary ranking factor. Its direct effects are on rich result eligibility, entity association between the website and GBP listing, and AI Overview citation probability. Indirectly, cleaner entity signals improve the confidence with which Google associates the website with the correct business entity, which supports Map Pack ranking.
WebPage schema should be on every page. LocalBusiness schema should appear on the homepage. Service schema should be on every service page. FAQPage schema should be on every page with FAQ content. Speakable schema should be on every content page including blog posts. BreadcrumbList should be on all pages below the homepage.
Yes, with caveats. Plugins like Rank Math and Yoast generate schema automatically based on page settings. They handle common types well but often miss Speakable schema and advanced stacking patterns. For full control, including @graph stacking and Speakable, manually coded JSON-LD placed in the page head is more reliable than plugin output alone.
SEO Local