# Connecting Customer.io

Source: https://dialmilo.com/help/connecting-customer-io
Updated: 2026-10-23

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.

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

  
    Go to **Campaigns**, open any campaign and click **Settings**. You'll also see the same card when you create a new campaign.
  
  
    Paste your **Site ID** and **Tracking API key**, choose your **Region** (US or EU), and enter the **Player ID column** from your CSV.
  
  
    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:

| Attribute | What it holds |
|---|---|
| `milo_last_call_at`, `milo_last_call_status` | When Milo last called and how the call went |
| `milo_last_campaign`, `milo_last_outcome` | Which campaign called, and the result |
| `milo_offer_accepted`, `milo_offer_declined` | Whether the player took the offer |
| `milo_callback_requested`, `milo_callback_at` | If the player asked to be called back, and when |
| `milo_feedback_score`, `milo_feedback_topic` | What the player said about your brand |
| `milo_opted_out`, `milo_opted_out_calls` | Whether the player asked not to be contacted, or not to be called |
| `milo_safer_gambling_flag` | Milo noticed signs of harm. Stop marketing to this player. |
| `milo_wrong_person` | Someone else answered |
| `milo_last_script` | Which 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:

```json
{
  "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**.