Getting Started
Create a Twilio Account
Go to Twilio and Get started with a free Twilio account (No credit card required).
Buy a phone number
Go to the console > Programmable Voice menu. Under this menu > Numbers and Get a number
Create a voice application
Under the Programmable Voice Menu > TwiML > TwiML Apps then
Click "+" to create a new TwiLM app
Give your app a friendly name, then click save.
Create an API key
Go to API Keys
Click "New API key"
Give it a friendly name (ex my bubble app voice)
Click Create
Copy the SID and Secret and store them in a safe place. Later you will add them to the functions environment variables.
Create token & service functions
Go to functions
Create a new service. Give it a name (ex yourappname)
Add the following environment variables
CALLER_ID (optional if you're planing on using mutliple Twilio numbers ignore this step)
TWIML_APP_SID: add the voice application SID from the voice application step
TWILIO_API_KEY: add the API key from the API key step
TWILIO_API_SECRET: add the API key secrete from the API key step
Create Access Token Function
Create a new function. Click "Add +" -> Add Function -> give the function a name (ex access-token)
Add following code
exports.handler = function (context, event, callback) {
const AccessToken = require('twilio').jwt.AccessToken;
const VoiceGrant = AccessToken.VoiceGrant;
// Prepare response
let response = new Twilio.Response();
// Add CORS Headers
let headers = {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "GET",
"Content-Type": "application/json"
};
// Used when generating any kind of tokens
const twilioAccountSid = context.ACCOUNT_SID;
const twilioApiKey = context.TWILIO_API_KEY;
const twilioApiSecret = context.TWILIO_API_SECRET;
// Used specifically for creating Voice tokens
const outgoingApplicationSid = context.TWIML_APP_SID;
const identity = event.identity;
const ttl = 3600; //Time to live for the token, in seconds.
// Create a "grant" which enables a client to use Voice as a given user
const voiceGrant = new VoiceGrant({
outgoingApplicationSid: outgoingApplicationSid,
incomingAllow: true, // Optional: add to allow incoming calls
});
// Create an access token which we will sign and return to the client,
// containing the grant we just created
const token = new AccessToken(
twilioAccountSid,
twilioApiKey,
twilioApiSecret,
{ identity: identity,
ttl: ttl
}
);
token.addGrant(voiceGrant);
const jwt = token.toJwt();
console.log(jwt);
response.setHeaders(headers);
response.setStatusCode(200);
// Set body
response.setBody({
'identity': identity,
'token': jwt
});
// Return the response
callback(null, response);
};
Make sure the function is Public, Click the icon next to the function and select Public
Save
Deploy
Create Voice Function
Create a new function. Click "Add +" -> Add Function -> give the function a name (ex client-voice)
Add following code Replace
context.CALLER_ID
withevent.appCallerId
if you are using multi Twilio numbers
exports.handler = function(context, event, callback) {
let twiml = new Twilio.twiml.VoiceResponse();
console.log(event.To)
console.log(event.From)
if(event.To) {
// Wrap the phone number or client name in the appropriate TwiML verb
// if is a valid phone number
const attr = isAValidPhoneNumber(event.To) ? 'number' : 'client';
const dial = twiml.dial({
answerOnBridge: true,
callerId: context.CALLER_ID
});
dial[attr]({}, event.To);
} else {
twiml.say('Sorry unable to make the call!');
}
callback(null, twiml);
};
/**
* Checks if the given value is valid as phone number
* @param {Number|String} number
* @return {Boolean}
*/
function isAValidPhoneNumber(number) {
return /^[\d\+\-\(\) ]+$/.test(number);
};
Make sure the function is Public, Click the icon next to the function and select Public
Save
Deploy
Add the voice URL to the Twilio voice app you have created
To get your capability token URL:
Go to Functions, then manage.
Click the voice function then
Copy URL (https://xxxx-####.twil.io/client-voice)
Then add the URL to your app
Go to TwiML Apps
Select your app
In Voice > Request URL > Paste your client voice URL (https://xxxx-####.twil.io/client-voice)
Add the access token URL to your Bubble plugin
To get your access token URL:
Go to Functions, then manage.
Click service then the access token function
Copy URL it should be something like https://xxxx-####.twil.io/capability-token
Paste this Capability token URL in your bubble plugin
Plugin Settings
Make sure you have all the plugin settings filled as shown below. Go to Plugins > Twilio Plugin > Fill out the username, password, accessTokenURL, & App Owner Email

Log Level
The value is a number that corresponds to the different levels of logging available. For best practice only change the log level when needed.
0
TRACE
1
DEBUG
2
INFO
3
WARN
4
ERROR
5
SILENT
Create a quick client functions (capability token and voice function) LEGACY
Go to Functions,
Click "+" to create a new function, then select "Twilio Client Quickstart".
Then Enter your APP_SID ( you will find it under TwiML Apps, click your app then copy the app SID) and CALLER_ID (Your Twilio phone number formatted as +11231231234)
Under the function configuration code replace
const identity = 'the_user_id'
withconst identity = event.identity
Last updated