Marketing attribution is where most service businesses get taken for a ride. Agencies report "leads" and "impressions" because those numbers always look good. What nobody tracks is whether your $5,000 in Google Ads this month generated the booked jobs that actually paid for it.

You don't need HubSpot. You don't need a $3,000/month marketing ops consultant. Here's the attribution stack that actually works for service businesses under $20M in revenue.

The three-layer attribution stack

Real attribution requires three layers working together: call tracking, link tracking (UTMs), and source capture in your CRM. Each layer catches a different kind of lead.

Layer 1: Call tracking (CallRail or similar)

80% of service-business leads come via phone. If you can't tie phone calls to campaigns, you have no attribution. Period.

How it works: CallRail assigns a unique phone number to each campaign (or each ad, or each landing page). When a customer calls the number on your HVAC Google Ads landing page, CallRail routes the call to your main office number and logs which campaign generated it.

Cost: $45/month for basic,

"What should my cost per lead be?" is the most common question we get from service business owners. The honest answer is: it depends heavily on your vertical, your intent mix, and what you count as a lead. Below are the CPL ranges we actually see across ~40 audited accounts in 2025–2026.

Important

CPL is a diagnostic metric, not a target. The metric that matters is cost per booked job — leads that don't convert to revenue aren't leads. Use the benchmarks below to check your account health, but manage your account to cost-per-booked-job.

CPL benchmarks by vertical

VerticalGood CPLCompetitive MarketTypical close rate
HVAC service call$30–$75$80–$15040–60%
HVAC installation lead$75–$150$150–$30015–30%
Dental (general)$80–$180$180–$30030–50%
Dental (emergency)$150–$300$300–$50055–75%
Dental (implants / cosmetic)$250–$500$500–$90010–20%
Legal (personal injury)$150–$450$450–$1,2008–15% to signed case
Roofing (repair)$75–$175$175–$35025–40%
Roofing (replacement)$150–$300$300–$60015–30%
Plumbing (emergency)$90–$180$180–$35050–70%
Plumbing (scheduled)$50–$120$120–$25025–45%
Pest Control (one-off)$40–$100$100–$20030–50%
Pest Control (subscription)$120–$250$250–$40015–30%
Auto Body$40–$120$120–$25030–50%
Equipment Rental (commercial)$75–$175$175–$40020–35%

"Good" means your account is well-managed in a typical metro. "Competitive Market" means your metro is contested (multiple national brands or agency-backed competitors actively bidding) and you'll pay the premium. Both ranges assume Google Ads with proper attribution, not Facebook brand-awareness campaigns (those have different CPL math).

The three variables that drive the spread

1. Keyword CPC

The most obvious driver. Your CPL is roughly click cost ÷ conversion rate, so high-CPC keywords translate directly. "Emergency plumber near me" at $60 CPC with a 10% landing page conversion rate = $600 CPL. "Plumbing maintenance" at $8 CPC at the same conversion rate = $80 CPL. Same vertical, 7.5x CPL delta.

2. Intent signals

Not all clicks have equal intent. "Emergency dentist" clicks convert at 20%+; "what is a dentist" clicks convert at 1%. Bad account management lumps these into the same ad group, which averages your CPL upward. Tight keyword-to-landing-page intent matching usually reduces CPL 30%+ before any other optimization.

3. Competitive density

Your competitors set the floor price. If Orkin, Terminix, and Rentokil all bid on "pest control Jacksonville," you cannot get clicks at 2024 prices. The operator who wins isn't the cheapest CPL — it's the one whose unit economics make a $200 CPL profitable because their LTV is $2,000.

CPL without LTV context is meaningless. A $400 CPL is excellent for personal injury law (case values of $50K+) and catastrophic for a $60 teeth-cleaning appointment. Your agency reports CPL without LTV context on purpose.

How to tell if your CPL is actually a problem

Run this math on your current account:

  1. Total ad spend last 90 days ÷ booked jobs last 90 days = cost per booked job
  2. Cost per booked job ÷ average first-year customer value = acquisition ratio
  3. Healthy service businesses: acquisition ratio of 15–30%
  4. Strong performers: 10–18%
  5. Danger zone: 35%+

If you can't complete this math because you don't track booked jobs back to campaigns, that's the real problem — not your CPL. Get attribution first, then optimize.

