Construction & Contracting · the southern Appalachians · 6-month engagement
Two locations, two Google profiles, one lead-scoring model that tells the crew which job to call first
A regional roofing and building-services contractor was running paid search and Meta against a website that published the wrong office address sitewide, with leads landing unranked in a construction CRM. We rebuilt the site, separated the two locations in local search, and built a scoring model that sorts every inbound job into *urgent / when-you-can / another-day* before anyone picks up the phone.
4.8
Google rating, primary profile
$5,000
Monthly paid media managed
Measured in Google Business Profile Insights, Google Ads, Meta Ads Manager and JobTread, window to be confirmed at publication. Supplied by the client and used with permission; identifying details removed. Cited: LocaliQ *2025 Home Services Search Benchmarks* (General Contractors: CVR 2.61%, CPL $165.67, CPC $5.31); BrightLocal GMB Insights (activity ranges). ---.
At a glance
The engagement in brief
Services
- Web Development
- Local SEO
- Google Business Profile
- Paid Search
- Paid Social
- Content
- CRM
- Lead Routing
- Reporting
Stack
- Lovable
- Netlify
- Supabase edge functions
- JobTread
- Google Ads
- Meta Ads
- Google Analytics 4
- Google Tag Manager
- LinkedIn Insight Tag
- Bing Places
The situation
What we walked into
The business had rebranded from roofing to a broader building-services identity, and almost nothing downstream had caught up. The website published one office address on every page, including the pages for the other location. One of the two Google Business Profiles still carried the old roofing-only name and a phone number that was not the main line. Paid search and Meta were live and spending. Leads were arriving into the construction CRM in the order they happened to come in, so a roof actively leaking and a request for a quote in the spring looked identical to whoever opened the queue.
The site published a single office address sitewide — including on the pages for the second location, which is a real staffed showroom with its own Google profile and its own catchment.
What we found
The diagnosis
01
The rebrand had not reached local search
One profile had been renamed to the new building-services identity; the other still read as the old roofing name, with a secondary phone number attached. For a two-location contractor, that is two different businesses as far as the map pack is concerned.
02
A sitewide address error was undermining the second location
Publishing one address on every page tells Google, and every citation aggregator that scrapes the site, that the second location does not exist as a distinct place. The site was the thing that was wrong, not the profile.
03
Paid was outrunning organic by a wide margin
Ads went live and started producing while blog publishing, local citations and review velocity lagged. In a trade where the published category conversion rate is among the lowest in home services, paid alone carries the whole cost of acquisition with nothing compounding underneath it.
04
Lead order was arbitrary, and urgency is the whole game in this trade
An emergency repair and a spring quote request have completely different economics and completely different tolerance for a slow callback. Sorting them by arrival time is sorting them by nothing.
05
Reputation was split across platforms in an unhelpful way
The Google rating was strong. The Facebook rating was materially weaker, and Facebook was where a meaningful share of the local audience was being reached by the Meta campaigns.
What we built
The system
We rebuilt the site in Lovable with per-location address data driven from a single business record, so the second location renders its own address, its own phone and its own service area. Site forms write to the JobTread CRM through a Supabase edge function, so a submission becomes a job record rather than an email. On top of that we built a lead-scoring model on three inputs — city, job type, and whether the enquiry came through the long or short form — resolving into three buckets: urgent, when-you-can, another-day. The two Google Business Profiles were separated properly, the legacy profile renamed and repointed to the main line, and Bing Places synced from Google. Analytics, Tag Manager, Google Ads, Meta Pixel with Conversions API and the LinkedIn Insight Tag were installed so paid performance is measured against jobs rather than against form fills.
The sequence
How it was delivered
Weeks 1–2
Strategy and integrations
Analytics, pixels, CRM connection, baseline audit
Owner: OmniFlow
Weeks 2–5
Site rebuild and address fix
Per-location data, corrected addresses, forms to CRM
Owner: OmniFlow
Weeks 4–6
Local search separation
Both profiles renamed and repointed, Bing Places synced
Owner: OmniFlow
Weeks 3 onward
Paid media
Google Search live, Meta awareness, Performance Max held for video assets
Owner: OmniFlow paid team
Weeks 7–9
Lead scoring
Three-bucket model built and implemented in JobTread
Owner: OmniFlow + client ops
Week 6 onward
Content cadence
Weekly content calendar, blogs, one photo-led social post per working day
Owner: OmniFlow + client
Months 3 and 4
Checkpoint reporting
Scheduled written checkpoints against the visibility plan
Owner: OmniFlow
Outcome
Results
Report this engagement on local visibility and lead quality, not on traffic. The two figures that matter are calls originating from each Google Business Profile before and after the profiles were separated, and the share of inbound jobs arriving with a score attached. Pull profile calls from Google Business Profile Insights per location, not from the combined view.
Measured in Google Business Profile Insights, Google Ads, Meta Ads Manager and JobTread, window to be confirmed at publication. Supplied by the client and used with permission; identifying details removed. Cited: LocaliQ *2025 Home Services Search Benchmarks* (General Contractors: CVR 2.61%, CPL $165.67, CPC $5.31); BrightLocal GMB Insights (activity ranges). ---.
Reporting
What you would actually see
These are the surfaces this engagement is run and measured from, shown with representative figures built around the benchmarks cited on this page. Every account we run reports into views like these, and you keep ownership of all of them.
These are demo dashboards. They show the reporting surfaces this engagement is run and measured from, with representative figures generated around the published benchmarks cited on this page — not a client account and not a client result. Live reporting for your own account replaces every number here.
Illustrative reporting
Demo- **Google Business Profile:** Calls 138/mo (+62%) · Direction requests 190/mo (+48%) · Website clicks 470/mo (+71%) · Searches 8,400/mo (+83%)
- **GA4:** Sessions 3,010/mo (+38%) · Key events 96/mo (+44%) · Engagement rate 60.8%
- **Paid search:** CPC $5.31 · Conversion rate 2.61% · CPL **$158** vs **$165.67** category average
- *Note: general contracting is one of the lowest-CVR, highest-CPL trades — that's the honest baseline, and why the lead-scoring model matters more than more clicks.*
Google Business Profile
Construction & Contracting · all locations
Calls
341
+85.0%
Direction requests
668
+68.0%
Website clicks
771
+76.5%
Searches shown
12,050
+93.5%
Calls from the profile, by month
Dashed line marks the month the engagement started.
| How customers search | Searches | Share |
|---|---|---|
| Discovery — category, product or service | 8,229 | 68.3% |
| Direct — business name or address | 2,353 | 19.5% |
| Branded — related brand | 723 | 6.0% |
Google Analytics 4
Construction & Contracting · all web data
Sessions
3,555
+40.0%
Key events
123
+50.0%
Session key event rate
3.5%
+1.0%
Engagement rate
61.4%
+5.6%
Sessions by month
Dashed line marks the month the engagement started.
| Session default channel group | Sessions | Key events | Rate |
|---|---|---|---|
| Organic Search | 1,467 | 71 | 4.8% |
| Paid Search | 837 | 25 | 3.0% |
| Direct | 616 | 17 | 2.8% |
| Referral | 345 | 13 | 3.8% |
| Organic Social | 291 | 9 | 3.1% |
LinkedIn Campaign Manager
Sponsored Content · Construction & Contracting audience
Impressions
105,866
+24.6%
Clicks
757
+27.1%
CTR
0.7%
+0.21%
Cost per lead
$177.94
-9.1%
Impressions by month
Dashed line marks the month the engagement started.
| Campaign | Impr. | Clicks | Leads | CPL |
|---|---|---|---|---|
| Thought leadership — practice leads | 35,994 | 257 | 18 | $177.94 |
| Problem-aware — retargeting | 27,525 | 197 | 13 | $177.94 |
| Case study download | 23,291 | 167 | 11 | $177.94 |
| Webinar registration | 19,056 | 136 | 9 | $177.94 |
Method
How this is measured
2 of the figures on this engagement are not published yet. Rather than estimate them, this is the standard they will be held to: the system each is read from, and the exact definition and window that will be used. Nothing appears above until it has been pulled from the system named here.
| Figure | Read from | How it is defined | Status |
|---|---|---|---|
| Google rating, primary profile | Google Business Profile Insights | September 2026 | Published |
| Monthly paid media managed | Google Ads and Meta Ads Manager | from June 2026 | Published |
| Calls from Google Business Profile | Google Business Profile Insights | compare the 90 days after profile separation to the 90 before | Not yet published |
| Leads scored and routed in CRM | JobTread | count records carrying a score since the model went live | Not yet published |
Honestly
What we would do differently
The first month was heavily weighted toward strategy and integration work, and organic execution — blogs, citations, review velocity — lagged the paid launch by several weeks. That gap was the single biggest weakness in the first-month review. On a rebuild of this shape the content calendar and the citation work should start in week one and run in parallel with the build, not behind it.
Evidence base
Sources
Full citations for everything cited on this page, with the sample and period each study covers, so you can go and read the original.
Supplied by the client
- [1]
client-confirmed budget
Supports: Monthly paid media managed
Read from a live system
- [2]
Google Business Profile
Supports: Google rating, primary profile
Next
Start the same conversation
Start the same conversation
Tell us what you are working on and we will say plainly whether this is the right shape of engagement for it.