Claude-skills seo-local-business
Generate complete SEO setup for local business websites — HTML head tags, JSON-LD LocalBusiness schema, robots.txt, sitemap.xml. Australian-optimised with +61 phone, ABN, suburb patterns.
git clone https://github.com/jezweb/claude-skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/jezweb/claude-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/plugins/web-design/skills/seo-local-business" ~/.claude/skills/jezweb-claude-skills-seo-local-business && rm -rf "$T"
plugins/web-design/skills/seo-local-business/SKILL.mdSEO Local Business
Generate a complete SEO package for local business websites. Produces meta tags, structured data, robots.txt, and sitemap.xml.
What You Produce
- Complete
section with meta tags, Open Graph, Twitter Cards<head> - JSON-LD structured data (LocalBusiness + Service + FAQ schemas)
robots.txtsitemap.xml
Workflow
Step 1: Gather Business Info
Ask for (or extract from existing site):
| Required | Optional |
|---|---|
| Business name | ABN |
| Primary service | Opening hours |
| Location (city/suburb) | Social media URLs |
| Phone number | Price range |
| Website URL | Service areas (suburbs) |
| Business description | GPS coordinates |
Step 2: Generate Head Tags
Fill placeholders in this template:
<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- Primary Meta Tags --> <title>{{PAGE_TITLE}} | {{BUSINESS_NAME}}</title> <meta name="title" content="{{PAGE_TITLE}} | {{BUSINESS_NAME}}"> <meta name="description" content="{{META_DESCRIPTION}}"> <!-- Canonical URL --> <link rel="canonical" href="{{CANONICAL_URL}}"> <!-- Open Graph / Facebook --> <meta property="og:type" content="website"> <meta property="og:url" content="{{CANONICAL_URL}}"> <meta property="og:title" content="{{PAGE_TITLE}} | {{BUSINESS_NAME}}"> <meta property="og:description" content="{{META_DESCRIPTION}}"> <meta property="og:image" content="{{OG_IMAGE_URL}}"> <!-- Twitter --> <meta property="twitter:card" content="summary_large_image"> <meta property="twitter:url" content="{{CANONICAL_URL}}"> <meta property="twitter:title" content="{{PAGE_TITLE}} | {{BUSINESS_NAME}}"> <meta property="twitter:description" content="{{META_DESCRIPTION}}"> <meta property="twitter:image" content="{{OG_IMAGE_URL}}"> <!-- Geo Tags (Local SEO) --> <meta name="geo.region" content="{{GEO_REGION}}"> <meta name="geo.placename" content="{{CITY}}"> <meta name="geo.position" content="{{LATITUDE}};{{LONGITUDE}}"> <meta name="ICBM" content="{{LATITUDE}}, {{LONGITUDE}}"> <!-- Favicons --> <link rel="icon" type="image/svg+xml" href="favicon.svg"> <link rel="icon" type="image/png" sizes="32x32" href="favicon-32.png"> <link rel="apple-touch-icon" href="apple-touch-icon.png"> <!-- Structured Data --> <script type="application/ld+json"> {{JSON_LD_SCHEMA}} </script> </head>
Title tag patterns (50-60 chars max):
| Page | Pattern | Example |
|---|---|---|
| Homepage | | |
| Service | | |
| About | | |
| Contact | | |
Meta description patterns (150-160 chars):
| Page | Pattern |
|---|---|
| Homepage | |
| Service | |
| About | |
| Contact | |
Step 3: Generate Structured Data
LocalBusiness (homepage — always include):
Use
LocalBusiness or a more specific subtype:
| Subtype | Use for |
|---|---|
| Plumbing services |
| Electrical services |
| Roofing |
| Air conditioning/heating |
| Mechanics |
| Hair/beauty |
| Dental practices |
| Law firms |
| Accountants |
| Real estate |
| Restaurants/cafes |
| Pubs/bars |
| Accommodation |
| Retail shops |
| Generic professional |
LocalBusiness schema properties:
| Property | Required | Notes |
|---|---|---|
| Yes | or subtype from above |
| Yes | Business name as shown to customers |
| Yes | Primary business image or logo |
| Yes | 1-2 sentence business description |
| Yes | Unique ID, use |
| Yes | Website homepage URL |
| Yes | International format: |
| Yes | PostalAddress (see below) |
| Recommended | Primary contact email |
| Recommended | to |
| Recommended | GeoCoordinates: latitude/longitude |
| Recommended | See hours format below |
| Recommended | Cities/suburbs served |
| Recommended | Social media profile URLs |
| Optional | ABN for Australian businesses |
| Optional | Business logo URL |
| Optional | ISO 8601 date |
| Optional | e.g. "Cash, Credit Card, EFTPOS" |
| Optional | |
PostalAddress:
| Property | Example |
|---|---|
| |
| |
| |
| |
| |
Example:
{ "@context": "https://schema.org", "@type": "LocalBusiness", "name": "ABC Plumbing Newcastle", "image": "https://www.abcplumbing.com.au/og-image.jpg", "description": "Professional plumbing services in Newcastle and Lake Macquarie.", "@id": "https://www.abcplumbing.com.au/#organization", "url": "https://www.abcplumbing.com.au", "telephone": "+61-2-4900-1234", "email": "info@abcplumbing.com.au", "priceRange": "$$", "address": { "@type": "PostalAddress", "streetAddress": "123 Hunter Street", "addressLocality": "Newcastle", "addressRegion": "NSW", "postalCode": "2300", "addressCountry": "AU" }, "geo": { "@type": "GeoCoordinates", "latitude": -32.9283, "longitude": 151.7817 }, "openingHoursSpecification": [ { "@type": "OpeningHoursSpecification", "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], "opens": "07:00", "closes": "17:00" }, { "@type": "OpeningHoursSpecification", "dayOfWeek": ["Saturday"], "opens": "08:00", "closes": "12:00" } ], "areaServed": [ { "@type": "City", "name": "Newcastle" }, { "@type": "City", "name": "Lake Macquarie" } ], "sameAs": [ "https://www.facebook.com/abcplumbing", "https://www.instagram.com/abcplumbing" ] }
Service (service pages — add per service):
| Property | Required | Notes |
|---|---|---|
| Yes | Service name |
| Yes | What the service provides |
| Yes | |
| Recommended | City or region |
| Recommended | Category of service |
| Optional | Pricing/availability |
{ "@context": "https://schema.org", "@type": "Service", "name": "Hot Water System Installation", "description": "Professional hot water system installation and replacement in Newcastle.", "provider": { "@id": "https://www.abcplumbing.com.au/#organization" }, "areaServed": { "@type": "City", "name": "Newcastle" }, "serviceType": "Plumbing", "offers": { "@type": "Offer", "availability": "https://schema.org/InStock", "priceRange": "$$" } }
FAQ (pages with FAQ sections):
{ "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "How much does a plumber cost in Newcastle?", "acceptedAnswer": { "@type": "Answer", "text": "Plumber callout fees in Newcastle typically range from $80-150." } } ] }
Step 4: Generate robots.txt and sitemap.xml
robots.txt:
User-agent: * Allow: / Sitemap: {{SITE_URL}}/sitemap.xml
sitemap.xml:
<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>{{SITE_URL}}/</loc> <lastmod>{{DATE}}</lastmod> <changefreq>weekly</changefreq> <priority>1.0</priority> </url> <!-- Add one <url> per page. Priority: 1.0 homepage, 0.8 services, 0.6 others --> </urlset>
Step 5: Validate
Test structured data at: https://validator.schema.org/
Common validation errors:
- Missing
— every JSON-LD block needs it@context - Wrong phone format — must be international (
)+61-... - Missing
— needed for cross-referencing between schemas@id - Empty
— include at least one cityareaServed
Australian-Specific Patterns
Phone Numbers
<!-- Link: international format. Display: local format. --> <a href="tel:+61249001234">(02) 4900 1234</a>
Schema telephone:
"+61-2-4900-1234"
| Prefix | International |
|---|---|
| 02 | +612 |
| 04 | +614 |
| 1300 | Keep as-is |
ABN
Add to LocalBusiness schema when available:
{ "taxID": "12 345 678 901" }
Australian State Codes
| State | Code | Geo Region |
|---|---|---|
| New South Wales | NSW | AU-NSW |
| Victoria | VIC | AU-VIC |
| Queensland | QLD | AU-QLD |
| South Australia | SA | AU-SA |
| Western Australia | WA | AU-WA |
| Tasmania | TAS | AU-TAS |
| Northern Territory | NT | AU-NT |
| ACT | ACT | AU-ACT |
Service Areas
Use
areaServed with Australian city and suburb names (see LocalBusiness example above).