Local SEO — built to be found, not just reviewed
For a storefront, a restaurant, or a listing site, being discoverable IS the product. SEO
designed in is cheap; SEO retrofitted is a rebuild. Build these signals from the first page.
1. Structured data (schema.org) — the biggest local lever
Emit JSON-LD matching the entity, validated against Google's Rich Results requirements:
- LocalBusiness (+ the specific subtype: Restaurant, HomeAndConstructionBusiness,
RealEstateAgent) — name, address (PostalAddress), geo, telephone, openingHours, priceRange,
url, sameAs (social). This is the single highest-impact local SEO signal.
- Product + Offer (storefront) — name, image, price, availability, aggregateRating.
- Menu / MenuItem (restaurant online-ordering).
- RealEstateListing / Residence (listings) — price, address, floorSize, numberOfRooms.
- BreadcrumbList on every deep page; FAQPage where there's Q&A.
Validate every type with the Rich Results test before shipping; invalid JSON-LD earns nothing.
2. NAP consistency + Google Business Profile alignment
Name / Address / Phone must be byte-identical across the site, the LocalBusiness JSON-LD,
and the Google Business Profile. Inconsistent NAP fractures local ranking. State the canonical
NAP once and reuse it.
3. Core Web Vitals are a ranking input (not just perf)
LCP / INP / CLS feed search ranking for these pages. Coordinate with performance-engineer,
but the SEO-driven minimums: optimized responsive images (AVIF/WebP + srcset — see
media-pipeline-engineer), no layout shift on load (sized media), fast TTFB. A slow local
page loses to a fast competitor regardless of content.
4. Crawl + index hygiene
- sitemap.xml auto-generated from the catalog/listings, with
lastmod; submitted.
- robots.txt allows indexable pages, blocks app/admin/checkout-internal.
- Canonical on every page (self or the preferred variant) — kills duplicate-content loss
from filters/pagination/UTM.
- noindex authenticated + thin/internal pages explicitly.
- Clean, stable, keyword-relevant URLs (
/menu/margherita, not /p?id=8842).
5. On-page + content signals
- One
<h1> per page; descriptive <title> + meta description per page (templated from the
entity, not duplicated site-wide).
- Descriptive
alt text on every image (a11y AND image search).
- Internal linking between related entities (product↔category, listing↔neighborhood).
- Location pages for multi-location businesses (one indexable page per location, unique content).
6. Syndication (where the product distributes)
For listings/storefronts that syndicate (MLS/IDX, Google Shopping, marketplaces), the
canonical lives on our page; syndicated copies point back. Define the feed format +
update cadence (coordinate the source-of-truth with integrations-engineer).
Output
When applied, contribute an SEO section to the architecture/design doc and a checklist
the senior-dev build satisfies:
## SEO
- schema.org types: <LocalBusiness subtype + Product/Menu/Listing> · JSON-LD validated
- canonical NAP: <name/address/phone> (identical in JSON-LD + GBP)
- CWV minimums: LCP/INP/CLS targets (with performance-engineer)
- crawl: sitemap.xml (lastmod) · robots.txt · canonical on all · noindex app/admin
- on-page: 1×h1, per-page title/meta, alt text, clean URLs
- syndication (if any): canonical = our page; feed = <format/cadence>
1---2name: local-seo-23description: Local-business SEO and structured-data framework for content-platform Product-Builder products that need to be found (storefronts, restaurant online-ordering, real-estate listings, service-business sites). Codifies schema.org structured data (LocalBusiness/Product/Menu/RealEstateListing), Core Web Vitals as a ranking input, local on-page signals (NAP consistency, Google Business Profile alignment), sitemap/robots/canonical hygiene, and listing syndication. Applied by senior-dev when building public pages and checked by cms-reviewer. cms-reviewer reviews SEO; this skill is how you BUILD it right the first time.4---5
6# Local SEO — built to be found, not just reviewed
7
8For a storefront, a restaurant, or a listing site, being discoverable IS the product. SEO
9designed in is cheap; SEO retrofitted is a rebuild. Build these signals from the first page.
10
11## 1. Structured data (schema.org) — the biggest local lever
12
13Emit JSON-LD matching the entity, validated against Google's Rich Results requirements:
14
15- **LocalBusiness** (+ the specific subtype: Restaurant, HomeAndConstructionBusiness,
16 RealEstateAgent) — name, address (PostalAddress), geo, telephone, openingHours, priceRange,
17 url, sameAs (social). This is the single highest-impact local SEO signal.
18- **Product** + **Offer** (storefront) — name, image, price, availability, aggregateRating.
19- **Menu** / **MenuItem** (restaurant online-ordering).
20- **RealEstateListing** / **Residence** (listings) — price, address, floorSize, numberOfRooms.
21- **BreadcrumbList** on every deep page; **FAQPage** where there's Q&A.
22
23Validate every type with the Rich Results test before shipping; invalid JSON-LD earns nothing.
24
25## 2. NAP consistency + Google Business Profile alignment
26
27Name / Address / Phone must be **byte-identical** across the site, the LocalBusiness JSON-LD,
28and the Google Business Profile. Inconsistent NAP fractures local ranking. State the canonical
29NAP once and reuse it.
30
31## 3. Core Web Vitals are a ranking input (not just perf)
32
33LCP / INP / CLS feed search ranking for these pages. Coordinate with performance-engineer,
34but the SEO-driven minimums: optimized responsive images (AVIF/WebP + srcset — see
35`media-pipeline-engineer`), no layout shift on load (sized media), fast TTFB. A slow local
36page loses to a fast competitor regardless of content.
37
38## 4. Crawl + index hygiene
39
40- **sitemap.xml** auto-generated from the catalog/listings, with `lastmod`; submitted.
41- **robots.txt** allows indexable pages, blocks app/admin/checkout-internal.
42- **Canonical** on every page (self or the preferred variant) — kills duplicate-content loss
43 from filters/pagination/UTM.
44- **noindex** authenticated + thin/internal pages explicitly.
45- Clean, stable, keyword-relevant URLs (`/menu/margherita`, not `/p?id=8842`).
46
47## 5. On-page + content signals
48
49- One `<h1>` per page; descriptive `<title>` + meta description per page (templated from the
50 entity, not duplicated site-wide).
51- Descriptive `alt` text on every image (a11y AND image search).
52- Internal linking between related entities (product↔category, listing↔neighborhood).
53- Location pages for multi-location businesses (one indexable page per location, unique content).
54
55## 6. Syndication (where the product distributes)
56
57For listings/storefronts that syndicate (MLS/IDX, Google Shopping, marketplaces), the
58canonical lives on **our** page; syndicated copies point back. Define the feed format +
59update cadence (coordinate the source-of-truth with integrations-engineer).
60
61## Output
62
63When applied, contribute an **SEO** section to the architecture/design doc and a checklist
64the senior-dev build satisfies:
65
66```
67## SEO
68- schema.org types: <LocalBusiness subtype + Product/Menu/Listing> · JSON-LD validated
69- canonical NAP: <name/address/phone> (identical in JSON-LD + GBP)
70- CWV minimums: LCP/INP/CLS targets (with performance-engineer)
71- crawl: sitemap.xml (lastmod) · robots.txt · canonical on all · noindex app/admin
72- on-page: 1×h1, per-page title/meta, alt text, clean URLs
73- syndication (if any): canonical = our page; feed = <format/cadence>
74```