[func] ;I have the func exten => s,1,Answer exten => s,n,Background(func_instruct) ;for away vm, 2 for busy vm, 3 to page exten => s,n,Set(TIMEOUT(response)=15) exten => s,n,Set(TIMEOUT(digit)=3) exten => _[123],1,Set(DB(FLAGS/${CALLERIDNUM})=${EXTEN}) ;set db vals and hangup so some channels get dialtone ASAP [macro-internal_extension] ; Based on Standard extension macro ; ${ARG1} - Voicemail box ; ${ARG2} - Device extension(s) to ring ; Usage ; in main context do exten => 1000,1,Macro(insternal_extension,1000,SIP/SnomDesk) ; I use variables defined in the globals section so it becomes exten => s,1,Gotoif($[${DB(FLAGS/${CALLERID(num)})}=1]?s-NOANSWER,1) ; if flag set call VM exten => s,n,Gotoif($[${DB(FLAGS/${CALLERID(num)})}=2]?s-BUSY,1) ; do same but lie and say busy exten => s,n,Gotoif($[${DB(FLAGS/${CALLERID(num)})}=3]?s-PAGE,1) ; page the guy, or just dial the interface as per usual exten => s,n(dial),Dial(${ARG2},20,tT) ; Ring the interface, 20 seconds maximum exten => s,n,Goto(s-${DIALSTATUS},1) ; Jump based on status exten => s-BUSY,1,Set(DB(FLAGS/${CALLERID(num)})=0) exten => s-BUSY,n,Voicemail(b${ARG1}) ; If busy, send to voicemail w/ busy announce exten => s-BUSY,n,Hangup exten => s-NOANSWER,1,Set(DB(FLAGS/${CALLERID(num)})=0) exten => s-NOANSWER,n,Voicemail(u${ARG1}) ; If unavailable, send to voicemail w/ unavail exten => s-NOANSWER,n,Hangup exten => s-PAGE,1,Set(DB(FLAGS/${CALLERID(num)})=0) exten => s-PAGE,n,SIPAddHeader(Call-Info:\;answer-after=0) ;substitute YOUR hardware's SDP page value exten => s-PAGE,n,goto(s,dial) exten => _s-.,1,Goto(s-NOANSWER,1) ; Treat anything else as no answer