Voice Over IP
--
Questions
--
Followers
Top Experts
Any info regarding software/tools or detailed scripts that would allow us to efficiently deploy various inbound survey campaigns.
Thanks
Zero AI Policy
We believe in human intelligence. Our moderation policy strictly prohibits the use of LLM content in our Q&A threads.
Please check out the below possible solutions;
http://www.voip-info.org/wiki/view/IVR+Software+from+DSC
http://users.telenet.be/Asterisk-PBX/IVR.htm
https://www.experts-exchange.com/questions/23340315/Create-IVR-In-Asterisk.html
I'm going to review the visual dialplan pro right now, but wanted to know if you use this or just heard of this. I'm curious as to whether this was a full featured package geared towards IVR or does this just have the tools necessary to assist in creating our specific IVR inbound survey compaigns as described above.
Thanks






EARN REWARDS FOR ASKING, ANSWERING, AND MORE.
Earn free swag for participating on the platform.
It is fully featured with regards to Asterisk functionality, and has a remote delivery method over SSH.
I've used this only to the point of designing a simple IVR.
Now that I understand the dialplan functions and syntax, I code everything manually now, but that software helped me get started.
Although I appreciate the comment, we are very knowledgeable in Asterisk, but are looking for specific tools/software to eliminate deployment time for survey IVR campaigns. (collecting data from key presses and storing them in a database) I spent about 10 minutes looking at Visual Dial Plan and its basically a GUI like FREEPBX for those who prefer not to tinker with Asterisk code. Personally, I find that I can create a PBX environment 20 times faster cutting and pasting line code then to physically have to draw icons and lines on grids. Doesn't make much sense to me to do that..... but thanks.
Anyone else?
The problem is that Asterisk is open source...so if you are looking for a cutom solution for deploying campaigns.., you'll probably have to develop it yourself.
You might be able to use this tool as a template for campaigns however. If you design your dialplan using mostly #include and put the campaigns dialplan code in separate files.

Get a FREE t-shirt when you ask your first question.
We believe in human intelligence. Our moderation policy strictly prohibits the use of LLM content in our Q&A threads.
Thanks I do appreciate it.
I did notice some of your other posted solutios for users. If you can expand on one of your other posts about using the Read command and using macros and such. I'll award the points if you can assist in the below:
1.) give me a sample scripts on how to capture DTMF key strokes and put them in a comma delimited file on a windows File Share.
For example. a 3 question survey asking someone to rate their satisfaction on a 1 - 5 scale on a vehicle lease or purchase.
2.) Be able to skip a question or ask a different question based on their response.
3). Provide the ability for someone to backup in a survey question for instance and change an answer before the IVR completes.
3. Ask an opened end question at the end where we would record their response. I'd then need to be able to export this audio and some how store the file name in the comma delimited file associated with the answers to the survey.
If you can mock up a quick setup of the above, I'd be more than happy to give the 500 points.
Thanks
I already do much of what you are asking for in my dialplan.
Asterisk is open source, and in the spirit of open source I have no problem posting my dialplan for you to look at. In my dialplan, you will see examples of the Read() function, examples on how to write to a cvs file, firing off macros, and some other things...
Take note that my setup, and business functions will likely be much different than yours
(see attached)
You must change the extension from .conf to .txt






