Tuning scoring models
Change which inputs a score reads, how much each weighs, and where its bands sit — with a preview before every recompute.
Every score on a profile or a stage overview comes from a scoring model. Every workspace has the same four — ICP fit, Profile value, Churn risk and Expansion readiness — and they live under Settings → Scoring, beside Lifecycle, because a score is a fact about a profile rather than about any one stage.
The four are ours and the numbers in them are yours. You cannot create, rename or delete them, and you never choose which chart draws which — every stage page asks the same two questions, and the answer to each is fixed. What is entirely yours is what goes into them: the factors, the weights, the transforms and the bands. Open a model to change any of those.
Every member can read the models. Editing them is limited to workspace admins.
How a model scores
A model is a list of factors. Each factor reads one input and maps it to a number from 0 to 100:
- Property — a declared property's value through a transform: linear between two values, logarithmic so 10, 100 and 1,000 read as evenly spaced, buckets, a score per value, or yes / no.
- Activity recency — days since a datetime property, decayed with a half-life: today reads 100, one half-life ago reads 50. Leave the property empty to read the newest activity on the profile instead.
- Activity volume — a count through a numeric transform, optionally compared against a baseline so "orders in the last 30 days against a third of the last 90" reads as a pace.
- Milestone proximity — how close the profile is to the next rung of one tier-or-number milestone: nine seats of ten, one tier below the top. A profile the milestone does not apply to has no input for the factor rather than a zero, and a rule-based milestone has none at all — there is no being 80% of the way to true.
- Contraction — how recently and how often the profile went down a rung. A downgrade is the hardest churn signal there is, which is why it sits in the risk model.
The score is the weighted average over the factors that had an input. A factor with no input contributes nothing and says so on the profile page; when less than the model's minimum weight had an input, the profile reads Not enough data rather than a low number. Invert flips a factor so a higher input reads as a worse score — how the risk model treats recency.
Bands name ranges of the score — low, medium and high by default — and are what the badges colour and the quadrants split on.
A model used to be able to carry threshold lines as well — "users is at least 10" — recorded on the profile's timeline when an active profile crossed one. They are gone. Crossing a line on a property is a milestone, which records the same crossing and gives you a rate over the profiles that could have crossed it. Declare it there instead.
The four scores
Each one answers a question some page is asking, and each predicts something Uptend actually records — which is what makes the set defensible rather than a matter of taste. A score that is only there to be looked at does not exist here.
| Score | Answers | Predicts | Scores | When a profile churns |
|---|---|---|---|---|
| ICP fit | what is this profile likely worth? | — | every profile | the score is kept |
| Profile value | what is it actually worth? | — | every profile | kept — "how big was the profile we lost" still matters |
| Churn risk | will it leave? | a profile churning | Active profiles only | cleared — a live number on a dead profile would mislead |
| Expansion readiness | will it grow? | an expansion happening | Active profiles only | cleared |
Fit and Profile value are the same question measured with different evidence. Before a profile activates there is no usage to read, so worth is predicted from firmographics; afterwards it is observed from seats, plan and usage. The handover is the activation milestone, and the two are drawn as one axis — worth — everywhere they appear.
Expansion readiness needs a tier-or-number milestone on the Expansion stage to have anything to measure, and it is one model however many you track: each adds a proximity factor to it, and archiving one takes its factor back out. A workspace that does not track expansion does not compute readiness at all.
Additional models
Models you built before the four became fixed are still here, listed under Additional models on the Scoring page. They are fully yours — edit, duplicate the values into another, delete them — and useful for sorting and filtering the Profiles list. What they cannot do is occupy an axis on a stage page. If one of them is the number you want on a chart, move its factors into the canonical model whose question it answers.
Profile value
Profile value scores how big a profile is with you: seats, projects, storage, transactions — whatever your usage metrics measure — as absolute magnitude. It reads users_total and projects_total through logarithmic transforms, so 1, 10 and 100 seats read as evenly spaced, with bands small, mid and large and the 10 users and 5 projects lines. There is no recency and no inversion: worth is not about whether the profile is still here, risk is. Because it is kept on churned profiles, the Retention overview can draw value against risk and read "large and at risk" in one corner, and the Reactivation list can rank what was lost.
Edit a model
- Open Settings → Scoring and click a model.
- Change a factor's weight, property, transform or half-life, add or remove factors, or adjust the bands and lines. A factor on a property that is not declared under Profiles is flagged as you type, and refused on save: it could never have an input.
- Watch the Total weight and the warning under it. The warning names any factor whose absence alone would leave too little weight for a number — the usual symptom of a weight typo, and the case that turns every profile missing that one property into Not enough data.
- Click Preview. Uptend scores the profiles the model covers under your draft without saving anything and shows, per band, how many profiles are in it today and how many would be after a recompute, plus how many would read Not enough data and the commonest reasons why.
- Click Save and recompute. A change to the factors, bands or lines becomes a new version of the model and every score is recomputed under it in the same request. Renaming a model, or switching it off, saves without a recompute.
settings-scoringsettings-scoring-model-editorWhere a model is drawn
Every chart asks the same two questions — how much is this profile worth to us, and how likely is this stage's outcome — so which model goes on which axis is not a choice you make. The Used by column on the Scoring page says where each one lands.
| Page | Across (worth) | Up (likelihood) |
|---|---|---|
| Retention | Profile value | Churn risk |
| Expansion | Profile value | Expansion readiness |
| Reactivation | Profile value | (none — a ranked list) |
Switching a model off stays the reversible option: a paused model keeps its place on every chart, which reads Not computed for it until it is switched back on.
When worth does not apply
If a whole dimension does not apply to your business, say so once rather than per page. Profiles differ in worth, the switch at the top of Settings → Scoring, is off when every profile is worth about the same to you. Off, the worth axis disappears from every chart in the product at once and each quadrant becomes a ranked list ordered by likelihood alone; ICP fit and Profile value stop being computed, and stop being asked about.
It is a statement about your business rather than a setting to tune. It cuts no new version of the lifecycle definition and needs no save: it takes effect the moment you flip it, and the next evaluation catches up. Its counterpart, Track expansion, is asked the same way under Settings → Lifecycle.
Score a usage metric
The quickest way from a usage metric to a score is Use in a score on the metric's row under Settings → Usage. It opens this editor on the model you pick — Profile value is usually the one — with the metric's keys listed under Factors: click a key to add a factor already pointed at it. A count (_total, _30d, _prev_90d, …) becomes an Activity volume factor with a logarithmic transform; a timestamp (_first_at, _last_at) becomes an Activity recency factor. Adjust the weight and transform, preview, and save. storage_bytes_30d or tokens_total reaches a factor without retyping the key.
Versions and history
Each model has a version. Saving a change to its factors, bands or lines creates the next one, and the recompute writes every score under it, so the factors a profile page shows always belong to the version that produced the number. Earlier scores are not kept: a recompute replaces them.
Switching a model off stops it computing; its existing scores stay but every surface reads Not computed for it until it is switched back on.
Map the placeholder properties
The four models arrive reading placeholder property keys — company_size, plan, users_total, projects_total, last_seen_at. Until those keys exist, the fit model reads Not enough data on every profile. users_total and projects_total are the totals of the Users and Projects usage metrics the Usage page suggests, so declaring those two fills them in; the rest are properties to map under Profiles. Or open the model and point its factors at the properties you have — a source without last_seen_at can read a metric's _last_at instead, and Use in a score on the Usage page adds such a factor in one click.