Skip to main content

    Construction & Contracting · the southern Appalachians · 6-month engagement

    Verified ResultReal client work. Every figure is measured in a named system and carries the window it was measured over.

    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

    1. 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.

    2. 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.

    3. 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.

    4. 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.

    5. 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.

    Two locations, two Google profiles, one lead-scoring model that tells the crew which job to call first — stackA stack of 10 connected layers, from "Single business record" through to "Reporting", each feeding the one below it.Single business recordLocation A page + GBPLocation B page + GBPPaid search + MetaSite formsSupabase edge functionJobTread job recordLead score: urgent / when-you-can / another-dayCrew queueReporting

    The sequence

    How it was delivered

    1. Weeks 1–2

      Strategy and integrations

      Analytics, pixels, CRM connection, baseline audit

      Owner: OmniFlow

    2. Weeks 2–5

      Site rebuild and address fix

      Per-location data, corrected addresses, forms to CRM

      Owner: OmniFlow

    3. Weeks 4–6

      Local search separation

      Both profiles renamed and repointed, Bing Places synced

      Owner: OmniFlow

    4. Weeks 3 onward

      Paid media

      Google Search live, Meta awareness, Performance Max held for video assets

      Owner: OmniFlow paid team

    5. Weeks 7–9

      Lead scoring

      Three-bucket model built and implemented in JobTread

      Owner: OmniFlow + client ops

    6. Week 6 onward

      Content cadence

      Weekly content calendar, blogs, one photo-led social post per working day

      Owner: OmniFlow + client

    7. 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

    Demo
    Business Profile performance
    Last 12 months

    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

    AprJunAugOctDecFeb

    Dashed line marks the month the engagement started.

    How customers searchSearchesShare
    Discovery — category, product or service8,22968.3%
    Direct — business name or address2,35319.5%
    Branded — related brand7236.0%

    Google Analytics 4

    Construction & Contracting · all web data

    Demo
    Acquisition overview
    Last 12 months vs. preceding period

    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

    AprJunAugOctDecFeb

    Dashed line marks the month the engagement started.

    Session default channel groupSessionsKey eventsRate
    Organic Search1,467714.8%
    Paid Search837253.0%
    Direct616172.8%
    Referral345133.8%
    Organic Social29193.1%

    LinkedIn Campaign Manager

    Sponsored Content · Construction & Contracting audience

    Demo
    Campaign performance
    Last 12 months

    Impressions

    105,866

    +24.6%

    Clicks

    757

    +27.1%

    CTR

    0.7%

    +0.21%

    Cost per lead

    $177.94

    -9.1%

    Impressions by month

    AprJunAugOctDecFeb

    Dashed line marks the month the engagement started.

    CampaignImpr.ClicksLeadsCPL
    Thought leadership — practice leads35,99425718$177.94
    Problem-aware — retargeting27,52519713$177.94
    Case study download23,29116711$177.94
    Webinar registration19,0561369$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.

    Every figure on this page, the system it is read from, and how it is defined
    FigureRead fromHow it is definedStatus
    Google rating, primary profileGoogle Business Profile InsightsSeptember 2026Published
    Monthly paid media managedGoogle Ads and Meta Ads Managerfrom June 2026Published
    Calls from Google Business ProfileGoogle Business Profile Insightscompare the 90 days after profile separation to the 90 beforeNot yet published
    Leads scored and routed in CRMJobTreadcount records carrying a score since the model went liveNot 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. [1]

      client-confirmed budget

      Supports: Monthly paid media managed

    Read from a live system

    1. [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.

    We use your details only to respond to this request. No lists, no resale.