Programmatic SEO Case Study

Awesome Backyard

My family's tent and party rental company in New Jersey, and the place I learned programmatic SEO by doing it. One template, a list of locations, and the internal linking that decides whether any of it gets found.

Awesome Backyard Parties is an event vendor marketplace connecting homeowners planning backyard parties with local rental vendors — tents, tables, bounce houses, and more.

How it is built

1
page template
1
list of locations
0
pages linked by hand

Technical Architecture

Database: Supabase

Built on PostgreSQL with pgvector extension for semantic search capabilities.

-- Example: Products table with vector embeddings
CREATE TABLE products (
  id UUID PRIMARY KEY,
  name TEXT,
  category TEXT,
  location GEOGRAPHY(POINT),
  embedding VECTOR(1536)
);

-- Enable pgvector for similarity search
CREATE INDEX ON products
USING ivfflat (embedding vector_cosine_ops);

Frontend: Next.js 14 (App Router)

Renders on the server so the page is there when a crawler asks and Static Site Generation (SSG) for performance.

  • Dynamic route generation for 1000+ equipment pages
  • Automatic metadata optimization per location
  • Image optimization with Next.js Image component
  • Incremental Static Regeneration (ISR) for real-time updates

Internal Linking Lattice

The system uses the Haversine formula in PostgreSQL to calculate geographic proximity and automatically generate contextual internal links.

How It Works:

  1. Every city page stores latitude/longitude coordinates
  2. Haversine formula calculates distance between cities in real-time
  3. System identifies the 5 nearest cities dynamically
  4. Related equipment pages are cross-linked automatically
  5. Links update on their own when a location gets added
-- Haversine formula in PostgreSQL
SELECT
  city_name,
  ( 6371 * acos(
      cos(radians($1)) *
      cos(radians(latitude)) *
      cos(radians(longitude) - radians($2)) +
      sin(radians($1)) *
      sin(radians(latitude))
    )
  ) AS distance_km
FROM cities
ORDER BY distance_km
LIMIT 5;

Architecture Flow

1

Data Ingestion

Product data + location coordinates stored in Supabase PostgreSQL

2

Route Generation

Next.js dynamically generates pages for each product × city combination

3

Link Calculation

Haversine formula identifies 5 nearest cities at build time

4

SEO Optimization

Metadata, schema markup, and internal links auto-generated per page

5

Continuous Updates

Pages rebuild when the data changes, with no deploy

Why it is built this way

Hiring it out means 50 writers producing city pages by hand, linking them by hand, and checking them by hand. Every new town costs the same as the last one.

Building it once means a template, a data source and linking that updates itself. A new town costs almost nothing, and that is the only real difference.

Result:

95% reduction in content production cost. 100% consistency. Infinite scalability.

A person writes a better page than my template does. The template just does not get tired on page four hundred, and that is the whole trade.

If you want to try this

This works anywhere the pages vary by something you already have a list of, usually a place or a product.