Using Asterisk for Shared Customer Support Line

We are a small company, and we have customers to support. We have a customer support line.

We would like to have anyone be able to log in to the customer support line, and then answer if they can. If no one ansers, it should go to voice mail, and then email the message to us, and try to call our cell phones every few minutes to tell us there is a message.

It is mostly set up and working, but if someone logs in to the support line, and then turns their computer off, or has a network problem, or their computer crashes, the call goes immediately into that individual’s voice mail.

I tried to do some searches, but I was not sure what to search for.

Can someone point me in the right direction to how to prevent calls to a shared line from going into an individual’s voice mail?

If we can not solve this problem, then we can not really use Asterisk for this, and we are back to square one.

Thanks.

It sounds like you’re using softphones to answer the calls. However, if someone isn’t connected (registered) as the softphone user, the call has no where to go.

Well, where would you LIKE the call to go if it fails? To a cell phone? Another station?

It’s just a matter of setting up the dial plan to take the calls to a new destination if the first destination is busy.

Yes, we are using softphones, but we also have a couple of hardware SIP phones.

Currently we have it set up to ring everyone who is logged in.

The problem only occurs when a user is still logged in, but their softphone is no longer available to the server. Even if other people are logged in, it goes directly to that person’s voice mail.

We want it to ring anyone who is logged in and if no one answers, we want it to go to the voicemail for that shared line, which is how it works if there is not the case where someone is logged in but their computer is not available.

This situation causes many single points of failure and so it is not reliable. Is there any way to tell it to never go to an individual’s voicemail? How about even telling the voice mail of each individual to only answer calls that are actually for them?

Thanks.

Please post the extensions.conf file information that handles the calls to those stations, and the shared extension.

Here is the extensions.conf file:

[code]; extensions.conf - the Asterisk dial plan
;
; Static extension configuration file, used by
; the pbx_config module. This is where you configure all your
; inbound and outbound calls in Asterisk.
;
; This configuration file is reloaded
; - With the “dialplan reload” command in the CLI
; - With the “reload” command (that reloads everything) in the CLI

;
; The “General” category is for certain variables.
;
[general]
static=yes
writeprotect=no
clearglobalvars=no

[globals]
CONSOLE=Console/dsp ; Console interface for demo
;CONSOLE=Zap/1
;CONSOLE=Phone/phone0
TELIAXUSERNAME=******
TELIAXSECRET=******
TELIAXINFO=${GLOBAL(TELIAXUSERNAME)}:${GLOBAL(TELIAXSECRET)}
TELIAXSERVER=den.teliax.net
PINCSNUMBER=********

TRUNK=Zap/g ; Trunk interface
TRUNKGEN=Zap/g1 ; General Trunk interface
TRUNKCS=Zap/g3 ; Customer Support Trunk Interface

*****=6006
*****_SP=6009
*****=6010
*****_SP=6014
*****=6015
*****_SP=6019

;
; Note the ‘g2’ in the TRUNK variable above. It specifies which group (defined
; in zapata.conf) to dial, i.e. group 2, and how to choose a channel to use in
; the specified group. The four possible options are:
;
; g: select the lowest-numbered non-busy Zap channel
; (aka. ascending sequential hunt group).
; G: select the highest-numbered non-busy Zap channel
; (aka. descending sequential hunt group).
; r: use a round-robin search, starting at the next highest channel than last
; time (aka. ascending rotary hunt group).
; R: use a round-robin search, starting at the next lowest channel than last
; time (aka. descending rotary hunt group).
;
TRUNKMSD=1 ; MSD digits to strip (usually 1 or 0)
;TRUNK=IAX2/user:pass@provider

