I rebuilt an indoor environmental testing firm’s entire system. Now 85% more people find them.
The firm ran on five systems that could not see each other: a website on a hosted builder, a calendar, accounting software, a CRM connected to none of them, and an inbox where every lead stopped. I replaced them with one connected system. More people find the firm in Google, every one who gets in touch is counted, and every job lands in the CRM without anyone typing it.
- Client
- An indoor environmental testing firm, North Carolina (name withheld)
- Their work
- Indoor air, mold, asbestos, lead and water testing
- My work
- The website, search, lead tracking, job tracker and CRM automation, AI drafting, hosting and domain
- Launched
- July 14, 2026
- Data
- Google, analytics and the CRM through Oct 31, 2026
What the owner keeps
Built by me, handed over whole. If they ever walk away from me, nothing has to be rebuilt.
Theirs to keep
- Every line of code behind the 43-page site, with no hosted site builder left to pay for
- The domain, the Google Business Profile, analytics and every lead, in accounts the firm owns
- Over a thousand records in their CRM and job tracker, exportable any time
Run without me
- The office keeps working in its own job tracker, and the CRM fills itself from it
- The owner reads, edits, approves and sends every report
- The day’s plan is written and published before anyone arrives, from their own job records
The short version
Four things changed. Everything below is the detail.
One system instead of five
The request, the appointment, the work order, the invoice and the payment are now one job record in the job tracker, and that record feeds the CRM, the day’s plan and the report on its own. Before, each of those lived in a different program and nobody could see the whole.
Found 85% more often
A hand-built 43-page site with search markup, regional pages and plain-language service pages took Google clicks from 116 to 215 in equal 30-day windows. The firm’s own name went from position 16 to 8. Visits from AI assistants rose 3.3 times.
Every lead counted, every job recorded
Hundreds of form sends and phone taps since launch, where the old site could count none. Over a thousand records of jobs, quotes and requests in a CRM that filled itself from the firm’s history in under an hour and stays current within seconds, with no typing.
Writing that drafts itself
The day’s plan for each person is written and published before the day starts. Each job’s report goes from the field app to a checked first draft that the owner reviews, approves and sends. Both start from the job record instead of a blank page.
Before and after
Five systems that each held a piece of every job and none held the whole, against one system where the job, the customer, the schedule, the bill and the lead are one record.
| Before | Now | |
|---|---|---|
| Website | A site on a hosted builder: no form on the homepage, no local pages, weak signals to Google | 43 hand-built pages on my server, a page for every service, audience and region, search markup on every page |
| Leads | A form that sent an email, and nothing counted it | Every form send reaches the firm’s inbox and mine; every form send and phone tap is counted in analytics |
| Schedule | A calendar, separate from the job | Requests, appointments, work orders and invoices on one job record in the job tracker |
| Customer records | A CRM that did not connect to the calendar, the books or the website | The CRM filled automatically from the job tracker: one deal per job, one record per service line, running totals on every customer and company |
| Money | Accounting software, apart from the job records | The invoice and the payment belong to the job, so what was quoted, sold and paid is one record |
| Email and domain | The website, the email and the domain on different hosts | One domain on my nameservers, the site on my server, the mail moved with it, no records lost |
| Reports | Written by hand from field notes for every job | Drafted by the system from the field app, checked number by number, approved and sent by the owner |
| The day’s plan | In people’s heads and the calendar | A brief for each person, written and published before the day starts |
| Marketing | No list to write to | A live list of who bought what, who came back, and who got a quote and never said yes |
The detail
Each part of the system, what it replaced, and what the numbers show. Open the ones you care about.
1The website and search
A hand-built site that Google shows more often and people choose more often: 116 to 215 clicks.
The website and search
A hand-built site that Google shows more often and people choose more often: 116 to 215 clicks.
Where the old site stood in May 2026
No way to count leads
Analytics was installed, but there was no tracking setup, no form on the homepage and no tracking on phone taps or form sends. In the 30 days before launch it recorded zero lead actions.
Weak signals to Google
The homepage had a 29-character title, three H1 headings and no structured data. Google had no machine-readable name, address, hours or service area for the business.
Hard to find by name
A search for “their own name” put the site at position 18 on average.
No local pages
The firm works across North Carolina, Upstate South Carolina and Southern Virginia, yet the site had no page for any city outside its own.
Visibility spent in the wrong place
The old water testing page was shown 7,547 times in 30 days for national laboratory searches, at position 50, and earned 3 clicks.
What I built
43 pages, by hand, on my server
One for every service, every audience (homeowners, builders, property managers, schools, realtors) and every program. No page builder, no plugins.
A search layer on every page
Unique titles and descriptions, LocalBusiness structured data with address, coordinates and hours, a share card and the firm’s real logo. A footer with the name, address and hours repeats the same facts on every page.
Six regional pages and a hub
Raleigh and the Research Triangle, Wilmington and the Cape Fear, Charlotte, Greenville and Upstate SC, Richmond VA, and Martinsville and Henry County VA.
Pages for searches the old site missed
Pricing, VOC testing, expert witness, and insurance and legal work.
Old addresses carried over
Permanent redirects from the old addresses, and the www address pointed to the bare domain, so years of links and rankings were kept.
Trust that holds up
Placeholder testimonials and unsupported claims removed, the certifications page rebuilt around the credentials the team actually holds, and all nine team bios on one page.
Weekly clicks from Google
Every bar is one week of clicks from Google search to the site. The old site averaged 28 a week. The new site has climbed since launch and set its record in the week of October 4.
Clicks climbed, then kept climbing
Google showed the site 29% more often (22,650 to 29,233 times), but clicks grew nearly three times faster than that. People who saw the firm in Google were more likely to choose it, which is what better titles, descriptions and pages are for.
The last two weeks alone, October 18 to 31, brought 85 clicks against 39 in the old site’s last two weeks, up 118%.
The results side by side
| Measure | Old site | New site | Change |
|---|---|---|---|
| Clicks from Google | 116 | 215 | +85% |
| Clicks to the website pages themselves (Business Profile link set aside) | 78 | 139 | +78% |
| Click rate in Google | 0.51% | 0.74% | +45% |
| Visits from the United States | 325 | 573 | +76% |
| Engaged US visits | 165 | 278 | +68% |
| Average US visit length | 2m 45s | 3m 21s | +21% |
| Visits from AI assistants | 9 | 30 | 3.3× |
| Form sends and phone taps recorded | 0 | 66 | from none |
| Website addresses earning a Google click | 17 | 26 | +9 |
The brand and the homepage moved up
| Search or page | Old site | New site |
|---|---|---|
| “their own name” | position 18.2, 2.8% click rate | Position 8.2, 7.2% click rate |
| “esg greensboro” | 1 click | 6 clicks, position 1 |
| “their own name, with the city” | Not in the data | 1 click, position 1 |
| Homepage | Position 26.7, 47 clicks | Position 19.5, 59 clicks |
| Team pages | 5 clicks across the old team and bio pages | 23 clicks to the one Our Team page |
Local service searches moved toward page one
| Search | Before | After | Clicks |
|---|---|---|---|
| mold testing (their city) nc | 15.8 | 6.9 | 2 to 5 |
| air quality testing (their city) nc | 7.8 | 10.7 | 0 to 1 |
| air quality testing near me | 6.0 | 1.2 | 0 to 0 |
| air quality testing burlington nc | 21.0 | 8.4 | 0 to 0 |
| asbestos testing (their city) nc | 6.7 | 6.8 | 2 to 1 |
Pages that did not exist before now bring visitors
The six regional pages and the hub were shown 4,182 times in the latest 30 days and earned 12 clicks: Raleigh 4, Wilmington 3, Richmond 3, Charlotte 1 and Greenville 1. The new expert witness and insurance and legal pages earned 7, VOC testing 6, builders and developers 3, and pricing 2. Lead testing went from 3 clicks to 9.
AI assistants send some of the best visitors
Visits from AI assistants grew from 9 to 30 between the two windows. Since launch ChatGPT alone sent 81 visits that produced 16 form sends and 9 phone taps, about 31 lead actions for every 100 visits. Clear pages with consistent facts about services, service area, hours and credentials are what these assistants read and repeat.
2Leads: captured, routed and counted
Hundreds of form sends and phone taps since launch, each delivered to two inboxes and recorded by page, search and channel.
Leads: captured, routed and counted
Hundreds of form sends and phone taps since launch, each delivered to two inboxes and recorded by page, search and channel.
Both forms on the site post to an automation on my server that delivers each request to the firm’s office inbox and to me, so a lead never depends on one person’s mailbox. Tracking on every page records form sends and phone taps in analytics as lead events.
In the latest 30 days the site recorded 35 contact form sends and 31 phone taps. Since launch it has recorded 91 form sends and 89 phone taps, and 77 of those 89 phone taps came from phones, which is the mobile layout doing its job. Before, the number was unknown, because nothing counted it.
What that gives the firm: it can see which pages, which searches and which channels bring work, instead of guessing. ChatGPT, for example, turned out to send visitors who get in touch at the highest rate of any source.
3The job, the schedule and the bill: one record
Where a calendar entry, an invoice in the accounting software and an inbox note used to describe the same job, the job tracker holds it once.
The job, the schedule and the bill: one record
Where a calendar entry, an invoice in the accounting software and an inbox note used to describe the same job, the job tracker holds it once.
The firm’s work now runs through one job tracker: the request, the estimate, the appointment, the work order, the invoice and the payment are one job. Before, the appointment was in a calendar, the invoice was in the accounting software, and what the customer asked for was in someone’s inbox or head. Nothing linked them, so a question as simple as “what did we quote this customer last time” meant opening three programs.
The job tracker is where the work happens, and nobody at the firm had to change how they use it. That matters because the rest of the system reads from it: the CRM, the day’s plan and the report all start from the job record, so the office enters a job once and everything downstream knows about it.
4The CRM that fills itself
Over a thousand records of jobs, quotes and requests, hundreds of thousands of dollars of history, loaded in under an hour and kept current within seconds, with no typing.
The CRM that fills itself
Over a thousand records of jobs, quotes and requests, hundreds of thousands of dollars of history, loaded in under an hour and kept current within seconds, with no typing.
I built the automation inside their job tracker that copies every request, quote and finished job from the job tracker into the CRM within seconds:
One deal per job
It tracks the original request, the first quote, every revision and the final bill.
One service record per service line
So CRM knows who bought what, when, and for how much.
Lost quotes kept, with the reason
So customers who did not buy can be followed up.
Running totals on every customer and company
Job count, lifetime value, services bought, last mold, verification and healthy home dates.
On September 18, 2026 I loaded the firm’s whole history, every request, quote and job back to the first record, in under an hour with no failures. In August the CRM held one record, a test lead, and no deals. Now it holds:
| Deals, one per job | Hundreds |
| Service records, matching the job tracker to the dollar | Over a thousand, worth hundreds of thousands of dollars |
| Customers who have bought | Hundreds |
| Customers who bought more than once | Nearly a hundred |
| Companies who have bought | Over a hundred, worth hundreds of thousands of dollars |
| Customers with a lost quote, ready for follow-up | Over a hundred |
| Jobs where the service sold differed from the one asked for | Dozens |
What the firm can do with it that it could not before
See the whole customer
One screen shows what a customer bought, when, for how much, what they were quoted, and what they turned down. That took a calendar, the accounting software and an inbox to piece together before.
Go back for the work it already quoted
Over a hundred customers with a lost quote or cancelled request are now a list, with the reason where one was recorded.
Market to its own history
Hundreds of buyers, nearly a hundred of them repeat buyers, sorted by service and date, so a re-test reminder or a review request goes to the right people at the right time.
Spot the sale that changed
Dozens of jobs where the service sold differed from the one asked for, which is where the office’s judgment adds revenue and where the intake could be sharper.
5The day’s plan and the report, drafted by the system
The two pieces of writing that used to start from a blank page now start from the job record and end with a person’s approval.
The day’s plan and the report, drafted by the system
The two pieces of writing that used to start from a blank page now start from the job record and end with a person’s approval.
The day’s plan writes itself
Every weekday at 5:10 a.m. Eastern a job on my server builds the day’s brief and publishes it to a private link: today’s work, what is coming and how to prepare, in a version for each person. The facts are built by code from the job records. The AI writes only the opening line and one “watch” line from numbers the code has already worked out, and a check refuses any draft that states a number or place on its own. It reads sample jobs today and the firm’s real jobs, at the same link, once their job tracker login is connected.
Report writing becomes report reviewing
The firm’s consultants write a report for every job. I built a report drafter for the firm to run as their own system: the field app sends the job, the drafter writes a first draft in the firm’s report structure, and a checker confirms every number matches the field data. The owner reads it, edits, approves and sends it from the firm’s own email, and the sent report is filed in that client’s folder in their file system. It never sends on its own. On a test job it wrote 64 numbers and invented none. It goes live once the firm supplies its report templates and it passes a test on 20 past jobs.
6Email that follows up, and the list it writes to
A partner series, a homeowner follow-up and report delivery emails, written in the firm’s voice, with a real list behind them for the first time.
Email that follows up, and the list it writes to
A partner series, a homeowner follow-up and report delivery emails, written in the firm’s voice, with a real list behind them for the first time.
A three-email series introducing independent post-remediation verification to remediation partners, a homeowner follow-up, and report delivery emails in two versions, with and without a review call, are written and on-brand, ready for the owner’s approval.
What is new is that there is now something to send them to. Before, the firm had no list of who bought what or who turned a quote down. Now every email, review request and re-test reminder can be built from the CRM’s own history, and the lost quotes are the first list worth writing to.
7Also in place
Hosting, the domain, the mail records, the measurement accounts and the groundwork.
Also in place
Hosting, the domain, the mail records, the measurement accounts and the groundwork.
- The domain moved to my own nameservers with the firm’s email records carried over unchanged, and the site served over HTTPS from my server.
- The search, analytics and tracking accounts set up, with every id recorded.
- The firm’s real logo, favicons and share cards across the site.
- The groundwork: a full site audit, keyword research with real search volumes, a local competitor review, an analytics review, and a marketing and systems plan for October 2026 to March 2027.
8What the numbers do not say
I would rather the firm trust these figures than be impressed by them.
What the numbers do not say
I would rather the firm trust these figures than be impressed by them.
- A month is a short window, and the old site’s last month was its weakest.Search Console holds the site’s data only from May 31, 2026, so there is no year-over-year comparison, and the old site’s last 30 days include the July 4 week. The shorter the window, the bigger the number: over the longest equal windows the data allows (44 days) the rise is 70%, over 30 days it is 85%, and over the last two weeks alone it is 118%. I chose a month because it is the shortest window that smooths out a single slow week. The step from the first 30 days after launch (156 clicks) to the latest 30 (215) is new site against new site, and shows the trend continuing.
- Form sends are an upper bound.The form event fires when Send is pressed, before the server confirms delivery, so a failed send or a double press counts. Visits from my own test copies are left out of every figure here.
- Not every click came from the website.76 of the 215 Google clicks came through the firm’s Google Business Profile in the map results, which is why the table also shows website-only clicks: 78 to 139.
- Not everything moved up.“asbestos testing (their city) nc” held its position but clicks fell from 2 to 1, “air quality testing (their city) nc” slipped from position 8 to 11, and “air duct testing” slid from position 23 to 33.
- Leads are counted; jobs booked from them are not yet tied back.The website counts who gets in touch. Which of those became a booked job is not yet linked, because web requests are still retyped into the job tracker by hand. That link is the next build.
- Two parts read sample data today.The morning brief and the report drafter are built and tested, and switch to the firm’s real jobs once their job tracker login and report templates are in. I have not claimed hours saved or revenue added anywhere in this study, because I have not measured them yet; the lost quotes are the first place to measure.
- Automated traffic is left out.A large share of all visits (32% before launch, 18% after) came from automated traffic in Singapore that never engages. Visit figures here are United States visits only.
9What comes next
The steps that finish the system and start measuring what it adds.
What comes next
The steps that finish the system and start measuring what it adds.
Send website requests straight into the job tracker, with an instant reply
Today the office retypes each web request into the job tracker. The form should create the job tracker request itself and send the customer a reply for their service, which also ties every booked job back to the page or search that brought it. It should also offer duct leakage testing, the firm’s most requested service, which the form is missing today.
Connect the morning brief to the firm’s real jobs
It needs a read-only the job tracker login. The link and the schedule stay the same.
Switch on the report drafter
The firm’s report templates, then a test on 20 past jobs, then live, with the owner approving every report.
Go back for the lost quotes
The first email that writes to the new list, and the first place to measure revenue the system added.
Put call summaries on the customer record
The firm’s calls run through a phone system that records them. Each recording can be summarized and saved on the matching CRM contact, so nobody retypes a phone call.
Finish the search housekeeping
Redirect the 26 old addresses that still return “page not found” (including the old post-remediation verification page, shown 724 times at position 10 in the old site's last 30 days), submit the current sitemap, update the Business Profile link, count delivered leads instead of button presses, keep the local mold pages on page one (mold testing sits at position 7 and mold inspection at 10), and grow reviews.
10How I measured
Where every number on this page comes from.
How I measured
Where every number on this page comes from.
- Search Console: the site’s domain property, web search, final data only, pulled November 2, 2026. Old window June 14 to July 13, 2026, the old site’s last 30 days. New windows July 14 to August 12 and October 2 to 31, 2026, each 30 days. The property’s data begins May 31, 2026, which is what sets the 44-day figure quoted in the limits.
- Google Analytics 4: the site’s property, same windows. Lead actions are the form send (generate_lead) and phone tap (phone_click) events on the live site only; events from test and demo copies of the site are left out. Visit figures are United States sessions.
- CRM figures: from the history load of September 18, 2026, checked against the job tracker’s line-item total and given here in round terms. The August state of the CRM comes from my review of the firm’s accounts on August 21, 2026.
- Brief and drafter: from their build tests.
- The old systems (the hosted site builder, the calendar, the accounting software, the old CRM) are as the firm described them to me and as I found them when the work began.
- Live checks: on November 1, 2026 I requested all 43 pages in the sitemap and the 55 old addresses that appear in Search Console.
- The old site’s state comes from my audit of the site on May 30, 2026.
Why it matters
The website’s job is to bring in work. The system’s job is to make sure none of it depends on someone remembering, retyping or chasing. More people find the firm, more of them get in touch, and every one of them lands in a record the whole business can see.
“We could take in more work, we got more work, we increased profit.”The owner, owner, an indoor environmental testing firm
That is the point of all of it: the firm’s owner gets to work on the business, not only in it.