Skip to main content
The same calculation drives three surfaces, the Headcount calculator, the capacity strip on Horizon, and the Capacity headroom derived signal on the Watchlist. This document is the maths.

The core formula

Given your inputs:
  • V: weekly ticket volume (current)
  • g: weekly growth rate (% per week)
  • d: AI deflection rate (% of tickets resolved without humans)
  • N: number of agents
  • u: target utilisation cap (%)
Forepost computes:
human_now    = V × (1 − d/100)
max_per_agent = human_now / N / 0.84
team_cap     = max_per_agent × N × (u/100)
week_growth  = V × (g/100) × (1 − d/100)
breach_week  = max(0, ceil((team_cap − human_now) / week_growth))
If week_growth = 0 (no volume growth) breach is treated as stable (returned as 99 internally; rendered as “no breach”).

Why 0.84

The constant 0.84 is the implicit headroom inferred from your current state. It says: whatever utilisation you’re at right now, that corresponds to 84% of an agent’s true ceiling. So human_now / N / 0.84 is the per-agent throughput at full theoretical capacity. This is a heuristic. It assumes you’re not currently working agents past their cliff. If your team is at 95% utilisation today and CSAT is already crumbling, the model will overestimate ceiling. We chose this constant after testing against five reference workspaces; it works well in the 60-85% utilisation range that healthy teams operate in.

Hire-by date

hire_by_week = max(0, breach_week − 8)
Eight weeks is the assumed lead time to source, sign, and ramp a support hire. It’s a sensible default for most support roles in 2026; teams scaling fast might want to widen it to 10-12.

Cost model

monthly_cost = round(salary × 1.25 / 12)
annual_cost  = round(salary × 1.25)
The 1.25 multiplier covers benefits, payroll tax, tooling, and onboarding overhead. UK payroll-loaded; US figures may need a higher multiplier (typically 1.3-1.4 with healthcare).

What the chart shows

A 28-week projection drawn from these inputs:
  • Volume line (blue): V × (1+g/100)^w projected forward, deflection-adjusted to humans-only.
  • Current capacity line (red dashed): flat at team_cap.
  • +1 hire capacity line (green dashed): flat at max_per_agent × (N+1) × (u/100).
  • Hire-by marker: vertical at hire_by_week.
  • Breach marker: vertical at breach_week.
The instant the volume line crosses Breach, you’re past target utilisation. CSAT typically degrades 2-3 weeks after that point.

Where it falls short

  • Doesn’t model seasonality. A January spike vs a steady base looks the same.
  • Assumes constant deflection. If your AI rate is climbing, real breach is later than the model suggests.
  • No agent skill mix. Two agents handling the same volume can have very different effective throughput.
  • Doesn’t account for backlog burn-down. Capacity is allocated to inbound only.
The model is intentionally simple. The point is to make capacity visible, not to predict it to the day.

Where the model lives in code

Worker side: calcBreach(ws) in worker.js. SPA side: calcHC() in src/App.jsx. Both use identical maths.