Schema.org JSON-LD That Actually Helps Local SEO (2026 Guide)

Schema.org JSON-LD does not rank you. It tells Google and AI systems what your business is, where you serve, and when you're open, matching your visible page. Get LocalBusiness right first, keep hours and service areas accurate, and you become eligible for local panels and rich results.
Part of the complete SEO guide.
On this page
- What schema does and doesn’t do
- Start with LocalBusiness, done properly
- Organization vs LocalBusiness: pick one, don’t stack
- FAQPage: use it honestly
- Breadcrumbs and Article markup
- How to test it
- Where schema fits in the bigger picture
- FAQ
- Does schema markup improve my rankings?
- Can I use a plugin to generate JSON-LD automatically?
- Do I still need FAQ markup in 2026?
Most schema advice online is a list of types to paste into your site with no explanation of why. That’s how you end up with markup that contradicts your page content and gets ignored. Here’s what schema actually does for local search, which types are worth your time in 2026, and the code I use on client sites.
Short version: schema doesn’t rank you. It helps Google and AI systems understand your business, and it makes you eligible for rich results. Accurate markup can win you a click. Sloppy markup does nothing, or worse, gets your structured data flagged as spam.
What schema does and doesn’t do
Structured data is a machine-readable description of what’s already on your page. Google’s documentation is blunt about this: markup that doesn’t reflect visible content is a violation. So the first rule is boring. If your JSON-LD says you’re open until 9pm but the page says 6pm, you have a problem, not a feature.
What it can get you:
- Local business panels with hours, phone, and services pulled correctly
- FAQ and HowTo rich results where Google still shows them
- Breadcrumb trails in the SERP instead of raw URLs
- Better entity understanding, which matters more now that AI answers summarize local businesses
- Product and review snippets if you sell things
What it won’t do: fix thin content, replace a Google Business Profile, or outrank a competitor with better reviews and more relevant pages. Treat it as plumbing, not as marketing.
Start with LocalBusiness, done properly
For a local service business, this is the one that matters most. Use the most specific subtype you can (ProfessionalService, HomeAndConstructionBusiness, LegalService, etc.) rather than the generic LocalBusiness. Here’s a realistic example for a contractor on Long Island:
{
"@context": "https://schema.org",
"@type": "HomeAndConstructionBusiness",
"@id": "https://example.com/#business",
"name": "Example Roofing Co",
"url": "https://example.com",
"telephone": "+1-631-555-0100",
"image": "https://example.com/img/storefront.jpg",
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "120 Main St",
"addressLocality": "Commack",
"addressRegion": "NY",
"postalCode": "11725",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 40.8429,
"longitude": -73.2926
},
"areaServed": [
{ "@type": "City", "name": "Commack" },
{ "@type": "City", "name": "Hauppauge" },
{ "@type": "City", "name": "Smithtown" }
],
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "08:00",
"closes": "17:00"
}
],
"sameAs": [
"https://www.google.com/maps/place/...",
"https://www.facebook.com/..."
]
}
A few notes that trip people up:
@idgives the business a stable identity. If you reference it elsewhere on the site, use the same ID so Google connects the dots instead of guessing.areaServedis where you legitimately work, not a keyword list. Listing 40 towns you don’t serve is the kind of thing that looks like spam.sameAsshould point to profiles that actually exist and match your name, address, and phone. Consistency across your site, Google Business Profile, and directories is what actually moves the needle.- Don’t stuff keywords into
name. “Example Roofing Co” is correct. “Example Roofing Co | Best Roofer Commack NY” is not.
Organization vs LocalBusiness: pick one, don’t stack
A common mistake is putting both Organization and LocalBusiness on the same page as separate entities. For a single-location business, use one. If you’re a larger brand with a storefront, you can use Organization on the homepage and reference the LocalBusiness node by @id from location pages. Keeping the graph clean is half the battle. This is the kind of thing that separates a site that’s put together carefully from one that was assembled from a plugin’s defaults, and it’s a big part of how I approach custom web development for local businesses.
FAQPage: use it honestly
Google cut back FAQ rich results in 2023, so you won’t see the accordion in the SERP for most sites anymore. That doesn’t make the markup useless. It still helps search engines and AI systems parse your Q&A content. Just don’t add it to pages that don’t visibly show the questions and answers.
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "How much does a roof replacement cost on Long Island?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Most asphalt shingle replacements in Suffolk County run $12,000 to $25,000 depending on square footage, pitch, and whether decking needs repair."
}
}
]
}
If you write the answer, put it on the page. The markup and the visible text need to match, or you’re gambling.
Breadcrumbs and Article markup
Breadcrumb markup is low effort and still shows in results. If your site has categories, add it:
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://example.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Services",
"item": "https://example.com/services/"
}
]
}
For blog posts, Article or BlogPosting with an accurate author, datePublished, and dateModified is worth having. The dateModified field is the honest one. If you actually update a post, bump it. Don’t fake it to look fresh, because that’s easy to spot and cheapens everything else you claim.
How to test it
Validate before you ship. Google’s Rich Results Test tells you what’s eligible and what’s broken. The Schema Markup Validator at validator.schema.org checks the raw graph. Browser dev tools are not a validator, and “it looks fine in the source” is not a test.
Two things people skip:
- Check for duplicate entities. If your theme and a plugin both inject LocalBusiness markup, you have two competing nodes. Disable one.
- Check that your NAP (name, address, phone) in the markup matches your Google Business Profile character for character. Mismatches confuse the entity and waste the effort.
Where schema fits in the bigger picture
Schema is one layer. It sits on top of a fast, crawlable site with clear page structure and content that answers real questions. If those aren’t in place, no amount of JSON-LD will save you. If they are, schema makes you easier to understand and occasionally earns you a richer result. That’s the whole value proposition, and it’s worth doing right.
I spend a lot of time on this kind of detail for local businesses across Commack and the rest of Long Island, mostly as part of broader Long Island SEO work. The technical side is unglamorous, but it’s the part that compounds.
FAQ
Does schema markup improve my rankings?
Not directly. It helps search engines understand your business and can make you eligible for rich results, which can improve click-through rate. It won’t fix weak content or a slow site.
Can I use a plugin to generate JSON-LD automatically?
You can, and for simple sites it’s often fine. The problem is that auto-generated markup frequently contradicts the page, duplicates entities, or lists services you don’t offer. Always validate the output and check for conflicts between plugins and your theme.
Do I still need FAQ markup in 2026?
Yes, though not for the reason most people think. Google shows fewer FAQ rich results now, but the markup still helps search and AI systems parse your Q&A content. Just make sure the questions and answers are visible on the page, not hidden in the code.


