Portfolio · Senzai

Uplift-based targeting for digital marketing campaigns

I led the machine learning of a re-engagement engine: the recommendation system that decides which customers to contact, when, and through which channel, built on causal inference rather than propensity, plus the pipelines, evaluation and CI/CD it runs on.

Role
ML lead: Senior Data Scientist and Machine Learning Engineer, Pipelines and MLOps Lead
Period
Oct 2023 – Oct 2025
Context
Marketing-analytics startup; a re-engagement engine for two B2C clients, a telecom operator and a bank
Stack
Python, CausalML, XGBoost, Airflow, MLflow, DVC, Docker, Kubernetes, AWS, GitLab CI/CD, FastAPI

Someone stopped opening the newsletters six months ago. The CRM tool would email them again on Thursday, along with everyone else. The engine’s answer is different: for this customer, nothing this week; for the next one in the table, a text message on Saturday morning. Do that three million times and you get the numbers below.

Outcomes
  • +30% Conversion, relative uplift Telecom client, re-engagement campaigns, engine vs. previous targeting
  • +5–15% Monthly conversion uplift Bank client, drip campaigns on 500–1,000 new leads a day, engine on vs. the bank's CRM targeting
  • 3M Customers scored in production 50M interaction events processed through the pipelines
  • Weeks → days Time to deploy a new model Automated CI/CD, containerised training and scoring

The problem

Leads go cold. Customers drift away. They already know the brand, they’ve just stopped responding. The usual answer is to message everyone the same way, which wastes budget on people who were never going to respond and annoys the ones who would have come back on their own.

Senzai built a re-engagement engine to contact the right customers at the right moment, with the right message. I led the machine learning behind it: the models that make those calls, and the platform that runs them.

Two clients, two engines

For a small telecom operator, the engine ran re-engagement and newsletter campaigns. It predicts not just who will open a message but who will convert because of it, and tunes send time, frequency, content and channel by segment, while leaving alone the “sleeping dogs”, the customers who react badly to being contacted at all. Conversion came out 30% higher than with the previous targeting.

For a bank, the job was drip campaigns on a stream of 500 to 1,000 new leads a day, about 70,000 visitors over the campaign period. The engine decides who to contact, when (time of day, day of week) and through which channel (email, SMS, ads). Measured against the bank’s existing CRM targeting, with the engine switched on versus off, monthly conversion rose by 5 to 15%.

Telecom operator · re-engagement campaigns Previous targeting100 (reference) 100 Engine130: conversion +30% vs. previous targeting 130 · +30% Bank · drip campaigns, 500–1,000 leads a day CRM targeting100 (reference) 100 Engine105 to 115: monthly conversion +5% to +15% vs. CRM targeting105 to 115: monthly conversion +5% to +15% vs. CRM targeting 105–115 · +5 to +15% 100 = previous targeting Previous or CRM targeting Uplift engine Range across months
Conversion with the engine switched on, indexed to 100 for the targeting each client used before. Telecom operator: 130, a 30% relative uplift. Bank: 105 to 115 depending on the month, a 5 to 15% uplift against its CRM targeting.

What I did

Leading the ML meant, in practice, four things. I built, tested and deployed the recommendation system itself, from the causal models through to the scoring service. I worked on the data pipelines that turn 50 million interaction events into features for 3 million customers. I designed the evaluation and the monitoring, so we knew whether a campaign was working and whether a model was drifting. And I set up the stack it all ran on: GitLab CI/CD, Docker on AWS EC2, Kubernetes, Airflow, MLflow and DVC. Getting a new model into production went from weeks to days.

How it works

Customer interaction events are ingested and turned into behavioural features and profiles. Meta-learners (S-, T- and X-learners) estimate the effect of a contact on each individual, so a campaign targets the people it will actually move. Customers are scored in batch, the recommendations are exposed through an API, and dashboards keep an eye on the whole thing. Every change is checked against a control group before it becomes the default.

Why it worked

A client plugs in their CRM data and the engine tells them who to target and who to leave alone. What made the results hold up across two very different clients wasn’t a clever model on its own, it was having a complete, tested system around it.

What I took away

Uplift modelling earned its keep: compared with ordinary prediction, it made a measurable difference in finding the persuadable customers. Building for production from the first day saved a painful rewrite later. And having a control group behind every change is what turned “we think it works” into numbers we could show the client.

Uplift modellingCausal MLRecommender systemsMLOpsAWS