A worked example
The algorithm, on one match.
The case below is a hypothetical. The attorney below is a hypothetical.
The numbers, though, are real: each feature score is what
matchScore.js would produce if you ran it on these inputs.
Nothing is fudged. Where the algorithm is opinionated, we say so.
The case
A clean rear-ender outside Reno.
We invented this case to land in the algorithm's honest middle — a strong-but-not-trivial fact pattern. Not a $5,000 fender-bender, not a $4M wrongful-death. The numbers below are inputs the consumer and the platform would supply through ordinary intake.
- Consumer
- 32-year-old driver, rear-ended on I-15 outside Reno
- State
- NV
- Case type
- auto
- Liability grade
- strong
- tortl-verified
- yes
- Multi-vehicle
- no
- Comparative negligence
- 10% fault attributed to consumer
- Estimated damages
- $85,000
- Statute expires
- 14 months out
- Urgency
- standard
- Max contingency
- 35%
- Preferred language
- English
The attorney
A Nevada PI attorney with auto as her focus.
The attorney is plausible for this case — licensed where she needs to be, declares auto as a specialty, prices at a typical contingency, and responds quickly. Like the case, the profile fields below are what intake captures on the attorney side.
- Bar-licensed in
- NV, CA
- Practice areas
- auto, pi_general
- Specialty depth
- auto
- Typical contingency
- 33%
- Case value range
- $50,000 – $500,000
- Liability appetite
- any
- Complexity appetite
- any
- Avg response time
- 8 hours
- Rating
- 4.7
- Last active
- 4 days ago
- Languages
- English, Spanish
- Distance to consumer
- ~22 miles
Case · Rear-end · clear liability · NV
no penalties · quality boost applied, capped at 1.00
The weights — client view
What the consumer's ranking optimizes for.
We're scoring this from the consumer's perspective, so we use the client-facing weight table. Specialty depth, reputation, and recovery probability carry the most weight; language match and case value fit carry the least.
| Specialty depth | 16 |
| Reputation | 15 |
| Recovery probability | 14 |
| Geographic proximity | 12 |
| Fee alignment | 12 |
| Response-time fit | 10 |
| Liability appetite | 7 |
| Case complexity fit | 5 |
| Activity recency | 4 |
| Language match | 3 |
| Case value fit | 2 |
Weights sum to 100. Each feature returns a value in [0, 1]. The weighted sum, divided by 100, is the pre-penalty score.
The feature scores
Every feature, scored.
For each of the eleven features, here is the [0, 1] value the scorer produces on the inputs above, the weight that multiplies it, and a one-sentence explanation of why the number landed where it did.
| Feature | Weight | Score |
|---|---|---|
| Specialty depth | 16 | 1.00 |
| Attorney lists 'auto' in specialtyDepth — a declared focus, not a checked box. Full credit. | ||
| Reputation | 15 | 0.94 |
| Rating 4.7 ÷ 5. Not in cold-start, so the actual rating is used directly. | ||
| Recovery probability | 14 | 0.85 |
| Strong liability (0.85) × auto baseline (1.00) × tortl-verified (1.0) × statute runway (1.0). The case will pay. | ||
| Geographic proximity | 12 | 1.00 |
| 22 miles, inside the 25-mile band. Full credit. | ||
| Fee alignment | 12 | 1.00 |
| Consumer cap 35%, attorney typical 33% — fits cleanly inside, no negotiation needed. | ||
| Response-time fit | 10 | 1.00 |
| 8-hour response on a standard-urgency case, well under the 24-hour ceiling. | ||
| Liability appetite | 7 | 0.85 |
| Strong case × attorney appetite 'any'. The table assigns 0.85 here — 'strong_only' would have scored 1.00. | ||
| Case complexity fit | 5 | 0.95 |
| Complexity score 0.15 (simple) against 'any'-appetite attorney. | ||
| Activity recency | 4 | 1.00 |
| Active 4 days ago, inside the 7-day band. | ||
| Language match | 3 | 1.00 |
| Consumer wants English; attorney offers English and Spanish. | ||
| Case value fit | 2 | 1.00 |
| $85k sits inside the $50k–$500k declared range. | ||
Multiplying each score by its weight and adding the eleven contributions:
16.00 + 14.10 + 11.90 + 12.00 + 12.00 + 10.00 + 5.95 + 4.75 + 4.00 + 3.00 + 2.00 = 95.70
That is the weighted sum. Divided by the total weight (100), the normalized pre-penalty score is 0.957.
The penalty check
Five thresholds. None of them tripped.
The weighted average can hide a single catastrophic feature, so the algorithm runs five threshold checks afterward. On this match, none fire — which is exactly what a clean, well-fit case looks like in the machinery.
| Feature | Threshold | This match |
|---|---|---|
| Recovery probability | < 0.20 | 0.85 |
| No — well above threshold. | ||
| Specialty depth | < 0.50 | 1.00 |
| No — full credit, not even close to the soft-fail band. | ||
| Response-time fit | < 0.30 on urgent | n/a |
| Not applicable — this case is standard urgency, the penalty doesn't evaluate. | ||
| Intake completeness | < 0.30 (attorney view) | n/a |
| Not applicable from the client view; the attorney-side penalty doesn't fire here. | ||
| Fee alignment | < 0.20 (client view) | 1.00 |
| No — full credit, no penalty. | ||
Score after penalties: 0.957 (unchanged). The penalty stage exists precisely to catch the matches this one isn't.
The high-quality boost
The one asymmetric lift — and it applies here.
A match qualifies for the 1.10 multiplier when four conditions all hold: the case is tortl-verified, liability is graded strong, estimated damages are at least $50,000, and the attorney's rating is 4.5 or higher. On this match:
- tortl-verified
- Yes.
- Liability grade
- Strong.
- Estimated damages ≥ $50,000
- $85,000. Yes.
- Attorney rating ≥ 4.5
- 4.7. Yes.
All four conditions hold. The boost applies: 0.957 × 1.10 = 1.053. The code caps the result at 1.00 — so the post-boost normalized score is 1.00.
This is a meaningful detail. The boost can push a strong-but-not-perfect weighted sum to the ceiling. It is the only place in the algorithm where the ranking model nudges a result upward, and the cap is what keeps the boost from running away.
The final score
100
1.00 × 100, rounded. The integer the consumer would see on this match card in the result set.
Weighted sum 95.70 → normalized 0.957 → no penalties → quality boost × 1.10 = 1.053 → cap at 1.00 → score 100.
In practice
What this match looks like in a real result set.
From the consumer's side, this attorney ranks at or near the top of their result set. A score of 100 is rare — it requires the boost to bind against the cap — and it signals a match where every feature is at or close to its best value. Most real matches score in the 60s and 70s.
From the attorney's side, the same case is scored under a different weight table — the attorney-facing weights. There, the dominant features are expected fee value (23) and recovery probability (19), and a new feature comes online: intake completeness (11), which doesn't appear at all on the client side. Specialty depth drops from 16 to 14; reputation falls out entirely. The same fact pattern can score very differently on the attorney side — usually lower, because the attorney's weights punish vague intake and rough fee math more than the consumer's weights do.
On this case, the attorney-side score is also strong: the case file is complete, expected fee math works (≈ $85,000 × 0.85 × 33% ≈ $23,800, comfortably inside the attorney's range), liability is graded strong, and recovery probability is high. Different weights, same conclusion: a match worth surfacing on both sides.
One case, one score
The math is on this page. There is no other math. A different attorney, a different case, a different score — but the calculation is the same one, every time.
Ready to be the attorney in the example
Lock in the founding rate before consumer access opens.
Free until launch