# Starting calls from your CRM journeys

Source: https://dialmilo.com/help/starting-calls-from-your-crm
Updated: 2026-10-23

Make a Milo call one step of a retention journey in Customer.io, Braze, Optimove, Fast Track or your own CRM, and get every call result back so the journey can branch.

Instead of uploading a list, your CRM can add players to a campaign one at a time, the moment something happens: a welcome pack, a player who logs in but doesn't deposit, a special event. Your journey posts the player to the campaign's **trigger URL**, Milo calls them, and the result comes back to your journey so it can send the right follow-up.

## 1. Your journey starts the call

  
    Open the campaign, click **Settings**, and under **Connect your retention chains** click **Create trigger URL**. Copy it. It's secret, so treat it like a password.
  
  
    In your CRM, add a webhook action that sends a POST with JSON to the trigger URL. Only `phone` is required, in international format:

```json
{
  "phone": "+447700900123",
  "name": "James",
  "player_id": "{{customer.id}}",
  "external_id": "{{event.id}}",
  "language": "en",
  "offer_code": "FS50",
  "context": { "segment": "lapsed 30 days", "favourite_game": "live blackjack" }
}
```
  
  
    Players your journey sends while the campaign is off wait in the queue and are called once you switch it on.
  

Good to know:

- You can send one player, a list, or `{"players": [...]}`, up to 500 per request.
- Every extra field becomes something Milo can use in the call, like `{first_name}` in your script, and comes back in the result.
- A journey that fires twice doesn't call a player twice. A player already waiting or on a call is skipped, and so is a repeated `external_id`.
- Add `"at"` with a date and time to call no earlier than then.
- Milo still follows your calling hours, attempts, contact limits, opt-outs, do-not-call list and safer-gambling exclusions, and calls at the campaign's pace and within its budget.

To change the URL, click **New URL**. The old one stops working immediately, so update your journeys first. **Turn off** disables it until you create a new one.

## 2. Every result comes back to your journey

Go to **Settings → Webhooks**, add your endpoint and pick the **Campaign call completed (outbound results)** event. Each finished call is sent with an `X-DialMilo-Signature` header so you can check it came from us. It includes the player details you sent, how the call went, and what happened:

```json
{
  "event": "campaign.call_completed",
  "data": {
    "player": { "phone": "+447700900123", "player_id": "123", "external_id": "evt-1" },
    "call": { "status": "answered", "duration_sec": 112, "final_attempt": true },
    "outcome": {
      "result": "offer_accepted",
      "opted_out": false,
      "safer_gambling_flag": false,
      "engagement": { "score": 88, "return_likelihood": "high", "next_step": "Send the spins reminder Friday" }
    },
    "summary": "Lapsed player accepted 50 free spins…"
  }
}
```

Your journey can branch on it: offer accepted → send the SMS with the code; callback requested → wait; opted out or safer-gambling flag → stop all marketing.

Using Customer.io? Connect it and results land on the player's profile and as a `milo_call_completed` event without any webhook setup on your side.

## Example journeys

| Journey | Trigger |
|---|---|
| **Welcome call** | New signup, called within the hour to welcome them and explain the welcome pack |
| **Login, no deposit** | Logged in but no deposit within 2 hours, offered a reload bonus |
| **Lapsed player** | No activity for 30 days, win-back offer |
| **Special event** | Big match or tournament, invite to the promotion |

Need a custom setup with Optimove, Fast Track or your own CRM? Contact us and we'll build it with you, free.