How to Measure ROI on Local Advertising (Step by Step)
The simple ROI formula — and the honest one
Most operators learn the simple version first: ROI = (Revenue from ad − Ad spend) ÷ Ad spend. Spend $1,000, generate $4,000 in revenue, your ROI is 300%. It's clean, it fits on a whiteboard, and it's the version every agency deck reaches for. It's also the version that hides whether the channel is actually paying you.
The honest version replaces revenue with gross margin, because gross margin is the dollars you can spend acquiring the next customer. Honest ROI = (Gross margin from ad-sourced revenue − Ad spend) ÷ Ad spend. The same $1,000 spend producing $4,000 in revenue at 30% gross margin is $1,200 in margin — net of spend, that's $200, or 20% ROI. Same headline, very different decision.
For local service businesses, the second number is the one that survives the year. The HubSpot marketing-ROI methodology and Bain's widely-cited customer-economics work both anchor on margin-based returns for the same reason: revenue includes the cost of producing the job, and you can't bank revenue you spent on labor and materials. The free local-advertising ROI calculator on this site runs both versions side-by-side so you can see the gap on your own numbers.
Simple ROI: (Revenue − Spend) ÷ Spend. Useful as a sanity check; flatters every channel.
Honest ROI: (Gross margin − Spend) ÷ Spend. The number you can actually reinvest in next month's spend.
LTV:CAC ratio: Lifetime gross margin per customer ÷ fully-loaded acquisition cost. The compounding view — what a channel is worth across a full customer relationship, not a single job.
Five inputs you need from your CRM
If your CRM can't produce these five numbers per channel per month, the ROI math doesn't work — you're estimating, not measuring. Most service-business CRMs (Jobber, Housecall Pro, ServiceTitan) can produce all five with a couple of custom fields and a disciplined intake process.
The discipline that matters most is tagging the lead source at intake. If a customer-service rep types "website" or "Google" without specifying which campaign, the attribution chain collapses at step one. Lock the lead-source dropdown to the channels you actually buy.
Ad spend by channel. Media + production + agency fees, fully loaded. Pull from the platform billing console (Google Ads, Meta, LSA), the invoice (billboards, direct mail, radio), or the WilDi Maps spend ledger for CPVD.
Leads by channel. Inbound calls, form fills, chat, walk-ins. Tag at intake. Use call-tracking numbers per channel to anchor inbound calls to the source.
Close rate by channel. Closed jobs ÷ leads, per channel. Channels do not close at the same rate — Google LSA leads close higher than lead-marketplace leads, and that gap is the entire ROI argument for some operators.
Average ticket by channel. Mean revenue per closed job, per channel. Channels skew the buyer — Meta retargeting tends to produce smaller tickets than direct LSA intent leads, for example.
Gross margin and repeat rate. Margin per ticket (after labor, materials, fuel) plus the repeat-purchase share over a 12- and 24-month window. Repeat customers are the channel multiplier nobody tracks until they realize one channel was producing all the lifetime value.
Common ROI-measurement mistakes
Most ROI failures aren't measurement failures — they're definition failures. The math is fine; the inputs are wrong, or the time window is wrong, or the channel is being credited for revenue it never produced. Here are the four mistakes that account for most of the bad ROI calls operators make.
Counting revenue, not gross margin. The biggest one. A channel can look like 4x ROI on revenue and break-even on margin. If your service business runs 25–35% gross margins, the difference between revenue-ROI and margin-ROI is roughly a 3x distortion factor.
Ignoring repeat business and LTV. A first-job ticket on a recurring-service customer (HVAC maintenance, lawn care, pest control) understates the channel value. Bain's customer-economics framing — popularized by Reichheld in The Loyalty Effect — anchors why retention compounds: a 5% increase in customer retention can lift profitability 25–95% depending on category. Channels producing repeat customers deserve credit for the lifetime margin, not just the first job.
Attribution windows too short. Service-business consideration windows are not e-commerce windows. A roof replacement decision can take 60–90 days; an HVAC system replacement can take a full season. A 7-day click attribution window will systematically under-credit channels that build awareness ahead of intent.
Last-click bias. The channel that gets the last click before the form fill almost always over-indexes — branded search, retargeting, and direct traffic all benefit. The channels that built the awareness (Meta, CPVD, billboards if you run them) get systematically under-credited unless you adopt a multi-touch attribution model.
Per-channel attribution — what's easy, what's hard
Not every channel is equally measurable. Some channels generate native attribution events (a click, a form fill, a verified delivery); others rely on inferred lift (modeling, surveys, geo-holdouts). The honest read for an operator is that the easy channels deserve more weight in your ROI math than the hard ones, because the math itself is more trustworthy.
Below is the channel-by-channel attribution reality. Anything in the "easy" column is producing per-customer attribution your CRM can lock down. Anything in the "hard" column needs a layered approach (next section) or it gets credited based on belief, not data.
Attribution difficulty by channel
Channel
Native attribution
Difficulty
Recommended method
Google LSA
Pay-per-lead with caller ID
Easy
Platform reporting + CRM tagging
Google Search Ads
Click + conversion pixel
Easy
GA4 conversions + offline conversion import
Meta Ads
Click + Conversions API
Easy–Medium
Meta Pixel + CAPI for offline matching
WilDi Maps CPVD
GPS-verified delivery + claim
Easy
Per-delivery verification at the device
Lead marketplaces
Platform-native lead
Easy
Marketplace dashboard + close-rate tracking
Billboards / OOH
None
Hard
Geo-holdouts, vanity URLs, post-conversion survey
Radio (terrestrial)
None
Hard
Promo codes, vanity URLs, matched-market lift
Direct mail / EDDM
None
Medium–Hard
Per-campaign vanity URL + unique phone number
Vehicle wraps
None
Hard
Post-conversion survey only
Yard signs
None
Hard
"How did you hear about us?" at intake
The layered attribution model — what to actually do
No single attribution method is sufficient for a multi-channel local business. The mistake is picking one and trusting it; the fix is layering four methods so each one catches what the others miss. The CallRail and WhatConverts attribution playbooks both anchor on this layered approach for the same reason — different channels surface in different layers.
Run all four in parallel. The cost of running them is small relative to the cost of misallocating a $5,000–$50,000 monthly ad budget against ROI you're guessing at.
Call tracking with unique numbers per channel. CallRail, CallTrackingMetrics, or WhatConverts. Assign a unique tracking number to each channel (one for LSA, one for Meta, one per billboard, one per direct-mail piece, one per WilDi tunnel). Inbound calls route to your real line but get logged against the source. This is the single highest-leverage attribution upgrade most local businesses are missing.
Unique URLs and UTM tagging. Every digital channel gets a UTM-tagged landing URL. Every offline channel gets a vanity URL (e.g. yourcompany.com/storm or yourcompany.com/spring). Google Analytics 4 plus a server-side conversion import closes the loop from URL hit to closed job.
Post-conversion surveys. A "How did you hear about us?" question at intake or invoice. Imperfect — customers misremember the touch — but it captures awareness channels (vehicle wraps, yard signs, billboards, word-of-mouth) that nothing else captures. Build it into the workflow, not an afterthought.
Geographic A/B tests (geo holdouts). The Geo Holdouts methodology — popularized by Google's Marketing Mix Modeling and the open-source GeoLift framework — tests offline channels by running them in a treatment region and not running them in a matched control region. The lift in the treatment region is the channel's incremental impact. This is the only honest way to measure channels with no native attribution (radio, billboards, broad-reach DOOH).
The CPVD attribution advantage — verified delivery is its own attribution event
Cost Per Verified Delivery (CPVD) collapses the attribution problem at the source. The unit of spend is a GPS-verified delivery to a real driver phone — the delivery itself is the attribution event. There's no inferred impression, no modeled lift, no bid-stream attrition. Either the delivery happened on the device or it didn't.
WilDi Maps offers CPVD in three tiers because three different jobs need three different precision floors. From $0.20 (background) — tunnels and zones priced for hyper-local precision.
Tunnel — 1-mile road strip, hyper-local PREMIUM. Lease a corridor: a high-converting commuter route, an interstate exit, the road past your top competitor. Every verified driver-pass during your flight is a measured delivery, attributable to the tunnel and the moment.
Zone — 1-square-mile area, hyper-local PREMIUM. Lease an H3 hexagon area instead of a strip. Useful for neighborhood-level catchment, post-storm roof targeting, and dense service territories.
Background — $0.20 fixed, city-wide rotation. Brand awareness at the lowest verified-delivery rate in the product. From $0.20 (background) — tunnels and zones priced for hyper-local precision.
When to pause spend
The hardest discipline in local advertising is killing channels that aren't working before they bleed another quarter of budget. Most operators wait too long, either because they're hoping for a turnaround or because the agency keeps showing them flattering revenue-ROI numbers instead of margin-ROI numbers.
Use a fixed pause rule and apply it without sentiment. The rule is simple: a channel that misses CAC target for two consecutive months gets paused, redeployed, or restructured. The two-month window is long enough to absorb seasonality and short enough to prevent a $50K annual leak.
Set a CAC target per channel. Working backwards from LTV and a target LTV:CAC ratio (3:1 is the widely-cited Bain benchmark for healthy SaaS and service economics; some service categories work cleanly at 4:1–5:1 with strong retention).
Measure honest-ROI monthly. Margin-based, not revenue-based. Pull the five CRM inputs, run the formula, log the result.
Pause on two consecutive misses. Don't rationalize; redeploy. The redeployed budget goes to the channel above target, not to a new untested channel.
Re-test paused channels quarterly. Markets shift, creative gets stale, competitors leave. A channel that missed in Q1 may clear in Q3 — but only re-test once you have a hypothesis about what changed.
Operator takeaway
Run the numbers in the local-advertising ROI calculator first — it sets up the simple-vs-honest comparison and the LTV:CAC view in one screen. Then go pull the five CRM inputs for last month and rebuild the calc on your real data. The gap between what you thought you were earning and what the margin-based math says you were earning is usually the most expensive number in the business.
For the channel-level read on where to spend after you've audited, the best advertising for local service businesses in 2026 guide breaks down the four-channel mix that survives this audit. For the architectural alternative to estimated-impression channels, the Cost Per Verified Delivery guide covers how delivery-based attribution removes the modeling layer entirely.
The product
Three ways to deliver: tunnels, zones, background
WilDi Maps is not a single flat-rate product. You pick the tier that matches how local you need to be. All three are GPS-verified per claim — no auction, no exchange rake, no Middleman Tax.
Tunnel
1-mile road strip
Premium
Hyper-local, just-in-time
Lease a one-mile stretch. When a driver enters the strip, they get a just-in-time message — perfect for emergency services, on-route specials, and anything where being right there now beats brand awareness later.
Best for
· HVAC, plumbing, water restoration
· On-route specials (food, fuel, retail)
· Garage door, locksmith, urgent service
Zone
1-square-mile area
Premium
Hyper-local, area-based
Lease a one-square-mile block — not tied to a single road. Catches the residential cluster, retail district, or industrial park where your work actually lives. Same just-in-time delivery as tunnels; different geometry.
Best for
· Lawn care, pest control, pool services
· Tree services, landscaping
· Neighborhood-targeted retail
Background
City-wide rotation
$0.20
per claim, fixed
City-wide brand presence on rotation. Highest reach for the budget — best when familiarity beats precision. The $0.20 fixed rate is the only flat-rate tier WilDi sells.
Best for
· Restaurant brands, retail specials
· Veteran-owned trust signals
· Cross-vertical brand awareness
What the driver gets when an ad is claimed
Direct-drive turn-by-turn
If the driver wants to act on the ad, the app navigates them straight to the advertiser's location.
Website link
Click-through to any URL — ordering page, brand site, blog post, lead form.
App page
Open a specific page inside the WilDi app — promo details, daily specials, claim instructions.
See the full pricing breakdown on the pricing page.
Frequently asked questions
How do I calculate ROI on advertising?
The simple formula is <strong>(Revenue from ad − Ad spend) ÷ Ad spend</strong>. The honest formula — the one operators should use — is <strong>(Gross margin from ad-sourced revenue − Ad spend) ÷ Ad spend</strong>, because gross margin is what you can actually reinvest. For a service business with 30% gross margin, $1,000 in spend producing $4,000 in revenue is $1,200 in margin and $200 net — a 20% honest ROI, not the 300% the simple formula reports. Run both numbers in our <a href="/calculators/roi-local-advertising">local-advertising ROI calculator</a> to see the gap on your own data.
What's a good LTV:CAC ratio?
The widely-cited benchmark for healthy customer economics is <strong>3:1</strong> — every dollar of acquisition cost should produce three dollars of lifetime gross margin. Below 1:1 you're losing money on every customer. Between 1:1 and 3:1 you're underwater or barely surviving. At 3:1 you're healthy. Above 5:1 you're under-spending on acquisition and probably leaving growth on the table. Service businesses with strong recurring revenue (HVAC maintenance, pest control, lawn care) can target 4:1–5:1; one-time-job businesses (roofing, drain cleaning) often run cleanly at 3:1.
Are call-tracking numbers reliable?
Yes, for the channel-attribution job they're built for — assigning inbound calls to the source that produced them. CallRail, CallTrackingMetrics, and WhatConverts all use dynamic number insertion and call routing that reliably tags the source channel in your CRM. The accuracy gaps are mostly operator-side: not enough unique numbers (one per channel, not one for all paid), numbers being reused across campaigns, and missing CRM integration that re-merges the tracked call back into the customer record. Set up one tracking number per channel, integrate with the CRM, and the data is trustworthy.
Should I attribute revenue or gross margin?
Always gross margin. Revenue includes the cost of producing the job — labor, materials, fuel, vehicle wear — and you can't reinvest revenue you spent on cost-of-goods. For a service business with 25–35% gross margins, attributing on revenue overstates ROI by roughly 3x. The same channel that looks like 4:1 on revenue can be 1.3:1 on margin. The HubSpot ROI methodology and Bain's customer-economics framework both anchor on margin for the same reason: it's the only number you can compare to spend and reinvest into the next campaign.
How long should an attribution window be?
It depends on the consideration window of the purchase. For emergency services (plumbing leaks, lockouts, AC failures in summer), 1–7 days is fine — the buyer is searching now and converting now. For replacement-cycle services (HVAC system replacement, roofing, kitchen remodel), 30–90 days is more honest. For seasonal services (lawn care, snow removal), tracking has to span the off-season because the awareness moment and the purchase moment are months apart. The widely-used GA4 default of 30 days is a reasonable starting point; longer for high-ticket categories. Short windows under-credit awareness channels (Meta, CPVD, billboards if you run them) and over-credit last-click channels.
What's CPVD?
Cost Per Verified Delivery (CPVD) is a pricing model where you pay a fixed price per GPS-verified delivery to a real driver phone, not estimated impressions or auctioned clicks. WilDi Maps offers three tiers: tunnel (1-mile road strip, hyper-local PREMIUM), zone (1-square-mile area, hyper-local PREMIUM), and background ($0.20 fixed, city-wide rotation). From $0.20 (background) — tunnels and zones priced for hyper-local precision. Each delivery is verified at the device, so the delivery itself is the attribution event — no inferred impression, no modeled lift, no bid-stream attrition. Full architecture in <a href="/learn/cost-per-verified-delivery">Cost Per Verified Delivery</a>.
About this analysis
Written by Timm Ross, founder of WilDi Maps · Jacksonville-based · Veteran-owned. Sources are cited inline; we update the numbers when the underlying research updates.