Skip to content

Case study

Churn scores and their reasons written back into HubSpot

A bookkeeping and payroll firm looking after about 1,800 small business clients in Ontario and Quebec now scores every account overnight, so a client manager opening a record sees the risk band and the three factors behind it without leaving the CRM.

Named only with client approval Figures marked are illustrative Reply within one business day

Forecast engine

Demand forecast - next 8 weeks

Live
W-8TodayW+8
ActualModelledConfidence88%

94.2%

Accuracy

+18%

Vs baseline

8w

Horizon

Retrained nightly on 14 months of order behaviour.

The engagement, in short

OlDevs built a client churn scoring system for a bookkeeping and payroll firm looking after about 1,800 small business clients in Ontario and Quebec.A model trained on billing history, support ticket patterns and client portal activity scores every client overnight, with monthly features assembled in a small Postgres feature store, and writes the score plus its three driving factors back into HubSpot as account properties. A daily view surfaces the twenty accounts worth a call, and what happens on those calls is logged and used to retrain the model each quarter. The firm reports −27% annual client churn and 2.4x retention call success, with 1,800 clients scored nightly.

Key facts

01Client
Bookkeeping and payroll firm with about 1,800 small business clients
02Industry
Professional services, Ontario and Quebec
03Services
Custom ML solutions, AI development
04Duration
9 weeks
05Platforms
HubSpot, Postgres feature store, nightly scoring jobs
06Outcome
−27% annual client churn, 1,800 clients scored nightly

The challenge

Churn was only visible a month after the decision was made

Churn only became visible once a client stopped answering emails, which was usually a month after they had already decided to leave. Client managers had a shared spreadsheet of hunches and no way to rank 1,800 accounts by who needed a call this week. Two partners were effectively reviewing the book from memory.

01

The signal arrived too late

A client going quiet was the first visible sign of churn, and by then the decision to leave had usually been made a month earlier. Every retention conversation started from behind, as a response to a departure rather than a reason to stay.

Late signals · Reactive retention

02

A shared spreadsheet of hunches

Risk lived in a spreadsheet of impressions that different client managers filled in differently and nobody maintained. It captured who had been thought about recently rather than who was actually at risk, and it went stale between updates.

Manual tracking · Inconsistent data

03

No way to rank 1,800 accounts

With about 1,800 small business clients on the book, there was no way to order them by who needed a call this week. Attention went to the accounts that happened to be in front of someone, which is not the same as the accounts most likely to leave.

Prioritisation · Coverage

04

Two partners holding the book in memory

Two partners were effectively reviewing the whole book from memory, which does not scale and does not transfer. Their judgement was good and completely undocumented, so it could not be checked, shared with newer managers or applied consistently.

Key person risk · Undocumented judgement

What we built

A risk band and a reason, in the record the manager already has open

We trained a churn model on billing history, support ticket patterns and client portal activity, with monthly features assembled in a small Postgres feature store and every client scored overnight. The score and the three factors driving it are written back into HubSpot as account properties, so a manager opening a record sees the risk band and the reason without leaving the CRM. A daily view surfaces the twenty accounts worth a call, and what happens on those calls is logged and used to retrain the model each quarter.

01

Churn model on signals the firm already had

The model was trained on billing history, support ticket patterns and client portal activity, all of it data the firm was already collecting. No new tracking was added and no client was asked to do anything differently for the system to work.

Custom ML · Existing data

02

A small Postgres feature store

Monthly features are assembled in a small Postgres feature store, so training and nightly scoring read the same definitions. That keeps a score reproducible and makes it possible to explain later why an account looked risky in a particular month.

Postgres · Feature store

03

Scores and reasons written into HubSpot

The risk band and the three factors driving it are written back into HubSpot as account properties. A client manager opening a record sees why an account is flagged without leaving the CRM, which is the difference between a score being used and being ignored.

HubSpot · Explainability

04

A daily call list of twenty accounts

A daily view surfaces the twenty accounts worth a call, so the working day starts from a list rather than a search. Call outcomes are logged against the account and used to retrain the model each quarter, so the list gets better with use.

Daily view · Quarterly retraining

Process

How the engagement ran.

  1. Defining churn

    We started by agreeing with the partners what churn actually means for this book, since a client who pauses over a quiet season is not the same as one who has left.

  2. Feature assembly

    Billing history, support ticket patterns and client portal activity were shaped into monthly features in a small Postgres feature store used by both training and scoring.

  3. Model build

    The model was trained on those features and reviewed with the partners in a working demo each week, so the people who knew the book could see what it was picking up while it was still being built.

  4. CRM write back

    Scores, risk bands and the three driving factors were written into HubSpot as account properties, with a daily view surfacing the twenty accounts worth a call.

  5. Feedback and retraining

    Call outcomes are logged against the account and feed the quarterly retraining routine, which we documented and handed over with the code and the accounts.

Stack

What it was built with.

Modelling

Churn model on existing signalsMonthly feature assemblyRisk bandsThree driving factors per score

Data

Postgres feature storeBilling historySupport ticket patternsClient portal activity

CRM

HubSpotCustom account propertiesDaily view of twenty accountsLogged call outcomes

Operations

Nightly scoring of 1800 clientsQuarterly retrainingShared feature definitions for training and scoring

−27%

Annual client churn

2.4x

Retention call success

1,800

Clients scored nightly

Outcomes

What changed for the client.

01

Churn came down

−27% annual client churn. Conversations now happen while a client is still deciding rather than a month after they have decided, which is the whole point of moving the signal earlier.

02

Retention calls land better

2.4x retention call success. Managers ring with a reason in front of them, so the call opens on something specific about that account instead of a general check in.

03

The whole book is covered

1,800 clients scored nightly means no account is out of view because nobody thought of it. Attention follows risk rather than following whichever client happened to be in front of someone that morning.

04

Partner judgement is now shared

What two partners held in memory is now a score, a reason and a logged outcome that any client manager can act on. Newer managers work from the same signals rather than needing years to build the instinct.

In their words

The client on the result.

Our client managers start the day with twenty names instead of a feeling about who has gone quiet.
AB

Managing partner, small business accounting firm

Professional services

FAQ

Questions about work like this.

They use this one because it appears where they already work. The risk band and the three factors driving it are written into HubSpot as account properties, so opening a client record shows the score and its reason without a second tool or a login. A score that lives in a separate dashboard is a score that gets checked once and then forgotten.

Because a number on its own does not tell a client manager what to say. Surfacing the three factors behind a score turns it into a call worth making, and it also lets an experienced manager overrule the model when they know something it does not. Explainability is what makes the score usable rather than merely correct.

No. This model was trained on billing history, support ticket patterns and client portal activity, all of which the firm was already collecting in the normal course of business. Nothing new was asked of clients, and the nine week timeline was possible partly because the data already existed and only had to be shaped.

Call outcomes are logged against the account and used to retrain the model each quarter, so what actually happened on a retention call becomes training data. Monthly features are assembled in a Postgres feature store shared by training and scoring, which keeps definitions consistent as the book grows and changes.

Access to the data, a working session to define what churn means for the book, and a few reviews with the people who will use the scores. We work in weekly demos, so partners and client managers see the model against real accounts as it develops rather than at the end, and the firm owns all code and accounts at handover.

Still have a question? Ask us when you request a quote

Let’s connect

Have a problem like this one?

Tell us what is not working. We’ll reply within one business day with how we would approach it and a tailored quote.

We’ll only use your details to prepare your quote. No lists, no spam.

Call us Request a quote