Marketing attribution template for contractors
Track which lead sources actually produce booked jobs and revenue, not just calls. This template maps every channel from Google Ads to call tracking to your CRM booking data so you can shift spend toward what works and stop paying for clicks that never pick up a phone.
Free template
Most contractors know what they spend. Few know what each channel actually books.
Picture a typical HVAC owner reviewing the monthly ad report. Google Ads: $8,400 spent. The agency says impressions are up. But the CRM shows 61 booked jobs for the month, and nobody can tell you how many of those came from Google, from the Yelp listing, from the neighborhood mailer, or from the referral network. So every channel gets renewed, and the one that is quietly booking 40 jobs for $60 a pop stays buried inside an average. A marketing attribution template for contractors fixes that. It connects each lead source to the jobs it produced and the revenue those jobs generated, so spend decisions rest on booking data, not ad-platform click counts. This page gives you the full template layout, a filled-in channel example, a step-by-step guide, and the point at which a manual spreadsheet stops being enough. Examples throughout are illustrative; your own channel mix, booking rates, and revenue per job will vary.
Warning
Data visibility gap: ad platform clicks are not booked jobs
Google Ads reports impressions, clicks, and form submissions. Your CRM reports booked calls and closed jobs. Between the click and the calendar there is a booking rate, an abandonment rate, and sometimes a CSR who books calls from three different channels into the same job type. Without a template that bridges both systems, you are measuring marketing by the metric that flatters it, not by the revenue it creates.
Build it in a spreadsheet
The marketing attribution template layout
Recreate this layout in a spreadsheet with one row per lead source. The goal is a single view of every channel: what it cost, how many leads it sent, how many of those turned into booked jobs, what revenue those jobs produced, and the cost per booked job. That last column is the one that earns its keep: it translates impressions into dollars and reveals the cheapest channel for actual work booked.
- Channel: the lead source name, written consistently so it matches your CRM and call tracking (Google Ads, LSA, Yelp, HomeAdvisor, Referral, etc.).
- Spend: total dollars paid to that channel in the period (ad budget, listing fees, mailer cost).
- Leads: raw inbound contacts attributed to that channel (calls, forms, chat).
- Booked jobs: leads that became a scheduled job in your CRM.
- Booking rate: booked jobs divided by leads; the efficiency signal between spend and output.
- Revenue: what those booked jobs produced after the work closed.
- Cost per booked job (CPBJ): spend divided by booked jobs; the single number that ranks channels by real productivity.
Attribution formula
Cost per booked job = channel spend / booked jobs from that channel
Run this formula for every channel in the same reporting period. The result ranks your marketing by the one output that matters to an operator: jobs on the calendar. A channel with a low click cost but a poor booking rate can cost more per booked job than a channel with a high click cost and a strong CSR conversion. The formula surfaces the difference.
Use the same date range for spend and booked jobs. Multi-touch attribution (one customer touching multiple channels) requires a judgment call; for most home-service companies, last-touch attribution by call tracking or form source is a practical starting point.
Attribution template columns and what to put in each
| Column | Source of the data | Why it matters |
|---|---|---|
| Channel | Your ad platforms, call tracking tags, and CRM lead-source field | Consistent naming is the whole game; one spelling per channel across every system |
| Spend | Ad platform billing, listing invoices, or mailer cost for the period | Includes agency fees if you outsource that channel; otherwise CPBJ is understated |
| Leads | Call tracking system or ad platform form count, filtered by channel tag | Count only bookable contacts; spam, existing customers calling back, and internal calls distort the rate |
| Booked jobs | Your CRM, filtered by lead source and booking date | This is the bridge between marketing and operations; if your CRM does not store lead source, attribution is guesswork |
| Booking rate (%) | Booked jobs divided by leads, calculated in the template | A low booking rate can mean a weak channel or a CSR skill gap; knowing which requires the data to be separated |
| Revenue | Your CRM or QuickBooks, summed for jobs attributed to that channel | Use completed and invoiced jobs only; proposals that did not close are leads, not revenue |
| Cost per booked job (CPBJ) | Spend divided by booked jobs, calculated in the template | The ranking metric: lower CPBJ and higher revenue per job is the combination you want more of |
Filled-in sample attribution report (illustrative, HVAC residential)
| Channel | Spend | Leads | Booked jobs | Booking rate | Revenue | CPBJ |
|---|---|---|---|---|---|---|
| Google Ads (search) | $5,800 | 74 | 51 | 69% | $24,990 | $114 |
| Local Services Ads | $2,100 | 38 | 34 | 89% | $16,660 | $62 |
| Yelp | $1,400 | 22 | 11 | 50% | $3,850 | $127 |
| Referral / word of mouth | $0 | 18 | 17 | 94% | $9,010 | $0 |
| Door hanger mailer | $800 | 9 | 6 | 67% | $1,980 | $133 |
Info
Owner takeaway: the Local Services Ads row is the one to double
In the sample above, Local Services Ads produce a $62 cost per booked job with an 89% booking rate. Google Ads produce a $114 CPBJ at 69%. Both are acceptable numbers, but the LSA channel converts nearly nine in ten leads it touches. If that holds over two or three more months, it earns a larger share of the budget. Yelp and the door hanger sit above $125 CPBJ and below 70% booking rate: not automatic cuts, but the numbers that need a month-by-month review before renewal. This is the decision the template makes visible.
How to read channel health in the attribution template
There is no universal benchmark for cost per booked job; it varies by trade, market, seasonality, and average ticket. Use these signals to read relative health across your own channels. Mark each channel good, watch, or poor based on your targets, not industry averages.
- CPBJ below your target and booking rate above 80%Protect this spend first. A high booking rate means the calls are qualified and the CSR team is converting them.Good
- Current
- Channel is efficient
- Target
- Company-set
- CPBJ near your target but booking rate below 65%A dip in booking rate from this channel will push CPBJ above target quickly. Investigate whether the lead quality or the CSR handling is the issue before cutting spend.Watch
- Current
- Efficiency is fragile
- Target
- Company-set
- CPBJ above target for two or more consecutive monthsTwo months is a pattern, not a blip. Either the channel quality has shifted, the market has gotten more competitive, or your offer is stale. A second month at poor is a decision point.Poor
- Current
- Channel underperforming
- Target
- Company-set
- Lead source field blank in CRM for more than 10% of booked jobsYou cannot attribute what you cannot read. Missing lead source data makes the whole template unreliable. Fix the CRM field before adding more channels.Poor
- Current
- Attribution gap
- Target
- Under 5% missing
| Metric | Current | Target | Status |
|---|---|---|---|
| CPBJ below your target and booking rate above 80%Protect this spend first. A high booking rate means the calls are qualified and the CSR team is converting them. | Channel is efficient | Company-set | Good |
| CPBJ near your target but booking rate below 65%A dip in booking rate from this channel will push CPBJ above target quickly. Investigate whether the lead quality or the CSR handling is the issue before cutting spend. | Efficiency is fragile | Company-set | Watch |
| CPBJ above target for two or more consecutive monthsTwo months is a pattern, not a blip. Either the channel quality has shifted, the market has gotten more competitive, or your offer is stale. A second month at poor is a decision point. | Channel underperforming | Company-set | Poor |
| Lead source field blank in CRM for more than 10% of booked jobsYou cannot attribute what you cannot read. Missing lead source data makes the whole template unreliable. Fix the CRM field before adding more channels. | Attribution gap | Under 5% missing | Poor |
How to set up the attribution template, step by step
01 List every active channel and assign a tracking tag
Write down every way a new customer can contact you: paid search, LSA, Yelp, Facebook, HomeAdvisor, door hangers, truck wraps, referral. Assign a consistent label to each one. That label must match exactly across your call tracking system and your CRM lead-source field. Mismatched names are the most common reason attribution data is wrong.
02 Set up call tracking by channel
Most inbound leads for home-service companies are phone calls. A call tracking platform (like CallRail or similar) assigns a unique number to each channel so the source follows the call into your CRM. Without channel-level call tracking, all phone leads look the same and the attribution template is at best a partial picture.
03 Pull spend and lead volume on the same cadence
Monthly is the practical minimum for most channels. Use the same date range for spend and for leads: if your ad platform invoices on the 1st, pull booked-job data for the same calendar month. Mismatched periods create phantom CPBJ numbers that lead to wrong decisions.
04 Count only bookable contacts in the lead column
Strip out spam, existing customers calling about a warranty, and internal calls before you calculate booking rate. Unfiltered call counts inflate lead volume and deflate booking rate, making average channels look worse than they are.
05 Calculate CPBJ and rank channels
Divide each channel's spend by its booked jobs. Rank from lowest to highest CPBJ. The top of the list is where more budget earns the most jobs; the bottom is where you need a reason to keep spending. Review this ranking monthly and track the direction of each channel over time, not just the snapshot.
06 Review out loud with your marketing lead and GM
The attribution template is a conversation tool, not just a spreadsheet. Walk each channel row in your monthly marketing review: what changed, what the CPBJ trend is, and what the next decision is. A ranking nobody discusses is as useful as a report nobody opens.
Warning
When the spreadsheet template stops working
A manual attribution spreadsheet works until three things collide. First, you add a new channel mid-month and forget to backfill the tracking tag, so the next month's booked-job count is split between the new label and 'unknown'. Second, the person who owns the spreadsheet leaves or gets busy in peak season and the template goes three months without an update. Third, you open a second location and the channels overlap: one Google Ads account, two service areas, two CRM lead sources. At that point you are not tracking attribution, you are arguing about which tab has the right number.
What attribution looks like running in real time
A datacube marketing board consolidates lead source data from call tracking, your CRM, and connected ad platforms into a live view by channel. Instead of pulling the numbers manually each month, the attribution table updates as calls and bookings land. Figures below are illustrative; a real board is built around your channel mix, targets, and data sources.
Illustrative tiles for layout reference. A live datacube marketing board is custom-built around your actual channels, CRM, call tracking, and ad platform connections.
Marketing attribution template FAQs
See your lead-source attribution running live
The template shows you the structure. A datacube marketing board runs that same attribution logic automatically: spend, leads, booked jobs, and CPBJ by channel, live from your CRM and call tracking. In a demo we walk your actual channels and show you what the marketing board would look like for your business.
Keep exploring
Related
Go deeper
