DEV Community

Rumy M Reyal
Rumy M Reyal

Posted on

Building a local SEO system for a service business: 40 pages in 90 days

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.

Top comments (0)