Technical Reference

CSM Assignment Engine — Scoring Algorithm

Four weighted capacity dimensions, one constrained assignment loop, and a deliberate human exception path.

← Back to Case Study
Document
Scoring algorithm reference
Provenance
Companion to the published CSM Assignment Engine case study
01

Assignment Logic

The Constrained Greedy Heuristic

The engine uses a custom greedy assignment loop that trades academic perfection for operational reality. Accounts are pre-sorted by complexity (descending), and capacity is re-calculated dynamically after every single assignment. This prevents the classic greedy pitfall of overloading the highest-performing reps with all the difficult accounts at once.

After each assignment, the next account goes to the CSM with the most remaining capacity — but capacity is re-evaluated each round, not static.

02

Formula Plate

Four-dimension scoring matrix

The engine evaluates each CSM's portfolio against four weighted dimensions to produce a composite capacity score.

35% · Volume — Proximity to Account Headcount Ceilings
volume_capacity = (max_accounts - current_accounts) / max_accounts
volume_score    = volume_capacity * 0.35

Tracks how close a CSM is to their account headcount cap. Closer to ceiling means less capacity for new accounts.

25% · ARR — Proximity to Financial Portfolio Caps
arr_capacity = (max_arr - current_arr) / max_arr
arr_score    = arr_capacity * 0.25

Capacity limits are anchored strictly to ARR, entirely ignoring TCV. TCV artificially inflates the perceived workload of multi-year deals. If an engine evaluates a 3-year deal at $100K ARR as $300K TCV, it instantly eats up rep capacity. When that CSM successfully renews for a standard 1-year term, the math incorrectly registers a massive retention penalty (100K/300K). Anchoring to ARR keeps workload grounded in present-day reality.

25% · Renewal Balance — Quarterly Distribution Smoothing
renewal_score = quarterly_renewal_headroom * 0.25

Ensures reps aren't buried in a single quarter. Prevents seasonal overload spikes by balancing renewal density across the year.

15% · Portfolio Risk — Turbulence Protection
health_score = (healthy_accounts / total_accounts) * 0.15

The current proportion of at-risk accounts in each CSM's book. Ensures reps with struggling portfolios aren't handed more turbulence.

Composite score
composite_score = (
  ((max_accounts - current_accounts) / max_accounts) * 0.35 +
  ((max_arr - current_arr) / max_arr) * 0.25 +
  quarterly_renewal_headroom * 0.25 +
  (healthy_accounts / total_accounts) * 0.15
)

Higher score = more remaining capacity = better candidate for new accounts.

03

Guardrails

Human judgment stays in the loop

The Bouncer Pattern (White-Glove Override)

Automation handles the bulk, but human intuition handles the exceptions. If the system detects a high-value "Enterprise Alert" account (top-tier segments under ~300 total accounts), the assignment loop halts. Enterprise accounts are flagged for manual leadership review and matched based on executive alignment and historical relationships; standard accounts continue through the automated greedy heuristic.

The New Hire Magnet

// New hires (0-2 months tenure) get flat volume boost
new_hire_score = 85  // flat score, not calculated

// Protected by Bouncer — can't take Enterprise accounts

Ramping reps need repetitions, not complex math. The flat score turns new hires into magnets for standard accounts until they hit their targeted ramp capacity. The Bouncer prevents them from taking Enterprise accounts.

04

Implementation Notes

Inputs, configuration, and audit history

Weights and caps are configurable per run via the Config module — no code changes required. All data sources normalize to a common key structure before scoring begins.

01

Totango API supplies account health, ARR, and renewal dates

02

Salesforce provides segment classification and unassigned account identification

03

Optional Glean enrichment resolves SFDC Account IDs for enrichment flows

04

All assignments go through staging → commit with full audit history