Appearance
Emails and events
Player messaging runs through Customer.io. The platform does not hold templates, subject lines or sending schedules — it reports what happened, and the campaigns you build there decide what the player receives.
The platform's own CRM
The platform also has a CRM of its own, in the admin panel, with templates, broadcasts, journeys and results. It receives the same events as Customer.io and runs alongside it. See CRM.
The split matters when something goes wrong: an email that did not arrive is almost always a campaign question, not a platform one.
Two directions
The platform tells Customer.io what happened. Every event below is sent as it occurs, attached to the player's profile.
Customer.io can tell the platform to award a bonus. A campaign can call back and grant a player a bonus — the mechanism behind "here is a free spin, come back and play". This is how a marketing decision becomes real money without anyone touching the admin panel.
Events the platform sends
| Event | When |
|---|---|
deposit_success | A deposit settles |
first_deposit_success | The player's first deposit ever |
withdrawal_success | A withdrawal is paid out |
withdrawal_rejected | A withdrawal is refused |
bonus_created | A bonus is granted |
kyc_approved / kyc_rejected | A verification decision |
player_blocked | An account is blocked |
vip_cashback_paid | VIP cashback is paid — see below |
Every event carries the player's ID, so it lands on the profile you already have rather than creating a second one.
Cashback emails
vip_cashback_paid is raised once per player per payout, at the moment the money is credited. See VIP cashback for how the payment itself is configured.
| Field | Content |
|---|---|
total_amount | The whole award |
real_amount | The part paid into the real balance |
bonus_amount | The part issued as bonus |
currency | Currency code |
percent | The rate applied |
basis | wagering, net_cash or gaming_loss |
basis_amount | The figure the rate was applied to |
period_start / period_end | The period the award covers |
level_id | The VIP level that paid |
The event does not exist until the first payout
Customer.io only recognises an event once it has received one. Configure a level, let the first payout run, and vip_cashback_paid will then be selectable as a campaign trigger. Build the campaign after that, not before.
Two things to get right in the template
Amounts arrive as text, not numbers. This is deliberate — sending a decimal as a number is how 12.10 reaches an inbox as 12.099999. Print them as they are; do not do arithmetic on them in the template.
A level paying 100% real money always reports bonus_amount as 0. Make the bonus sentence conditional, or the message will congratulate the player on winning nothing.
Sending is independent of the money
Every event is fire-and-forget. If Customer.io is unreachable, the deposit still completes, the bonus is still granted and the cashback is still paid — only the message is missed.
The practical consequence: you can switch a feature on before its campaign is written, and nobody is left unpaid while marketing catches up. It also means a missing email is never evidence that the underlying action failed. Check the player's wallet or bonus list before assuming anything went wrong.
Testing a new campaign
Trigger the underlying action once on staging and watch the event arrive, rather than writing the template against a payload you have assumed. Field names are easy to get subtly wrong, and a template referencing a field that does not exist renders an empty space rather than an error.