How to Implement Click-to-Dial

While Flex offers its own Dialpad to allow you to insert touch-tone numbers and place calls from Flex, you may want users to be able to click a phone number in a system outside of Flex that launches a phone call using Flex.

You can implement this functionality using Flex’s native outbound dialing capabilities. Read on to learn how to implement click-to-dial.

The Outbound Call Action

The StartOutboundCall Action allows you to define your own logic to trigger outbound calls, and will be key to implementing click-to-dial functionality. StartOutboundCall requires a destination phone number — we have to call somebody, after all — but it also includes additional parameters for defining details like custom Task attributes and the caller ID that should make the call.

Ensure a reservation has been created before updating the attributes of a StartOutboundCall task.

Making a call from a CRM embedded in Flex

You’ve embedded your CRM by developing a React component. You want agents to be able to click on a phone number in the CRM Plugin to start an outbound call in Flex.

A flow diagram showing how an agent clicks a number to invoke a Flex action and make an outbound call

The Outbound Call Action

In your Flex Plugin code, you might write a function like this:

function clickToDial(destinationNumber) {
  Flex.Actions.invokeAction("StartOutboundCall", {
    destination: destinationNumber

Your destinationNumber can either be an E.164 phone number or a SIP URI in this format: sip:<sip_uri>. Once you’ve defined how you want to invoke StartOutboundCall, you can set this function as the onClick attribute for any number, button, or other clickable element in your UI. For example, in your Plugin code, you might have a CustomerNumber component that takes the click-to-dial function:

  onClick={(e) => clickToDial(props.customerNumber, e)}

When an agent clicks on the rendered CustomerNumber component, clickToDial will fire with the customer number, and Flex will invoke the StartOutboundCall action and initiate the call for you.

Customize the Outbound Call Action

We can also use the Actions Framework to extend StartOutboundCall. For example, we might want to use a specific caller ID (from number) depending on the agent that is placing the call. Using replaceAction we can modify this for our custom click-to-dial button, as well as the Flex Dialpad component’s call button:

async init(flex, manager) {
  flex.Actions.replaceAction("StartOutboundCall", (payload, original) => {
    var newPayload = payload;
    newPayload.callerId = manager.workerClient.attributes.phone_number;

Now that we have replaced StartOutboundCall, all calls will be made with the caller ID specified by the phone_number attribute on the agent’s TaskRouter worker.

Making a call when Flex is embedded in your CRM

In this case, you’ve embedded Flex in your CRM. Agents should be able to click on a phone number in the CRM to launch Flex and make a call.

A flow diagram showing how an agent clicks a number in a CRM, which posts a message to invoke a Flex action

The postMessage() function

By default, most browsers can use the Window.postMessage() function to communicate between iframe elements. You can utilize the postMessage() to help Flex understand that something was clicked in your CRM and establish an outbound call. The flow might look like this:

1. An agent clicks a UI element to start a call.
2. This click event triggers a postMessage() call that communicates with Flex through an iframe:

// Store the Flex iframe element in a variable
const flexIframe = document.getElementById('flex').contentWindow;

function sendMessage(e) {
  // Prevent any default browser behaviour.
  // Send a message to the iframe with the phone number
  flexIframe.postMessage(document.getElementById('phoneNumber').value, *);

Note that this code sample uses * (a wildcard) as the targetOrigin, meaning that any malicious site could read the contents of your message. Always use a specific URL in production to keep your data safe!

3. Flex receives the message, along with the associated message payload:

// Flex in an iFrame
if (window.self !== {
  // Define a function for what to do when a message from postMessage() comes in
  function receiveMessage(event) {
    // Invoke the Flex Outbound Call Action
    flex.Actions.invokeAction("StartOutboundCall", {destination:});

  // Add an event listener to associate the postMessage() data with the receiveMessage logic
  window.addEventListener("message", receiveMessage, false);

4. Flex initiates the outbound call.

Common integrations

Some CRM tools offer their own APIs for enabling click-to-dial, and simply need to be integrated with Flex. For example, Salesforce’s OpenCTI API, for example, offers a series of functions for enabling outbound dialing.

Software Click-To-Dial Platform
Salesforce OpenCTI
Zendesk ZAF

This list will continue to be updated as we learn about other software’s click-to-dial platforms.

Next steps

Now that you’ve got some ideas for how to implement click-to-dial, you may be curious about the details of building with Flex. Why not...

Rate this page:

Need some help?

We all do sometimes; code is hard. Get help now from our support team, or lean on the wisdom of the crowd by visiting Twilio's Stack Overflow Collective or browsing the Twilio tag on Stack Overflow.

Thank you for your feedback!

Please select the reason(s) for your feedback. The additional information you provide helps us improve our documentation:

Sending your feedback...
🎉 Thank you for your feedback!
Something went wrong. Please try again.

Thanks for your feedback!