Starting calls from your CRM journeys
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
- 1
Create the trigger URL
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.
- 2
Add a webhook step to your journey
In your CRM, add a webhook action that sends a POST with JSON to the trigger URL. Only
phoneis required, in international format:{ "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" } } - 3
Switch the campaign on
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:
{
"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.
Was this helpful?
Related articles
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.
Running an outbound calling campaign
Set up a campaign, upload your players, and follow it from the Campaigns page: dates, pausing and resuming, how many calls run at once, and what each tab shows.
Calling hours, time zones and contact limits
How Milo calls every player in their own local time, how often it will try, and how to stop the same player being called by several campaigns in a row.