What I build for contractors
From a homeowner’s search to a signed job. This is the whole system, in the order a job moves through it. Each part has a name and a reason.
-
The homeowner
-
Your site
TypeScript on Next.js, deployed to Cloudflare Workers
- A page for every service in every town
- The quote tool, priced from your own numbers
- The form, rate limited and checked for bots
- The ad click and the campaign, read on the server
- A database at the edge
- Object storage for files
-
You
-
Google Ads
Each ad lands on the page built for that job.
The search
A homeowner in Camas searches for the job and the town. Roof replacement Camas.
Programmatic town and service pages. You get a page for every service in every town you work, so you have a page for that exact search.
Structured data graph. Each page also tells Google and the AI assistants, in their own format, what you do and where, so they describe you correctly.
How it is built
Every town page and service page is built from one set of facts about the business, so a license number or a phone number is typed once. Volks Roofing has 11 town pages, DWV Construction has 15, and The ICF Guys has 12, counted from each site’s own sitemap.
Four town pages on four client sites. Each one opens.
The page
The homeowner taps your result on a phone, on cellular.
Edge-rendered web platform. The page is served from the data center nearest the homeowner, so it opens fast. I measure every site on a real phone before launch and give you the number.
The page shows your license number at the top, your reviews, and jobs you finished in that town.
How it is built
Sites are written in TypeScript on Next.js and deployed to Cloudflare Workers. Data lives in a database at the edge, and files live in object storage.


The quote
Multi-step qualification funnel. The homeowner picks the project, the scope, the timeline, and a budget range, adds photos from a phone, and picks a time for a site walk. The lead that reaches you is ready to price.
Estimating engine. On a Site with Tools the homeowner also sees a price range, built from your own numbers. On a roofing site the homeowner types an address and the roof is measured from satellite data.
How it is built
The roof engine finds the building and reads each roof plane from aerial and solar data, with its pitch and its area. The area becomes squares, waste is added for a roof that is cut up, and the range is priced on the roofer’s own rate per square.
The block estimator takes a wall length and a height and returns form counts, concrete volume, rebar footage, and a typical budget range. The cost calculators do the same for other trades.




The lead
The request reaches your inbox the moment it is sent, with the name, the phone, the project, the photos, and where the lead came from. The homeowner gets a confirmation with your number on it.
Email deliverability engineering. SPF, DKIM, and DMARC are set on your domain, so your reply reaches the homeowner’s inbox.
How it is built
The email is written by the site itself. One tap adds the site walk to your calendar, calls the homeowner, or opens a reply, and after the job one tap asks for a Google review. Every form is rate limited and checked for bots, and a post sent from another site is turned away.


The source
Open it
contractormarketingnw.com/toolsCase studies
The dashboardLead attribution pipeline. The ad click and the search behind each lead are stored with it. Every lead traces to the campaign, the keyword, and the town that produced it.
First-party analytics dashboard. Visits, leads by source, and phone taps, live, at a private link on your phone, with no cookie banner.
How it is built
The ad click and the campaign are read on the server when the visitor arrives, before the page renders. The counting is done on the site itself and kept in your own database, with no outside tracker. The analytics tables hold no name, phone, or email, and crawlers are counted apart from people.



The ads
On the Lead System, I build the Google Ads account by hand in your own account. Search campaigns only. The highest bids go to searches from people ready to hire. A list of hundreds of blocked terms is in place before the first dollar is spent. Each ad lands on the page built for that job.
I read every search term twice a week.
Ads inside ChatGPT are a new channel for contractors. I build those campaigns and run them too.
The signed job
Offline conversion import. When a lead signs, you text me the amount. The signed job goes back into Google Ads with its value, so the bidding learns which searches produce signed work.
Every week you get a report I write by hand. Spend, clicks, every lead by name and town, and what I changed and why.
In your name
Your domain is registered in your name. Your Google Ads account runs on your card, with you as an administrator, and your Google Business Profile is yours.



