First-party data · February-March 2026
950 roofing objections, sorted by how the call ended
Across 635 transcribed roofing conversations, 950 homeowner objections were logged across 20 types. Every appearance is labelled with the outcome of the conversation it came from, so the distribution can be split. Cost is the most raised objection on both sides of that split -- 28.6% of everything raised inside the conversations that booked, 22.3% inside the ones that were lost.
Whatever separates a booked roofing call from a lost one, it is not that the lost ones asked about money. What does separate them is further down the table, and it is not where the training decks put it.
What these shares are not
They are not a chance of booking, and they cannot be turned into one. The 635-conversation set is ENRICHED: booked calls are 33% of it against 2.0% of the 10,794-call corpus, an enrichment of about 17x. Nothing on this page is a population rate. What survives the enrichment is the composition INSIDE each cohort, because the enrichment changes how large the two cohorts are relative to each other and not what is in either one.
So every figure below is a share of ONE cohort's own objections. Read 30.0% beside "Not interested" as "30.0% of everything raised inside the lost conversations was this", never as a probability that a call goes badly. The two denominators are printed beside every table on this page for exactly that reason: 353 objections inside the booked cohort, 597 inside the lost one.
And the two cohorts are not symmetric. The booked side is 211 conversations against 212 booked calls in the whole corpus, so it is close to a census of every roofing call that booked in the window. The lost side is 424 calls that ran past 40 seconds and ended "not interested" -- a selected subpopulation with every hang-up excluded. It describes long lost conversations, not lost calls.
Finding one
Price is not the objection that loses the call
Cost or price is rank 1 by total appearances, and it is also rank 1 inside each cohort taken separately: 28.6% of the 353 objections raised inside conversations that booked, and 22.3% of the 597 raised inside conversations that were lost. A gap of 6.3 percentage points, on 234 appearances -- the largest row in the table, and one of the least informative about where a call is going.
The rows that DO separate the two cohorts are these. Booked-cohort share to the right, lost to the left, on one shared scale. Rows where the two agree within a percentage point are omitted from the chart and remain in the full table below.
Denominators: 597 objections inside 424 lost conversations, 353 inside 211 that booked. Bars share one scale so the two sides are comparable; neither is a rate over calls.
"Not interested" is the one row that behaves like a verdict. 30.0% of the lost cohort's objections against 5.9% of the booked cohort's -- a 24.1-point gap, on 200 appearances, and the widest in the table by a factor of more than two.
"Not right now" or call later runs the other way. 16.4% of the booked cohort against 6.7% of the lost one, on 98 appearances. A homeowner deferring and a homeowner refusing sound similar on a recording and sit at opposite ends of this table.
Most raised inside conversations that booked
- 1. Cost or price -- 28.6% (101 of 353)
- 2. "Not right now" or call later -- 16.4% (58 of 353)
- 3. "No damage" or no problems -- 14.7% (52 of 353)
Most raised inside conversations that were lost
- 1. "Not interested" -- 30.0% (179 of 597)
- 2. Cost or price -- 22.3% (133 of 597)
- 3. "My roof is fine" or a new roof -- 11.4% (68 of 597)
Finding two
A fifth of every objection raised sits below the top five
The five largest rows carry 747 of the 950 appearances, 78.6%. The remaining 15 rows carry 203 -- 21.4% of everything a homeowner said. A playbook built on the top five is a playbook with no answer prepared for a fifth of what it will hear, and the tail is where the rows with the most lopsided cohort splits live.
The whole table follows. Counts first, shares second, and the two rows too small to carry a share say so instead of showing a number.
| # | Objection | Total | In booked | In lost | Booked share | Lost share | Gap |
|---|---|---|---|---|---|---|---|
| 1 | Cost or price | 234 | 101 | 133 | 28.6% | 22.3% | +6.3 |
| 2 | "Not interested" | 200 | 21 | 179 | 5.9% | 30.0% | -24.1 |
| 3 | "No damage" or no problems | 110 | 52 | 58 | 14.7% | 9.7% | +5.0 |
| 4 | "My roof is fine" or a new roof | 105 | 37 | 68 | 10.5% | 11.4% | -0.9 |
| 5 | "Not right now" or call later | 98 | 58 | 40 | 16.4% | 6.7% | +9.7 |
| 6 | "Who is this?" or company name | 57 | 20 | 37 | 5.7% | 6.2% | -0.5 |
| 7 | "Too busy" or at work | 29 | 13 | 16 | 3.7% | 2.7% | +1.0 |
| 8 | Warranty questions | 21 | 10 | 11 | 2.8% | 1.8% | +1.0 |
| 9 | Spouse or partner decides | 15 | 12 | 3 | 3.4% | 0.5% | +2.9 |
| 10 | "Do not call" or remove me | 13 | 2 | 11 | 0.6% | 1.8% | -1.2 |
| 11 | Already have a roofer | 11 | 2 | 9 | 0.6% | 1.5% | -0.9 |
| 12 | Already had an inspection | 11 | 2 | 9 | 0.6% | 1.5% | -0.9 |
| 13 | Metal or tin roof | 9 | 6 | 3 | 1.7% | 0.5% | +1.2 |
| 14 | In the construction trade | 8 | 2 | 6 | 0.6% | 1.0% | -0.4 |
| 15 | Condo, HOA or apartment | 7 | 6 | 1 | 1.7% | 0.2% | +1.5 |
| 16 | Renter, not the owner | 6 | 0 | 6 | 0.0% | 1.0% | -1.0 |
| 17 | "How did you get my number?" | 5 | 3 | 2 | 0.8% | 0.3% | +0.5 |
| 18 | Insurance already handled | 5 | 3 | 2 | 0.8% | 0.3% | +0.5 |
| 19 | Selling or moving | 4 | 3 | 1 | n/a | n/a | n/a |
| 20 | Just bought the home | 2 | 0 | 2 | n/a | n/a | n/a |
| Total | 950 | 353 | 597 | 100% | 100% |
Shares are of each cohort's own objection total, not of calls. A row below 5 appearances publishes its counts and its rank but no share: one call would move it by more than the gap between most adjacent rows. Gap is booked share minus lost share, in percentage points.
What this page will not publish, and why
A reader who finds the source table will notice a column missing from every table above. Its absence is deliberate, and so is the absence of three other things a page like this is normally expected to claim.
The source table's "Book Rate" column, in-wins over total.
Its denominator is the enriched set, so every value in it inherits the enrichment. A reader would take a row as "this share of the homeowners who raise this objection go on to book", which overstates the truth by roughly an order of magnitude. No value from that column appears in the data module, on this page or in the published JSON.
Any merge with the sibling booked-calls-only objection table in the same directory.
It reads a different set and answers a different question -- it finds scheduling resistance to be the most common form -- so combining the two would produce counts that describe no population at all.
A campaign count, a campaign name, an agent name or a client name.
The source documents disagree about how many campaigns the corpus covers, and the per-campaign cuts map directly to individual clients. Only the anonymous aggregate leaves those files.
A chance of booking given any objection, on either cohort.
That quantity needs the objection profile of the calls this set excludes -- the hang-ups and the short refusals -- and no source document publishes it.
How it was measured
The corpus and the subset
Every call placed by the roofing appointment-setting campaigns across February-March 2026 was transcribed in full. The objection reading was done on a subset of 635 substantive conversations -- 211 that booked an inspection and 424 dispositioned "not interested" that ran longer than 40 seconds. The 40-second floor is what makes the lost side a SUBSET rather than a sample: a call that ends before anybody speaks carries no objection to count, so including it would have added rows of zeroes and moved every share.
The unit is an appearance, not a conversation
A conversation raising three objections is counted once in each of three rows, which is why 950 appearances sit on 635 conversations -- 1.50 each. It also means the rows do not partition the conversations and must never be rendered as a pie: they add to the appearance total, not to the call total.
Why within-cohort
A share computed across the two cohorts inherits the enrichment and is wrong by roughly an order of magnitude. A share computed inside one cohort does not, because the enrichment changes how large the cohorts are relative to each other rather than what is in either one. That is the entire reason this page publishes two columns instead of one, and it is enforced in code: the data module freezes the shape of an emitted row and throws at build time on anything else, so a rate across the cohorts has no key to travel under.
The window is fixed
February-March 2026, read on 2026-03-19. Nothing refreshes it. A dataset that silently re-derives itself lets a published figure change underneath a citation, so re-reading the transcripts would produce a new dataset with a new window rather than an update to this one.
Privacy
Aggregate only. The transcripts carry homeowner names, phone numbers and agent aliases; none of that is in the shipped dataset, which is twenty labels and four counts each. No agent, campaign or client is named, and the data module refuses to load a table whose labels are not exactly the twenty published here. The same rules govern the sibling outbound dial cadence benchmark, the inbound answer-rate benchmark and the setter variance benchmark, which publishes spreads and blends only for the same reason.
The measurements behind this page
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)
Source: 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)
An objection is the normal content of a real roofing conversation, not the signature of a lost one
In a 635-call set of substantive roofing conversations, 82% of the calls that booked and 78% of the calls that were lost contained at least one homeowner objection
Source: apps/airoofing/files/10k_objection_map.md, "Key Finding" (2026-Q1)
What roofing homeowners actually object to, ranked
Across 635 substantive roofing conversations, 950 objections were logged across 20 types, an average of 1.50 per conversation. The five most common were cost or price (234), "not interested" (200), "no damage" (110), "my roof is fine" or a new roof (105), and "not right now" (98). Of the 200 "not interested" objections, 21 occurred in a call that booked anyway.
Source: apps/airoofing/files/10k_objection_map.md, "Objection Types Ranked by Frequency" (2026-Q1)
Which objections separate a roofing call that booked from one that was lost
Splitting the same 950 objections by outcome gives 353 raised inside the 211 conversations that booked and 597 inside the 424 that were lost. Cost or price is the single most raised objection on BOTH sides -- 28.6% of the booked side (101 of 353) against 22.3% of the lost side (133 of 597). The widest divergence is "not interested", at 30.0% of the lost side (179 of 597) against 5.9% of the booked side (21 of 353); it inverts on "not right now", 16.4% booked (58 of 353) against 6.7% lost (40 of 597).
Source: apps/airoofing/files/10k_objection_map.md, "Objection Types Ranked by Frequency" (In Wins and In Losses columns); rendered and re-derived by src/data/roofing-objections.ts behind /roofing-objection-benchmark/ (2026-Q1)
What this dataset cannot see
- The lost cohort is 424 calls dispositioned "not interested" that ran longer than 40 seconds. It excludes hang-ups entirely, and 19 of a 40-call hang-up sample ended inside 15 seconds -- before an objection could physically be voiced. So the loss-side mix describes long lost conversations, not lost calls.
- The booked cohort is 211 conversations against 212 booked calls in the whole corpus, so that side is close to a census. The two sides are therefore not symmetric samples and must not be read as one.
- There are no timestamps. The corpus carries no record of WHEN inside a call an objection was raised, so nothing here supports a claim about first-minute objections or about objection order.
- An appearance is not a conversation. A single call can raise several objections and is counted once in each row it appears in, which is why the rows sum to more appearances than there are conversations.
- It is one operation, one vertical and one fixed window. There is no second call floor in this dataset, so nothing here establishes what is normal or good for anybody else.
- It is all OUTBOUND cold dialling. Not one figure here describes how somebody who called US behaves.
Using this data
Published under CC BY 4.0. Quote it, chart it, argue with it -- with a link back to this page, and with the cohort and the window attached to any figure you take from it. Every row above is also available as a JSON file, so it can be checked rather than retyped out of a table. If you run a roofing appointment-setting floor and can produce the equivalent split, that would make this comparable to something for the first time, and we would rather link to yours than be the only number in the room.
Questions
What do roofing homeowners object to most on an outbound call?
Cost. Across 635 substantive roofing conversations recorded February-March 2026, 950 objections were logged across 20 types, and cost or price is the largest at 234 appearances. The finding that matters is what happens when you split those appearances by how the conversation ended: cost is the most raised objection on BOTH sides, 28.6% of everything raised inside the conversations that booked and 22.3% inside the ones that were lost. Whatever separates a booked roofing call from a lost one, it is not that the lost ones asked about money.
Which objection actually predicts a lost call?
"Not interested", by a distance nothing else in the table approaches. It is 30.0% of every objection raised inside the lost cohort against 5.9% inside the booked cohort, a gap of 24.1 percentage points on 200 appearances. The mirror image is "Not right now" or call later, which runs the other way: 16.4% of the booked cohort against 6.7% of the lost one. A homeowner deferring is in a different conversation from a homeowner refusing, and the two are easy to hear as the same thing.
Does raising a price objection mean the call is lost?
No, and this dataset cannot tell you the opposite either. Cost leads both cohorts, so its presence carries almost no information about the outcome. What this page will NOT do is turn that into a chance of booking. The set behind it is enriched: booked calls are 33% of these 635 conversations against 2.0% of the 10,794-call corpus they were drawn from, roughly a 17-fold enrichment, so any rate computed across the two cohorts would overstate reality by about an order of magnitude. The source table carries such a column and it is deliberately absent from this page, from the data file behind it and from the published JSON.
How many objections does a real roofing conversation contain?
1.50 on average -- 950 appearances across 635 conversations. An objection is the normal content of a roofing conversation rather than the signature of a failing one: 82% of the calls that booked and 78% of the calls that were lost contained at least one. Those two numbers being within four points of each other is the single most useful thing in this dataset, and it is why the mix matters more than the count.
What are the limits of this data?
Three that change how any figure here should be read. The lost cohort is 424 calls dispositioned "not interested" that ran longer than 40 seconds -- it excludes hang-ups entirely, and 19 of a 40-call hang-up sample ended inside 15 seconds, before an objection could physically be voiced, so it describes long lost conversations rather than lost calls. The booked cohort is 211 conversations against 212 booked calls in the whole corpus, so that side is close to a census and the two are not symmetric samples. And there are no timestamps, so nothing here supports any claim about when inside a call an objection arrives.
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 of every row is at /roofing-objection-benchmark.json. The window, the source document, the cohort definitions, the counts behind every share and the rule deciding which rows publish a share are all on this page, so the figures can be checked rather than taken on trust. If you quote a share, quote the cohort it is a share OF -- these are shares of one cohort's own objections, never a chance of booking.
If you want this cut on your own calls
The reason we can publish this is that the calls are transcribed and the outcomes are attached to them. Most roofing operations cannot answer "what do our lost calls actually say" about their own floor at all, which means the rebuttals are inherited from whoever wrote the training deck. That is the conversation worth having, and it is cheaper to have before the list is burned than after.