A retail bank ran outbound campaigns for term deposits. The call centre had a fixed number of dials each week, and the list was built from broad segments and recent contact history. Conversion was low, some customers were called repeatedly, and the team could not tell whether a better list would produce more deposits or simply move the same conversions earlier in the quarter.
The capacity decision
The relevant decision was not "who will subscribe?" across the whole customer base. It was "given this week's dials, which customers should we call first, and when should we stop calling someone who has already said no?" The constraint is the same in every campaign team: a ranking that ignores contact capacity and fatigue is an interesting model, not an operating tool.
What we worked with
Campaign records contained:
- Customer profile: age, job, marital status, education, housing loan, personal loan and credit-default status.
- Contact details: channel, month, day of week and number of contacts in the current campaign.
- Campaign history: days since the previous contact, number of previous contacts and the outcome of the previous campaign.
- Macroeconomic context: employment variation rate, consumer price index, consumer confidence index, Euribor rate and employment level.
- Call outcome: call duration and whether the customer subscribed.
Most contacts did not subscribe. The campaign also ran across months with different economic conditions, which matters for how the model is validated.
The trap that looks like a good model
Call duration is recorded for every contact and correlates almost perfectly with subscription. It is also only known after the call. Including it produces a model with excellent test scores and no possible use in targeting — a mistake that is easy to make and difficult to detect when the only metric on the dashboard is AUC.
We excluded duration from the pre-call score entirely. It was used separately, to study call quality and script performance, where it belongs.
How targeting works
- Separate pre-call and post-call information. Every field was classified by whether it exists at the moment the list is built. Anything downstream of the call was excluded from scoring.
- Validate on later campaign periods. The data mixes months and macroeconomic conditions. We tested on later periods rather than random rows, so the model faced the kind of future it would actually see.
- Build features around contact history. Number of prior contacts, outcome of the previous campaign and recency since the last contact proved more actionable than demographics. They are also the levers the campaign team can control.
- Model with imbalance in mind. A logistic baseline and a gradient-boosted challenger were compared on lift, AUC and calibration. Accuracy was not used as a headline metric, because predicting "no" for everyone would score well and help nobody.
- Evaluate where the dials are spent. The question is how many subscribers appear in the first tranche of calls, not how well the model sorts the full file. We reported cumulative gain and lift by decile.
- Tie the cut-off to capacity and cost. The threshold came from weekly dial capacity and the cost per contact. The output included a priority tier and a contact-frequency limit per customer.
- Design the measurement before launch. A holdout group and a pre-agreed conversion metric were part of the delivery, so the campaign could be judged against a counterfactual rather than against last month.
What this changes
- Dials concentrated on realistic prospects. The first tranche of the list carried a much higher expected conversion rate than the old segment-based list.
- Repeated contact became a policy. Frequency limits reduced the number of customers receiving the same offer for the third time.
- The leakage error was caught before launch. Without the pre-call audit, the model would have looked excellent in testing and failed in production.
- Improvement could be proven. The holdout design gave the team a way to measure incremental deposits instead of assuming that a higher-ranked list was a better campaign.
What we delivered
- A pre-call subscription-propensity score with reason codes.
- A ranked weekly call list with contact-frequency limits.
- A lift and calibration report by campaign period.
- A holdout test design and a campaign performance dashboard.
Where this applies
This fits banks, insurers, telecoms and any team running outbound campaigns with a fixed contact capacity. The minimum inputs are a customer identifier, campaign contact history, a pre-call feature set and a subscription or response outcome. The first deliverable is usually the pre-call audit — establishing which fields actually exist when the list is built — followed by a lift curve on a held-out campaign period.
This is an illustrative case study built on an anonymized dataset; it does not report results from a specific client engagement. It reflects our standard method for campaign targeting and measurement.