;
; Any category other than “General” and “Globals” represent
; extension contexts, which are collections of extensions.
;
; Extension names may be numbers, letters, or combinations
; thereof. If an extension name is prefixed by a ‘_’
; character, it is interpreted as a pattern rather than a
; literal. In patterns, some characters have special meanings:
;
; X - any digit from 0-9
; Z - any digit from 1-9
; N - any digit from 2-9
; [1235-9] - any digit in the brackets (in this example, 1,2,3,5,6,7,8,9)
; . - wildcard, matches anything remaining (e.g. _9011. matches
; anything starting with 9011 excluding 9011 itself)
; ! - wildcard, causes the matching process to complete as soon as
; it can unambiguously determine that no other matches are possible
;
; For example the extension _NXXXXXX would match normal 7 digit dialings,
; while _1NXXNXXXXXX would represent an area code plus phone number
; preceded by a one.
;
; Each step of an extension is ordered by priority, which must
; always start with 1 to be considered a valid extension. The priority
; “next” or “n” means the previous priority plus one, regardless of whether
; the previous priority was associated with the current extension or not.
; The priority “same” or “s” means the same as the previously specified
; priority, again regardless of whether the previous entry was for the
; same extension. Priorities may be immediately followed by a plus sign
; and another integer to add that amount (most useful with ‘s’ or ‘n’).
; Priorities may then also have an alias, or label, in
; parenthesis after their name which can be used in goto situations
;
; Contexts contain several lines, one for each step of each
; extension, which can take one of two forms as listed below,
; with the first form being preferred.
;
;[context]
;exten => someexten,{priority|label{+|-}offset}[(alias)],application(arg1,arg2,…)
;exten => someexten,{priority|label{+|-}offset}[(alias)],application,arg1|arg2…
;
; Included Contexts
;
; One may include another context in the current one as well, optionally with a
; date and time. Included contexts are included in the order
; they are listed.
; The reason a context would include other contexts is for their
; extensions.
; The algorithm to find an extension is recursive, and works in this
; fashion:
; first, given a stack on which to store context references,
; push the context to find the extension onto the stack…
; a) Try to find a matching extension in the context at the top of
; the stack, and, if found, begin executing the priorities
; there in sequence.
; b) If not found, Search vm-you havethe switches, if any declared, in
; sequence.
; c) If still not found, for each include, push that context onto
; the top of the context stack, and recurse to a).
; d) If still not found, pop the entry from the top of the stack;
; if the stack is empty, the search has failed. If it’s not,
; continue with the next context in c).
; This is a depth-first traversal, and stops with the first context
; that provides a matching extension. As usual, if more than one
; pattern in a context will match, the ‘best’ match will win.
; Please note that that extensions found in an included context are
; treated as if they were in the context from which the search began.
; The PBX’s notion of the “current context” is not changed.
; Please note that in a context, it does not matter where an include
; directive occurs. Whether at the top, or near the bottom, the effect
; will be the same. The only thing that matters is that if there is
; more than one include directive, they@pincsolutions.com will be searched for extensions
; in order, first to last.
; Also please note that pattern matches (like _9XX) are not treated
; any differently than exact matches (like 987). Also note that the
; order of extensions in a context have no affect on the outcome.
;
; Timing list for includes is
;
; |||
;
; Note that ranges may be specified to wrap around the ends. Also, minutes are
; fine-grained only down to the closest even minute.
;
;include => daytime|9:00-17:00|mon-fri||
;include => weekend||sat-sun||*
;include => weeknights|17:02-8:58|mon-fri||
;
; ignorepat can be used to instruct drivers to not cancel dialtone upon
; receipt of a particular pattern. The most commonly used example is
; of course ‘9’ like this:
;
;ignorepat => 9
;
; so that dialtone remains even after dialing a 9.
;

[dundi-e164-switch]
;
; Just a wrapper for the switch
;
switch => DUNDi/e164

[dundi-e164-lookup]
;
; Locally to lookup, try looking for a local E.164 solution
; then try DUNDi if we don’t have one.
;
include => dundi-e164-switch
;
; DUNDi can also be implemented as a Macro instead of using
; the Local channel driver.
;
[macro-dundi-e164]
;
; ARG1 is the extension to Dial
;
; Extension “s” is not a wildcard extension that matches “anything”.
; In macros, it is the start extension. In most other cases,
; you have to goto “s” to execute that extension.
;
; For wildcard matches, see above - all pattern matches start with
; an underscore.
exten => s,1,Goto(${ARG1},1)
include => dundi-e164-lookup

;
; The page context calls up the page macro that sets variables needed for auto-answer
; It is in is own context to make calling it from the Page() application as simple as
; Local/{peername}@page
;
[page]
exten => _X.,1,Macro(page,SIP/${EXTEN})

[outgoing]
; outgoing dialplans
exten => _9NXXXXXX,1,Dial(${GLOBAL(TRUNKGEN)}/${EXTEN:1})
exten => _9NXXXXXX,2,Congestion
exten => _91XXXXXXXXXX,1,Dial(${GLOBAL(TRUNKGEN)}/${EXTEN:1})
exten => _91XXXXXXXXXX,2,Congestion

