Case Study · Marketing Site · Local SEO

Twin County Outdoor Services

A single-crew landscaping & hardscape contractor in Aledo, TX, going up against better-funded outdoor living companies across Fort Worth and Parker County — built as a programmatic local SEO engine, not a static brochure site.

Astro TypeScript Tailwind CSS Netlify Sharp / heic-convert Schema.org IndexNow
92Total indexed pages
22City × service landing pages
15Project pages (up from 3)
6Blog posts on commercial-intent queries
DaysTo build 22 geo pages + full internal linking
Twin County Outdoor Services homepage — owner-operated landscaping hero with wrapped truck and click-to-call CTAs
The challenge

One crew. One truck. A market full of bigger names.

Twin County Outdoor Services is a single-crew, owner-operated landscaping and hardscape contractor working out of Aledo, TX. The competition isn't other one-truck operations — it's larger, better-funded outdoor living companies with marketing budgets Twin County doesn't have.

The site they started with reflected that gap: a handful of service pages and a 3-project portfolio. No city-level pages, no structured data, nothing built to catch the specific searches homeowners actually run — "French drains in Saginaw" or "retaining wall Keller TX." Search traffic went to whoever showed up for those queries, and it wasn't Twin County.

The goal: build a site that could compete on content depth and local specificity — the one advantage a small crew can win on a page-by-page basis, without hiring a marketing team to do it.

The solution

Services, cities, and projects as data — not hand-built pages.

We built a statically-generated Astro site where services, service areas, and projects live in structured TypeScript files, not hardcoded HTML. Dynamic route templates ([slug].astro) turn each data entry into a fully-rendered, SEO-complete page. New content is a data entry, not a build task.

  • Astro — static output, zero client-side JS where none is needed, fast by default.
  • TypeScript content model — services, service areas, and projects defined once, rendered everywhere they need to appear.
  • Tailwind CSS — utility-first styling on top of the BurnsBuilt build pattern.
  • Sharp + heic-convert — custom image pipeline converting HEIC phone photos into optimized WebP at card and gallery sizes.
  • Schema.org structured data — LocalBusiness/HomeAndConstructionBusiness, Service, FAQPage, BreadcrumbList, and Article schema across the site.
  • IndexNow — pings search engines the moment a new page publishes, instead of waiting on a crawl.
  • Netlify — push to main, live in minutes.
Key features

A local SEO engine, not a single static site.

Geo × service pages

22 city pages that aren't boilerplate.

Pages like "French Drains in Saginaw, TX" and "Retaining Walls in Keller, TX" each carry unique local copy, city-specific FAQs, pricing context, and permit information — not a city name swapped into a template.

A homeowner in Saginaw sees a page written for Saginaw, not a find-and-replace.
Internal-linking registry

Every new page gets found automatically.

A central registry (geoPages.ts) cross-links each city page to its service hub, sibling cities, and relevant project photos the moment it's added. Solves the standard problem of pages that get built but never get linked to — and never get crawled.

No orphan pages. No manual link-building pass after every launch.
Project portfolio

15 pages of real work, from real photos.

Replaced a 3-project starting point with 15 project pages built from real client photos, with before/after sliders. HEIC photos off a phone go through the Sharp/heic-convert pipeline and come out as optimized WebP at card and gallery sizes.

Real jobs, real photos, no stock imagery.
Structured data

One verified business entity, tied to every page.

A single canonical LocalBusiness/HomeAndConstructionBusiness entity (@id-based) anchors Service, FAQPage, BreadcrumbList, and Article schema across the site — so Google can confidently tie every page back to one business instead of guessing.

Rich-result eligibility across the full site, not a handful of pages.
The technical edge

Built on data. Prioritized by evidence, not guesswork.

The site wasn't built once and left alone. It launched with core services and service areas, then grew in two more passes — 10 additional geo pages, then a further round closing gaps that a competitor analysis surfaced. It's a continuously evolving asset, not a one-and-done launch.

Prioritization came from real Google Search Console data — pages were rewritten and new pages were built based on actual impression, click, and position numbers, not assumptions about what might rank.

A competitor analysis against 4-5 direct local competitors informed which pages to build next, surfacing specific content gaps — services or cities competitors covered that Twin County didn't — and closing them.

The result

From a handful of pages to a 92-page local SEO footprint.

92Total pages indexed (up from a handful of core service pages)
22City × service landing pages, each with unique local content
15Project pages built from real client photos, up from 3
DaysTo build 22 geo pages plus full internal linking, not weeks

Traffic and ranking data are still maturing — new geo pages need time in Google's index before the numbers mean anything. We update this case study with real Search Console numbers once they're in, not before.

A look inside

Screenshots.

The project in the wild — UI from the live product.

More work like this

We build local SEO engines for home service contractors.

Geo-targeted landing pages, auto internal linking, and full schema markup for landscaping, hardscape, and outdoor service businesses competing against bigger-budget competitors.

Talk to us about your site →

Competing against bigger budgets on search?

If you're a one-crew or one-truck operation losing local search traffic to companies with real marketing spend, tell us your service area and we'll scope what it would take to close the gap.

Let's Talk