{
  "name": "CCDocs outbound booking yield benchmark",
  "url": "https://ccdocs.com/outbound-booking-yield-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.",
  "question": "How many outbound dials does one booked appointment cost, and does the booking yield of a dial fall because deep-dialled prospects are worse or because fewer of them answer?",
  "answer": "One booked appointment cost 5,889 dials on this corpus. Booking yield falls 2.127x from attempt 1 to attempt 10, and that fall is 1.838x lost reach against only 1.158x lost conversation quality -- the deep dial is a rarer conversation, not a worse one, in 3 of the 4 campaigns large enough to test it.",
  "source": {
    "table": "the dialler's own call log",
    "grain": "one row per outbound dial attempt",
    "bookingLabel": "\"appointment booked\" -- a disposition a human agent selected on the call, never an automated verdict",
    "conversationLabel": "a dial the dialler recorded as answered by a person, with each campaign's own outcome definitions consulted before the system-wide ones",
    "readPath": "a read-only reporting copy of the call log, queried in aggregate only"
  },
  "window": {
    "start": "2026-06-01",
    "endExclusive": "2026-08-10",
    "completeWeeks": 10,
    "weekBoundary": "Monday to Sunday, whole weeks only, so no weekday is over-represented",
    "timezone": "America/New_York (the dialler's own clock; call_date is stored in it)"
  },
  "universe": {
    "dials": 7155062,
    "conversations": 304020,
    "contactRatePct": 4.249,
    "bookings": 1215,
    "dialsPerBooking": 5889,
    "bookingsPer10kDials": 1.698,
    "bookingsPer100ConversationsPct": 0.3996,
    "campaigns": 14,
    "campaignsThatBooked": 8,
    "unmappedStatusRows": 786,
    "unmappedStatusPct": 0.011
  },
  "exclusions": {
    "rationale": "Campaigns that are not outbound client appointment-setting dials. Listed with volume because a silent exclusion is indistinguishable from a measurement.",
    "campaigns": [
      {
        "reason": "blank campaign_id, zero human-answered, unattributable",
        "dials": 35599
      },
      {
        "reason": "call-progress test campaign, not client work",
        "dials": 47791
      },
      {
        "reason": "inbound queue (100% human-answered), different call direction",
        "dials": 3133
      },
      {
        "reason": "inbound queue (100% human-answered), different call direction",
        "dials": 657
      },
      {
        "reason": "inbound queue (100% human-answered), different call direction",
        "dials": 2101
      }
    ],
    "totalDialsExcluded": 89281
  },
  "classifierFree": {
    "bookingsPerDial": true,
    "dialsPerBooking": true,
    "bookingsPerConversation": false,
    "contactRate": false,
    "note": "Bookings and dials are both hard row counts, so bookings-per-dial carries no call-progress verdict and its LEVEL is publishable. Anything with conversations in the denominator inherits the classifier bias measured on this estate (its HUMAN class was wrong on 28 of 92 bridged calls) and only its RATIO between buckets survives."
  },
  "gate": {
    "maxTopContributorSharePct": 75,
    "minCampaignsAtLeast1kDials": 5,
    "minBucketDials": 100000,
    "rationale": "Every dial was placed for a client. A bucket one campaign dominates is that client's operating number wearing a pooled costume. Thresholds match scripts/dial-cadence/ exactly: two studies over the same corpus withholding on different thresholds would let a reader recover a withheld bucket by differencing them."
  },
  "coverage": {
    "emittedBuckets": 10,
    "withheldBuckets": 13,
    "emittedDials": 6141394,
    "withheldDials": 1013613,
    "emittedBookings": 1094,
    "beyondMaxAttemptDials": 55,
    "beyondMaxAttemptBookings": 0,
    "reconciles": true
  },
  "byAttempt": {
    "emitted": [
      {
        "bucket": 1,
        "dials": 1838012,
        "conversations": 89733,
        "bookings": 402,
        "bookingsPer10kDials": 2.187,
        "bookingsPer10kDialsCi95": [
          1.98,
          2.41
        ],
        "dialsPerBooking": 4572,
        "contactRatePct": 4.882,
        "bookingsPer100ConversationsPct": 0.448,
        "bookingsPer100ConversationsCi95": [
          0.4064,
          0.4939
        ],
        "campaignsAtLeast1kDials": 8,
        "topContributorSharePct": 73.05
      },
      {
        "bucket": 2,
        "dials": 1193579,
        "conversations": 63950,
        "bookings": 247,
        "bookingsPer10kDials": 2.069,
        "bookingsPer10kDialsCi95": [
          1.83,
          2.34
        ],
        "dialsPerBooking": 4832,
        "contactRatePct": 5.358,
        "bookingsPer100ConversationsPct": 0.3862,
        "bookingsPer100ConversationsCi95": [
          0.3411,
          0.4374
        ],
        "campaignsAtLeast1kDials": 8,
        "topContributorSharePct": 71.08
      },
      {
        "bucket": 3,
        "dials": 899316,
        "conversations": 43588,
        "bookings": 154,
        "bookingsPer10kDials": 1.712,
        "bookingsPer10kDialsCi95": [
          1.46,
          2.01
        ],
        "dialsPerBooking": 5840,
        "contactRatePct": 4.847,
        "bookingsPer100ConversationsPct": 0.3533,
        "bookingsPer100ConversationsCi95": [
          0.3018,
          0.4136
        ],
        "campaignsAtLeast1kDials": 8,
        "topContributorSharePct": 69.24
      },
      {
        "bucket": 4,
        "dials": 571621,
        "conversations": 25665,
        "bookings": 93,
        "bookingsPer10kDials": 1.627,
        "bookingsPer10kDialsCi95": [
          1.33,
          1.99
        ],
        "dialsPerBooking": 6146,
        "contactRatePct": 4.49,
        "bookingsPer100ConversationsPct": 0.3624,
        "bookingsPer100ConversationsCi95": [
          0.2959,
          0.4437
        ],
        "campaignsAtLeast1kDials": 9,
        "topContributorSharePct": 63.22
      },
      {
        "bucket": 5,
        "dials": 433016,
        "conversations": 17116,
        "bookings": 57,
        "bookingsPer10kDials": 1.316,
        "bookingsPer10kDialsCi95": [
          1.02,
          1.71
        ],
        "dialsPerBooking": 7597,
        "contactRatePct": 3.953,
        "bookingsPer100ConversationsPct": 0.333,
        "bookingsPer100ConversationsCi95": [
          0.2571,
          0.4312
        ],
        "campaignsAtLeast1kDials": 7,
        "topContributorSharePct": 57.55
      },
      {
        "bucket": 6,
        "dials": 336735,
        "conversations": 12577,
        "bookings": 43,
        "bookingsPer10kDials": 1.277,
        "bookingsPer10kDialsCi95": [
          0.95,
          1.72
        ],
        "dialsPerBooking": 7831,
        "contactRatePct": 3.735,
        "bookingsPer100ConversationsPct": 0.3419,
        "bookingsPer100ConversationsCi95": [
          0.2539,
          0.4602
        ],
        "campaignsAtLeast1kDials": 6,
        "topContributorSharePct": 55.42
      },
      {
        "bucket": 7,
        "dials": 269487,
        "conversations": 9121,
        "bookings": 33,
        "bookingsPer10kDials": 1.225,
        "bookingsPer10kDialsCi95": [
          0.87,
          1.72
        ],
        "dialsPerBooking": 8166,
        "contactRatePct": 3.385,
        "bookingsPer100ConversationsPct": 0.3618,
        "bookingsPer100ConversationsCi95": [
          0.2577,
          0.5077
        ],
        "campaignsAtLeast1kDials": 6,
        "topContributorSharePct": 54.6
      },
      {
        "bucket": 8,
        "dials": 226073,
        "conversations": 7233,
        "bookings": 26,
        "bookingsPer10kDials": 1.15,
        "bookingsPer10kDialsCi95": [
          0.78,
          1.69
        ],
        "dialsPerBooking": 8695,
        "contactRatePct": 3.199,
        "bookingsPer100ConversationsPct": 0.3595,
        "bookingsPer100ConversationsCi95": [
          0.2454,
          0.5262
        ],
        "campaignsAtLeast1kDials": 6,
        "topContributorSharePct": 55.81
      },
      {
        "bucket": 9,
        "dials": 198403,
        "conversations": 5929,
        "bookings": 21,
        "bookingsPer10kDials": 1.058,
        "bookingsPer10kDialsCi95": [
          0.69,
          1.62
        ],
        "dialsPerBooking": 9448,
        "contactRatePct": 2.988,
        "bookingsPer100ConversationsPct": 0.3542,
        "bookingsPer100ConversationsCi95": [
          0.2318,
          0.5409
        ],
        "campaignsAtLeast1kDials": 5,
        "topContributorSharePct": 52.74
      },
      {
        "bucket": 10,
        "dials": 175152,
        "conversations": 4652,
        "bookings": 18,
        "bookingsPer10kDials": 1.028,
        "bookingsPer10kDialsCi95": [
          0.65,
          1.62
        ],
        "dialsPerBooking": 9731,
        "contactRatePct": 2.656,
        "bookingsPer100ConversationsPct": 0.3869,
        "bookingsPer100ConversationsCi95": [
          0.2449,
          0.6108
        ],
        "campaignsAtLeast1kDials": 5,
        "topContributorSharePct": 49.92
      }
    ],
    "withheld": [
      {
        "bucket": 0,
        "dials": 155,
        "reasons": [
          "RULE A: one campaign is 85.2% of the bucket (max 75.0%)",
          "RULE B: only 0 campaigns contribute >= 1000 dials (min 5)",
          "RULE C: 155 dials is below the 100000 reporting floor"
        ]
      },
      {
        "bucket": 11,
        "dials": 83074,
        "reasons": [
          "RULE A: one campaign is 88.7% of the bucket (max 75.0%)",
          "RULE B: only 4 campaigns contribute >= 1000 dials (min 5)",
          "RULE C: 83074 dials is below the 100000 reporting floor"
        ]
      },
      {
        "bucket": 12,
        "dials": 78762,
        "reasons": [
          "RULE A: one campaign is 90.2% of the bucket (max 75.0%)",
          "RULE B: only 3 campaigns contribute >= 1000 dials (min 5)",
          "RULE C: 78762 dials is below the 100000 reporting floor"
        ]
      },
      {
        "bucket": 13,
        "dials": 90384,
        "reasons": [
          "RULE A: one campaign is 88.8% of the bucket (max 75.0%)",
          "RULE B: only 4 campaigns contribute >= 1000 dials (min 5)",
          "RULE C: 90384 dials is below the 100000 reporting floor"
        ]
      },
      {
        "bucket": 14,
        "dials": 93419,
        "reasons": [
          "RULE A: one campaign is 89.7% of the bucket (max 75.0%)",
          "RULE B: only 4 campaigns contribute >= 1000 dials (min 5)",
          "RULE C: 93419 dials is below the 100000 reporting floor"
        ]
      },
      {
        "bucket": 15,
        "dials": 87176,
        "reasons": [
          "RULE A: one campaign is 93.1% of the bucket (max 75.0%)",
          "RULE B: only 3 campaigns contribute >= 1000 dials (min 5)",
          "RULE C: 87176 dials is below the 100000 reporting floor"
        ]
      },
      {
        "bucket": 16,
        "dials": 84305,
        "reasons": [
          "RULE A: one campaign is 93.9% of the bucket (max 75.0%)",
          "RULE B: only 3 campaigns contribute >= 1000 dials (min 5)",
          "RULE C: 84305 dials is below the 100000 reporting floor"
        ]
      },
      {
        "bucket": 17,
        "dials": 92384,
        "reasons": [
          "RULE A: one campaign is 96.4% of the bucket (max 75.0%)",
          "RULE B: only 3 campaigns contribute >= 1000 dials (min 5)",
          "RULE C: 92384 dials is below the 100000 reporting floor"
        ]
      },
      {
        "bucket": 18,
        "dials": 92660,
        "reasons": [
          "RULE A: one campaign is 99.2% of the bucket (max 75.0%)",
          "RULE B: only 1 campaigns contribute >= 1000 dials (min 5)",
          "RULE C: 92660 dials is below the 100000 reporting floor"
        ]
      },
      {
        "bucket": 19,
        "dials": 88249,
        "reasons": [
          "RULE A: one campaign is 99.8% of the bucket (max 75.0%)",
          "RULE B: only 1 campaigns contribute >= 1000 dials (min 5)",
          "RULE C: 88249 dials is below the 100000 reporting floor"
        ]
      },
      {
        "bucket": 20,
        "dials": 85237,
        "reasons": [
          "RULE A: one campaign is 99.9% of the bucket (max 75.0%)",
          "RULE B: only 1 campaigns contribute >= 1000 dials (min 5)",
          "RULE C: 85237 dials is below the 100000 reporting floor"
        ]
      },
      {
        "bucket": 21,
        "dials": 72292,
        "reasons": [
          "RULE A: one campaign is 99.9% of the bucket (max 75.0%)",
          "RULE B: only 1 campaigns contribute >= 1000 dials (min 5)",
          "RULE C: 72292 dials is below the 100000 reporting floor"
        ]
      },
      {
        "bucket": 22,
        "dials": 65516,
        "reasons": [
          "RULE A: one campaign is 99.9% of the bucket (max 75.0%)",
          "RULE B: only 1 campaigns contribute >= 1000 dials (min 5)",
          "RULE C: 65516 dials is below the 100000 reporting floor"
        ]
      }
    ],
    "beyondMaxAttempt": {
      "maxAttempt": 22,
      "buckets": 10,
      "dials": 55,
      "bookings": 0,
      "note": "Attempts deeper than maxAttempt are not bucketed individually -- past this depth a single client campaign is effectively the whole bucket and the gate would withhold every one of them anyway. Their totals are carried here so emitted + withheld + this reconciles exactly to universe.dials; an unreconciled coverage figure is its own kind of false statement."
    }
  },
  "decomposition": {
    "spanFrom": 1,
    "spanTo": 10,
    "yieldRatio": 2.127,
    "reachRatio": 1.838,
    "qualityRatio": 1.158,
    "identity": "yieldRatio = reachRatio x qualityRatio, to rounding"
  },
  "robustness": {
    "question": "Does bookings-per-conversation fall with attempt number INSIDE a campaign, or only in the pool?",
    "bands": [
      "1",
      "2-3",
      "4-6",
      "7-10"
    ],
    "minConversationsPerBand": 500,
    "byCampaign": [
      {
        "campaign": "campaign-A",
        "shareOfCorpusPct": 56.97,
        "bands": [
          {
            "band": "1",
            "conversations": 60353,
            "bookings": 200,
            "bookingsPer100ConversationsPct": 0.3314,
            "ci95": [
              0.2886,
              0.3805
            ]
          },
          {
            "band": "2-3",
            "conversations": 71097,
            "bookings": 252,
            "bookingsPer100ConversationsPct": 0.3544,
            "ci95": [
              0.3134,
              0.4009
            ]
          },
          {
            "band": "4-6",
            "conversations": 29607,
            "bookings": 105,
            "bookingsPer100ConversationsPct": 0.3546,
            "ci95": [
              0.2931,
              0.4291
            ]
          },
          {
            "band": "7-10",
            "conversations": 12228,
            "bookings": 43,
            "bookingsPer100ConversationsPct": 0.3517,
            "ci95": [
              0.2612,
              0.4733
            ]
          }
        ],
        "chiSquare": 0.596,
        "df": 3,
        "p": 0.897398,
        "flatAcrossAttempts": true
      },
      {
        "campaign": "campaign-B",
        "shareOfCorpusPct": 28.78,
        "bands": [
          {
            "band": "1",
            "conversations": 15133,
            "bookings": 158,
            "bookingsPer100ConversationsPct": 1.0441,
            "ci95": [
              0.8941,
              1.2189
            ]
          },
          {
            "band": "2-3",
            "conversations": 17693,
            "bookings": 95,
            "bookingsPer100ConversationsPct": 0.5369,
            "ci95": [
              0.4395,
              0.6559
            ]
          },
          {
            "band": "4-6",
            "conversations": 13688,
            "bookings": 62,
            "bookingsPer100ConversationsPct": 0.453,
            "ci95": [
              0.3535,
              0.5802
            ]
          },
          {
            "band": "7-10",
            "conversations": 8870,
            "bookings": 41,
            "bookingsPer100ConversationsPct": 0.4622,
            "ci95": [
              0.3409,
              0.6264
            ]
          }
        ],
        "chiSquare": 53.513,
        "df": 3,
        "p": 0,
        "flatAcrossAttempts": false
      },
      {
        "campaign": "campaign-C",
        "shareOfCorpusPct": 5.51,
        "bands": [
          {
            "band": "1",
            "conversations": 4125,
            "bookings": 9,
            "bookingsPer100ConversationsPct": 0.2182,
            "ci95": [
              0.1148,
              0.4142
            ]
          },
          {
            "band": "2-3",
            "conversations": 6036,
            "bookings": 12,
            "bookingsPer100ConversationsPct": 0.1988,
            "ci95": [
              0.1138,
              0.3472
            ]
          },
          {
            "band": "4-6",
            "conversations": 4294,
            "bookings": 4,
            "bookingsPer100ConversationsPct": 0.0932,
            "ci95": [
              0.0362,
              0.2393
            ]
          },
          {
            "band": "7-10",
            "conversations": 2439,
            "bookings": 6,
            "bookingsPer100ConversationsPct": 0.246,
            "ci95": [
              0.1128,
              0.5357
            ]
          }
        ],
        "chiSquare": 2.782,
        "df": 3,
        "p": 0.426483,
        "flatAcrossAttempts": true
      },
      {
        "campaign": "campaign-D",
        "shareOfCorpusPct": 5.03,
        "bands": [
          {
            "band": "1",
            "conversations": 5321,
            "bookings": 15,
            "bookingsPer100ConversationsPct": 0.2819,
            "ci95": [
              0.1709,
              0.4646
            ]
          },
          {
            "band": "2-3",
            "conversations": 7379,
            "bookings": 22,
            "bookingsPer100ConversationsPct": 0.2981,
            "ci95": [
              0.197,
              0.451
            ]
          },
          {
            "band": "4-6",
            "conversations": 4743,
            "bookings": 10,
            "bookingsPer100ConversationsPct": 0.2108,
            "ci95": [
              0.1146,
              0.3877
            ]
          },
          {
            "band": "7-10",
            "conversations": 2413,
            "bookings": 4,
            "bookingsPer100ConversationsPct": 0.1658,
            "ci95": [
              0.0645,
              0.4255
            ]
          }
        ],
        "chiSquare": 1.795,
        "df": 3,
        "p": 0.616064,
        "flatAcrossAttempts": true
      }
    ],
    "pooled": {
      "bands": [
        {
          "band": "1",
          "conversations": 89733,
          "bookings": 402,
          "bookingsPer100ConversationsPct": 0.448
        },
        {
          "band": "2-3",
          "conversations": 107538,
          "bookings": 401,
          "bookingsPer100ConversationsPct": 0.3729
        },
        {
          "band": "4-6",
          "conversations": 55358,
          "bookings": 193,
          "bookingsPer100ConversationsPct": 0.3486
        },
        {
          "band": "7-10",
          "conversations": 26935,
          "bookings": 98,
          "bookingsPer100ConversationsPct": 0.3638
        }
      ],
      "chiSquare": 11.44,
      "df": 3,
      "p": 0.009568
    }
  },
  "blindSpots": [
    "The clock is the dialler's own, America/New_York. It is NOT the recipient's local time, and no claim about the called party's local hour may be made from this dataset.",
    "A booked appointment is not a sale, a kept appointment, or a signed contract. This study stops at the booking and says nothing about what happened afterwards -- the CRM outcome is not in this corpus.",
    "Attempt number is the count on the dial row, so a lead booked and removed on attempt 1 never appears at attempt 2. The deeper buckets are therefore a SURVIVING population, enriched in people who did not book earlier. That selection pushes the deep buckets DOWN, which means it runs against the finding that quality is flat rather than producing it.",
    "The window is 10 complete weeks of one summer. Roofing and solar demand is seasonal and this dataset cannot see a storm season it did not span.",
    "Campaigns are anonymised and their mix is not constant across attempt buckets, which is exactly why the quality question is re-run inside each campaign rather than trusted pooled."
  ]
}
