Beyond a broad customer segment
The source data already existed: preferred leagues and teams, the split between prematch and live betting, and the composition of betting slips. Campaigns had reflected these differences only broadly. The task was to turn them into personalised modules that people could read at a glance.
From a data export, the system produces a set of HTML widgets for each recipient. A graphic presents the individual value and a short comment puts it in context, in German or English. The CRM team still decides which components to use in each campaign and in what order within Emarsys.
From the initial concept to the finished widgets
We developed the full concept and visual design. That meant deciding how each metric should appear in an email: what the graphic would communicate, what the accompanying copy needed to explain, and how the layout would work with different amounts of data. These decisions shaped each widget’s design and structure.
We also wrote the complex email HTML, including the Emarsys-specific code needed to integrate the widgets into the existing campaign template. Our work covered the Emarsys API integration and the handling of data from the affiliate API. We were responsible for both the modules recipients would see and the application supplying their personalised content.
The copy follows rules, not a language model
The backend uses PHP and Neos Flow. A pipeline imports the raw data, calculates metrics per recipient and checks thresholds. It then selects suitable text blocks. Every statement can be traced back to a number in the dataset.
Modules include a league mix, the prematch-to-live ratio, an accumulator-bet profile, the preferred betting market and a team ranking. None requires fresh text generation at every send. The editorial work lies in predefined wording and the rules determining when it applies.
Calculate ahead so delivery does not have to wait
With almost a million recipients, calculating every metric at request time is not practical. The pipeline does this after import. At send time, Emarsys retrieves prepared results through External Content. A contact ID determines which content belongs to each recipient.
A module for the next fixture also needs current information from the operator’s affiliate API. These details are processed when requested. The email therefore reflects the state at send time, not a permanently live view.
Simulating a send to hundreds of thousands of recipients
We load-tested the system by simulating an email send to several hundred thousand recipients. That work formed part of our implementation, alongside the widgets, the Emarsys-specific code and the API integrations.
Missing data, Outlook and the Emarsys template
Three areas particularly shaped the implementation:
- Less data without a broken layout
- Not every record provides five teams or a clear favourite league. A ranking with three meaningful entries shows three. If the data is insufficient for a component, it is omitted without leaving an empty space.
- Email is not a browser window
- More complex graphics are rendered as images on the server; simple bars use HTML directly. We built the widgets with table layouts and worked within the existing template’s conventions to make the design work in Outlook too.
- The existing template sets the rules
- The widgets have their own design, but sit within an existing Emarsys template. We had to account for its global CSS and the way optional blocks are managed. The brand typeface also needed adjusted spacing and image dimensions when rendered on the server, along with the appropriate font licence.
A widget system, not a one-off campaign
Staging and production are separate and access-protected; hosting sits in the client’s account. Changes to the widget set are delivered as new versions, so we can review them without disturbing the live version.
The result connects a data pipeline and custom application logic to the tool the CRM team already uses. It is designed to accommodate more widgets, leagues and sports.
Personalisation does not necessarily require generative AI. Here, every comment follows a traceable metric.