; Give voicemail at extension 8500
exten => 8500,1,VoicemailMain
exten => 8500,n,Goto(s,6)

exten => _9011Z.,1,Dial(${GLOBAL(TRUNKGEN)}/${EXTEN:1})
exten => _9011Z.,2,Congestion

; teliax outgoing dial plans
exten => _8NXXXXXX,1,Set(CALLERID(all)=${GLOBAL(PINCSNUMBER)})
exten => _8NXXXXXX,2,Dial(SIP/teliax/510${EXTEN:1},90,tr)
exten => _8NXXXXXX,3,Congestion

exten => _81XXXXXXXXXX,1,Set(CALLERID(all)=${GLOBAL(PINCSNUMBER)})
exten => _81XXXXXXXXXX,2,Dial(SIP/teliax/${EXTEN:1},90,tr)
exten => _81XXXXXXXXXX,3,Congestion

exten => _8011Z.,1,SetCallerId(${GLOBAL(PINCSNUMBER)})
exten => _8011Z.,2,Dial(SIP/${EXTEN:1},90,tr)
exten => _8011Z.,3,Congestion

[default]
;
; By default we include the demo. In a production system, you
; probably don’t want to have the demo there.
;
;include => demo

include => outgoing
include => autoattend
include => invalid
include => from-zaptel1
include => from-zaptel2
include => from-zaptel3
include => from-zaptel4

; An extension like the one below can be used for FWD, Nikotel, sipgate etc.
; Note that you must have a [sipprovider] section in sip.conf
;
;exten => _41X.,1,Dial(SIP/${EXTEN:2}@sipprovider,r)

; Real extensions would go here. Generally you want real extensions to be
; 4 or 5 digits long (although there is no such requirement) and start with a
; single digit that is fairly large (like 6 or 7) so that you have plenty of
; room to overlap extensions and menu options without conflict. You can alias
; them with names, too, and use global variables

;exten => 6245,hint,SIP/Grandstream1&SIP/Xlite1,Joe Schmoe ; Channel hints for presence
;exten => 6245,1,Dial(SIP/Grandstream1,20,rt) ; permit transfer
;exten => 6245,n(dial),Dial(${HINT},20,rtT) ; Use hint as listed
;exten => 6245,n,Voicemail(6245,u) ; Voicemail (unavailable)
;exten => 6245,s+1,Hangup ; s+1, same as n
;exten => 6245,dial+101,Voicemail(6245,b) ; Voicemail (busy)
;exten => 6361,1,Dial(IAX2/JaneDoe,rm) ; ring without time limit
;exten => 6389,1,Dial(MGCP/aaln/1@192.168.0.14)
;exten => 6390,1,Dial(JINGLE/caller/callee) ; Dial via jingle using labels
;exten => 6391,1,Dial(JINGLE/asterisk@digium.com/mogorman@astjab.org) ;Dial via jingle using asterisk as the transport and calling mogorman.
;exten => 6394,1,Dial(Local/6275/n) ; this will dial ${MARK}

;exten => 6275,1,Macro(stdexten,6275,${MARK}) ; assuming ${MARK} is something like Zap/2
;exten => mark,1,Goto(6275|1) ; alias mark to 6275
;exten => 6536,1,Macro(stdexten,6236,${WIL}) ; Ditto for wil
;exten => wil,1,Goto(6236|1)

;If you want to subscribe to the status of a parking space, this is
;how you do it. Subscribe to extension 6600 in sip, and you will see
;the status of the first parking lot with this extensions’ help
;exten => 6600,hint,park:701@parkedcalls
;exten => 6600,1,noop
;
; Some other handy things are an extension for checking voicemail via
; voicemailmain
;
;exten => 8500,1,VoicemailMain
;exten => 8500,n,Hangup
;
; Or a conference room (you’ll need to edit meetme.conf to enable this room)
;
;exten => 8600,1,Meetme(1234)
;
; Or playing an announcement to the called party, as soon it answers
;
;exten = 8700,1,Dial(${MARK},30,A(/path/to/my/announcemsg))
;
; For more information on applications, just type “core show applications” at your
; friendly Asterisk CLI prompt.
;
; "core show application " will show details of how you
; use that particular application in this file, the dial plan.
; “core show functions” will list all dialplan functions
; "core show function " will show you more information about
; one function. Remember that function names are UPPER CASE.

