Tri-State Stump Removal - Site Source

A fast, static Eleventy site. No database, no plugins to update, no WordPress maintenance. Edit content by editing text/markdown files and rebuilding - takes under a second.

Project layout

_data/site.json        <- brand name, phone, email, NAP, schema info
                           (edit THIS file to rebrand the whole site)
_data/locations.json   <- list of towns/counties served
                           (add an entry here -> a new /service-area/
                           page is generated automatically)
service-area/location-page.njk <- template used for every location page
                           (edit ONCE, it applies to all locations)
blog/posts/*.md         <- blog articles (markdown, see below)
apps-script/            <- Google Apps Script lead handler + setup notes
css/style.css           <- all styling

Local preview (optional)

npm install
npm run serve

Opens a local preview at http://localhost:8080 with live reload.

TONIGHT: fastest way to go live

  1. Build the site:

    npm install
    npm run build
    

    This creates a _site/ folder containing the finished static site.

  2. Go to https://app.netlify.com/drop and drag the _site folder onto the page. Netlify will give you a live URL (e.g. random-name-123.netlify.app) immediately.

  3. In Netlify, go to Domain settings and add your custom domain (once you've registered it). Update DNS the same way you did for brightsidecommercialcleaning.com.

This gets you live tonight. The downside of drag-and-drop: every time you add a blog post or location, you'll need to run npm run build again and re-drag the new _site folder.

Recommended next step (within a day or two): connect GitHub

For the "add content without touching HTML" workflow to be fully hands-off:

  1. Push this project to a new GitHub repo (private is fine).
  2. In Netlify: "Add new site" > "Import an existing project" > connect the repo. Netlify reads netlify.toml and handles the build automatically (npm run build, publishes _site).
  3. From then on: edit a file, commit, push -> Netlify rebuilds and redeploys automatically in ~10-20 seconds. No manual zip/drag steps.

Adding a blog post (no HTML editing)

Create a new file in blog/posts/, e.g. blog/posts/2026-07-01-when-to-remove-a-stump.md:

---
layout: layouts/post.njk
title: "When Should You Remove a Stump vs. Leave It?"
description: "A quick guide to deciding whether a stump needs to go now or can wait."
date: 2026-07-01
permalink: /blog/when-to-remove-a-stump/
---

Your article content here, written in plain markdown...

It will automatically appear on /blog/ and get its own page, sitemap entry, and schema-friendly title/meta.

Adding a new service area / county (no HTML editing)

Add a new entry to _data/locations.json:

{
  "name": "Johnson City",
  "state": "TN",
  "stateFull": "Tennessee",
  "county": "Washington County",
  "slug": "johnson-city-tn",
  "localNote": "One unique sentence about this area - landmarks, terrain, common job types, etc."
}

A full /service-area/johnson-city-tn/ page is generated automatically using the existing template, and it's added to the homepage, footer, sitemap, and schema areaServed list everywhere.

Rebranding / changing the phone number

Everything pulls from _data/site.json. Update businessName, phoneDisplay, phoneRaw, email, domain, etc. in that one file and rebuild - it updates the header, footer, every page's schema, and the contact page.

CallRail setup (when ready)

  1. Sign up for CallRail and set up dynamic number insertion (DNI) / whisper sync per their instructions.
  2. CallRail gives you a "Companion" JS snippet URL. Paste it into _data/site.json -> callrailScriptUrl. It's automatically injected into every page's <head>.
  3. Because every page renders the phone number from the same site.phoneDisplay value in the same format, CallRail's swap script will reliably find and replace it everywhere - header, footer, homepage hero, every location page, and the contact page.
  4. Configure your "whisper" message and destination number(s) entirely within CallRail's dashboard - no further site changes needed. When you reroute a lead to a different operator, just update the destination number in CallRail (and/or the Config tab in the lead spreadsheet - see apps-script/).

Lead form / Google Sheet backend

See apps-script/LeadFormHandler.gs for the full setup. Short version: a Google Sheet with a "Leads" tab (every submission gets logged) and a "Config" tab (edit a cell to reroute notifications to a different operator - no code changes).