First-party data · February-March 2026
Five setters, the same two campaigns, and two very different bills
5 appointment setters each ran both of the same two campaigns across February-March 2026 -- same lists, same offer, same hours, same dialler -- and placed 8,319 dials between them. They booked 176 appointments and collected 375 do-not-call requests. Both of those numbers varied by more across the five seats than most buyers assume either one can.
The second number is the one no vendor publishes, and it is the one that does not grow back. A booking a setter fails to get is recoverable -- the record stays dialable and a better setter can work it next cycle. A do-not-call request is a permanent removal from a list the contractor paid for.
Recoverable
2.6x
spread in appointments per contacted homeowner, 2.0% to 5.3%
Permanent
3.5x
spread in do-not-call requests per dial, 1.8% to 6.4%
Read this before quoting anything below
This is a DISPERSION, not a correlation. The two extremes are far apart on every column, but the middle three do not order on the per-contact denominator, and dropping the single best setter -- the only one below 8 percent opt-out per contact -- makes the relationship vanish. Nothing here supports "worse bookers burn more list" as a rule.
The two denominators genuinely disagree, and the disagreement is not a rounding artefact. The lowest booker is also the highest opt-out generator, and the highest booker the lowest. The extremes oppose on this denominator. The lowest booker is fourth of five here, and the highest opt-out rate belongs to the third-best booker. The extremes do NOT oppose on this denominator. Same five people, same four integers, opposite answers -- purely from the choice of denominator. So every ordering claim on this page names the denominator it belongs to, and where a claim cannot survive both, it is not made.
The four dispersions
Each row is the range across the 5 setters, with the pooled cohort rate marked inside it. These are spreads over people, published as spreads: this page does not carry a per-setter table, for the reason set out under what this dataset refuses.
| Measure | What it is | Lowest | Highest | Spread | Pooled |
|---|---|---|---|---|---|
| Appointments booked, per contacted homeowner | What the seat produced | 2.0% | 5.3% | 2.6x | 4.2% |
| Do-not-call requests, per dial | What the seat destroyed | 1.8% | 6.4% | 3.5x | 4.5% |
| Do-not-call requests, per contacted homeowner | What the seat destroyed | 3.5% | 11.6% | 3.3x | 8.9% |
| Contacted homeowners, per dial | The input the other three sit on | 38.1% | 59.9% | 1.6x | 50.9% |
Cohort totals: 8,319 dials, 4,231 contacted homeowners, 176 appointments booked and 375 do-not-call requests across 5 setters and 2 campaigns. Every rate above is derived from those integers rather than copied, and each reconciles to the percentage the source document prints for itself within rounding.
Absent is not zero
Seven of the eleven published scorecards carry a do-not-call line: the five cohort setters and two others outside it. Four carry none at all. Those four are ABSENT from the opt-out figures on this page, never counted as zero -- their opt-out count is unknown, and an unknown rendered as a zero would invent the most flattering possible value for it.
11
published agent scorecards
7
carry a do-not-call line
4
carry none -- unknown, and reported as unknown
This site publishes a second, wider spread. Neither corrects the other.
Our roofing appointment-setting statistics publishes a booking spread across 11 agents that is wider than the one on this page. That is not a contradiction and this page is not a correction of it.
The eleven-agent spread is wider because it lets the campaign vary, so part of its width belongs to the campaign rather than to the person. This five-setter cohort holds the campaign fixed and measures only what is left. Neither figure corrects the other and they must not be presented as a revision.
How it was measured
- The cohort
- The five setters who ran BOTH of the same two campaigns across the same two months. Same lists, same offer, same hours, same dialler.
- The grain
- One scorecard per agent, each stating total calls, contact calls, appointments booked and -- for seven of the eleven -- do-not-call events.
- The corpus
- 10,794 outbound roofing appointment-setting calls placed Feb-Mar 2026, transcribed and analysed. See ccdocs-roofing-call-corpus.
- Why both denominators are safe to state
- A second internal document publishes per-dial totals for these same five setters that run 54 calls higher in aggregate. That is exactly the non-roofing plumbing list removed from the corpus (10,848 transcribed, 54 filtered, 10,794 analysed), so the two documents are one measurement either side of one documented filter rather than two sources that disagree.
What this data cannot see
- It is five people. Five is enough to show that seats differ by this much on identical work; it is nowhere near enough to establish a distribution, a median seat, or what is normal for anybody else. Do not read the ends of these spreads as best-case and worst-case for a hire.
- A do-not-call event is a REQUEST RECORDED BY THE SETTER, not an audited outcome. It counts what reached the disposition; it cannot count a homeowner who wanted off the list and did not say so, and it cannot distinguish a request caused by the approach from one that was coming regardless.
- The two campaigns are held fixed but the LIST WITHIN them was not randomised across setters. If the dialler handed systematically colder records to one seat, part of what looks like a person here is the list. Nothing in the source documents lets that be ruled out.
- It is one operation, one vertical and one fixed two-month window. There is no second call floor in this dataset, so nothing here establishes an industry rate for either column.
- It is all OUTBOUND cold dialling. Not one figure here describes how somebody who called US behaves.
- Bookings and opt-outs are counted; REVENUE is not. This page states that a removed record is a permanent loss of an asset the contractor paid for -- it does not price that loss, because the list cost and the lifetime value behind it are per-client figures and are not publishable here.
- Nothing refreshes it. It is a fixed window, deliberately: a dataset that silently re-derives itself lets a published figure change underneath a citation.
What this dataset refuses to publish
Listed rather than omitted. A reader who knows the source will look for the missing cut, and "we chose not to" is a stronger answer than silence.
- A per-setter row, on any column, under any label.
- facts.ts states the rule under ccdocs-agent-booking-rate-spread: only the anonymous spread and the blend leave the source file. The cohort is five people on one client's Q1 rota, so relabelling the rows setter-A..setter-E does not anonymise them -- call volume alone re-identifies the order to anyone with access to that rota. The spreads and blends on this page are the whole of what is publishable, and the module has no key a row could travel under.
- Any agent name, on-call alias or internal agent ID.
- The source scorecards carry real names and the aliases those people used on the phone, and the IDs resolve to real people in the dialler. They identify current or recent employees and none of them appears in this module, on the page, or in the published JSON.
- Any campaign code, client brand or per-campaign booking rate.
- Each campaign maps to one contractor, so a campaign code is a client identifier and a per-campaign rate is that client's own operating number. Only the two-campaign aggregate leaves the source file, and the campaigns are referred to by count alone.
- The source document's ranking prose and its tier labels for individual agents.
- Those are characterisations of identifiable employees written for an internal coaching document. They are defamation-shaped when published, and they do not become safe by being attached to an anonymised row, so none of that language travels here in any form.
- A significance statistic for any of these spreads.
- The extremes do survive a two-proportion test and src/__tests__/data/agent-variance.test.ts asserts it. It is not printed because src/data/number-provenance.ts has a closed derivation op set that cannot license a z-statistic, and a number the provenance system cannot check does not belong on a page whose whole claim is that its numbers are checkable.
- A correlation between booking rate and opt-out rate.
- It does not survive the choice of denominator. The extremes oppose per dial and do not oppose per contact, the middle three do not order, and dropping the best setter removes the relationship entirely. What is real is the dispersion in each column separately.
The figures on this page, with their sources
- Size of the ccdocs outbound roofing call corpus the first-party figures are measured on
- 10,794 outbound roofing appointment-setting calls placed Feb-Mar 2026, every one transcribed and analysed (10,848 transcribed in total; 54 belonged to a non-roofing plumbing list and were removed)
- apps/airoofing/files/10k_agent_scorecards.md (period, per-agent totals), apps/airoofing/files/10k_winning_vs_losing.md (roofing-filtered totals), apps/airoofing/roadmap.md (unfiltered totals) · 2026-Q1
- The controlled five-setter cohort behind the setter-variance benchmark, and why it is narrower than the 11-agent spread
- 5 appointment setters who each ran BOTH of the same two campaigns across Feb-Mar 2026: 8,319 dials, 4,231 contacted homeowners, 176 appointments booked and 375 do-not-call requests, with a pooled contact rate of 50.9% and a contact rate spread of 38.1% to 59.9% (1.6x) across the five
- apps/airoofing/files/10k_agent_scorecards.md, the 5 scorecards declaring the same two campaigns · 2026-Q1
- How much of the contractor list an individual setter permanently destroys, the column nobody publishes
- Across the same 5 setters, do-not-call requests run 1.8% to 6.4% of dials, a 3.5x spread, and 3.5% to 11.6% of contacted homeowners, a 3.3x spread; pooled, 375 of 8,319 dials is 4.5% and 375 of 4,231 contacts is 8.9%
- apps/airoofing/files/10k_agent_scorecards.md, the do-not-call line on each of the 5 cohort scorecards · 2026-Q1
- How much the individual setter moves BOOKINGS with the campaign held fixed
- Across the 5 setters who ran the same two campaigns, appointments per contacted homeowner range from 2.0% to 5.3%, a 2.6x spread; the pooled rate is 4.2% (176 of 4,231 contacts)
- apps/airoofing/files/10k_agent_scorecards.md, the 5 scorecards declaring the same two campaigns · 2026-Q1
Our own calculators do not yet use this
The agent headcount calculator and the campaign profitability calculator both take contact rate, appointments per contact and close rate as figures the user types in. Neither has a measured setter-variance input, so neither currently reflects anything on this page. Wiring a measured default into them is a separate piece of work and is stated here rather than implied.
Questions about this data
- How much does the individual appointment setter change the result?
- On identical work, by more than most buyers assume. Five setters ran both of the same two campaigns across February-March 2026 -- same lists, same offer, same hours, same dialler -- and placed 8,319 dials between them. Appointments per contacted homeowner ranged from 2.0% to 5.3%, a 2.6x spread, against a pooled 4.2%. Holding the campaign fixed is what makes that attributable to the person rather than to the list.
- What does a bad appointment setter actually cost a contractor?
- Two separate things, and only one of them is recoverable. The first is the booking that did not happen -- the record stays dialable and a better setter can work it next cycle. The second is a do-not-call request, which permanently removes a record from a list the contractor paid for, and no later performance recovers it. Across these five setters the second column ran 1.8% to 6.4% of dials, a 3.5x spread, and 3.5% to 11.6% of contacted homeowners, a 3.3x spread. Pooled, 375 of 8,319 dials ended in a permanent removal.
- Do the worst bookers burn the most list?
- That depends entirely on which denominator you use, which is why this page will not make the claim. Measured per dial, the extremes oppose: the lowest booker is also the highest opt-out generator. Measured per contacted homeowner, they do not -- the lowest booker is fourth of five, and the highest opt-out rate belongs to the third-best booker. The middle three do not order either way, and dropping the single best setter makes the relationship disappear. What the data supports is a dispersion in each column separately, not a correlation between them.
- How complete is the do-not-call measurement?
- Partial, and the gaps are stated rather than filled. Exactly 7 of the 11 published agent scorecards carry a do-not-call line: the 5 setters in this cohort plus two others outside it. The remaining 4 carry none at all, so their opt-out count is unknown and they are absent from every figure on this page. They are not counted as zero. A missing measurement rendered as a zero would invent the most flattering possible value for the exact column being published, which is the one error this dataset exists to refuse.
- Why is this spread narrower than the 11-agent one published elsewhere?
- Because they are different cohorts answering different questions, and neither corrects the other. The wider figure spans 11 agents across mixed campaigns, so part of its width belongs to the campaign rather than to the person. This cohort holds the campaign pair fixed and measures only what is left, which is why it is narrower and why it is the one attributable to the seat. Both are true of what they measure, and the smaller number here is not a revision of the larger one.
- Can I cite or reuse this data?
- Yes. It is published under CC BY 4.0 with a link back to this page, and the machine-readable version is at /outbound-agent-variance-benchmark.json. The window, the cohort rule, the integers behind every rate and every publication this dataset refuses are all on this page, so the figures can be checked rather than taken on trust. If you quote a do-not-call rate, quote the denominator it is a rate OF -- per dial and per contacted homeowner order the same five people differently, and that is the most important single fact on this page.
Cite it, or check it
Published under CC BY 4.0 with a link back to this page. The machine-readable version -- every spread, every pooled rate, the coverage caveat, every blind spot and every refusal -- is at /outbound-agent-variance-benchmark.json.
The rest of the research on this floor: what homeowners object to, when an outbound dial connects, and how fast inbound gets answered.
Talk to us about who is on your phones