Which customers to act on next
One row per customer in, a probability out — for whatever outcome you label. Send the labeled history you already have alongside the accounts you want ranked, and get a score for every one of them back in the same request: who's ready to upgrade, which trials will convert, which leads to call first, who's about to leave.
No training pipeline of your own, and no ML team. Report what actually happened once you know it, and check drift to see when accuracy starts slipping.
What you can predict
Five directions our clients ask for most. Each one is the same request shape — a table of decided rows, a table of undecided ones — and the same endpoint.
Expansion and upsell likelihood
Sales calls the accounts most likely to upgrade, instead of working the list alphabetically.
Trial-to-paid conversion
Onboarding spends its attention on the trials still winnable this week.
Lead scoring
Inbound leads reach whoever works the queue already ranked by how past leads like them closed.
Churn risk
Customer success reaches the accounts at risk while there's still something to offer them.
Payment and dunning failure risk
Billing asks for new card details before the invoice fails, not after the retries run out.
The model has no built-in notion of any of these. target
is a label you pick; the API fits whatever pattern your labeled rows show,
so your own outcome works the same way as the five above.
How it works
Predict
POST the rows whose outcome you already know alongside the ones you need scored, and get a probability for each of those back in the same request.
Record outcomes
Report what actually happened — the upgrade, the conversion, the cancellation — once you know it, so every prediction has ground truth to be checked against.
Catch drift
Ask GET /v1/drift whether accuracy
starts slipping, comparing the last 30 days against the 30 before, on
your own schedule. Not included on the Starter plan.
One endpoint, your data
Decided rows carry an outcome;
undecided rows don't, and those are the ones you get scores for.
curl https://beta.earlytell.eu/v1/predict \
-H "Authorization: Bearer $EARLYTELL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"target": "upsell_90d",
"task_type": "classification",
"context": [
{ "entity_id": "cust_1", "features": { "plan": "starter", "usage_pct": 92 }, "outcome": 1 },
{ "entity_id": "cust_2", "features": { "plan": "starter", "usage_pct": 18 }, "outcome": 0 }
],
"query": [
{ "entity_id": "cust_3", "features": { "plan": "starter", "usage_pct": 88 } }
]
}'
The same call works with churn_risk,
trial_conversion,
lead_score or
payment_failure as the
target — the model has no built-in
notion of any of them, so only your rows and your label change.
What we've measured
On the public IBM Telco Customer Churn dataset — 5,977 labeled rows, held out 1,000 of them — the model scored AUC 0.844 and 82.3% accuracy. Of the 100 held-out customers it rated riskiest, 84 had actually churned, against a 26% base rate across the holdout.
A logistic regression trained on the same rows came in slightly behind that — and EarlyTell had no training step at all. The labeled rows were just part of the request.
That's one public churn dataset, and it's the only accuracy we've measured so far. The other directions above are outcomes the API supports, not results we're claiming.