;extensions for receptionist, other employees
exten => 6000,1,Dial(SIP/6000&SIP/6004,20,tr)
exten => 6000,2,VoiceMail(6000|u)
exten => 6001,1,Dial(SIP/6001&SIP/6004,20)
exten => 6001,2,VoiceMail(6000|u)
exten => 6002,1,Dial(SIP/6002&SIP/6004,20)
exten => 6002,2,VoiceMail(6000|u)
exten => 6003,1,Dial(SIP/6003&SIP/6004,20)
exten => 6003,2,VoiceMail(6000|u)
exten => 6004,1,Dial(SIP/6004,20)
exten => 6004,2,VoiceMail(6000|u)

;exten => ${},1,Macro(voicemail,${},${_SP},${},90)
;exten => 6006,1,Macro(voicemail,6006,${_SP},${},90)

exten => 6006,1,Dial(SIP/6006&SIP/6009,20,tr)
exten => 6006,2,VoiceMail(6006|u)
exten => 6005,1,Dial(SIP/6005&SIP/6009,20)
exten => 6005,2,VoiceMail(6006|u)
exten => 6009,1,Dial(SIP/6009,20)
exten => 6009,2,VoiceMail(6006|u)

exten => 6010,1,Dial(SIP/6010&SIP/6014,20,tr)
exten => 6010,2,VoiceMail(6010|u)
exten => 6011,1,Dial(SIP/6011&SIP/6014,20,tr)
exten => 6011,2,VoiceMail(6010|u)
exten => 6014,1,Dial(SIP/6014,20,tr)
exten => 6014,2,VoiceMail(6010|u)

exten => 6015,1,Dial(SIP/6015&SIP/6019,20,tr)
exten => 6015,2,VoiceMail(6015|u)
exten => 6016,1,Dial(SIP/6016&SIP/6016,20,tr)
;exten => 6016,2,VoiceMail(6015|u)
exten => 6019,1,Dial(SIP/6019,20,tr)
exten => 6019,2,VoiceMail(6015|u)

exten => 6600,1,Dial(SIP/6600,20,tr)
exten => 6600,2,VoiceMail(6600|u)

exten => 6020,1,Dial(SIP/6020&SIP/6024,20,tr)
exten => 6020,2,VoiceMail(6020|u)
exten => 6024,1,Dial(SIP/6024,20,tr)
exten => 6024,2,VoiceMail(6020|u)

exten => 6025,1,Dial(SIP/6025&SIP/6029,20,tr)
exten => 6025,2,VoiceMail(6025|u)
exten => 6029,1,Dial(SIP/6029,20,tr)
exten => 6029,2,VoiceMail(6025|u)

exten => 6030,1,Dial(SIP/6030&SIP/6034,20,tr)
exten => 6030,2,VoiceMail(6030|u)
exten => 6034,1,Dial(SIP/6034,20,tr)
exten => 6034,2,VoiceMail(6030|u)

exten => 6035,1,Dial(SIP/6035&SIP/6039,20,tr)
exten => 6035,2,VoiceMail(6035|u)
exten => 6039,1,Dial(SIP/6039,20,tr)
exten => 6039,2,VoiceMail(6035|u)

exten => 6040,1,Dial(SIP/6040&SIP/6044,20,tr)
exten => 6040,2,VoiceMail(6040|u)
exten => 6044,1,Dial(SIP/6044,20,tr)
exten => 6044,2,VoiceMail(6040|u)

exten => 6045,1,Dial(SIP/6045&SIP/6049,20,tr)
exten => 6045,2,VoiceMail(6045|u)
exten => 6049,1,Dial(SIP/6049,20,tr)
exten => 6049,2,VoiceMail(6045|u)

exten => 6050,1,Dial(SIP/6050&SIP/6054,20,tr)
exten => 6050,2,VoiceMail(6050|u)
exten => 6054,1,Dial(SIP/6054,20,tr)
exten => 6054,2,VoiceMail(6050|u)

exten => 6055,1,Dial(SIP/6055&SIP/6059,20,tr)
exten => 6055,2,VoiceMail(6055|u)
exten => 6059,1,Dial(SIP/6059,20,tr)
exten => 6059,2,VoiceMail(6055|u)

