โ† All posts

The 4-month playbook that took a services site from 0 to 12k organic / mo

Programmatic SEO for local services, step by step.

The brief was straightforward: a local services business (think dental, real estate, home services โ€” I'll keep the name out of it) wanted to stop relying on Google Ads. They had a single homepage, a contact form, and a phone number. Domain age: 11 days.

Four months later, they were getting ~12,000 organic visits per month and 400+ qualified phone inquiries โ€” without spending another rupee on ads. Here's the playbook, step by step.

1. Map the search intent in your category

Most "programmatic SEO" advice tells you to combine two lists (e.g. {city} ร— {service}) and call it a day. That generates a lot of pages, but Google has gotten very good at recognizing those pages as templated thin content. So we started somewhere different: what does someone in this category actually type into Google?

We pulled six months of Google Search Console data from three competitors using the Ahrefs Content Gap report. The patterns we found:

  • Local + service + price intent: "root canal cost mumbai", "dental implant price near me" (high commercial value)
  • Local + service + question intent: "is teeth whitening safe", "how long does invisalign take" (top-funnel education)
  • Local + service + provider intent: "best dentist in andheri east", "dentist near {neighborhood}" (bottom-funnel, high-intent)
  • Comparison: "{brand x} vs {brand y}"

Result: four distinct page templates, each engineered to answer one buyer-intent type โ€” not one giant matrix of duplicates.

2. Build the data layer first

We modelled the content in a Postgres table โ€” one row per page โ€” with fields like service_slug, area_slug, price_range, duration, top_3_questions, local_signals (nearby landmarks, transit stations).

Crucial: the data was researched, not generated. We hired one freelancer for two weeks to interview the client's existing patients and document real prices, real questions, real procedures. That gave us ~80 service rows ร— ~22 neighbourhood rows = 1,760 page combinations, each with actual data behind it.

3. Templates that aren't templated

Each page used a Next.js dynamic route โ€” /[service]/[area]/page.tsx โ€” that pulled from Postgres at build time. But here's the part most people skip: we generated structural variation.

  • Page intro: 3 different opening paragraph styles, chosen by a hash of the slug. Google sees variety, not duplicates.
  • FAQ order: shuffled per page based on local search volume.
  • Internal links: top 5 most-similar pages, calculated by service category + geographic proximity.
  • Schema markup: LocalBusiness + FAQPage + Service, generated from the same data.

4. Index throttling โ€” release in waves

This is the step nobody talks about. Dumping 1,800 pages into Google's index in one day is the fastest way to trigger a quality review. We released in waves:

  1. Week 1: 50 highest-priority pages (top-volume keywords in the highest-margin services).
  2. Week 2: +200 pages, gated behind sitemap re-submission.
  3. Week 4: +500 pages once Search Console showed the first wave indexing.
  4. Week 6: Remaining 1,050 pages.

This gave Google time to crawl, render, and trust each batch before more arrived. By week 8, ~80% of pages were indexed. By week 16, ~60% were ranking in the top 30.

5. The "first cohort to convert" trick

Don't write 1,800 pages and hope. Pick the 20 most likely to convert in your highest-margin service, ship them, get traffic, measure conversion. Then scale.

For us, this was the 20 highest-volume "{service} cost {area}" pages. Those went live in week 1 with custom lead forms. Within 30 days, conversion rate was 4.1% โ€” high enough to justify scaling the model to the full inventory.

6. Add a content engine, not just a build pipeline

After launch, we built a CMS layer so the client's team could update prices, add new services, and write neighborhood-specific announcements without touching code. Each update auto-redeployed the affected pages via ISR (incremental static regeneration) on Vercel.

What it cost

  • One full-time freelancer for 2 weeks (data collection): ~โ‚น40k
  • Engineering (us, 16 weeks part-time): ~โ‚น2.5L
  • Hosting (Vercel Pro + Postgres): โ‚น3k/mo

By month 4, the site was generating an estimated โ‚น6L+ in revenue per month from organic alone, replacing roughly โ‚น1.8L/month of Google Ads spend.

What I'd do differently

Two things. First: start with even fewer pages โ€” 200 instead of 1,800 โ€” and measure rank velocity before scaling. Second: invest more in editorial review on the first cohort. The first 50 pages set the trust tone for everything Google indexes after.

Programmatic SEO works. But "programmatic" doesn't mean "lazy." The brands winning at it are doing real research, real differentiation, and treating it as a content product โ€” not a script.