Outbound campaigns

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.

Updated Oct 23, 2026 3 min read
Key takeaway

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. 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. 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 phone is 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. 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

JourneyTrigger
Welcome callNew signup, called within the hour to welcome them and explain the welcome pack
Login, no depositLogged in but no deposit within 2 hours, offered a reload bonus
Lapsed playerNo activity for 30 days, win-back offer
Special eventBig 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.