惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog RSS Feed
Jina AI
Jina AI
雷峰网
雷峰网
Blog — PlanetScale
Blog — PlanetScale
Hugging Face - Blog
Hugging Face - Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
博客园 - 司徒正美
罗磊的独立博客
J
Java Code Geeks
Engineering at Meta
Engineering at Meta
WordPress大学
WordPress大学
Vercel News
Vercel News
A
About on SuperTechFans
I
InfoQ
D
DataBreaches.Net
爱范儿
爱范儿
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
U
Unit 42
aimingoo的专栏
aimingoo的专栏
宝玉的分享
宝玉的分享
P
Proofpoint News Feed
Microsoft Azure Blog
Microsoft Azure Blog
美团技术团队

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Building a local SEO system for a service business: 40 pa...
Rumy M Reyal · 2026-04-23 · via DEV Community

Rumy M Reyal

TL;DR: I run a cleaning company in the GTA. In 90 days I built 38 niche landing pages using Supabase + a Lovable-built admin form + a pSEO content generator. Here's what worked and what didn't.

The problem

Local service businesses compete on Google Maps (Google Business Profile) and on organic search. The GBP side is well-documented. The organic side is where most service businesses lose — they publish a Services page and a Locations page and expect to rank.

They don't. A single generic "cleaning services Toronto" page is trying to compete with franchise sites, aggregators (Thumbtack, Jiffy, TaskRabbit), and every other cleaning company in the city.

What works: a page per service × per location. Long-tail keywords with lower search volume but dramatically higher intent.

The system

Stack:

  • Supabase (Postgres) for content storage
  • Lovable (for the admin form that writes to Supabase)
  • Next.js / React (generated by Lovable) for the front-end
  • A content generator script that reads a table of niche + location combos and outputs seed content for each

Content generator in rough pseudocode:

for (const niche of niches) {
  for (const location of locations) {
    const page = {
      slug: `${niche.slug}-${location.slug}`,
      h1: `${niche.name} in ${location.name}`,
      subheadline: buildSubheadline(niche, location),
      benefits: niche.benefits,
      painPoints: niche.painPoints,
      faqs: generateFAQs(niche, location),
      metaTitle: buildMetaTitle(niche, location),
      metaDesc: buildMetaDesc(niche, location),
      status: 'draft'
    };
    await supabase.from('niche_landing_pages').insert(page);
  }
}

Enter fullscreen mode Exit fullscreen mode

The gotchas

1. Sitemap discovery. The pages rendered fine and had internal links, but the sitemap.xml generator on Lovable didn't include the /landing/* route. Google had no way to discover the 38 pages. Added them to the sitemap, submitted via GSC.

2. Schema markup. Each page needs LocalBusiness + Service schema. Initial build only had the homepage schema. Rolling this out per-landing page.

3. Content generation is the bottleneck, not publishing. The system can publish 100 pages in a day. Writing 100 unique, useful pages takes 3 months. Budget accordingly.

What ranks

Too early to conclusively say (most pages are 2-4 weeks old). But:

Next: link acceleration

On-page is necessary but not sufficient. New pages with zero external links take 8-16 weeks to rank page 1. Pages with 2-3 DR 80+ backlinks rank in 2-4 weeks. Running a 30-day link acceleration plan now (you're reading one of the pieces of it).

If you're building a local service business, full process documented at procleaningpros.ca. Happy to answer any questions in the comments.