Every suburb in Sydney is a potential customer. But creating unique, valuable content for hundreds of locations manually? Impossible. We needed a system that scales.
790 Pages. Each One Unique.
Every Sydney suburb is a potential customer. We built a system that generates unique, valuable content for each location—without templates, without thin content, without penalties.
Someone searching "web design Parramatta" or "SEO services Bondi" should find us. But creating unique, valuable content for hundreds of locations manually? Impossible. And simple templates like "We offer [service] in [location]" get penalized by Google.
We needed a system that could generate 500+ location pages with genuinely unique content, proper SEO, and maintainable code. Here's how we built it.
The Goal
Local SEO at Scale
Every Sydney suburb is a potential customer, but manual content creation is impossible
AI-generated unique content for 790 pages that passes Google's quality guidelines

The Math
79 Sydney suburbs × 9 services = 711 service-location pages + 79 standalone location pages
The Scale

What Google Penalizes
Before building, we had to understand what Google explicitly penalizes: "doorway pages."
Doorway Pages (BAD)
"Sites or pages created to rank for specific, similar search queries" — Google
"We offer web design in Parramatta. Contact us for web design in Parramatta today!"
"We offer web design in Bondi. Contact us for web design in Bondi today!"
"We offer web design in Chatswood. Contact us for web design in Chatswood today!"
This is thin content. Google sees through it. Users bounce. Rankings tank.
What Google WANTS
- Unique, helpful content for each location
- Local relevance — content that relates to the specific area
- User value — information that helps someone in that location
- Minimum 800-1200 words of unique content per page
Google's Warning
Doorway Pages = Penalty
Google explicitly penalizes 'doorway pages' - thin content pages that exist only to rank for location keywords. We needed genuinely useful content.

The challenge: create 790 pages that each have 800+ words of genuinely unique content, without manually writing 632,000 words. AI-generated content was the only viable solution.
Content Generation Strategy
The seed script contains detailed insights for major cities that feed into content generation:
Sydney CBD
Australia's largest business hub with 500,000+ registered businesses
Parramatta
Western Sydney's CBD, gateway to 2.5 million residents
Newcastle
Hunter Region's economic center, diversifying beyond mining
Canberra
Government hub with unique B2G opportunities
Each service has its own content generator that creates unique paragraphs based on location attributes:
Content Strategy
What Makes Each Page Unique
- 1
City-specific business insights
- 2
Local market challenges
- 3
Industry presence data
- 4
Service-specific benefits
- 5
800+ words per page

Service-Specific Content Generators
Web Design
Local business needs, mobile-first, conversion focus
SEO
Local search optimization, Google Business Profile
Google Ads
Geographic targeting, local competition analysis
The content generators use city-specific data (business environment, digital landscape, local challenges, opportunities, industries) to create paragraphs that actually make sense for each location. Not templates—genuinely contextual content.
Database Architecture
Two Tables Drive Everything
locations
• slug, name, state, region
• description (AI-generated)
• population, coordinates
• target_keywords[]
• nearby_suburbs[]
service_locations
• service_slug, location_slug
• title, meta_description
• hero_headline, hero_subheadline
• main_content (800+ words)
• benefits[], faqs, target_keywords[]
Database Architecture
Two Tables Drive Everything
- 1
locations: slug, name, region, description, keywords
- 2
service_locations: service + location + unique content
- 3
Drizzle ORM for type safety
- 4
Neon PostgreSQL (AWS Sydney)
- 5
Data persists across restarts

Tech Stack
Neon PostgreSQL
AWS Sydney, serverless
Drizzle ORM
Type-safe queries
React + TypeScript
Frontend framework
TailwindCSS
Styling
Seed Script
npx tsx scripts/seed-locations.ts
~3 min build
All 790 pages
SEO Implementation
Every page includes three types of structured data:
ProfessionalService
Name, description, areaServed, serviceArea with GeoCoordinates
Service
serviceType, provider, areaServed, description
BreadcrumbList
Home → Locations → City → Service
SEO Implementation
Schema Markup on Every Page
- 1
ProfessionalService schema
- 2
Service schema with areaServed
- 3
BreadcrumbList for navigation
- 4
GeoCoordinates for local search
- 5
FAQ schema where applicable

Internal Linking Strategy
Each page links to:
Parent location page
Service-location pages link up to their location
Related services
Other services in the same location
Nearby suburbs
Same service in geographically close areas
Main service page
The canonical service page
This creates a strong internal link structure that helps both users and search engines. Users can navigate from Parramatta → Web Design → Nearby suburbs. Search engines can crawl the entire location hierarchy efficiently.
AI-First Messaging
Consistent Across 790 Pages
- 1
AI Website Development
- 2
AI Search Engine Optimization
- 3
AI Google Ads Management
- 4
No WordPress, no legacy systems
- 5
Exponentially better over time

AI-First Messaging Across All Pages
Every location page reinforces the AI-first positioning with consistent but contextual messaging:
Parramatta
"Parramatta businesses are future-proofing with AI-powered marketing"
Bondi
"Bondi's competitive market demands AI-powered marketing that evolves"
Chatswood
"Chatswood businesses gain an edge with AI-first digital strategies"
The messaging is consistent across all 790 pages, but the context changes. Same positioning, different local relevance.
Results
System Performance
100% unique content. CDN-cacheable. No runtime database queries.

Results
Lessons Learned
5 Key Takeaways
- Quality over quantity - Google penalizes doorway pages. Each page needs genuine value.
- City-specific insights matter - Generic templates fail. Local context makes content believable.
- Schema markup is essential - ProfessionalService, Service, and BreadcrumbList schemas help Google understand the content.
- Internal linking compounds - Strong link structure helps both users and search engines navigate.
- AI-first messaging scales - Consistent positioning across 790 pages without repetition.
Key Insight
Location pages aren't about quantity. They're about relevance. AI-generated content that's useful beats hand-written content that's generic.

The Power of AI-First Development
790 pages. Each one unique. Each one valuable. Location pages aren't about quantity—they're about relevance. AI-generated content that's actually useful beats hand-written content that's generic.
The system scales because the content quality scales with it.
Need Location Pages for Your Business?
We build AI-powered location page systems that scale with your growth. Unique content for every location, proper SEO, and maintainable code—all without manual content creation.
Frequently Asked Questions
How do you avoid Google's doorway page penalty?▼
How long does it take to generate all 790 pages?▼
Can you add new locations without rebuilding everything?▼
What schema markup do you include on each page?▼
How do you maintain consistent messaging across 790 pages?▼
Social Media Carousel
8 cards • Click to download individually or as ZIP
Building 500+ Location Pages with AI-Generated Content
Building JJM: Location Pages
Local SEO at scale without duplicate content penalties

Every Sydney suburb with genuinely unique content

From concept to 790 deployed pages

Each Page Includes
- 1
800+ words unique content
- 2
Local business context
- 3
Schema markup
- 4
Service-specific info
- 5
City-specific data

Template vs AI-Generated
'We offer [service] in [location]' - duplicate
Contextually relevant, locally-aware content

Technical Stack
- 1
Neon PostgreSQL
- 2
Static generation
- 3
CDN delivery
- 4
Incremental builds

Google rewards relevance. We provide it at scale.
— Jordan James

See the Pages
Check out the location pages in action

Share This Article
Spread the knowledge