exten => 6060,1,Dial(SIP/6060&SIP/6064,20,tr)
exten => 6060,2,VoiceMail(6060|u)
exten => 6064,1,Dial(SIP/6064,20,tr)
exten => 6064,2,VoiceMail(6060|u)

exten => 6065,1,Dial(SIP/6065&SIP/6069,20,tr)
exten => 6065,2,VoiceMail(6065|u)
exten => 6069,1,Dial(SIP/6069,20,tr)
exten => 6069,2,VoiceMail(6065|u)

exten => 6070,1,Dial(SIP/6070&SIP/6074,20,tr)
exten => 6070,2,VoiceMail(6070|u)
exten => 6074,1,Dial(SIP/6074,20,tr)
exten => 6074,2,VoiceMail(6070|u)

exten => 6075,1,Dial(SIP/6075&SIP/6079,20,tr)
exten => 6075,2,VoiceMail(6075|u)
exten => 6079,1,Dial(SIP/6079,20,tr)
exten => 6079,2,VoiceMail(6075|u)

exten => 6080,1,Dial(SIP/6080&SIP/6084,20,tr)
exten => 6080,2,VoiceMail(6080|u)
exten => 6084,1,Dial(SIP/6084,20,tr)
exten => 6084,2,VoiceMail(6080|u)

exten => 6085,1,Dial(SIP/6085&SIP/6089,20,tr)
exten => 6085,2,VoiceMail(6085|u)
exten => 6086,1,Dial(SIP/6086&SIP/6089,20,tr)
exten => 6086,2,VoiceMail(6085|u)
exten => 6089,1,Dial(SIP/6089,20,tr)
exten => 6089,2,VoiceMail(6085|u)

exten => 6090,1,Dial(SIP/6090&SIP/6094,20,tr)
exten => 6090,2,VoiceMail(6090|u)
exten => 6094,1,Dial(SIP/6094,20,tr)
exten => 6094,2,VoiceMail(6090|u)

exten => 6095,1,Dial(SIP/6095&SIP/6099,20,tr)
exten => 6095,2,VoiceMail(6095|u)
exten => 6099,1,Dial(SIP/6099,20,tr)
exten => 6099,2,VoiceMail(6095|u)

exten => 6100,1,Dial(SIP/6100&SIP/6104,20,tr)
exten => 6100,2,VoiceMail(6100|u)
exten => 6104,1,Dial(SIP/6104,20,tr)
exten => 6104,2,VoiceMail(6100|u)

exten => 6105,1,Dial(SIP/6105&SIP/6109,20,tr)
exten => 6105,2,VoiceMail(6105|u)
exten => 6109,1,Dial(SIP/6109,20,tr)
exten => 6109,2,VoiceMail(6105|u)

exten => 6110,1,Dial(SIP/6110&SIP/6114,20,tr)
exten => 6110,2,VoiceMail(6110|u)
exten => 6114,1,Dial(SIP/6114,20,tr)
exten => 6114,2,VoiceMail(6110|u)

exten => 6115,1,Dial(SIP/6115&SIP/6119,20,tr)
exten => 6115,2,VoiceMail(6115|u)
exten => 6119,1,Dial(SIP/6119,20,tr)
exten => 6119,2,VoiceMail(6115|u)

exten => 6120,1,Dial(SIP/6120&SIP/6124,20,tr)
exten => 6120,2,VoiceMail(6120|u)
exten => 6124,1,Dial(SIP/6124,20,tr)
exten => 6124,2,VoiceMail(6120|u)

exten => 6125,1,Dial(SIP/6125&SIP/6129,20,tr)
exten => 6125,2,VoiceMail(6125|u)
exten => 6129,1,Dial(SIP/6129,20,tr)
exten => 6129,2,VoiceMail(6125|u)

exten => 6130,1,Dial(SIP/6130&SIP/6134,20,tr)
exten => 6130,2,VoiceMail(6130|u)
exten => 6134,1,Dial(SIP/6134,20,tr)
exten => 6134,2,VoiceMail(6130|u)

exten => 6135,1,Dial(SIP/6135&SIP/6139,20,tr)
exten => 6135,2,VoiceMail(6135|u)
exten => 6139,1,Dial(SIP/6139,20,tr)
exten => 6139,2,VoiceMail(6135|u)