Four levers to cut CPL 25–40%

  1. Negative keyword expansion. Most service accounts have 10–50 negative keywords and need 300–800. Every "what is," "how to," "DIY," "near me part-time" gets a chunk of your wasted budget.
  2. Ad group tightening. If one ad group targets "emergency plumber" and "drain cleaning" and "water heater repair" with the same ad copy, quality scores drop and CPCs rise. One intent per ad group, one landing page per intent.
  3. Landing page specificity. Generic "Contact us for plumbing services" pages convert at 2–4%. Keyword-matched landing pages with the exact service + location convert at 8–15%. CPL drops 50%+ on the same traffic.
  4. Call tracking honesty. Many accounts are paying for broken phones, missed calls, or calls routed to voicemail. Call tracking data + honest staffing coverage often recovers 20–30% of existing lead flow.
45/month for advanced. Over 90%+ of our audited accounts that have CallRail either aren't using it fully or have it misconfigured.

What to track: Source (which campaign generated the call), Duration (calls under 30 seconds are usually not real leads), Transcription (modern call tracking auto-transcribes so you can audit quality).

Layer 2: UTM parameters on every non-call touchpoint

Email links, social posts, print QR codes - anything that isn't a phone call needs UTM parameters so Google Analytics knows where the traffic came from.

The 5 UTM parameters: utm_source (where - google, facebook, newsletter), utm_medium (how - cpc, email, social), utm_campaign (which - spring-sale, hvac-emergency), utm_content (variant - email-v2, banner-a), utm_term (keyword - only for paid search).

Example: yoursite.com/?utm_source=facebook&utm_medium=cpc&utm_campaign=spring-tune-up

Critical rule: Apply UTMs to paid channels. Never UTM your own internal navigation links - it breaks GA4 reports.

Layer 3: Source capture in intake

Ask every customer "How did you hear about us?" during intake. Capture the answer in a CRM field. This is the ground-truth check against what your tracking claims.

When tracked-source and self-reported-source disagree, self-reported is usually wrong (customers forget the specific touchpoint). But if they agree over time, you've validated your tracking. If they disagree wildly, your tracking is broken.

Connecting the layers end-to-end

The goal: every lead in your CRM has three data points - the campaign that generated it, the landing page they arrived on, and the booked-job outcome. Here's the flow:

  1. Visitor clicks a Google Ads link with UTMs → lands on a service page with a tracked phone number
  2. Visitor calls the tracked number → CallRail logs the call with campaign source, records transcript
  3. Office books the appointment in your CRM → intake form auto-populates source from URL params or CallRail webhook
  4. Booked job completes → revenue gets tagged back to the source in CRM reporting
  5. Monthly report pulls spend by campaign + booked revenue by campaign = true ROI per channel

The five attribution models and when to use each

ModelHow it worksGood for
Last-touchLast channel before conversion gets 100% creditShort sales cycles, single-touch decisions
First-touchFirst channel gets 100% creditAwareness-heavy content marketing
LinearEqual credit to every touchpointLong sales cycles (30+ days)
Position-based40% first, 40% last, 20% middleBalance of awareness + closing
Time-decayMore credit to recent touchesSubscription businesses

For most service businesses, last-touch is honest enough. The customer called from a Facebook ad, Facebook gets credit. The customer filled out a Google Ads form, Google Ads gets credit. Multi-touch attribution adds overhead that only pays off at scale.

If your current reporting doesn't tell you the cost per booked job for each campaign, you don't have attribution. You have a dashboard that shows numbers.

Common attribution failures (and fixes)

Failure: Same phone number on every page

Fix: Deploy dynamic number insertion - CallRail inserts a unique number per visitor session based on traffic source. Callers see the number but you get per-campaign attribution.

Failure: Form submissions aren't tagged

Fix: Add hidden fields capturing utm_source, utm_medium, utm_campaign from URL on every form. Most form builders (Typeform, Wufoo, Gravity Forms) support this natively.

Failure: GA4 shows traffic but your CRM doesn't

Fix: The form isn't passing UTMs to the CRM on submission. Check the form integration or use an integration tool like Zapier to pass fields through.

Failure: Revenue data lives in a separate system from leads

Fix: Monthly reconciliation. Export leads from marketing with source. Export booked revenue from billing/dispatch. Join on customer or appointment ID. Produces a monthly cost-per-booked-job by source report.

Tools we recommend for service-business attribution

Total attribution stack cost for most service businesses: $45-

