CRM Campaign
A bank campaign, from choosing the clients to measuring the result
A bank wants to offer a savings account to clients who have money left before payday. This demo runs that campaign from start to finish. SQL picks who to contact and who to leave out. Mautic, an open-source marketing tool, sends the e-mails and pushes and hands interested clients to a banker. A report then compares the result with a group that got no message. Consent is checked again before each message goes out. Everything runs on simulated data for a fictional bank, so nothing reached a real person. Both readings of the result are "not shown", and the report says why.
A demo bank campaign on simulated data: SQL chooses the clients, Mautic sends the messages, and a report measures the result against a group that got nothing.
How it works
The offer: a fictional bank, Ukázková banka (fiktivní), offers a savings account with a standing order to clients who usually have money left before payday.
Who gets it: SQL picks them from 200,000 synthetic clients. 55,210 match the rule and 39,132 remain after 11 exclusion rules (SIMULATED). A client whose data is missing is left out.
The journey: Mautic sends e-mail A or B, then a push, and hands clients who clicked to a banker. A tenth of the clients get nothing, so there is a group to compare with.
Consent: it is checked when a client is loaded, inside the journey and again before each message. A push that comes due at night waits until 08:00.
The result: all 9 safety checks passed, and 1,283 e-mails went to a local test inbox, none to a real person (SIMULATED). Whether the campaign works: not shown. Which e-mail is better: not shown. With 163 clients in the comparison group the test is too small, and the report says so.
Real data: one panel uses a public data set of a real bank's phone campaigns (REAL PUBLIC DATA: Moro, Rita and Cortez 2014, CC BY 4.0). Each extra call brings fewer yeses, so the banker here calls once, and only clients who clicked.
What it is not: a real bank, client or campaign. Mautic stands in for commercial tools; I have no production experience with it, with Bloomreach or with Salesforce Marketing Cloud Engagement, for which the demo has only a build spec written from documentation. AI agents (Claude Code) wrote the code, the SQL and the first versions of the texts under my direction; I chose the campaign idea, the target rule and the A/B hypothesis from options the agents proposed.
Limits and decisions
- Simulated, not a real campaign. The bank is made up, the clients are synthetic, and their behaviour and the size of the effect come from a simulator. The runs show the method and the machinery; they say nothing about how real clients behave.
- Both readings: not shown. Run 2 does not show that the campaign works or that one framing beats the other: both intervals include zero. The simulation gives framing A no advantage and the campaign only a small effect, which 163 holdout clients cannot show. Run 2 uses the same clients and random draws as run 1, so it is not an independent repeat, and the two are never pooled. The first demo's run is inconclusive by its own rule too.
- Mautic is a stand-in. Mautic is an open-source stand-in, neither Bloomreach nor Salesforce Marketing Cloud Engagement, and I have no production experience with any of the three. The build spec and the concept map for Marketing Cloud Engagement come from documentation: no account was opened, and the rows marked as inferred are an agent's reading, not the vendor's words.
- The client texts are agent drafts. The Czech e-mails, the push and the banker's note in the screenshots were drafted by AI agents. I have not edited them yet, so they are not my writing.
- Stubs and a missing channel. Push and the banker queue are local stubs; no provider was called. The first demo's in-app card has no channel in this Mautic set-up, so 133 clients in A or B got no message at all. Mautic ran on PHP's built-in server, which handles one request at a time: enough for one laptop, not for production.
- The demo clock skews some figures. One demo day lasts one minute, so the hour at which a push comes due is close to random. Two thirds of the pushes were held overnight in run 2, far more than a real bank would see. The 8 unsubscribes in A against 0 in B are noise on a small count: on 40,000 clients the same draws give 0.33% and 0.27%.
- The legal side is not checked by a lawyer. The consent and opt-out rules are built around Czech Act No. 480/2004, section 7, and GDPR Article 21, as read on 5 November 2026. No lawyer checked them; in a bank they would go to compliance first.
What's inside
- The business case comes first
- The target rule is easy to say and to check
- Exclusions fail closed.
- The groups are fixed before any message
- First run, on paper (SIMULATED)
- Opens mislead, and the report shows how (SIMULATED)
Built with: SQL (SQLite), Python, Mautic, Claude Code
Previous project: Insurance Assistant · Next project: AI Toolbox · All projects