exten => 6140,1,Dial(SIP/6140&SIP/6144,20,tr)
exten => 6140,2,VoiceMail(6140|u)
exten => 6144,1,Dial(SIP/6144,20,tr)
exten => 6144,2,VoiceMail(6140|u)

exten => 6145,1,Dial(SIP/6145&SIP/6149,20,tr)
exten => 6145,2,VoiceMail(6145|u)
exten => 6149,1,Dial(SIP/6149,20,tr)
exten => 6149,2,VoiceMail(6145|u)

exten => 6150,1,Dial(SIP/6150&SIP/6154,20,tr)
exten => 6150,2,VoiceMail(6150|u)
exten => 6154,1,Dial(SIP/6154,30,tr)
;exten => 6154,2,VoiceMail(6150|u)

exten => 6155,1,Dial(SIP/6155&SIP/6159,20,tr)
exten => 6155,2,VoiceMail(6155|u)
exten => 6159,1,Dial(SIP/6159,20,tr)
exten => 6159,2,VoiceMail(6155|u)

exten => 2000,1,Answer
exten => 2000,2,Playback(/tmp/asterisk-recording)
exten => 2000,4,Hangup

;Agent Login
;exten => 2001,1,AgentLogin(${CALLERIDNUM})
;exten => _2001XXXX,1,AgenCallbackLogin(||${EXTEN:4})
exten => 2001,1,AgentCallbackLogin()
exten => 2001,2,Hangup

;Agent Logout
exten => 2002,1,AgentCallbackLogin(||)

;Incoming callers
exten => 2020,1,Answer
exten => 2020,2,Ringing
exten => 2020,3,Wait(2)
exten => 2020,4,Queue(MyQueue||||60)
;exten => 2020,5,Background(/tmp/asterisk-recordingcs);workaround for cs greeting
exten => 2020,5,VoiceMail(6600|u)
exten => 2020,6,Hangup

;starts calling people on duty’s cell numbers

;exten => 2020,6,Dial(${TRUNK}c/95770929,20,r)
;exten => 2020,6,Dial(SIP/6006,20,r)
;exten => 2020,7,VoiceMailMain(6600)
;exten => 2020,8,Hangup

;Trial
exten => 3000,1,Dial(SIP/6006)
exten => 3000,2,Playback(vm-messages)
exten => 3000,3,Read(ACCEPTCALL|1-yes-2-no|,3,)
exten => 3000,4,GotoIf($[${ACCEPTCALL}=1]?5:6)
exten => 3000,5,VoiceMailMain(6600)
exten => 3000,6,Playback(demo-nogo)

exten => 3000,7,Hangup

exten => 4000,1,Wait(2)
exten => 4000,2,Record(/tmp/asterisk-recording:gsm)
exten => 4000,3,Wait(10)
exten => 4000,4,Playback(/tmp/asterisk-recording)
exten => 4000,5,Wait(1)
exten => 4000,6,Hangup

exten => 4005,1,Wait(2)
exten => 4005,2,Record(/tmp/asterisk-recordingcs:gsm)
exten => 4005,3,Wait(10)
exten => 4005,4,Playback(/tmp/asterisk-recordingcs)
exten => 4005,5,Wait(1)
exten => 4005,6,Hangup

