Skip to main content
Strategy8 min read

How to Measure the Real ROI of Your Meta Ads (Stop Staring at CPL)

Cost per lead is the vanity metric every contractor stares at. It's also the wrong metric. Here's how to calculate the ROI that actually matters — and what to do when the number isn't what you hoped.

J
JadenFounder, Elev8 Operations
200+ contractor accounts managed8 min read · Updated 2026-05-10

If the only metric you watch is cost per lead, you'll make decisions that wreck your business. Here's the full ROI framework we use with 200+ contractors — and why staring at CPL misses the point.

The 4 Metrics That Actually Matter

Metric
What It Tells You
Target
Cost Per Lead (CPL)
How efficiently you're generating form submits
$10–$35 for home services
Lead → Booked Rate
How well your team converts leads to jobs
10–22% (varies by trade)
Cost Per Booked Job (CPBJ)
True acquisition cost
< 15% of avg. job value
Return On Ad Spend (ROAS)
Revenue ÷ ad spend
3–5× minimum

CPL alone is meaningless. A $15 lead that never closes is infinitely more expensive than a $40 lead that books a $10K job. Always pair CPL with close rate and job value.

The 'Cost Per Booked Job' Formula

This is the single most important metric. Calculation:

Cost Per Booked Job = (Monthly Ad Spend + Monthly Management Fees) ÷ Jobs Actually Booked That Month

If you spent $3,000 on ads + $1,500 on management this month and booked 30 jobs, your cost per booked job is $150. If those jobs averaged $3,000 revenue, you made $90,000 in revenue from $4,500 spent. Your ROI is 20x on the management + ad combo, or 30x on ad spend alone.

The Payback Period Question

For contractors with recurring revenue (maintenance plans, service agreements), customers are worth 2–5× the first job's value over their lifetime. Your 'real' cost per customer should account for this.

Trade
First Job
LTV (3-yr)
Multiplier
Roofing
$12,000
$12,500
1.04×
HVAC
$6,500
$18,000
2.77×
Pest Control
$300
$1,800
6.0×
Landscaping
$2,500
$8,000
3.2×
Plumbing
$800
$3,600
4.5×

For trades with recurring revenue, your break-even on a $200 cost-per-booked-job is way below the first invoice. You can afford to spend more aggressively on acquisition because lifetime value is higher.

What to Track Every Week

  • Total ad spend (Meta + any other platform)
  • Total leads generated (form submits only — not pageviews)
  • Total leads your team contacted within 1 hour
  • Total appointments / estimates scheduled
  • Total jobs actually booked (signed or deposit collected)
  • Total revenue from this week's booked jobs

How to Set Up Reporting Without a CRM

Google Sheet with 6 columns: Lead Date, Source (Meta / Google / LSA / Referral), Name, First-Contact Time, Booked (Y/N), Job Value. Fill it every day. At the end of the month, pivot by source. Simplest reporting system that tells you the truth.

When ROI Looks Bad — Diagnosis Sequence

If ROAS is under 3×, work through this checklist:

  • Is CPL too high? → Creative / audience / landing page problem
  • Is CPL fine but close rate < 10%? → Team / follow-up / qualification problem
  • Is close rate fine but job values dropping? → Offer / pricing problem
  • Is everything fine but ROAS still bad? → You have a math problem (look at margins, not revenue)

Most accounts don't need more leads — they need better attribution. 70% of contractors we audit can't tell you their real cost per booked job. Once they can, they stop making random budget-shift decisions.

Share
8 min read · Updated 2026-05-10

Frequent Questions. Short Answers.

Use your own. Meta's reported ROAS only counts events it can attribute (Pixel + CAPI). You'll see 2–3× higher numbers with your own calculation because you're counting phone calls, walk-ins, and referred customers that Meta never sees. Your own math is more honest — and usually more flattering.

Weekly spend + monthly ROAS review is the cadence. First full month gives you a directional read; month 2–3 gives you a stable one. If you're trying to judge profitability after 2 weeks, stop — the data isn't there yet.

Track with a 30-day / 60-day / 90-day booked window separately. Commercial work, full kitchen remodels, and anything $15K+ has a 45–90 day sales cycle. Attribute back to the lead date, not the booking date, so you're comparing ad spend from the right month.

Only if your close rate is constant and your job values are constant. It rarely is. Contractors who optimize purely on leads-per-dollar end up maximizing low-quality leads at the expense of real revenue.

