Client anonymized at their request. Spend is pulled from the ad account. Revenue is reported by the contractor from closed jobs.
The contractor
A commercial roofing company in Alabama serving Alabama and Georgia: flat and low-slope roofs on warehouses, retail, churches, and industrial buildings, with a residential lane on the side. Before this, new work came from referrals and the occasional shared lead. Referrals are great until the phone stops ringing.
The problem
The contractor had tried buying leads. The pattern was familiar: a lot of homeowners, a lot of racing other roofers to the phone, and no way to know which leads actually turned into jobs. What they needed was a predictable source of commercial opportunities that they owned outright.
What was built
Ads on the contractor's own Meta account
We set up and run the ad account in the contractor's name. The creative that has carried the account is deliberately unglamorous: a side-by-side “replace vs. coat” comparison for aging flat roofs, a square-footage callout aimed at building owners, and photos of the contractor's real crew on real membrane roofs. Ads that spoke to homeowners were tested and cut. Ads that spoke to building owners were scaled.
A funnel that qualifies before it rings
Every ad sends the prospect to a single page with one job: capture the property type, the address, what the roof needs, and when. The page confirms whether the property is a home or a business and flags commercial leads for priority. The contractor knows what the job is before they dial.
A CRM that texts the lead in seconds
The moment a form is submitted, the contractor gets a text with the name, number, property, and the exact ad, ad set, and campaign that produced the lead. Every lead also lands in a CRM they can log into. When a job closes, it traces back to the ad that started it.
The results
Lifetime spend on the account is $6,341.29. The contractor reports more than $500,000 in roofing jobs closed from leads the system produced, a return of roughly 78 times ad spend. The single best-performing ad, the replace-vs-coat comparison, is still running today, refreshed periodically with new creative variants.
Two things made the number possible, and neither is the ad platform. First, the funnel filtered residential and unqualified traffic before it reached the contractor, so estimator time went to real commercial opportunities. Second, attribution let us turn budget toward the ads that produced closed jobs, not the ads that produced the cheapest clicks.
What we would tell another roofer
- Own the account. The audiences, the pixel data, and the winning ads on this account belong to the contractor, not to us.
- Qualify before the phone rings. Four questions on a landing page are worth more than any targeting setting.
- Judge on CRM numbers. The Meta pixel over- and under-counts. Closed jobs in the CRM are the only scoreboard.
- Speed wins. A text in seconds beats an email in an hour every time.
Get the same system in your state
We build this for one roofing contractor per state, and we guarantee it: $100,000 in new roofing jobs in your first 60 days, or you don't pay the retainer. Alabama is taken. Most other states are still open.
Find out if your state is still open.
Claim my state