Integrations

Connecting Customer.io

Send every call result to your players' Customer.io profiles, and send deposits and logins back so Milo can show which calls brought players back.

Updated Oct 23, 2026 3 min read
Key takeaway

Connect Customer.io once and it works for all your campaigns. After every call Milo updates the player's Customer.io profile and sends a milo_call_completed event, so your journeys can follow up with the right email or text. Deposits and logins sent back from Customer.io show up as conversions in your campaign results.

Before you start

You need your Customer.io Site ID and tracking API key. In Customer.io, go to Workspace settings → API and webhook credentials. You also need to know which column in your player lists holds each player's Customer.io ID (for example cio_id).

Connecting

  1. 1

    Open a campaign's settings

    Go to Campaigns, open any campaign and click Settings. You'll also see the same card when you create a new campaign.

  2. 2

    Fill in the Integrations card

    Paste your Site ID and Tracking API key, choose your Region (US or EU), and enter the Player ID column from your CSV.

  3. 3

    Click Connect Customer.io

    We check the credentials with Customer.io before saving. The key is never shown again.

Once connected, the card shows the masked Site ID, region, ID column, when Milo last sent something, and the last error if one happened. Owners and admins can connect or disconnect Customer.io.

What Milo sends to Customer.io

After each call, the player's profile gets these attributes:

AttributeWhat it holds
milo_last_call_at, milo_last_call_statusWhen Milo last called and how the call went
milo_last_campaign, milo_last_outcomeWhich campaign called, and the result
milo_offer_accepted, milo_offer_declinedWhether the player took the offer
milo_callback_requested, milo_callback_atIf the player asked to be called back, and when
milo_feedback_score, milo_feedback_topicWhat the player said about your brand
milo_opted_out, milo_opted_out_callsWhether the player asked not to be contacted, or not to be called
milo_safer_gambling_flagMilo noticed signs of harm. Stop marketing to this player.
milo_wrong_personSomeone else answered
milo_last_scriptWhich script the player heard in an A/B test

Milo also sends a milo_call_completed event, which you can use to start or branch a journey.

Use milo_safer_gambling_flag and milo_opted_out as exit conditions in your journeys, so nobody who raised a concern or opted out gets another message.

Sending deposits and logins back

When connected, the card shows a secret Conversion webhook URL. In a Customer.io journey, add a Send webhook action that posts to it when a player deposits or logs in:

{
  "player_id": "{{customer.id}}",
  "event": "deposit",
  "amount": 50.00,
  "currency": "GBP",
  "occurred_at": "{{event.timestamp}}",
  "event_id": "{{event.id}}"
}

Use "event": "login" for a player who comes back without depositing. Sending the same event_id twice is ignored, so retries are safe. Treat the URL like a password.

No Customer.io? You can upload a deposits CSV from the campaign page instead.

Calling players from a Customer.io journey

To make a Milo call a step in a journey, for example "logged in but didn't deposit within 2 hours", use the campaign's trigger URL. See Starting calls from your CRM journeys.

Disconnecting

Click Disconnect on the card. Call results stop going to Customer.io, and the conversion webhook URL stops working. To swap keys, click Update credentials.