EarlyTell

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.