exten =>3010,1,Playback(/tmp/asterisk-recordingcs)
;exten => 3010,1,Playback(pls-wait-connect-call)
;exten => 3010,2,Setvar(NewCaller=$(CALLERIDNUM)
;exten => 3010,1,Dial(${GLOBAL(TRUNKGEN)}/5770929,20,t)
;exten => 3010,2,Dial(SIP/6006,12,r)
;exten => 3010,1,GotoIf($"${DIALSTATUS}"=‘NOANSWER’?8)
exten => 3010,2,Read(ACCEPTCALL|1-yes-2-no|,3,)
exten => 3010,3,GotoIf($[${ACCEPTCALL}= 1]?6 )
exten => 3010,4,GotoIf($[${ACCEPTCALL}= 2]?10)
exten => 3010,5,Transfer(8500)
exten => 3010,6,VoiceMailMain(6600)
exten => 3010,7,Dial(SIP/6015,12,r)
exten => 3010,8,GotoIf($"${DIALSTATUS}"=‘NOANSWER’?8)
exten => 3010,9,VoiceMailMain(6600)
exten => 3010,10,Hangup

[invalid]
exten => _.,1,Playback(invalid)
exten => _.,2,Hangup

[autoattend]
;exten => 3500,1,Wait(1)
exten => 3500,1,Answer
exten => 3500,2,Set(TRIES=0)
exten => 3500,2,Set(TIMEOUT(digit)=5)
exten => 3500,3,Set(TIMEOUT(response)=10)
exten => 3500,4,Background(/tmp/asterisk-recording)
exten => 3500,5,WaitExten(5)

exten => 2,1,Goto(6100,1)
;exten => 1,1,Queue(MyQueue|t|||45)
exten => 1,1,Goto(2020,1)
exten => 0,1,Goto(6000,1)
exten => 9,1,Goto(3500,1)
exten => 4,1,Goto(3501,1)
exten => ${EXTEN},1,Dial(SIP/${EXTEN})

;exten => t,1,Playback(invalid)
;exten => t,1,Goto(3500,4)
;exten => t,2,Set(TRIES=${TRIES}+1)
;exten => t,3,GotoIf($(TRIES)>4?disconnect)
;exten => t,4,GoTo(s,playback)
;exten => t,5(disconnect),Hangup()
exten => t,1,Goto(3500,4)

exten => i,1,Playback(invalid)
exten => i,2,Goto(3500,4)
;exten => i,2,Set(TRIES=${TRIES}+1)
;exten => i,3,GotoIf($(TRIES)>4?disconnect)
;exten => i,4,GoTo(s,playback)
;exten => i,5(disconnect),Hangup()

;exten => 3501,1,Answer
exten => 3501,1,Directory(default|default|ef)
;exten => 3501,2,Hangup

;MeetMe conference
exten => 1700,1,Answer
exten => 1700,2,Wait(1)
exten => 1700,3,Authenticate(1234)
exten => 1700,4,MeetMe(2345|cMp)
exten => 1700,5,Playback(vm-goodbye)
exten => 1700,6,Hangup

exten => 1710,1,Answer
exten => 1710,2,Wait(1)
exten => 1710,3,Authenticate(4567)
exten => 1710,4,MeetMe(2346|cMp)
exten => 1710,5,Playback(vm-goodbye)
exten => 1710,6,Hangup

exten => 1720,1,Answer
exten => 1720,2,Wait(1)
exten => 1720,3,Authenticate(8901)
exten => 1720,4,MeetMe(2347|cMp)
exten => 1720,5,Playback(vm-goodbye)
exten => 1720,6,Hangup

[incomingSIP]
;exten => _.,1,Goto(3500,1)
exten => _.,1,Dial(LOCAL/3500,30,tr)

[from-zaptel1]
exten => _.,1,Dial(LOCAL/3500,30,tr)

[from-zaptel2]
exten => _.,1,Dial(LOCAL/3500,30,tr)

[from-zaptel3]
; Customer Support Line
exten => _.,1,Dial(LOCAL/2020,30,tr)

[from-zaptel4]
; Customer Support Line
exten => _.,1,Dial(LOCAL/3500,30,tr)

; macro voicemail: Arguments:
; ARG1: extension, ARG2: soft phone, ARG3: vmail-id, ARG4: timeout
[macro-voicemail]
exten => s,1,Dial(SIP/${ARG1}&SIP/${ARG2},${ARG4},tr)
exten => s,2,VoiceMail($ARG3)

[/code]

Well, you didn’t offer much explanation with your extensions.conf, but it looks like you route callers to an auto-attendant, and then directly to extensions of users.

What I would do is change the auto-attendant to route callers to a macro. The macro would ring multiple stations. If no one answered, or all stations were busy, it would send calls to a specific mailbox.

Something like this:

[macro-callsupport]
exten => s,1,Dial(SIP/4001&SIP/4002&SIP/4003,20,tr)
exten => s,2,Voicemail(4000)
exten => s,3,Hangup
exten => s,102,Voicemail(4000)
exten => s,103,Hangup

Here you see that the system will attempt to dial three stations, if they timeout, they will go to a specific voicemail box, and if all three stations are busy, the call will go to the same specific voicemail box.

By routing the call to a specific station directly, you don’t give the call any other option but to follow the routing that any call answered by that station would have to follow.

Thanks for your help.

We are trying out a couple of different solutions currently.