How to Measure ROI on Local Advertising (Step by Step)
Tunnel = a 1-mile stretch of road you own. Zone = a neighborhood-sized area of about 0.28 square miles that you own. Background = the whole member network, no geography limit. Full glossary
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, and the reason is arithmetic rather than authority: revenue includes the cost of producing the job, and you cannot bank revenue you already 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 of 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.
It is also worth knowing how much of the funnel sits after the lead and before the money, because that is the part no ad platform reports to you. Invoca's home-services benchmark, built from more than 70 million calls, finds 52% of inbound calls answered, 38% of answered calls qualifying as leads, and 45% of qualified leads booking a job. That is roughly 17% of calls becoming a booked job. Every one of those steps is yours to improve, and none of them is the channel's fault, which is exactly why close rate has to be measured per channel rather than assumed.
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, and the mechanics explain why: a lead marketplace sells the same homeowner to several contractors at once (Networx states a single Pay Per Lead goes to up to four contractors; Thumbtack caps a customer at five pros in the first four hours), so you are quoting against competitors on a lead you already paid for. Measure the gap on your own numbers rather than assuming it.
Average ticket by channel. Mean revenue per closed job, per channel. Channels skew the buyer, so track it rather than assuming the ticket is constant across sources.
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.
Inbound calls to home-services businesses that are answered
52%
Rises to 65% for calls over 15 seconds and 73% over 30 seconds; 70 million+ calls analysed
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 sit near break-even on margin. Run it on your own margin and the size of the distortion falls out of the arithmetic: at a 30% gross margin, the revenue-based number overstates the return by more than 3x.
Ignoring repeat business and LTV. A first-job ticket on a recurring-service customer (HVAC maintenance, lawn care, pest control) understates the channel value, because the second, third and fourth jobs arrive with no acquisition cost attached. The often-quoted figure that a 5% lift in retention raises profits by some large percentage traces back to 1990-era secondary retellings that we could not verify at source, so we do not quote a multiplier. The structural point stands without one: channels producing repeat customers deserve credit for the lifetime margin, not just the first job, and you can measure that yourself from your own repeat rate.
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. Different channels surface in different layers, which is the whole reason a single method always leaves a blind spot.
Run all four in parallel. Call tracking and UTM tagging cost tens of dollars a month; a post-conversion survey question costs nothing. Set that against a monthly ad budget you are otherwise allocating on a guess, and the arithmetic is not close.
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). Run the channel in one region and deliberately not in a matched control region; the difference in outcomes between them is the channel's incremental impact. Open-source tooling exists for the matching and the statistics (Meta's GeoLift library is the best known), but the idea works on a spreadsheet too. This is the only honest way to measure channels with no native attribution, which means radio, billboards and 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 person's phone while they're driving. 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 placement types because three different jobs need three different precision floors. The background rate is set by your monthly deposit rather than by an auction: $0.25 per delivery at Enterprise ($3,000 a month and up), $0.32 at Pro ($1,000 and up), $0.40 at Local ($250 and up), $0.50 at Starter below that. Tunnels and zones are priced above background for hyper-local precision, so treat $0.25 as a floor rather than a flat rate. One caution on the ROI math: a delivery is not a lead and not an impression, so put it in your model as a cost per verified reach and let your own claim and close rates carry it the rest of the way.
Tunnel: 1-mile road strip, hyper-local PREMIUM. Own a corridor: a high-converting commuter route, an interstate exit, the road past your top competitor. Every verified drive-by during your flight is a measured delivery, attributable to the tunnel and the moment.
Zone: neighborhood-sized area (about 0.28 square miles), hyper-local PREMIUM. Claim an H3 hexagon area instead of a strip. Useful for neighborhood-level catchment, post-storm roof targeting, and dense service territories.
Background: tier-based, city-wide rotation. Awareness at the account tier's headline rate: $0.25 at Enterprise, $0.32 at Pro, $0.40 at Local, $0.50 at Starter. Tunnels and zones cost more, so check the tier your monthly deposit actually qualifies for before you model the volume.
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 that a losing channel cannot quietly run for a year.
Set a CAC target per channel. Work backwards from LTV and a target LTV:CAC ratio. 3:1 is the ratio most operators plan against; treat it as a rule of thumb rather than a measured benchmark, because no source at our sourcing bar publishes one for local service businesses. Categories with strong recurring revenue can hold a higher ratio.
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, with no auction, no exchange rake, no Middleman Tax.
Tunnel
1-mile road strip
Premium
Hyper-local, just-in-time
Claim a one-mile stretch. When a member 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
0.28-square-mile area
Premium
Hyper-local, area-based
Claim 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
From $0.25
per claim, tier-based
City-wide brand presence on rotation. Highest reach for the budget; best when familiarity beats precision. Per-delivery rate drops by tier (Enterprise: $0.25 / Pro: $0.32 / Local: $0.40 / Starter: $0.50). See /pricing for the live rate card.
Best for
· Restaurant brands, retail specials
· Veteran-owned trust signals
· Cross-vertical brand awareness
What the member gets when an ad is claimed
Direct-drive turn-by-turn
If the member 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. That's 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 ratio most operators plan against is <strong>3:1</strong>: every dollar of acquisition cost should produce three dollars of lifetime gross margin. Be clear about what that number is, though. It is a rule of thumb that circulated out of software-company finance, not a measured benchmark for local service businesses, and no source at our sourcing bar publishes one for the trades. Used as a planning target it is still useful: below 1:1 you are losing money on every customer, and well above 5:1 you are probably under-spending on acquisition and leaving growth on the table. Businesses with strong recurring revenue (HVAC maintenance, pest control, lawn care) can hold a higher ratio than one-time-job businesses, because the second and third jobs carry no acquisition cost.
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. Work an example on your own margin: at a 30% gross margin, attributing on revenue overstates the return by more than 3x, and the same channel that looks like 4:1 on revenue can land near break-even on margin. There is no authority to appeal to here and none is needed. Margin is simply the only number you can both 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 an opted-in person's phone while they are driving, not estimated impressions or auctioned clicks. WilDi Maps offers three placement types: tunnel (1-mile road strip), zone (about 0.28 square mile area) and background (city-wide rotation). The background rate is set by your monthly deposit tier: $0.25 at Enterprise ($3,000 and up), $0.32 at Pro ($1,000 and up), $0.40 at Local ($250 and up), $0.50 at Starter. Tunnels and zones cost more, so $0.25 is a floor rather than a flat price. 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. Put it in your ROI model as a cost per verified reach, because a delivery is not a lead and not an impression. Full architecture in <a href="/learn/cost-per-verified-delivery">Cost Per Verified Delivery</a>.
What are the WilDi Maps plan tiers?
Four public tiers: Starter ($50 minimum deposit, background only), Local ($250, up to 2 tunnels and 1 zone), Pro ($1,000, up to 8 tunnels and 5 zones), and Enterprise ($3,000, up to 25 tunnels and 15 zones). Per-delivery background rates step down by tier, from $0.50 on Starter to $0.25 on Enterprise. An Agency tier is available through sales.
How much does it cost to start advertising on WilDi Maps?
The Starter tier opens with a $50 deposit, and that deposit becomes your ad budget. Background deliveries on Starter run $0.50 per verified delivery, so the first deposit buys 100 GPS-verified deliveries to the phones of real local people out on the road. There is no auction and no platform fee stacked on top.
What exactly counts as a verified delivery?
One verified delivery of your offer to the phone of one real person who was physically inside your chosen geography at that moment, confirmed by GPS on the device itself. That person also taps to acknowledge the offer, so a delivery is never an invisible impression. Bots, background tabs, and off-screen impressions cannot generate one. You are billed only when a verified delivery happens.
What is the difference between background, zone, and tunnel ads?
Background reaches everyone active in the WilDi app: nationwide by default, or limited to one area you choose (your city, your side of town) so budget is never spent outside it. A zone is a neighborhood-sized area you hold exclusively: while it is yours, no competitor can run there. A tunnel is a one-mile stretch of road you can place anywhere, and it follows the road's contours, ideal for the approach to your shop or a route your customers already drive.
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.