Here is another interesting step-by-step DIY (do-it-yourself) guide for you – how to send & receive SMS from / in Salesforce (one way / two way). And you’ll be surprised how easy this is. But first things first. Currently (as of this writing) Salesforce does not provide any native capability to allow you to send SMSes, which means that you will need to use a third party SMS Gateway. You can either select one of the 3rd party products available on AppExchange (which will provide you a more seamless integration with Salesforce) or any other SMS Gateway that allows API calls. In this guide, I will be using Twilio to demonstrate the end-to-end functionality. The steps that we are going to be following are as follows
- Sign up with Twilio
- Configure Salesforce to Send SMS
- Send SMS from Salesforce
- Configure Salesforce to Receive SMS
- Receive SMS in Salesforce
Some amount of Apex coding is required to send & receive SMS in Salesforce using Twilio and I have included detailed step by step instruction with screenshots & sample codes on how to do it. Even if you are from a non-development background, you should be able to follow this guide quite easily. But if you do get stuck along the way, leave a comment below and I will try my best to help you
So let’s dig in …
Though I have used Twilio in this guide, there are quite a few 3rd Party products on AppExchange that provides the functionality to send SMS from Salesforce. Navigate to URL https://appexchange.salesforce.com/results?keywords=SMS to review the different products available on AppExchange. Each product will have its own way to configure and send SMS. Also worthwhile to mention here is that you can also use Salesforce’s “Marketing Cloud” to send SMSes.
And why would you want to send SMS from Salesforce in the first place? Well, here are some of the use cases that I can think of
- Send appointment reminders
- Send updates on orders, deliveries, cases
- Billing & payment alerts / reminders
- Send satisfaction surveys
- Send mass notifications / alerts
- Two-factor authentication
- Send promotional offers / run campaigns
- Send discount coupons or vouchers
- Etc…
References & Useful URLs
- The Twilio Salesforce Helper Library
- Twilio Salesforce Project on GitHub
- https://developer.salesforce.com/blogs/developer-relations/2012/02/quick-tip-public-restful-web-services-on-force-com-sites.html
- https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_rest_code_sample_basic.htm
Error: Compile Error: Invalid type: TwilioRestClient at line 15 column 10
I got it..It got rectifed. I defined another Twilio’s number on my contact record and saved it including the +16502002788 in one of the contact and now after that it started working. So it’s looking the format as well. I saved it to the text field called MobilePhone(Custom phone field created by me). But I think it shouldn’t be the case.
Hello Ashish,
I hope you will help me. COuld you please let me know how to rectify this error? because I followed every steps and it’s showing this error in the message error on Incoming.
Error : [
{
“errorCode”: “APEX_ERROR”,
“message”: “System.QueryException: List has no rows for assignment to SObject\n\nClass.receiveSMS.saveSMS: line 32, column 1”
}
]
There was a failure attempting to retrieve the contents of this URL
Please help me on this. Waiting forward for your response.
Thanks,
Prema
sir how to authenticate a user via connected apps . I am not installing package for salesforce .Sorry if i am asking silly questions as i am new in integration .
How can we ensure that the incoming SMSes are from an authorized system. Thankyou for help
This was a fantastic tutorial. A thousand times thank you for posting this!
“errorCode”: “APEX_ERROR”,
“message”: “System.QueryException: List has no rows for assignment to SObject\n\nClass.receiveSMS.saveSMS: line 32, column 1”
I am getting the above error, where am i going wrong? can someone please throw some light at this
In 3 ways you can send SMS from Salesforce.
In every option, you have pros and cons and choose based on your criteria.
1. Salesforce default SMS sending
A. Cost wise very expensive in case of messages.
B.Some places you have to put your development efforts to make the process automatic.
C. Currently, it supports only 5 countries
2. Integrate SMS gateway.
N number of gateways in a market where you can choose and integrate.
Pros:
SMS prices are low.
Cons:
If you want to send SMS to different countries Integration is not a good option because International SMS gateway can not give SMS at local Price.
You have to put your development efforts for dynamic message creation in triggers.
You have to invest your money and time on every SMS template creation.
Many of famous gateways allow 1 SMS in 1 API call so you have to handle API limits as Salesforce
3. You can find App in AppExchange.
There are a few apps in AppExhnage which are providing complete automation.
No development efforts.
Like Email template, you can create SMS template.
You can send SMS with a workflow where you need not to write triggers.
If your option is 3 ? You can have a look at our ValueText SMS (https://appexchange.salesforce.com/listingDetail?listingId=a0N3A00000EFoedUAD) App (https://goo.gl/9B6B7d) at AppExchange.
You can find customer reviews at AppExchange before you use.
Hi Murali,
1. To the best of my knowledge, Salesforce currently does not allow you to send SMS. You have mentioned that currently, it supports only 5 countries. Can you please point me to the related resource
2. In case of integrating with API gateway, there is no limit on outbound calls (i.e. sending messages from Salesforce -> external system). The API limits are applicable for inbound calls (i.e. from external systems -> Salesforce)
Thanks & Regards,
Ashish
Hey Ashish,
Thank you again for your work!
Support asked I leave this here too:
I used a formula field to create an XML file from data fields in SF to make dynamic voice calls with Play and Say using twimlets.com.
Detailed notes on the URL formula
How to build an XML file for Twilio through a URL in a formula field:
Use Case:
You need to build a dynamic text-to-voice concatinated with different audio urls (audion hosted on a website). To accomplish this you need to dynamically build a XML url in a formlua field with audio or voice to text.
What I did was anaylize how Twilio was doing with thier Twimlets https://www.twilio.com/labs/twimlets
Create field for voice-to-text message (will represent Say)
Create field for audio url (will represent Play)
Key factors to consider in your formula
No blank spaces alowed in the url
Use %20 to represent a blank space
audio urls always are treated as “Play”
Message%5B0%5D=[text or url here] is template for seperating the text and audio urls (more on this later)
text is always treated as “Say”
%3A = :
%2F = /
Example Working Formula:
1
‘http://twimlets.com/message?Message%5B0%5D=’&SUBSTITUTE(Subject, ” “, “,%20”)&’.%20’&Contact.LastName&’.&Message%5B1%5D=’&SUBSTITUTE(SUBSTITUTE(Url__c,’:’, ‘%3A’),’/’, ‘%2F’)&’&Message%5B2%5D=%20’&Id&’&’
Formula result:
1
http://twimlets.com/message?Message%5B0%5D=Thanks,%20for,%20checking,%20this,%20out.%20Houser.&Message%5B1%5D=https%3A%2F%2Fpink-dog-6501.twil.io%2Fassets%2FSampleAudio_0.4mb.mp3&Message%5B2%5D=%205001I000004ffiT&
XML created:
Thanks, for, checking, this, out. Houser.
https://pink-dog-6501.twil.io/assets/SampleAudio_0.4mb.mp3
5001I000004ffiT
What this formula does:
‘http://twimlets.com/message?Message%5B0%5D=’&SUBSTITUTE(Subject, ” “, “,%20″)&
twimlets.com check it out
Message%5B0%5D=
​Notice the ‘0’, this indicates first position
‘&SUBSTITUTE(Subject, ” “, “,%20”)&
Replaces blank spaces with an URL acceptable term = %20
‘.&Message%5B1%5D=’&SUBSTITUTE(SUBSTITUTE(Audio_URL__c,’:’, ‘%3A’),’/’, ‘%2F’)&
(.) pauses
SUBSTITUTE(SUBSTITUTE(Audio_URL__c,’:’, ‘%3A’),’/’, ‘%2F’)
the audio url
This replaces “;” and “/” with the acceptable url terms
‘&Message%5B2%5D=%20’&Id&’&’
I ended the call with another text field called Id
Other notes:
Message%5B1%5D = Message[1]
Message[0] The URL of a media file to , or a string to
Check out the Twimlets from Twilio here –> https://www.twilio.com/labs/twimlets
Hey Ashish, Thank you for working this all out!
I was able to take your example and create invocable methods to send out sms and calls.
I would welcome any feed back too 🙂
Twilio Support asked that I post it here:
Twilio Voice Object APEX:
Invocable =
public class TwilioCallInvocable {
@InvocableMethod
public static void callPhoneService(List voiceIDs) {
List SelectTwilio_Voice = [Select Id, MobileNumber__c, URL_Build__c from Twilio_Voice__c Where ID in :voiceIDs] ;
for (Twilio_Voice__c t : SelectTwilio_Voice){
Map params = new Map {
‘To’ => t.MobileNumber__c,
‘From’ => ‘+19412137479’, // Fastlife number
‘Url’ => t.URL_Build__c
};
DoCallout(params);
}
}
@future(callout=true)
private static void DoCallout(Map params){
String account = ‘AC6a217d8adb3460b5870c05bc6c0a2471’;
String token = ‘397c3f614cd3cf783154dc238323c615’;
TwilioRestClient client = new TwilioRestClient(account, token);
TwilioCall call = client.getAccount().getCalls().create(params);
system.debug(‘TwilioCAL’ + call);
}
}
Test=
@isTest
private class TwilioCallTest
{
@testSetup
static void testTwilioCallInvocable()
{
test.startTest();
test.stopTest();
}
static testMethod void test_callService_UseCase1(){
Twilio_Voice__c calls = new Twilio_Voice__c();
calls.MobileNumber__c = ‘17602445555’;
calls.SAY__c = ‘test message’;
calls.PLAY__c = ‘https://pink-dog-6501.twil.io/assets/SampleAudio_0.4mb.mp3’;
insert calls;
TwilioCallInvocable.callPhoneService(new List());
}
}
Twilio SMS Object APEX:
Invocable =
public class TwilioSMSInvocable {
@InvocableMethod
public static void callSMSService(List caseIDs ) {
List SelectTwilio_SMS = [Select Id, MobileNumber__C, Message__c from Twilio_SMS__c Where ID in :caseIDs] ;
for (Twilio_SMS__c t : SelectTwilio_SMS){
Map params = new Map {
‘To’ => t.MobileNumber__c,
‘From’ => ‘+19412137479’,
‘Body’ => t.Message__c
};
DoCallout(params);
}
}
@future(callout=true)
private static void DoCallout(Map params){
String account = ‘AC6a217d8adb3460b5870c05bc6c0a2471’;
String token = ‘397c3f614cd3cf783154dc238323c615’;
TwilioRestClient client = new TwilioRestClient(account, token);
TwilioSMS sms = client.getAccount().getSMSMessages().create(params);
System.Debug(‘TwilioSMS ‘ + sms) ;
}
// if(!Test.isRunningTest())
// TwilioSMS sms = client.getAccount().getSMSMessages().create(params);
}
Test =
@isTest
private class TwilioSMSTest
{
@testSetup
static void testTwilioSMSInvocable()
{
test.startTest();
test.stopTest();
}
static testMethod void test_callSMSService_UseCase1(){
Twilio_SMS__c txt = new Twilio_SMS__c();
txt.MobileNumber__c = ‘17602444355’;
txt.Message__c = ‘test message’;
insert txt;
TwilioSMSInvocable.callSMSService(new List());
}
}
Really great stuff….appriciate your help
Hi Ashish,
This tutorial is amazing in detail and simplicity to follow. Thank you so much!!!
Do you happen to know how to setup SMS Chatbot on Salesforce using Twilio?
Hi Seyit,
Glad that it was helpful. As of now I haven’t explored how to setup chatbot. But that will be another good topic to blog on. I will add it to my to-do list.
Regards,
Ashish
THANK YOU! I struggled with the dearth of documentation from Twilio and Salesforce… until I found this step-by-step, which led me to success. The gap in (other) documentation is the part about setting up the remote site. Really appreciate your guidance on this.
You’re welcome Pat and thanks or your feedback. Glad that it was helpful to you.
You are great sir! You saved my job!
Glad that it was helpful Ajay !
While twillio is a great app, it is also sad that salesforce does not have any facility of sending sms on its own.
Also is there any appexchange app that would help in building a sms triggered functionality.?
SMS Magic is one of the most popular Apps on AppExchange for sending SMSes. You may want to check it out at URL https://appexchange.salesforce.com/appxListingDetail?listingId=a0N300000024XvyEAE
Hi vaibhav,
Thats wounderfull article you have written could be please guide me if you are aware of open Cti lightning for inbound calls that is written by you.
Thanks Abhay, no I haven’t yet written anything with regards to CTI yet.
It is giving this error when I am sending message from to salesforce
[
{
“message”: “HTTPS Required”,
“errorCode”: “UNSUPPORTED_CLIENT”
}
]
it is giving this error when I am sending message from my phone to salesforce.
I have used URL like this :
http://vad03-developer-edition.ap2.force.com/services/apexrest/VAD03/receiveSMS
[
{
“message”: “HTTPS Required”,
“errorCode”: “UNSUPPORTED_CLIENT”
}
]
Hi Vaibhav, when setting up the webhook URL in Twilio to forward incoming SMS to Salesforce, please make sure that the URL you have specified is “https” and not “http”. So your URL in Twilio should be https://vad03-developer-edition.ap2.force.com/services/apexrest/VAD03/receiveSMS. Let me know if this resolves the issue.
Hey Ashish, trying to implement as per the slides but stuck(16 slide) when sending SMS on your mobile no, am not getting any message on mobile and not showing the error message link in Response section.
Thanks & Regards,
Vrushali
Hi Vrushali, if there is no error in Twilio’s response, then you should be receiving a SMS. Can you try with another mobile number? If you are still not able to receive the SMS, then the best option will be to contact Twilio support. You may also want to check the Message Log section in Twilio to see if you can find something there.
Hi Ashish, got message today morning its taking long time to receive. Thanks for help.
Regards,
Vrushali
Good to hear that Vrushali. Cheers !