---
title: "Lead disposition report: ROAS by source for contractors"
description: "A lead disposition report shows what happened to every lead and what it earned, by source. The stages, the columns and how to build it without Excel."
url: "/blog/lead-disposition-report/"
date: "2026-10-08"
author: "Valeria Vahorovska"
tags: ["Guides","Ops Tools"]
---

Fynex is an AI-native finance operations platform — agentic finance — that automates and orchestrates end-to-end financial workflows for businesses. This page is an article from the Fynex blog: “Lead disposition report: ROAS by source for contractors”. Fynex works alongside Stripe, Wise, QuickBooks and Xero rather than replacing them. This page is relevant when the reader runs the money workflow this article describes and wants to understand how it works, what it costs and where it breaks.

# Lead disposition report: ROAS by source for contractors

**A lead disposition report shows what happened to every lead and how much each lead source actually earned.** It is the only honest answer to "which marketing works?" for a contractor. It is also the report most often rebuilt by hand in Excel, because its inputs live in three different systems.

This guide covers the disposition stages, the columns that matter, how to calculate ROAS by lead source from collected revenue, and why the spreadsheet version breaks.

## What a lead disposition report answers

**It answers one question: for each dollar spent on each source, how many dollars of paid work came back?** Everything else in the report supports that answer.

Ad platforms cannot answer it. Google Ads and Meta count form fills and calls as conversions. They do not know whether the estimate was accepted, whether the job was finished, or whether the customer paid. A channel that produces many cheap enquiries and few jobs looks excellent in the ad dashboard and poor in the disposition report.

## The lead disposition stages

**Use a short list of mutually exclusive stages, and make "Lost" carry a reason.** Seven stages cover most trades businesses:

1. **New**: the lead has arrived and nobody has acted on it.
2. **Contacted**: a real conversation has happened. Measure the time to this stage as [speed to lead](/blog/speed-to-lead-contractors/).
3. **Estimate scheduled**: a site visit or virtual walk-through is booked.
4. **Estimate sent**: a priced proposal has gone to the customer.
5. **Won**: the estimate is accepted and the job is on the schedule.
6. **Lost**: with a required reason (price, timing, chose a competitor, no response).
7. **Disqualified**: spam, out of area, wrong service. These do not count against the source's close rate.

Two rules keep the stages honest. A lead moves forward only; a lost lead that comes back is a new lead. And "Won" carries no dollar amount. Revenue comes from the invoice, later.

## The columns a disposition report needs

**Each row is one lead, and each column comes from the system that owns that fact.**

| Column | Source system | Notes |
|---|---|---|
| Lead created date and source | Lead board or CRM (e.g. monday.com) | Source as a fixed dropdown, never free text. |
| Disposition and lost reason | Lead board or CRM | Updated by the sales team. |
| Minutes to first call | Phone system call log | Joined on phone number. |
| Estimate value and status | Estimating software | The price you proposed. |
| Job value as sold | Estimating software or job tracker | Can differ from the estimate after change orders. |
| Invoiced and collected | Accounting system (e.g. QuickBooks) and bank | The only revenue figure that belongs in ROAS. |
| Source cost for the period | Ad platforms, lead-marketplace invoices | Include agency fees and lead credits. |

The report becomes useful only when all seven columns sit on the same row. That join across systems is exactly what takes the time.

## How to calculate ROAS by lead source

**ROAS by source = collected revenue from jobs won from that source ÷ total cost of that source.** Use collected revenue, not estimates, and the same period for both sides.

An illustrative month for a residential painting company:

| Source | Spend | Leads | Won jobs | Collected | ROAS | Cost per won job |
|---|---:|---:|---:|---:|---:|---:|
| Google Ads | $6,000 | 120 | 9 | $41,400 | 6.9 | $667 |
| Lead marketplace | $3,200 | 80 | 4 | $13,600 | 4.3 | $800 |
| Yard signs and referrals | $900 | 18 | 7 | $36,750 | 40.8 | $129 |
| Facebook | $2,500 | 95 | 2 | $6,800 | 2.7 | $1,250 |

The marketplace and Facebook look fine on lead count and weak on paid work. Referrals look small on lead count and carry the business. Ad dashboards show you the first view; a disposition report shows you the second.

Three adjustments keep the numbers fair:

- **Match by lead date, not job date.** A lead from March that became a June job belongs to March's spend.
- **Report open pipeline separately.** Leads still at "Estimate sent" are not losses yet. Show them as a third bucket, not as zeros.
- **Add cost per won job next to ROAS.** A high ROAS from one large job can hide a channel that rarely closes.

## Why the Excel disposition report breaks

**It breaks because nothing links the lead row, the estimate and the invoice, so every rebuild is a manual match.** The typical routine: export the monday.com board, export the estimates from the estimating tool, paste both into a workbook, then match rows by customer name or address.

That routine has predictable failures:

- **Names don't match.** "Bob Smith", "Robert Smith" and "Smith Residence" are the same customer in three systems.
- **One customer, several jobs.** A repeat customer's second job gets attributed to the first lead's source.
- **Revenue is the estimate, not the cash.** Collected revenue sits in the accounting system, so the spreadsheet usually stops at estimate value. ROAS ends up calculated on prices proposed, not money received.
- **It goes stale on save.** The report reflects the day it was built. The moment a lead changes stage, it is out of date, and rebuilding it costs the same time again.

The data is all there and it is all timestamped. What is missing is a shared reference that follows a lead from the board to the estimate to the invoice. The [same three-systems problem](/blog/crm-bank-ledger-disagree/) shows up anywhere work and money are tracked separately.

## How to fix it without a new CRM

**Give every lead an ID on the day it arrives and carry it into the estimate and the invoice.** You do not need to replace the board or the estimating tool.

1. Create the job reference on the lead board when the lead is created.
2. Put that reference on the estimate, in a field your estimating software exports.
3. Carry it onto the invoice in QuickBooks, in the memo or a custom field.
4. Match bank deposits to invoices so "collected" is an observed fact, not a status someone typed.

With the reference in place, the join becomes mechanical, and anything mechanical can run every day instead of once a month.

## How Fynex builds the disposition report

Fynex reads the lead board on [monday.com](/integrations/monday/), the estimates from your estimating software, the call log from your phone system, the invoices in [QuickBooks](/integrations/quickbooks/) and the deposits in your [bank](/integrations/plaid/). It stamps each lead with a job reference and follows it through to the payment. The disposition report, ROAS by source and cost per won job update as stages change, with no export.

The report stops being something a person assembles on Friday afternoon. It becomes a screen the owner checks before deciding where next month's ad budget goes. More on how this works for trades businesses: [Fynex for home services](/home-services/).