"What should my cost per lead be?" is the most common question we get from service business owners. The honest answer is: it depends heavily on your vertical, your intent mix, and what you count as a lead. Below are the CPL ranges we actually see across ~40 audited accounts in 2025–2026.

Important

CPL is a diagnostic metric, not a target. The metric that matters is cost per booked job — leads that don't convert to revenue aren't leads. Use the benchmarks below to check your account health, but manage your account to cost-per-booked-job.

CPL benchmarks by vertical

VerticalGood CPLCompetitive MarketTypical close rate
HVAC service call$30–$75$80–$15040–60%
HVAC installation lead$75–$150$150–$30015–30%
Dental (general)$80–$180$180–$30030–50%
Dental (emergency)$150–$300$300–$50055–75%
Dental (implants / cosmetic)$250–$500$500–$90010–20%
Legal (personal injury)$150–$450$450–$1,2008–15% to signed case
Roofing (repair)$75–$175$175–$35025–40%
Roofing (replacement)$150–$300$300–$60015–30%
Plumbing (emergency)$90–$180$180–$35050–70%
Plumbing (scheduled)$50–$120$120–$25025–45%
Pest Control (one-off)$40–$100$100–$20030–50%
Pest Control (subscription)$120–$250$250–$40015–30%
Auto Body$40–$120$120–$25030–50%
Equipment Rental (commercial)$75–$175$175–$40020–35%

"Good" means your account is well-managed in a typical metro. "Competitive Market" means your metro is contested (multiple national brands or agency-backed competitors actively bidding) and you'll pay the premium. Both ranges assume Google Ads with proper attribution, not Facebook brand-awareness campaigns (those have different CPL math).

The three variables that drive the spread

1. Keyword CPC

The most obvious driver. Your CPL is roughly click cost ÷ conversion rate, so high-CPC keywords translate directly. "Emergency plumber near me" at $60 CPC with a 10% landing page conversion rate = $600 CPL. "Plumbing maintenance" at $8 CPC at the same conversion rate = $80 CPL. Same vertical, 7.5x CPL delta.

2. Intent signals

Not all clicks have equal intent. "Emergency dentist" clicks convert at 20%+; "what is a dentist" clicks convert at 1%. Bad account management lumps these into the same ad group, which averages your CPL upward. Tight keyword-to-landing-page intent matching usually reduces CPL 30%+ before any other optimization.

3. Competitive density

Your competitors set the floor price. If Orkin, Terminix, and Rentokil all bid on "pest control Jacksonville," you cannot get clicks at 2024 prices. The operator who wins isn't the cheapest CPL — it's the one whose unit economics make a $200 CPL profitable because their LTV is $2,000.

CPL without LTV context is meaningless. A $400 CPL is excellent for personal injury law (case values of $50K+) and catastrophic for a $60 teeth-cleaning appointment. Your agency reports CPL without LTV context on purpose.

How to tell if your CPL is actually a problem

Run this math on your current account:

  1. Total ad spend last 90 days ÷ booked jobs last 90 days = cost per booked job
  2. Cost per booked job ÷ average first-year customer value = acquisition ratio
  3. Healthy service businesses: acquisition ratio of 15–30%
  4. Strong performers: 10–18%
  5. Danger zone: 35%+

If you can't complete this math because you don't track booked jobs back to campaigns, that's the real problem — not your CPL. Get attribution first, then optimize.

Four levers to cut CPL 25–40%

  1. Negative keyword expansion. Most service accounts have 10–50 negative keywords and need 300–800. Every "what is," "how to," "DIY," "near me part-time" gets a chunk of your wasted budget.
  2. Ad group tightening. If one ad group targets "emergency plumber" and "drain cleaning" and "water heater repair" with the same ad copy, quality scores drop and CPCs rise. One intent per ad group, one landing page per intent.
  3. Landing page specificity. Generic "Contact us for plumbing services" pages convert at 2–4%. Keyword-matched landing pages with the exact service + location convert at 8–15%. CPL drops 50%+ on the same traffic.
  4. Call tracking honesty. Many accounts are paying for broken phones, missed calls, or calls routed to voicemail. Call tracking data + honest staffing coverage often recovers 20–30% of existing lead flow.
45/month
(just CallRail, everything else is free or already owned). That's 10-20x cheaper than HubSpot's Marketing Hub Pro and delivers the attribution service businesses actually need.