Recovery intelligence for lending and receivables

Predict the wobble. Shape the call. Keep the book.

One system, two lenses over the same decision. The Risk Lens picks who to contact and when. The Coach Lens shapes what happens once someone answers. The outcome of that conversation is the label that retrains both.

How much do you want?
Deeper settings reveal method and caveats in place, rather than on another page.
of delinquent accounts return to current with no contact at all. Calling them costs money and irritates people who were already going to pay.
more recovered value than risk-ranking at the same agent capacity, using roughly half the contacts.
median gap between speakers in a real call. An LLM cannot compose inside it, so the coaching design does not pretend to.

01The window closes faster than the queue moves

Conventional collections starts working an account once it is properly delinquent, and sorts the list by probability of default. Both halves of that are expensive.

Sorting by probability ignores how much money is on each account. A borrower 40% likely to worsen owing €168,000 outranks one 95% likely owing €2,000. Risk-ranking gets that backwards every time.

And the clock is unforgiving. Half of accounts one month behind cure on their own. One month later that has collapsed, and the dominant move is deeper delinquency. The month where a conversation is cheap and effective is the month before most systems are even looking.

These transition rates are computed from the panel itself: every month-to-month move of every loan, not a published industry average.

Where an account sits next month, given where it sits today. Real month-to-month transitions across panel rows.
02

One borrower, end to end

Six decisions, in the order the system makes them. Scroll, and the panel keeps up.

01risk lens
Risk Lens · L1

The trajectory bends

Not "is this borrower risky" but "is this borrower's path changing". L1 reads the trailing window (arrears direction, peak, balance movement) and returns a calibrated probability that the next ninety days are worse than the last.

Calibration, not ranking, is the gate: an agent reads the number and acts on its face value, so a model that ranks perfectly and is badly calibrated is worse than useless here.

Risk Lens · L2

Would they have fixed it themselves?

Most delinquents self-cure. Contacting them spends the most expensive resource in the business on someone who was already going to pay, and annoys them while doing it. So "do not contact" is a scored action with money attached, not the absence of a decision.

Risk Lens · allocator

Is the minute worth it?

The allocator maximises expected recovered value per agent-minute: uplift over self-cure, weighted by exposure, under a hard capacity constraint. It is the only thing in the system allowed to produce a queue.

The advantage is largest exactly where real operations live, which is to say when capacity is scarce. Give it enough agents to call everybody and the edge disappears, which is the honest shape of the result.

Coach Lens · borrower state

What do we actually know about them?

Capacity is estimable from a payment trajectory. Willingness is not, at least not without a conversation. Most accounts do not reach a confident quadrant from servicing data alone.

So the system does not guess a strategy. It supplies the one question that separates cannot-pay from will-not-pay. Teaching an agent what to ask beats telling them what to say when the model does not know.

Coach Lens · live

The hint has to fit in the gap

Measured from real call audio: the median gap between speakers is under half a second. Deterministic hints render in a fraction of a millisecond and land inside it. LLM-composed hints take 500–1500 ms and are demoted to the next pause rather than dropped on top of the agent mid-sentence.

The two-tier design is not an architectural preference. It is what the gap distribution permits.

The loop

The promise becomes the label

A promise to pay is captured with an amount, a date and a method, then resolved against what actually arrived. Kept or broken, that outcome retrains the risk models and promotes or demotes the coaching strategy that produced it. Every decision carries its experiment arm and propensity, or the retrain refuses to run.

03

What the evidence actually says

Every figure below is regenerated by the pipeline and carries the kind of evidence behind it. Hover a badge to see its source.

Value-ranking beats risk-ranking, most where it matters

The edge is at fifteen percent of full-coverage capacity, and far larger when capacity is tighter.

The risk score means what it says

L1 reliability against the diagonal. Brier against a base rate of .

The latency budget was measured, not chosen

real turn boundaries. are wide enough for a hint at the budget; only could fit a 500 ms LLM.

The models drift, and the monitor catches it

Self-cure rose from to across the split. The ranking held; absolute calibration lagged, because no model calibrates to a regime shift it never saw.

Every chart, interactive, with its method →

04There is a person on the other end

This is software that decides who gets a phone call about money they do not have. That is not a neutral act, and the design treats it as a constraint rather than a footnote.

Not contacting is a first-class outcome. The allocator scores silence against money, so leaving someone alone has to earn its place, and frequently does.

The coach has a boundary. Hints only fire at real turn gaps, never mid-sentence, and the strategy corpus is seeded from collections practice with every entry visibly marked as having zero outcome support until real results promote it.

Guardrails are stop conditions, not reports. Complaint rate, broken-promise rate and repeat-contact rate halt the pilot rather than appearing in a monthly deck.

Not contacting someone is a decision with a price on it, and it wins on its merits more often than the industry admits.

Quiet, bending, behind, recovering, quiet again. An account moves through phases the way the moon does, and the product exists to notice the second one.

05

What this refuses to claim

A results page that hides its gaps is worse than useless. These numbers could each have been estimated into something impressive. They are marked pending instead, and the code enforces it.

The conversation work rests on synthetic transcripts, which validate the plumbing but cannot prove conversation features improve prediction, because the generator's own priors would leak into any lift. So evals/metrics.py refuses to compute that number on synthetic records at all. The check is in the code, not in a reviewer's memory.