From local-seo-skills
Generates Schema.org LocalBusiness JSON-LD structured data for websites, including address, geo coordinates, hours, areas served, ratings, and services to match Google Business Profile data.
How this skill is triggered — by the user, by Claude, or both
Slash command
/local-seo-skills:local-schemaThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are an expert in implementing structured data for local businesses. Your goal is to correctly implement LocalBusiness schema that reinforces GBP data and improves local search visibility.
You are an expert in implementing structured data for local businesses. Your goal is to correctly implement LocalBusiness schema that reinforces GBP data and improves local search visibility.
Schema on your website must match your GBP data exactly. Mismatches create conflicting signals. The schema is your website confirming what GBP says about your business.
{
"@context": "https://schema.org",
"@type": "Plumber",
"@id": "https://example.com/#business",
"name": "Smith Plumbing",
"image": "https://example.com/images/logo.png",
"url": "https://example.com",
"telephone": "+17165550100",
"email": "[email protected]",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Main St, Suite 200",
"addressLocality": "Buffalo",
"addressRegion": "NY",
"postalCode": "14201",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": "42.8864",
"longitude": "-78.8784"
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "08:00",
"closes": "17:00"
}
],
"areaServed": [
{ "@type": "City", "name": "Buffalo", "sameAs": "https://en.wikipedia.org/wiki/Buffalo,_New_York" },
{ "@type": "City", "name": "Orchard Park" },
{ "@type": "City", "name": "Hamburg" }
],
"priceRange": "$$",
"sameAs": [
"https://www.facebook.com/smithplumbing",
"https://www.yelp.com/biz/smith-plumbing-buffalo"
],
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"reviewCount": "142"
},
"hasOfferCatalog": {
"@type": "OfferCatalog",
"name": "Plumbing Services",
"itemListElement": [
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "Emergency Plumbing",
"description": "24/7 emergency plumbing repair"
}
}
]
}
}
Use the most specific LocalBusiness subtype:
| Business Type | Schema @type |
|---|---|
| General business | LocalBusiness |
| Plumber | Plumber |
| Electrician | Electrician |
| HVAC | HVACBusiness |
| Dentist | Dentist |
| Restaurant | Restaurant |
| Auto repair | AutoRepair |
| Attorney | Attorney |
| Real estate agent | RealEstateAgent |
| Hair salon | HairSalon |
| Medical practice | MedicalBusiness |
Full list: https://schema.org/LocalBusiness (check subtypes)
Each location needs its own schema with a unique @id:
{
"@type": "Plumber",
"@id": "https://example.com/locations/buffalo-ny/#business",
"name": "Smith Plumbing - Buffalo",
"url": "https://example.com/locations/buffalo-ny/",
...
}
On the homepage, reference all locations:
{
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "Smith Plumbing",
"department": [
{ "@id": "https://example.com/locations/buffalo-ny/#business" },
{ "@id": "https://example.com/locations/orchard-park-ny/#business" }
]
}
For businesses without a public address, omit address and emphasize areaServed:
{
"@type": "Plumber",
"name": "Smith Plumbing",
"areaServed": [
{ "@type": "City", "name": "Buffalo, NY" },
{ "@type": "City", "name": "Orchard Park, NY" },
{ "@type": "State", "name": "New York" }
],
"telephone": "+17165550100",
"url": "https://example.com"
}
document.querySelectorAll('script[type="application/ld+json"]')address format doesn't match GBPgeo coordinates@type (too generic)telephone missing country codeopeningHoursSpecification doesn't match actual hours@id across pages⚠️ Detection limitation: web_fetch and curl strip <script> tags. Many CMS plugins inject JSON-LD via JavaScript. Always use Rich Results Test or browser tools to verify schema exists.
| What You Found | Next Action | Skill |
|---|---|---|
| Schema implemented, need to verify GBP matches | Audit GBP to ensure all data aligns exactly with schema | gbp-optimization |
| Need schema on multiple location pages | Build schema per page with location-specific data | local-landing-pages |
| Schema is part of a broader audit | Feed schema findings into the full audit report | local-seo-audit |
| Schema added but rankings unchanged | Schema alone rarely moves rankings — it reinforces other signals. Check if the real issue is elsewhere | geogrid-analysis |
Default next step: After implementing schema, validate with Google's Rich Results Test, then monitor Search Console for structured data errors over the next 2 weeks.
See docs/tool-routing to pick based on what's connected.
npx claudepluginhub garrettjsmith/localseoskills --plugin local-seo-skillsGenerates, audits, and validates JSON-LD structured data for a single page or file. Supports common Schema.org types (Article, Product, FAQ, LocalBusiness, etc.) for rich-snippet eligibility and AI extraction.
Generates SEO setup for Australian local business sites: HTML head with meta/OG/Twitter/geo tags, JSON-LD LocalBusiness schema, robots.txt, sitemap.xml.
Detects, validates, and generates Schema.org structured data (JSON-LD). Activates on /seo-schema or when users mention schema, structured data, rich results, JSON-LD, or markup.