{
  "name": "CCDocs roofing objection benchmark",
  "url": "https://ccdocs.com/roofing-objection-benchmark/",
  "license": "https://creativecommons.org/licenses/by/4.0/",
  "attribution": "The Call Center Doctors (ccdocs.com). CC BY 4.0 -- reuse freely with attribution and a link.",
  "cohortCaveat": "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.",
  "source": {
    "document": "apps/airoofing/files/10k_objection_map.md",
    "table": "Objection Types Ranked by Frequency",
    "analysedOn": "2026-03-19",
    "corpusCalls": 10794,
    "corpus": "10,794 outbound roofing appointment-setting calls placed Feb-Mar 2026, every one transcribed",
    "grain": "one row per objection type, counted by appearance rather than by conversation",
    "cohortCaveat": "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."
  },
  "window": {
    "corpusPeriod": "February-March 2026",
    "analysisDate": "2026-03-19",
    "temporalCoverage": "2026-02-01/2026-03-31"
  },
  "totals": {
    "appearances": 950,
    "inWins": 353,
    "inLosses": 597,
    "types": 20,
    "conversations": 635,
    "bookedConversations": 211,
    "lostConversations": 424,
    "perConversation": 1.5
  },
  "coverage": {
    "headRows": 5,
    "headAppearances": 747,
    "headSharePct": 78.6,
    "tailRows": 15,
    "tailAppearances": 203,
    "tailSharePct": 21.4
  },
  "objections": [
    {
      "rank": 1,
      "label": "Cost or price",
      "total": 234,
      "inWins": 101,
      "inLosses": 133,
      "winSharePct": 28.6,
      "lossSharePct": 22.3,
      "shareGapPct": 6.3,
      "shareWithheldReason": null
    },
    {
      "rank": 2,
      "label": "\"Not interested\"",
      "total": 200,
      "inWins": 21,
      "inLosses": 179,
      "winSharePct": 5.9,
      "lossSharePct": 30,
      "shareGapPct": -24.1,
      "shareWithheldReason": null
    },
    {
      "rank": 3,
      "label": "\"No damage\" or no problems",
      "total": 110,
      "inWins": 52,
      "inLosses": 58,
      "winSharePct": 14.7,
      "lossSharePct": 9.7,
      "shareGapPct": 5,
      "shareWithheldReason": null
    },
    {
      "rank": 4,
      "label": "\"My roof is fine\" or a new roof",
      "total": 105,
      "inWins": 37,
      "inLosses": 68,
      "winSharePct": 10.5,
      "lossSharePct": 11.4,
      "shareGapPct": -0.9,
      "shareWithheldReason": null
    },
    {
      "rank": 5,
      "label": "\"Not right now\" or call later",
      "total": 98,
      "inWins": 58,
      "inLosses": 40,
      "winSharePct": 16.4,
      "lossSharePct": 6.7,
      "shareGapPct": 9.7,
      "shareWithheldReason": null
    },
    {
      "rank": 6,
      "label": "\"Who is this?\" or company name",
      "total": 57,
      "inWins": 20,
      "inLosses": 37,
      "winSharePct": 5.7,
      "lossSharePct": 6.2,
      "shareGapPct": -0.5,
      "shareWithheldReason": null
    },
    {
      "rank": 7,
      "label": "\"Too busy\" or at work",
      "total": 29,
      "inWins": 13,
      "inLosses": 16,
      "winSharePct": 3.7,
      "lossSharePct": 2.7,
      "shareGapPct": 1,
      "shareWithheldReason": null
    },
    {
      "rank": 8,
      "label": "Warranty questions",
      "total": 21,
      "inWins": 10,
      "inLosses": 11,
      "winSharePct": 2.8,
      "lossSharePct": 1.8,
      "shareGapPct": 1,
      "shareWithheldReason": null
    },
    {
      "rank": 9,
      "label": "Spouse or partner decides",
      "total": 15,
      "inWins": 12,
      "inLosses": 3,
      "winSharePct": 3.4,
      "lossSharePct": 0.5,
      "shareGapPct": 2.9,
      "shareWithheldReason": null
    },
    {
      "rank": 10,
      "label": "\"Do not call\" or remove me",
      "total": 13,
      "inWins": 2,
      "inLosses": 11,
      "winSharePct": 0.6,
      "lossSharePct": 1.8,
      "shareGapPct": -1.2,
      "shareWithheldReason": null
    },
    {
      "rank": 11,
      "label": "Already have a roofer",
      "total": 11,
      "inWins": 2,
      "inLosses": 9,
      "winSharePct": 0.6,
      "lossSharePct": 1.5,
      "shareGapPct": -0.9,
      "shareWithheldReason": null
    },
    {
      "rank": 12,
      "label": "Already had an inspection",
      "total": 11,
      "inWins": 2,
      "inLosses": 9,
      "winSharePct": 0.6,
      "lossSharePct": 1.5,
      "shareGapPct": -0.9,
      "shareWithheldReason": null
    },
    {
      "rank": 13,
      "label": "Metal or tin roof",
      "total": 9,
      "inWins": 6,
      "inLosses": 3,
      "winSharePct": 1.7,
      "lossSharePct": 0.5,
      "shareGapPct": 1.2,
      "shareWithheldReason": null
    },
    {
      "rank": 14,
      "label": "In the construction trade",
      "total": 8,
      "inWins": 2,
      "inLosses": 6,
      "winSharePct": 0.6,
      "lossSharePct": 1,
      "shareGapPct": -0.4,
      "shareWithheldReason": null
    },
    {
      "rank": 15,
      "label": "Condo, HOA or apartment",
      "total": 7,
      "inWins": 6,
      "inLosses": 1,
      "winSharePct": 1.7,
      "lossSharePct": 0.2,
      "shareGapPct": 1.5,
      "shareWithheldReason": null
    },
    {
      "rank": 16,
      "label": "Renter, not the owner",
      "total": 6,
      "inWins": 0,
      "inLosses": 6,
      "winSharePct": 0,
      "lossSharePct": 1,
      "shareGapPct": -1,
      "shareWithheldReason": null
    },
    {
      "rank": 17,
      "label": "\"How did you get my number?\"",
      "total": 5,
      "inWins": 3,
      "inLosses": 2,
      "winSharePct": 0.8,
      "lossSharePct": 0.3,
      "shareGapPct": 0.5,
      "shareWithheldReason": null
    },
    {
      "rank": 18,
      "label": "Insurance already handled",
      "total": 5,
      "inWins": 3,
      "inLosses": 2,
      "winSharePct": 0.8,
      "lossSharePct": 0.3,
      "shareGapPct": 0.5,
      "shareWithheldReason": null
    },
    {
      "rank": 19,
      "label": "Selling or moving",
      "total": 4,
      "inWins": 3,
      "inLosses": 1,
      "winSharePct": null,
      "lossSharePct": null,
      "shareGapPct": null,
      "shareWithheldReason": "fewer than 5 appearances -- one call would move the share by more than the gap between most adjacent rows, so the counts are published and the shares are not"
    },
    {
      "rank": 20,
      "label": "Just bought the home",
      "total": 2,
      "inWins": 0,
      "inLosses": 2,
      "winSharePct": null,
      "lossSharePct": null,
      "shareGapPct": null,
      "shareWithheldReason": "fewer than 5 appearances -- one call would move the share by more than the gap between most adjacent rows, so the counts are published and the shares are not"
    }
  ],
  "shareRule": {
    "minTotalForShare": 5,
    "winShareDenominator": 353,
    "lossShareDenominator": 597,
    "note": "winSharePct is this objection as a share of every objection raised inside the booked cohort; lossSharePct is the same inside the lost cohort. Neither is a chance of booking. Rows below minTotalForShare publish counts and rank with null shares."
  },
  "divergence": [
    {
      "label": "\"Not interested\"",
      "winSharePct": 5.9,
      "lossSharePct": 30,
      "shareGapPct": -24.1
    },
    {
      "label": "\"Not right now\" or call later",
      "winSharePct": 16.4,
      "lossSharePct": 6.7,
      "shareGapPct": 9.7
    },
    {
      "label": "Cost or price",
      "winSharePct": 28.6,
      "lossSharePct": 22.3,
      "shareGapPct": 6.3
    },
    {
      "label": "\"No damage\" or no problems",
      "winSharePct": 14.7,
      "lossSharePct": 9.7,
      "shareGapPct": 5
    },
    {
      "label": "Spouse or partner decides",
      "winSharePct": 3.4,
      "lossSharePct": 0.5,
      "shareGapPct": 2.9
    },
    {
      "label": "Condo, HOA or apartment",
      "winSharePct": 1.7,
      "lossSharePct": 0.2,
      "shareGapPct": 1.5
    },
    {
      "label": "\"Do not call\" or remove me",
      "winSharePct": 0.6,
      "lossSharePct": 1.8,
      "shareGapPct": -1.2
    },
    {
      "label": "Metal or tin roof",
      "winSharePct": 1.7,
      "lossSharePct": 0.5,
      "shareGapPct": 1.2
    },
    {
      "label": "\"Too busy\" or at work",
      "winSharePct": 3.7,
      "lossSharePct": 2.7,
      "shareGapPct": 1
    },
    {
      "label": "Warranty questions",
      "winSharePct": 2.8,
      "lossSharePct": 1.8,
      "shareGapPct": 1
    },
    {
      "label": "Renter, not the owner",
      "winSharePct": 0,
      "lossSharePct": 1,
      "shareGapPct": -1
    },
    {
      "label": "\"My roof is fine\" or a new roof",
      "winSharePct": 10.5,
      "lossSharePct": 11.4,
      "shareGapPct": -0.9
    },
    {
      "label": "Already have a roofer",
      "winSharePct": 0.6,
      "lossSharePct": 1.5,
      "shareGapPct": -0.9
    },
    {
      "label": "Already had an inspection",
      "winSharePct": 0.6,
      "lossSharePct": 1.5,
      "shareGapPct": -0.9
    },
    {
      "label": "\"Who is this?\" or company name",
      "winSharePct": 5.7,
      "lossSharePct": 6.2,
      "shareGapPct": -0.5
    },
    {
      "label": "\"How did you get my number?\"",
      "winSharePct": 0.8,
      "lossSharePct": 0.3,
      "shareGapPct": 0.5
    },
    {
      "label": "Insurance already handled",
      "winSharePct": 0.8,
      "lossSharePct": 0.3,
      "shareGapPct": 0.5
    },
    {
      "label": "In the construction trade",
      "winSharePct": 0.6,
      "lossSharePct": 1,
      "shareGapPct": -0.4
    }
  ],
  "blindSpots": [
    "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."
  ],
  "refusals": [
    {
      "what": "The source table's \"Book Rate\" column, in-wins over total.",
      "why": "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."
    },
    {
      "what": "Any merge with the sibling booked-calls-only objection table in the same directory.",
      "why": "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."
    },
    {
      "what": "A campaign count, a campaign name, an agent name or a client name.",
      "why": "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."
    },
    {
      "what": "A chance of booking given any objection, on either cohort.",
      "why": "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."
    }
  ]
}