Build a single source-of-truth spreadsheet (or use your CRM's source field). Every lead gets tagged: meta_ad / google_search / lsa / referral / directory / organic. Every closed job pulls revenue back to source. Run the math monthly: revenue / spend per source = source-level ROAS. The contractors who win at scale all do this — guessing 'I think Meta's working' is how money disappears.

Build a 'truth ratio' — divide your real-month booked jobs by Meta's reported leads for the same window. Most contractors find a ratio of 0.6 to 1.4. Below 0.6 means Meta over-counts (duplicate events, bot traffic, low-quality leads inflating the lead column); above 1.4 means Meta under-counts (iOS attribution loss, walk-in conversions Meta never saw, missing CAPI events). Once you know your ratio, multiply Meta's lead column by it to get a 'real lead' estimate that drives weekly budget decisions. Re-calibrate quarterly — Meta's tracking accuracy shifts with platform updates and your CAPI quality.

Different break-evens. Cold prospecting target: 3-4× ROAS — these are first-touch leads, expensive to acquire, but feed your funnel. Retargeting target: 6-10× ROAS — these are warm visitors who already know you, conversion is mechanical. If you blend the two and report a single ROAS number, you'll under-fund prospecting (looks unprofitable next to retargeting) and over-fund retargeting (it cannibalizes leads that would've come back anyway). Always report ROAS by funnel stage. Healthy contractor split at $5K+/mo: 70% prospecting (3-4× ROAS), 20% retargeting (6-10× ROAS), 10% top-of-funnel awareness (don't measure on ROAS — measure on cost per video view or cost per landing page view to your blog/guides).

Don't measure them on direct ROAS — measure them on contributory metrics that compound. Three metrics that matter: (1) BRAND SEARCH LIFT — track searches for your business name in Google Search Console; brand searches up 30-50% after 90 days of awareness ads is the win signal; (2) DIRECT TRAFFIC GROWTH — Google Analytics direct/typed-in traffic; should rise 20-40% as awareness builds; (3) RETARGETING POOL SIZE — your Custom Audience of website visitors should grow at the rate you're spending on awareness. Awareness spend pays back through retargeting + organic, not direct ad clicks. Budget rule: 10-15% of total Meta spend on awareness for businesses building long-term brand. Skip it if you're <$3K/mo total ad spend — at that size, every dollar should chase direct response.

Build a Looker Studio (free) dashboard pulling from three connectors: (1) META ADS connector — pulls spend, impressions, clicks, leads daily; (2) CRM connector (HubSpot/JobNimbus/etc native or Zapier) — pulls leads, opportunities, closed jobs daily; (3) GOOGLE ANALYTICS or your finance source — pulls revenue. Build 5 dashboard tabs: (1) Top-line — spend, leads, jobs, revenue this week vs last week; (2) Per-channel — Meta vs Google vs LSA vs referral, side-by-side cost-per-booked-job; (3) Trend — 90-day rolling CPL + ROAS by channel; (4) Per-creative — top 10 creatives by cost-per-booked-job (forces creative-level attribution); (5) Per-team-member — close rate by salesperson (so the math conversation starts with the right person). Set up auto-email weekly to yourself + key stakeholders. Total setup time: 6-8 hours one-time. Saves 20-40 hours/year vs manually reconciling reports. Most contractors who 'don't know their real ROAS' could fix that in one weekend of dashboard work.

Audience determines the framing, not the number. To INVESTORS/LENDERS: lead with TRUE blended cost-per-booked-job (including all hidden costs from /guides/meta-ads-cost FAQ), 90-day rolling trend, ROAS by funnel stage. They want conservative, defensible numbers — over-promising is how partnerships die. To YOUR INTERNAL TEAM: lead with CPL trends (what they can directly affect), creative-level performance (so they know which ads to make more of), and weekly variance flags (so they catch issues early). Don't show ROAS to the team — it's too abstract and they can't directly affect it. To VENDORS/AGENCIES: lead with target cost-per-booked-job + acceptable variance ranges — 'we'd consider $400 cost-per-booked-job profitable, anything over $600 needs a conversation.' Each audience needs the metrics that empower them to act, not the metrics that make YOU look good. Reporting same numbers to all three is how communication breaks down.

Use cohort-based ROI, not calendar-month ROI. The trap: contractors look at 'leads in March → revenue in March' and conclude their March spend was unprofitable, when actually March's revenue came from December's leads. Fix: track LEAD COHORTS, not monthly snapshots. Tag every lead with their submission month in your CRM. When the lead converts (4 months later), credit revenue back to the lead's submission month, not the conversion month. After 6-12 months, you have a clear picture of 'leads from March 2026 ultimately produced $X in revenue, vs $Y of ad spend in March 2026.' That's the real ROI for that month. Don't try to compute true ROI in real-time for long-cycle businesses — wait for the cohort to mature. Most contractors who say 'Meta isn't profitable' for remodeling work are looking at calendar-month math when they should be looking at cohort math.

Five-row daily Google Sheet. COLUMNS (left to right): (1) Date; (2) Meta Spend ($, manual entry from Ads Manager); (3) Leads received (auto-pulled from CRM via Zapier or manual); (4) Appointments scheduled (manual entry from CRM); (5) Closed jobs (manual entry); (6) Revenue ($, manual). At end of each row, calculate: CPL = column 2 / column 3; Cost-per-booked-job = column 2 / column 5; ROAS = column 6 / column 2. At top, build a 30-day rolling average pivot. Total setup: 30 minutes one-time. Maintenance: 5 minutes/day to fill rows. Better than fancy dashboards because: (1) you actually use it daily; (2) the act of filling it forces awareness; (3) no third-party connector breakages. Most contractors over-invest in beautiful dashboards they never look at; this ugly Google Sheet wins because friction is low + ownership is direct.

Banks want stability + repeatability evidence, not optimistic projections. Three documents to prepare: (1) 24-MONTH HISTORICAL spend + revenue trend by month — shows seasonality + growth pattern. Format as a simple chart with two lines (spend vs revenue), 24 data points; (2) UNIT ECONOMICS table — average CPL, close rate, average job value, cost-per-booked-job for the last 12 months. One row, six columns, easy to scan; (3) FORWARD MODEL — next 12 months projected at CONSERVATIVE numbers (worst-case month repeated, no growth assumption). Show monthly cash flow + cumulative profit. Bankers reward conservatism; over-promising + under-delivering kills future credit access. Avoid: showing best-case ROAS as 'expected,' projecting hockey-stick growth, including channels you're not actually running. Most contractors over-share + lose credibility; sharp, conservative + verifiable numbers win loan approvals + favorable terms. Have your accountant cross-check before submission.

Set RANGE-based quarterly targets, not single-point estimates. Three-row target template: (1) STRETCH (best-case) — 15-20% improvement vs prior quarter; reachable only if everything goes right; (2) EXPECTED — 5-10% improvement; what you should reasonably hit if execution is solid; (3) FLOOR — flat performance; the minimum acceptable result that wouldn't trigger an account-strategy rebuild. Document all three at start of each quarter; share with team + agency. At quarter-end: hitting STRETCH = celebrate + analyze what worked to repeat; hitting EXPECTED = stay course; hitting FLOOR = warning, diagnose; missing FLOOR = rebuild trigger. Most contractors set single-point targets ('we want 10% improvement') + then experience normal variance as failure. Range targets give you elastic accountability — celebrate when overperformance happens, escalate when underperformance happens, accept normal variance in the middle. The structure also keeps reviews honest — you can't claim 'we hit our goal' if you missed by 8% on a 10% target, but a 5-15% range gives appropriate flexibility for actual market conditions.

Track these as INDEX METRICS, not ROAS metrics. Three indirect-ROI signals that compound over 12-24 months: (1) RETARGETING POOL DEPTH — every blog visitor + video viewer joins your retargeting Custom Audience. The pool's size at end of year is a proxy for upper-funnel ROI: bigger pool = cheaper cost-per-booked-job from retargeting later; (2) BRAND-SEARCH GROWTH — track searches for your business name in Google Search Console month-over-month. Direct/typed traffic + brand searches up 30%+ year-over-year = your upper-funnel content is building name recognition; (3) ASSISTED CONVERSIONS in GA4 — leads who DIDN'T book on first visit but came back through Google search/direct after upper-funnel content exposure. The GA4 attribution model surfaces this. Don't measure upper-funnel content on direct ROAS; measure on these three downstream indicators. Most contractors abandon content marketing because 'it doesn't drive direct ROI' — same issue: wrong measurement window. The right framing: content is asset-building; ROI is measured 6-18 months out, not this month.

Want Us to Do It For You?

Book a free 30-minute strategy call. We'll apply everything in this guide to your business, for free.

Book My Free Strategy Call