EARN REWARDS FOR ASKING, ANSWERING, AND MORE.
Earn free swag for participating on the platform.
I have a couple questions regarding the dialplan code you provided me. Specifically, the COMMA=, global variable you set. My output file still shows the pipe command. I'm not sure if I'm reading your file correctly, but your file seems to have a lot of DOUBLE QUOTES in front of things. I can't tell if some of them are comments or are needed. Specifically when you define your COMMA=, you have that in double quotes "COMMA=," I didn't quite follow your exact syntax in your echo command, but got it to write out the file with all the | pipe characters in between each response. Any help on why or what I'm doing wrong.
Here is a simple sample of how I'm writing the file:
COMMA=,
exten => 2222,1,Answer()
exten => 2222,n,Wait(.5)
exten => 2222,n,NoOp(Question 1)
exten => 2222,n,Background()
exten => 2222,n,Read(Q1,,1)
exten => 2222,n,Wait(.5)
exten => 2222,n,NoOp(Question 2)
exten => 2222,n,Background()
exten => 2222,n,Read(Q2,,1)
exten => 2222,n,Wait(.5)
exten => 2222,n,NoOp(Question 3
exten => 2222,n,Background()
exten => 2222,n,Read(Q3,,1)
exten => 2222,n,Wait(.5)
exten => 2222,n,NoOp(Question 4
exten => 2222,n,Background()
exten => 2222,n,Read(Q4,,1)
exten => 2222,n,Wait(.5)
exten => 2222,n,NoOp(Question 5)
exten => 2222,n,Background()
exten => 2222,n,Read(Q5,,1)
exten => 2222,n,System(echo ${Q1}${COMMA}${Q2}${COMMA}
* output looks fine but it looks like this
1|5|4|2|3
I want 1,5,4,2,3 obviously.
Please keep in mind that we are using trixbox not asterisk if it matters on how and where to define the variable.
Also, can you tell me the syntax to only allow for digit 1-5 to be available when prompting a question?
Thanks again.
It should just be COMMA=,
...and that needs to be in the global custom variables conf file..., or you can do it in the dialplan like this >
exten => 2222,1,Answer()
exten => 2222,n,Wait(.5)
exten => 2222,n,SetGlobalVar(COMMA=
Since it's trixbox you should also be modifying only the extensions_custom.conf file.
I know there were some changes to Asterisk 1.6 regarding commas and pipes, which may or may not be included in the version on your trixbox....basically, it may no longer be necessary to set the COMMA global variable. You might want to try using the "|" character or just use a comma..","
As far as restricting digits 1-5...basically you would just limit it to 1 digit....and use GotoIf() function to determine whether to go on to the next question...
example.
exten => 2222,n(Q4START),NoOp(Begin
exten => 2222,n,Wait(.5)
exten => 2222,n,Background(question
exten => 2222,n,Read(Q4,,1)
;Below 5 lines sends them to Q5START label if Q4 = 1-5
exten => 2222,n,GotoIf($["${Q4}" = "1"]?Q5START)
exten => 2222,n,GotoIf($["${Q4}" = "2"]?Q5START)
exten => 2222,n,GotoIf($["${Q4}" = "3"]?Q5START)
exten => 2222,n,GotoIf($["${Q4}" = "4"]?Q5START)
exten => 2222,n,GotoIf($["${Q4}" = "5"]?Q5START)
;Otherwise the next three lines will execute instead.
exten => 2222,n,Playback(invalident
exten => 2222,n,NoOp(User entered invalid info, restart Question 4)
exten => 2222,n,Goto(Q4START)
exten => 2222,n(Q5START),NoOp(Begin
exten => 2222,n,Wait(.5)
exten => 2222,n,Background(question
and so on and so forth.......

Get a FREE t-shirt when you ask your first question.
We believe in human intelligence. Our moderation policy strictly prohibits the use of LLM content in our Q&A threads.
; **************************************************************
; ** GENERAL SETTINGS FOR EXTENSIONS
[general]
static=yes
writeprotect=no
autofallthrough=yes
clearglobalvars=no
priorityjumping=no
; **************************************************************
; ** GLOBAL VARIABLES
[globals]
;The below global variable is used for representing commas when invoking macros that write information to comma delimited format.
;This is a necessary workaround to keep Asterisk from interpreting comma as a "pipe" character.
COMMA=,
;The below global variable is used to set the caller ID name for outgoing calls. This is not used in this dialplan.
CIDNAME=Jason T Coast
;The below channel variable is used to set the initial caller ID phone number for outgoing calls. This can be changed using ext. 2222 in features context below.
CIDNUM=2049902283
;The below is used to set DYNAMIC_FEATURES as a global channel variable, which allows users to use features listed in features.conf.
DYNAMIC_FEATURES=delrecord#stoprecord#blackout#blindxfer#recordarc#recordnrs#recordwrs
;The below line is used to include the blacklist file.
#include blacklist.conf
;The below is the default starting context for all internal users. It includes all other contexts.
[default]
include => users
include => blacklist
include => local
include => incoming
include => features
;The below context is used for incoming calls.
[incoming]
exten => _877XXXXXXX,1,Answer()
exten => _877XXXXXXX,n,Wait(.5)
exten => _877XXXXXXX,n,NoOp(incoming call)
exten => _877XXXXXXX,n,Playback(mainmenu)
exten => _877XXXXXXX,n,Dial(SIP/5000&SIP/5001,20,tw)
exten => _877XXXXXXX,n,VoiceMail(5000@default,u)
exten => _877XXXXXXX,n,Hangup()
exten => _0505,1,Answer()
exten => _0505,n,Wait(.5)
exten => _0505,n,NoOp(incoming call)
exten => _0505,n,Dial(SIP/3307,30,tw)
exten => _0505,n,VoiceMail(3307@default,u)
exten => _0505,n,Hangup()
exten => _0506,1,Answer()
exten => _0506,n,Wait(.5)
exten => _0506,n,NoOp(incoming call)
exten => _0506,n,Dial(SIP/3300,30,tw)
exten => _0506,n,VoiceMail(3300@default,u)
exten => _0506,n,Hangup()
exten => _0507,1,Answer()
exten => _0507,n,Wait(.5)
exten => _0507,n,NoOp(incoming call)
exten => _0507,n,Dial(SIP/3306,30,tw)
exten => _0507,n,VoiceMail(3306@default,u)
exten => _0507,n,Hangup()
;The below context contains internal extensions. Take note of first two lines below.
[users]
;These two lines allow the "writecdr" macro to be used, which records the current call information in a comma delimited file.
exten => _30XX,1,Dial(SIP/${EXTEN},30,M(writecdr)TtwW)
exten => _31XX,1,Dial(SIP/${EXTEN},30,M(writecdr)TtwW)
exten => 3330,1,Dial(SIP/${EXTEN},30,M(writecdr)TtwW)
exten => 3599,1,Dial(SIP/${EXTEN},30,TtwW)
exten => 3200,1,Dial(SIP/${EXTEN},30,TtwW)
exten => 3201,1,NoOp(${CDR(src)})
exten => 3201,n,NoOp(${DIALEDNUM})
exten => 3201,n,Dial(SIP/${EXTEN},20,M(writecdr)TtwW)
exten => 3300,1,Dial(SIP/${EXTEN},20,TtwW)
exten => 3300,n,VoiceMail(${EXTEN}@default,u)
exten => 3301,1,Dial(SIP/${EXTEN},20,TtwW)
exten => 3301,n,VoiceMail(${EXTEN}@default,u)
exten => 3302,1,Dial(SIP/${EXTEN},20,TtwW)
exten => 3302,n,VoiceMail(${EXTEN}@default,u)
exten => 3303,1,Dial(SIP/${EXTEN},20,TtwW)
exten => 3303,n,VoiceMail(${EXTEN}@default,u)
exten => 3304,1,Dial(SIP/${EXTEN},20,TtwW)
exten => 3304,n,VoiceMail(${EXTEN}@default,u)
exten => 3305,1,Dial(SIP/${EXTEN},20,TtwW)
exten => 3305,n,VoiceMail(${EXTEN}@default,u)
exten => 3306,1,Dial(SIP/${EXTEN},20,TtwW)
exten => 3306,n,VoiceMail(${EXTEN}@default,u)
exten => 3307,1,Dial(SIP/${EXTEN},20,TtwW)
exten => 3307,n,VoiceMail(${EXTEN}@default,u)
exten => 5000,1,Dial(SIP/${EXTEN},20,TtwW)
exten => 5001,1,Dial(SIP/${EXTEN},20,TtwW)
include => incoming
include => blacklist
;The below context is the one and only context used for dialing outbound. This is where most variables used in the dialplan are set.
[local]
exten => _NXXNXXXXXX,1,Set(CALLERID(num)=${CIDNUM})
exten => _NXXNXXXXXX,n,Set(__DIALEDNUM=${CDR(dst)})
exten => _NXXNXXXXXX,n,Set(MYCHANEXTEN=${CDR(channel):4:4})
exten => _NXXNXXXXXX,n,Set(MYCHANID=${CDR(channel)})
exten => _NXXNXXXXXX,n,System(echo "${DIALEDNUM}${COMMA}${MYCHANID}" > /var/spool/asterisk/CallsInProgress/${MYCHANEXTEN}.txt)
exten => _NXXNXXXXXX,n,SIPDtmfMode(rfc2833)
exten => _NXXNXXXXXX,n,Dial(Zap/G3/${EXTEN},90,TW)
include => blacklist
include => incoming
;The below context is used to add a phone number to blacklist.conf. ( see features context below)
[manualblacklist]
exten => s,1,Answer()
exten => s,n,Wait(.5)
exten => s,n,Goto(begin)
exten => s,n(blreadstart),NoOp(added ${blnum} to blacklist)
exten => s,n(begin),NoOp(begin BL application)
exten => s,n,Background(enter-num-blacklist)
exten => s,n,Read(blnum,,10)
exten => s,n,GotoIf($[ ${blnum} < 201200000 ]?unsuccessful:successful)
exten => s,n(successful),NoOp(user entered all ten digits to blacklist)
exten => s,n,System(echo "exten => _${blnum}${COMMA}1${COMMA}Hangup()" >> /etc/asterisk/blacklist.conf)
exten => s,n,Playback(beep)
exten => s,n,Goto(blreadstart)
exten => s,n(unsuccessful),NoOp(user did not enter all ten digits to blacklist)
exten => s,n,Playback(oops1)
exten => s,n,Playback(you-dialed-wrong-number)
exten => s,n,Playback(please-try-again)
exten => s,n,Goto(blreadstart)
;The below macro adds the phone number of the party which dialed into blacklist.conf. (see features.conf)
[macro-blockout]
exten => s,1,System(echo "exten => _${DIALEDNUM}${COMMA}1${COMMA}Hangup()" >> /etc/asterisk/blacklist.conf)
exten => s,n,Playback(beep)
exten => s,n,Wait(3)
exten => s,n,System(/usr/sbin/asterisk -rx "extensions reload")
;The below macro is used to record a conversation, for the ARC group. (see features.conf)
[macro-arcrecord]
exten => s,1,Playback(beep)
exten => s,n,NoOp(RECORDING ${DIALEDNUM})
exten => s,n,NoOp(${CDR(dst)})
exten => s,n,MixMonitor(/var/spool/asterisk/monitor/arc/${DIALEDNUM}.wav,bW(3))
exten => s,n,Set(_wdir=arc)
;The below macro is used to record a conversation, for the WRS group. (see features.conf)
[macro-wrsrecord]
exten => s,1,Playback(beep)
exten => s,n,NoOp(RECORDING ${DIALEDNUM})
exten => s,n,NoOp(${CDR(dst)})
exten => s,n,MixMonitor(/var/spool/asterisk/monitor/wrs/${DIALEDNUM}.wav,bW(3))
exten => s,n,Set(_wdir=wrs)
;The below macro is used to record a conversation, for the NRS group. (see features.conf)
[macro-nrsrecord]
exten => s,1,Playback(beep)
exten => s,n,NoOp(RECORDING ${DIALEDNUM})
exten => s,n,NoOp(${CDR(dst)})
exten => s,n,MixMonitor(/var/spool/asterisk/monitor/nrs/${DIALEDNUM}.wav,bW(3))
exten => s,n,Set(_wdir=nrs)
;The below macro is used to stop recording. (see features.conf)
[macro-stopmon]
exten => s,1,Playback(beep)
exten => s,n,NoOp(STOP RECORDING of ${DIALEDNUM})
exten => s,n,StopMixMonitor()
;The below macro is used to delete a recording file. (see features.conf)
[macro-delmon]
exten => s,1,Wait(1)
exten => s,n,Playback(beep)
exten => s,n,StopMixMonitor()
exten => s,n,Wait(1)
exten => s,n,NoOp(DELETE RECORDING ${DIALEDNUM} in ${wdir})
exten => s,n,System(rm -f /var/spool/asterisk/monitor/${wdir}/${DIALEDNUM}.wav)
;This macro is launched with the Dial() function when a user transfers a call. I is used to write to a comma delimited text file, to a local folder that is shared via Samba.
;This macro records the variables for number dialed, SIP- channel ID, and writes the text file named by the extension the call was transferred to. (ie. 3001.txt)
[macro-writecdr]
exten => s,1,NoOp(${CDR(channel)})
exten => s,n,NoOp(${DIALEDNUM})
exten => s,n,NoOp(WRITE CDR TO FILE)
exten => s,n,Set(MYCHANEXTEN=${CDR(channel):4:4})
exten => s,n,System(echo "${DIALEDNUM}${COMMA}${CDR(channel)}" > /var/spool/asterisk/CallsInProgress/${MYCHANEXTEN}.txt)
[features]
;Below is used to spy on a SIP extension channel.
exten => 1111,1,Answer()
exten => 1111,n,Wait(1)
exten => 1111,n,Authenticate(8899,a)
exten => 1111,n,Playback(pin-number-accepted)
exten => 1111,n,Wait(1)
exten => 1111,n,Background(beep)
exten => 1111,n,Read(Zapchan,,4)
exten => 1111,n,ChanSpy(SIP/${Zapchan},q)
;Below is used to record main menu greeting.
exten => 9999,1,Answer()
exten => 9999,n,Wait(.5)
exten => 9999,n,Authenticate(0000,a)
exten => 9999,n,Record(/var/lib/asterisk/sounds/mainmenu.gsm,,40)
exten => 9999,n(playback),NoOp(playing recorded menu)
exten => 9999,n,Playback(mainmenu)
exten => 9999,n,Background(to-accept-recording)
exten => 9999,n,Background(press-1)
exten => 9999,n,Background(to-rerecord-it)
exten => 9999,n,Background(press-2)
exten => 9999,n,Read(numpress,,1,,2,10)
exten => 9999,n,GotoIf($[${numpress} = 1]?exit:9999,4)
exten => 9999,n(exit),Background(goodbye)
exten => 9999,n,Hangup()
;Below is used to get into the main voicemail application
exten => 5555,1,Answer()
exten => 5555,n,Wait(.5)
exten => 5555,n,SIPDtmfMode(rfc2388)
exten => 5555,n,VoicemailMain(@default)
;Below is used to jump to the manual blacklist feature context above..., at extension S, priority 1.
exten => 9000,1,Goto(manualblacklist,s,1)
;Below is used to change the global variable CID. This allows users to dial ext. 2222 and change the outgoing caller ID display at any time.
exten => 2222,1,Answer()
exten => 2222,n,Wait(.5)
exten => 2222,n(ecidnumstart),NoOp(User changing CID variable)
exten => 2222,n,Playback(beep)
exten => 2222,n,Read(ecidnum,,10)
exten => 2222,n,GotoIf($[ ${ecidnum} < 201200000 ]?unsuccessful:successful)
exten => 2222,n(successful),NoOp(user entered all ten digits to blacklist)
exten => 2222,n,SetGlobalVar(CIDNUM=${ecidnum})
exten => 2222,n,Playback(beep)
exten => 2222,n,Hangup()
exten => 2222,n(unsuccessful),NoOp(user entered invalid phone number)
exten => 2222,n,Playback(oops1)
exten => 2222,n,Playback(you-dialed-wrong-number)
exten => 2222,n,Playback(please-try-again)
exten => 2222,n,Goto(ecidnumstart)
exten => 2222,n,Hangup()
Note the [applicationmap] toward the bottom...that is what allows the macros to fire that invoke recording.
;
; Sample Call Features (parking, transfer, etc) configuration
;
[general]
parkext => 700
parkpos => 701-720
context => parkedcalls
;parkingtime => 45
courtesytone = beep
;parkedplay = caller
;adsipark = yes
;findslot => next
;parkedmusicclass=default
transferdigittimeout => 3000
xfersound = beep
xferfailsound = beeperr
;pickupexten = #8
featuredigittimeout = 3500
atxfernoanswertimeout = 60
; Note that the DTMF features listed below only work when two channels have answered and are bridged together.
; They can not be used while the remote party is ringing or in progress. If you require this feature you can use
; chan_local in combination with Answer to accomplish it.
[featuremap]
blindxfer => #
;disconnect => #9
automon => *0
atxfer => *1
;parkcall => #72 ; Park call (one step parking)
[applicationmap]
recordarc => *3,caller,macro,arcrecord
recordnrs => *4,caller,macro,nrsrecord
recordwrs => *2,caller,macro,wrsrecord
stoprecord => *5,caller,macro,stopmon
delrecord => *7,caller,macro,delmon
blackout => *9,caller,macro,blockout






EARN REWARDS FOR ASKING, ANSWERING, AND MORE.
Earn free swag for participating on the platform.
a couple more questions if I may..
In your example:
exten => 2222,n,GotoIf($["${Q4}" = "1"]?Q5START)
Is there any boolean syntax where I can just code valid responses 1-5 in one line of code to go to Q5START?
Is it necessary to have the DTMF answer in double quotes?
I assume I can use the * DTMF as a valid answer or is this a reserved DTMF code. I'd like to use it for someone to backup a question.
Lastly, pardon if this is a very basic question, but what command or parameter can I use to allow someone to enter a DTMF code while a audio file is playing. In those scenarios where you can say, at any time you can hit the * key to move back a menu.
exten => 2222,n,GotoIf($[${Q4} = 1]?Q5START) <<<<<that should work.
The only way to use a boolean method would be like this...
exten => 2222,n,GotoIf($[${Q4} =< 5]?Q5START) <<<<<which says any number equal to or less than 5...however that would include 0 as a valid response so in this case it won't work since 0 is not a valid option.
The * key + a number is most often used for features...not usually responses to IVR's. The reason I would say don't use *, is that it causes a delay....there are built in * key combos in asterisk..."not sure about trixbox"...but basically what happes is you press *, and asterisk waits about 1.5 seconds for another digit to follow before processing just a *. You can disable those features which use a star, but I wouldn't recommend it.
I would use numbers 1-5 as your responses...and use 0 to backup.
When you use ...,n,Background(question5
exten => 2222,n,GotoIf($[${Q4} = 0]?Q4START)
exten => 2222,n,GotoIf($[${Q4} =< 5]?Q5START)
exten => 2222,n,Playback(invalident
exten => 2222,n,NoOp(User entered invalid info, restart Question 4)
exten => 2222,n,Goto(Q4START)

Get a FREE t-shirt when you ask your first question.
We believe in human intelligence. Our moderation policy strictly prohibits the use of LLM content in our Q&A threads.
1. When an inbound call is answered by my IVR campaign, I'd like to parse a text file to see if a 7 digit number exists before letting them into the survey. Can you direct me to some samples that will parse an entire file (plain ascii text file) and look for the occurrence of a 7 digit number that the caller enters at the beginning of a survey IVR.
As an example. "please enter your 7 digit customer number followed by the # button". Store that number in a variable then parse a file and if it matches the record continue with the IVR.
2. I need to make a recording in the IVR and then rename that recording to the 7 digit number plus the question number. Say in Question 4 we ask them to tell us about their recent service experience at a dealership. I'd like to make a recording and call it the Q4-"7 digit number".
3. Lastly, I'd need to write out the recording name to the record. This will allow us to listen to the recording and transcribe the audio to text and merge the records post processing.
Anyway, any samples on the above would be appreciated and if you'd like. I'll open another question up and just award you the 500 points in there. In the mean time, I'll see if I can just award you more points on this question... say a 1000 or so. :)
Thanks again
Voice Over IP
--
Questions
--
Followers
Top Experts
Voice over IP (VoIP) is a methodology and group of technologies for the delivery of voice communications and multimedia sessions over Internet Protocol (IP) networks, such as the Internet. Other terms commonly associated with VoIP are IP telephony, Internet telephony, broadband telephony, and broadband phone service. The term specifically refers to the provisioning of communications services (voice, fax, SMS, voice-messaging) over the public Internet, rather than via the public switched telephone network (PSTN). Examples of the VoIP protocols are H.323, Media Gateway Control Protocol (MGCP), Session Initiation Protocol (SIP), H.248 (also known as Media Gateway Control (Megaco)), Real-time Transport Protocol (RTP), Real-time Transport Control Protocol (RTCP), Secure Real-time Transport Protocol (SRTP), Session Description Protocol (SDP), and Inter-Asterisk eXchange (IAX).