{"id":44,"date":"2026-03-20T13:04:17","date_gmt":"2026-03-20T10:04:17","guid":{"rendered":"http:\/\/localhost\/wordpress\/index.php\/2016\/03\/11\/call-transfer-and-forwarding-in-asterisk-configuration\/"},"modified":"2026-03-23T14:32:36","modified_gmt":"2026-03-23T11:32:36","slug":"configure-call-transfer-forwarding-asterisk","status":"publish","type":"post","link":"https:\/\/computingforgeeks.com\/configure-call-transfer-forwarding-asterisk\/","title":{"rendered":"Configure Call Transfer and Forwarding in Asterisk PBX"},"content":{"rendered":"\n<p>Asterisk PBX supports several methods for transferring and forwarding calls &#8211; blind transfers, attended transfers, call forwarding, follow-me, and call parking. These features let users move active calls between extensions, forward calls to external numbers, and park calls for pickup from any phone. This guide covers how to configure each of these call handling features in <a href=\"https:\/\/www.asterisk.org\/get-started\/\" target=\"_blank\" rel=\"noreferrer noopener\">Asterisk 22 LTS<\/a> on Ubuntu 24.04 and Rocky Linux 10 using PJSIP endpoints and the native dialplan.<\/p>\n\n\n\n<p>We will walk through blind and attended transfers using <code>features.conf<\/code>, call forwarding with dialplan logic and feature codes, follow-me sequential ringing with <code>followme.conf<\/code>, call parking with <code>res_parking<\/code>, and Do Not Disturb toggling. Each section includes working configuration examples and CLI verification steps. If you need to <a href=\"https:\/\/computingforgeeks.com\/how-to-install-asterisk-pbx-on-ubuntu\/\" target=\"_blank\" rel=\"noreferrer noopener\">install Asterisk on Ubuntu<\/a> first, handle that before proceeding.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Prerequisites<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ubuntu 24.04 LTS or Rocky Linux 10 server with root or sudo access<\/li>\n\n<li>Asterisk 22 LTS installed and running with PJSIP configured<\/li>\n\n<li>At least 3 PJSIP endpoints registered (extensions 1001, 1002, 1003 used in examples)<\/li>\n\n<li>SIP softphones or IP phones for testing (Zoiper, Linphone, or similar)<\/li>\n\n<li>Ports 5060\/UDP (SIP) and 10000-20000\/UDP (RTP) open in firewall<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Understanding Call Transfer Types in Asterisk<\/h2>\n\n\n\n<p>Before configuring anything, here is a quick breakdown of the transfer types available in Asterisk:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Transfer Type<\/th><th>Description<\/th><th>Feature Key<\/th><\/tr><\/thead><tbody><tr><td>Blind Transfer<\/td><td>Transfers the call immediately without announcing it to the destination<\/td><td>## (default)<\/td><\/tr><tr><td>Attended Transfer<\/td><td>Places caller on hold, calls the destination first, then completes the transfer<\/td><td>*2 (default)<\/td><\/tr><tr><td>Call Forwarding<\/td><td>Automatically redirects incoming calls to another number based on conditions<\/td><td>Feature codes (*72\/*73)<\/td><\/tr><tr><td>Follow-Me<\/td><td>Rings multiple destinations sequentially until someone answers<\/td><td>FollowMe() app<\/td><\/tr><tr><td>Call Parking<\/td><td>Places a call in a parking lot for pickup from any extension<\/td><td>Park() app<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"900\" height=\"500\" src=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/03\/asterisk-blind-vs-attended-transfer.png\" alt=\"Diagram showing blind transfer versus attended transfer call flow in Asterisk PBX\" class=\"wp-image-162985\" title=\"\" srcset=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/03\/asterisk-blind-vs-attended-transfer.png 900w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/03\/asterisk-blind-vs-attended-transfer-300x167.png 300w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/03\/asterisk-blind-vs-attended-transfer-768x427.png 768w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/03\/asterisk-blind-vs-attended-transfer-756x420.png 756w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/03\/asterisk-blind-vs-attended-transfer-696x387.png 696w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Configure Blind Transfer in Asterisk<\/h2>\n\n\n\n<p>A blind transfer (also called an unattended transfer) sends the active call to another extension immediately. The person initiating the transfer hangs up as soon as they dial the destination extension. The caller hears ringing while the new destination is contacted.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Configure features.conf for Blind Transfer<\/h3>\n\n\n\n<p>Open the features configuration file.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo vim \/etc\/asterisk\/features.conf<\/code><\/pre>\n\n\n\n<p>Add or verify these settings under the <code>[featuremap]<\/code> section:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[featuremap]\nblindxfer => ##        ; Press ## during a call to initiate blind transfer\natxfer => *2           ; Press *2 for attended transfer (covered next)\ndisconnect => *0       ; Press *0 to disconnect the call\nparkcall => #72        ; Press #72 to park a call\n\n[general]\ntransferdigittimeout => 5    ; Seconds to wait for transfer destination digits\nxfersound => beep            ; Sound played when transfer starts\nxferfailsound => beeperr     ; Sound played when transfer fails<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Update Dialplan with Transfer Flags<\/h3>\n\n\n\n<p>For transfers to work, the <code>Dial()<\/code> application must include the <code>T<\/code> and <code>t<\/code> flags. The uppercase <code>T<\/code> allows the calling party to transfer, and lowercase <code>t<\/code> allows the called party to transfer. Edit your dialplan.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo vim \/etc\/asterisk\/extensions.conf<\/code><\/pre>\n\n\n\n<p>Update the dial commands in your internal context:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[internal]\nexten => 1001,1,NoOp(Dialing extension 1001)\n same => n,Dial(PJSIP\/1001,30,Tt)\n same => n,Hangup()\n\nexten => 1002,1,NoOp(Dialing extension 1002)\n same => n,Dial(PJSIP\/1002,30,Tt)\n same => n,Hangup()\n\nexten => 1003,1,NoOp(Dialing extension 1003)\n same => n,Dial(PJSIP\/1003,30,Tt)\n same => n,Hangup()<\/code><\/pre>\n\n\n\n<p>Reload the dialplan and features module.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo asterisk -rx \"dialplan reload\"\nsudo asterisk -rx \"module reload features\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Test Blind Transfer<\/h3>\n\n\n\n<p>Here is the step-by-step flow for testing a blind transfer from extension 1001 to 1003:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Extension 1001 calls extension 1002. Both parties are connected<\/li>\n\n<li>Extension 1002 presses <code>##<\/code> on the dialpad, then dials <code>1003<\/code><\/li>\n\n<li>Extension 1002 is immediately disconnected from the call<\/li>\n\n<li>Extension 1003 rings. When 1003 answers, they are connected directly to 1001<\/li>\n<\/ul>\n\n\n\n<p>Verify the transfer in the Asterisk CLI.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo asterisk -rvvv<\/code><\/pre>\n\n\n\n<p>During the transfer you will see output similar to this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Executing [1002@internal:1] NoOp(\"PJSIP\/1001-00000001\", \"Dialing extension 1002\")\n-- Executing [1002@internal:2] Dial(\"PJSIP\/1001-00000001\", \"PJSIP\/1002,30,Tt\")\n-- PJSIP\/1002-00000002 answered PJSIP\/1001-00000001\n-- PJSIP\/1002-00000002 initiated blind transfer to 1003@internal\n-- Blind transfer target 1003@internal\n-- Executing [1003@internal:1] NoOp(\"PJSIP\/1001-00000001\", \"Dialing extension 1003\")\n-- PJSIP\/1003-00000003 is ringing\n-- PJSIP\/1003-00000003 answered PJSIP\/1001-00000001<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Configure Attended Transfer in Asterisk<\/h2>\n\n\n\n<p>An attended transfer (also called a supervised or consultative transfer) lets you talk to the destination party before completing the transfer. The original caller is placed on hold while you consult with the transfer target. This is the preferred method when you need to announce who is calling.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Attended Transfer Settings in features.conf<\/h3>\n\n\n\n<p>The <code>atxfer<\/code> key was already set in the previous section. Additional settings control the attended transfer behavior. Open the features configuration.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo vim \/etc\/asterisk\/features.conf<\/code><\/pre>\n\n\n\n<p>Add these settings under <code>[general]<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[general]\ntransferdigittimeout => 5\natxfernoanswertimeout => 15    ; Seconds to ring transfer target before giving up\natxferloopdelay => 10          ; Seconds before retrying if transfer target is busy\natxferdropcall => no           ; If 'yes', drops the call when transfer target doesn't answer\n                               ; If 'no', returns the caller to the transferer\natxfercallbackretries => 2     ; Number of times to retry calling the transferer back<\/code><\/pre>\n\n\n\n<p>Reload the features module.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo asterisk -rx \"module reload features\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Test Attended Transfer<\/h3>\n\n\n\n<p>The three-party flow works as follows:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Extension 1001 calls extension 1002. Both parties are connected<\/li>\n\n<li>Extension 1002 presses <code>*2<\/code> on the dialpad, then dials <code>1003<\/code><\/li>\n\n<li>Extension 1001 is placed on hold and hears music on hold<\/li>\n\n<li>Extension 1003 rings. When 1003 answers, extension 1002 can announce the call<\/li>\n\n<li>Extension 1002 hangs up to complete the transfer. Now 1001 and 1003 are connected<\/li>\n<\/ul>\n\n\n\n<p>If extension 1003 does not answer within the <code>atxfernoanswertimeout<\/code> period and <code>atxferdropcall<\/code> is set to <code>no<\/code>, the call returns to extension 1002. The CLI output during an attended transfer looks like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- PJSIP\/1002-00000002 answered PJSIP\/1001-00000001\n-- PJSIP\/1002-00000002 initiated attended transfer to 1003@internal\n-- Started music on hold, class 'default', on channel 'PJSIP\/1001-00000001'\n-- Executing [1003@internal:1] NoOp(\"PJSIP\/1002-00000002\", \"Dialing extension 1003\")\n-- PJSIP\/1003-00000003 is ringing\n-- PJSIP\/1003-00000003 answered PJSIP\/1002-00000002\n   > Consulting with 1003 before transfer...\n-- Stopped music on hold on PJSIP\/1001-00000001\n-- Attended transfer complete: PJSIP\/1001-00000001 bridged to PJSIP\/1003-00000003<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Configure Call Forwarding in Asterisk Dialplan<\/h2>\n\n\n\n<p>Call forwarding redirects incoming calls to another number automatically. Asterisk supports three standard forwarding conditions &#8211; unconditional (always forward), busy (forward when the line is busy), and no-answer (forward after a timeout). We implement these using the Asterisk database (<code>AstDB<\/code>) and dialplan logic so users can enable and disable forwarding with feature codes from their phones.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Dialplan Logic for Call Forwarding<\/h3>\n\n\n\n<p>Open the extensions configuration file.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo vim \/etc\/asterisk\/extensions.conf<\/code><\/pre>\n\n\n\n<p>Add the forwarding logic to your internal context. This checks the AstDB for forwarding settings before routing calls:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[internal]\n; Main extension handler with call forwarding support\nexten => _10XX,1,NoOp(Incoming call for ${EXTEN})\n same => n,Set(DEST=${EXTEN})\n\n ; Check Do Not Disturb first\n same => n,Set(DND=${DB(DND\/${DEST})})\n same => n,GotoIf($[\"${DND}\" = \"yes\"]?dnd)\n\n ; Check unconditional forwarding (CFU)\n same => n,Set(CFU=${DB(CFU\/${DEST})})\n same => n,GotoIf($[${LEN(${CFU})} > 0]?forward)\n\n ; Ring the extension\n same => n,Dial(PJSIP\/${DEST},25,Tt)\n\n ; If busy, check busy forwarding (CFB)\n same => n,GotoIf($[\"${DIALSTATUS}\" = \"BUSY\"]?cfb)\n\n ; If no answer, check no-answer forwarding (CFNA)\n same => n,GotoIf($[\"${DIALSTATUS}\" = \"NOANSWER\"]?cfna)\n\n same => n,Hangup()\n\n ; Unconditional forward\n same => n(forward),NoOp(Forwarding ${DEST} to ${CFU})\n same => n,Dial(PJSIP\/${CFU},30,Tt)\n same => n,Hangup()\n\n ; Busy forward\n same => n(cfb),Set(CFB=${DB(CFB\/${DEST})})\n same => n,GotoIf($[${LEN(${CFB})} > 0]?cfb_dial)\n same => n,VoiceMail(${DEST}@default,u)\n same => n,Hangup()\n same => n(cfb_dial),Dial(PJSIP\/${CFB},30,Tt)\n same => n,Hangup()\n\n ; No-answer forward\n same => n(cfna),Set(CFNA=${DB(CFNA\/${DEST})})\n same => n,GotoIf($[${LEN(${CFNA})} > 0]?cfna_dial)\n same => n,VoiceMail(${DEST}@default,u)\n same => n,Hangup()\n same => n(cfna_dial),Dial(PJSIP\/${CFNA},30,Tt)\n same => n,Hangup()\n\n ; DND active\n same => n(dnd),Playback(do-not-disturb)\n same => n,Hangup()<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Feature Codes for User-Controlled Forwarding<\/h3>\n\n\n\n<p>Users dial feature codes from their phone to enable or disable forwarding without needing admin access. Add these to the same context in <code>extensions.conf<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>; *72 - Enable unconditional call forwarding\n; User dials *72 followed by the destination extension (e.g., *721003)\nexten => _*72.,1,NoOp(Enable CFU for ${CALLERID(num)} to ${EXTEN:3})\n same => n,Set(DB(CFU\/${CALLERID(num)})=${EXTEN:3})\n same => n,Playback(call-fwd-unconditional&activated)\n same => n,Hangup()\n\n; *73 - Disable unconditional call forwarding\nexten => *73,1,NoOp(Disable CFU for ${CALLERID(num)})\n same => n,Set(DB_DELETE(CFU\/${CALLERID(num)})=)\n same => n,Playback(call-fwd-unconditional&de-activated)\n same => n,Hangup()\n\n; *90 - Enable busy forwarding\nexten => _*90.,1,NoOp(Enable CFB for ${CALLERID(num)} to ${EXTEN:3})\n same => n,Set(DB(CFB\/${CALLERID(num)})=${EXTEN:3})\n same => n,Playback(call-fwd-on-busy&activated)\n same => n,Hangup()\n\n; *91 - Disable busy forwarding\nexten => *91,1,NoOp(Disable CFB for ${CALLERID(num)})\n same => n,Set(DB_DELETE(CFB\/${CALLERID(num)})=)\n same => n,Playback(call-fwd-on-busy&de-activated)\n same => n,Hangup()\n\n; *92 - Enable no-answer forwarding\nexten => _*92.,1,NoOp(Enable CFNA for ${CALLERID(num)} to ${EXTEN:3})\n same => n,Set(DB(CFNA\/${CALLERID(num)})=${EXTEN:3})\n same => n,Playback(call-fwd-no-answer&activated)\n same => n,Hangup()\n\n; *93 - Disable no-answer forwarding\nexten => *93,1,NoOp(Disable CFNA for ${CALLERID(num)})\n same => n,Set(DB_DELETE(CFNA\/${CALLERID(num)})=)\n same => n,Playback(call-fwd-no-answer&de-activated)\n same => n,Hangup()<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Verify Call Forwarding<\/h3>\n\n\n\n<p>Reload the dialplan and test from a registered phone.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo asterisk -rx \"dialplan reload\"<\/code><\/pre>\n\n\n\n<p>From extension 1001, dial <code>*721003<\/code> to forward all calls to extension 1003. Then verify the database entry in the Asterisk CLI:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ sudo asterisk -rx \"database show CFU\"\n\/CFU\/1001                                         : 1003\n1 result found.<\/code><\/pre>\n\n\n\n<p>Now any call to extension 1001 will be redirected to 1003. To disable it, dial <code>*73<\/code> from extension 1001.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Set Up Follow-Me \/ Find-Me in Asterisk<\/h2>\n\n\n\n<p>Follow-Me rings multiple destinations in sequence until someone answers or all options are exhausted. A typical use case is ringing the desk phone first, then the user&#8217;s mobile, then falling back to voicemail. This is configured through <code>followme.conf<\/code> and the <code>FollowMe()<\/code> dialplan application.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"900\" height=\"400\" src=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/03\/asterisk-followme-call-flow.png\" alt=\"Follow-Me call flow diagram showing sequential ringing from desk phone to mobile to voicemail in Asterisk\" class=\"wp-image-162986\" title=\"\" srcset=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/03\/asterisk-followme-call-flow.png 900w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/03\/asterisk-followme-call-flow-300x133.png 300w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/03\/asterisk-followme-call-flow-768x341.png 768w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/03\/asterisk-followme-call-flow-696x309.png 696w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Configure followme.conf<\/h3>\n\n\n\n<p>Open the Follow-Me configuration file.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo vim \/etc\/asterisk\/followme.conf<\/code><\/pre>\n\n\n\n<p>Add a general section and a profile for extension 1001:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[general]\nfeaturedigittimeout => 5000    ; Milliseconds to wait for feature digit input\nenable_callee_prompt => yes    ; Ask callee to press 1 to accept the call\ntakecall => 1                  ; Digit to press to accept the call\ndeclinecall => 2               ; Digit to press to decline the call\n\n[1001]\nmusicclass => default          ; Music on hold class for the caller\ncontext => internal            ; Dialplan context for followme\nnumber => PJSIP\/1001,15       ; Ring desk phone for 15 seconds\nnumber => PJSIP\/1001&Local\/+15551234567@outbound,20  ; Ring desk + mobile for 20 sec\nnumber => PJSIP\/1001&Local\/+15559876543@outbound,20  ; Ring desk + alternate for 20 sec<\/code><\/pre>\n\n\n\n<p>Each <code>number<\/code> line defines a step in the sequence. The second parameter is the ring timeout in seconds. You can ring multiple channels simultaneously by separating them with <code>&amp;<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Add FollowMe() to the Dialplan<\/h3>\n\n\n\n<p>Update <code>extensions.conf<\/code> to use FollowMe() instead of a direct Dial() for the extension. You can integrate it as a fallback after the desk phone does not answer:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[internal]\n; Extension 1001 with Follow-Me enabled\nexten => 1001,1,NoOp(Calling 1001 with Follow-Me)\n same => n,FollowMe(1001,ds)\n same => n,GotoIf($[\"${FOLLOWME_STATUS}\" = \"SUCCESS\"]?done)\n same => n,VoiceMail(1001@default,u)\n same => n(done),Hangup()<\/code><\/pre>\n\n\n\n<p>The <code>d<\/code> flag in <code>FollowMe(1001,ds)<\/code> disables the screening announcement (no &#8220;press 1 to accept&#8221;). The <code>s<\/code> flag plays a status message to the caller. If none of the follow-me destinations answer, the call goes to voicemail as a final fallback.<\/p>\n\n\n\n<p>Reload the configuration.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo asterisk -rx \"dialplan reload\"\nsudo asterisk -rx \"module reload app_followme\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Verify Follow-Me<\/h3>\n\n\n\n<p>Call extension 1001 from another phone. The Asterisk CLI shows the sequential ringing:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Executing [1001@internal:1] NoOp(\"PJSIP\/1002-00000001\", \"Calling 1001 with Follow-Me\")\n-- Executing [1001@internal:2] FollowMe(\"PJSIP\/1002-00000001\", \"1001,ds\")\n-- Trying step 1: PJSIP\/1001 with timeout 15\n-- PJSIP\/1001-00000002 is ringing\n-- No answer from step 1, moving to step 2\n-- Trying step 2: PJSIP\/1001&Local\/+15551234567@outbound with timeout 20\n-- PJSIP\/1001-00000003 is ringing\n-- Local\/+15551234567@outbound is ringing<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5: Configure Call Parking in Asterisk<\/h2>\n\n\n\n<p>Call parking places an active call into a &#8220;parking lot&#8221; where it can be picked up from any other extension. This is useful in office environments where someone needs to take a call from a different room. The parked call gets assigned a parking slot number (like 701, 702) that anyone can dial to retrieve the call.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Configure res_parking<\/h3>\n\n\n\n<p>Asterisk 22 uses the <code>res_parking<\/code> module for call parking. Open the parking configuration.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo vim \/etc\/asterisk\/res_parking.conf<\/code><\/pre>\n\n\n\n<p>Set up a parking lot:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[general]\n\n[default]\nparkext => 700              ; Extension to dial to park a call\nparkpos => 701-720          ; Parking slot range (701 through 720)\ncontext => parkedcalls      ; Context where parked calls live\nparkinghints => yes         ; Enable BLF hints for parking slots\nparkingtime => 45           ; Seconds before parked call times out and returns\ncomebackcontext => internal ; Context to return timed-out calls to\ncomebacktoorigin => yes     ; Return call to the person who parked it\ncourtesytone => beep        ; Tone played when call is picked up\nparkedmusicclass => default ; Music on hold for parked callers\nannouncement => yes         ; Announce the parking slot number<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Add Parking to the Dialplan<\/h3>\n\n\n\n<p>Add the parked call retrieval context to your dialplan. Refer to the <a href=\"https:\/\/docs.asterisk.org\/Configuration\/Features\/Call-Parking\/\" target=\"_blank\" rel=\"noreferrer noopener\">Asterisk call parking documentation<\/a> for additional options.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo vim \/etc\/asterisk\/extensions.conf<\/code><\/pre>\n\n\n\n<p>Add the parking extensions:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>; Park a call by transferring to 700\n[internal]\nexten => 700,1,NoOp(Parking call)\n same => n,Park(default,t(45)r(internal)c(internal)s)\n same => n,Hangup()\n\n; Include the parked calls context so users can retrieve parked calls\n; by dialing the slot number (701-720)\n#include \"res_parking.conf\"\n\n[parkedcalls]\n; This context is managed by res_parking automatically<\/code><\/pre>\n\n\n\n<p>Reload the parking module.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo asterisk -rx \"module reload res_parking\"\nsudo asterisk -rx \"dialplan reload\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Test Call Parking<\/h3>\n\n\n\n<p>To park a call:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>During an active call, transfer the call to extension 700 (blind transfer with ##700)<\/li>\n\n<li>Asterisk announces the parking slot number (e.g., &#8220;parked on 701&#8221;)<\/li>\n\n<li>Anyone can retrieve the call by dialing 701 from any phone<\/li>\n<\/ul>\n\n\n\n<p>Verify parked calls in the CLI:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ sudo asterisk -rx \"parkedcalls show\"\nParking Lot: default\n--- Parking Lot ---\nSlot  Channel                Timeout  CallerID\n701   PJSIP\/1001-00000001   35       \"User 1001\" <1001>\n\n1 parked call in lot 'default'<\/code><\/pre>\n\n\n\n<p>If no one picks up the parked call within the <code>parkingtime<\/code> (45 seconds), the call returns to the person who parked it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 6: Configure Do Not Disturb (DND)<\/h2>\n\n\n\n<p>Do Not Disturb lets users temporarily reject all incoming calls. We use the AstDB to store the DND flag and check it before routing calls. The DND check was already included in the call forwarding dialplan from Step 3.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">DND Feature Codes<\/h3>\n\n\n\n<p>Add these feature codes to <code>extensions.conf<\/code> so users can toggle DND from their phone:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>; *78 - Enable Do Not Disturb\nexten => *78,1,NoOp(Enable DND for ${CALLERID(num)})\n same => n,Set(DB(DND\/${CALLERID(num)})=yes)\n same => n,Playback(do-not-disturb&activated)\n same => n,Hangup()\n\n; *79 - Disable Do Not Disturb\nexten => *79,1,NoOp(Disable DND for ${CALLERID(num)})\n same => n,Set(DB_DELETE(DND\/${CALLERID(num)})=)\n same => n,Playback(do-not-disturb&de-activated)\n same => n,Hangup()<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">DND Check in the Dialplan<\/h3>\n\n\n\n<p>The full extension handler with DND checking was shown in the call forwarding section. The key lines are:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>; Check DND status before routing\nsame => n,Set(DND=${DB(DND\/${DEST})})\nsame => n,GotoIf($[\"${DND}\" = \"yes\"]?dnd)\n\n; ... at the end of the extension\nsame => n(dnd),Playback(do-not-disturb)\nsame => n,Hangup()<\/code><\/pre>\n\n\n\n<p>Verify DND status from the CLI:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ sudo asterisk -rx \"database show DND\"\n\/DND\/1001                                         : yes\n1 result found.<\/code><\/pre>\n\n\n\n<p>When DND is active, callers hear the &#8220;do not disturb&#8221; prompt and the call ends. Extension 1001 does not ring at all.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 7: Configure Transfers and Forwarding in FreePBX<\/h2>\n\n\n\n<p>If you are running <a href=\"https:\/\/computingforgeeks.com\/install-freepbx-ubuntu\/\" target=\"_blank\" rel=\"noreferrer noopener\">FreePBX<\/a> on top of Asterisk, all of the above features can be configured through the web GUI instead of editing config files manually.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Call Transfer Settings<\/h3>\n\n\n\n<p>Blind and attended transfer keys are managed under <strong>Admin > Feature Code Admin<\/strong>. The default codes are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Blind Transfer: <code>##<\/code><\/li>\n\n<li>Attended Transfer: <code>*2<\/code><\/li>\n\n<li>Disconnect: <code>**<\/code><\/li>\n<\/ul>\n\n\n\n<p>You can change these codes in the Feature Code Admin module. Go to <strong>Admin > Feature Code Admin > Call Transfer<\/strong> and modify the DTMF sequences as needed.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Call Forwarding in FreePBX<\/h3>\n\n\n\n<p>Per-extension forwarding is configured under <strong>Applications > Extensions<\/strong>. Edit an extension and navigate to the <strong>Follow Me<\/strong> tab. The settings include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Follow Me List<\/strong> &#8211; add extension numbers and external numbers to ring<\/li>\n\n<li><strong>Ring Strategy<\/strong> &#8211; ringallv2 (ring all, then hunt), hunt, memoryhunt, firstnotonphone<\/li>\n\n<li><strong>Ring Time<\/strong> &#8211; seconds to ring before moving to the next destination<\/li>\n\n<li><strong>Destination if no answer<\/strong> &#8211; voicemail, another extension, ring group, or IVR<\/li>\n<\/ul>\n\n\n\n<p>Users can also control forwarding from their phone using the default FreePBX feature codes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>*72<\/code> &#8211; Call Forward All: Activate<\/li>\n\n<li><code>*73<\/code> &#8211; Call Forward All: Deactivate<\/li>\n\n<li><code>*90<\/code> &#8211; Call Forward Busy: Activate<\/li>\n\n<li><code>*91<\/code> &#8211; Call Forward Busy: Deactivate<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Call Parking in FreePBX<\/h3>\n\n\n\n<p>Parking is configured under <strong>Applications > Parking<\/strong>. The default parking lot uses extension 70 with slots 71-79. You can create additional parking lots for different departments. Each parking lot can have its own timeout, music on hold class, and return destination.<\/p>\n\n\n\n<p>After making changes in FreePBX, always click <strong>Apply Config<\/strong> in the top bar to write the changes to the Asterisk configuration files and reload.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Feature Code Reference Table<\/h2>\n\n\n\n<p>Here is a summary of all feature codes configured in this guide:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature Code<\/th><th>Function<\/th><th>Config File<\/th><\/tr><\/thead><tbody><tr><td>##<\/td><td>Blind transfer<\/td><td>features.conf<\/td><\/tr><tr><td>*2<\/td><td>Attended transfer<\/td><td>features.conf<\/td><\/tr><tr><td>*0<\/td><td>Disconnect call<\/td><td>features.conf<\/td><\/tr><tr><td>#72<\/td><td>Park a call<\/td><td>features.conf<\/td><\/tr><tr><td>*72 + ext<\/td><td>Enable unconditional forwarding<\/td><td>extensions.conf<\/td><\/tr><tr><td>*73<\/td><td>Disable unconditional forwarding<\/td><td>extensions.conf<\/td><\/tr><tr><td>*90 + ext<\/td><td>Enable busy forwarding<\/td><td>extensions.conf<\/td><\/tr><tr><td>*91<\/td><td>Disable busy forwarding<\/td><td>extensions.conf<\/td><\/tr><tr><td>*92 + ext<\/td><td>Enable no-answer forwarding<\/td><td>extensions.conf<\/td><\/tr><tr><td>*93<\/td><td>Disable no-answer forwarding<\/td><td>extensions.conf<\/td><\/tr><tr><td>*78<\/td><td>Enable Do Not Disturb<\/td><td>extensions.conf<\/td><\/tr><tr><td>*79<\/td><td>Disable Do Not Disturb<\/td><td>extensions.conf<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Troubleshooting Asterisk Call Transfers<\/h2>\n\n\n\n<p>If transfers are not working, check these common issues:<\/p>\n\n\n\n<p><strong>Transfer key does nothing during a call<\/strong> &#8211; Make sure the <code>Dial()<\/code> application includes <code>T<\/code> and\/or <code>t<\/code> flags. Without these flags, Asterisk does not listen for DTMF feature codes during the call. Verify with:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo asterisk -rx \"dialplan show internal\"<\/code><\/pre>\n\n\n\n<p><strong>DTMF not detected<\/strong> &#8211; If using PJSIP, check that DTMF mode is set correctly in your endpoint configuration. RFC 4733 (also called RFC 2833) is the most reliable method:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ sudo asterisk -rx \"pjsip show endpoint 1001\" | grep dtmf\n dtmf_mode : rfc4733<\/code><\/pre>\n\n\n\n<p>If DTMF mode is set to <code>inband<\/code>, transfer detection may fail. Change it to <code>rfc4733<\/code> in <code>pjsip.conf<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[1001]\ntype = endpoint\ndtmf_mode = rfc4733<\/code><\/pre>\n\n\n\n<p><strong>Features module not loaded<\/strong> &#8211; Verify the features module is loaded:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ sudo asterisk -rx \"module show like features\"\nModule                         Description                              Use Count  Status\nfeatures                       Call Features                            0          Running\n1 modules loaded<\/code><\/pre>\n\n\n\n<p><strong>Follow-Me not ringing external numbers<\/strong> &#8211; Make sure your outbound context allows external dialing and that the trunk is configured for outbound calls. Check the <code>context<\/code> setting in <code>followme.conf<\/code> matches a context that includes outbound routes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>We configured blind transfers, attended transfers, call forwarding with user-controlled feature codes, follow-me sequential ringing, call parking, and do-not-disturb in Asterisk 22. All features use the native Asterisk dialplan and AstDB, so they work with any SIP phone that supports DTMF. For production systems, add monitoring for parked call timeouts, test all feature codes after Asterisk upgrades, and document the feature codes for end users so they can manage their own forwarding rules.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Related Guides<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/computingforgeeks.com\/how-to-install-asterisk-pbx-on-ubuntu\/\" target=\"_blank\" rel=\"noreferrer noopener\">Install Asterisk 18 LTS on Ubuntu<\/a><\/li>\n\n<li><a href=\"https:\/\/computingforgeeks.com\/install-asterisk-lts-on-debian-linux\/\" target=\"_blank\" rel=\"noreferrer noopener\">How To Install Asterisk 18 LTS on Debian<\/a><\/li>\n\n<li><a href=\"https:\/\/computingforgeeks.com\/install-freepbx-ubuntu\/\" target=\"_blank\" rel=\"noreferrer noopener\">Installing FreePBX 16 on Ubuntu<\/a><\/li>\n\n<li><a href=\"https:\/\/computingforgeeks.com\/how-to-install-and-configure-festival-for-asterisk-use\/\" target=\"_blank\" rel=\"noreferrer noopener\">Install and Configure Festival for Asterisk PBX usage<\/a><\/li>\n\n<li><a href=\"https:\/\/computingforgeeks.com\/install-sipp-ubuntu-debian\/\" target=\"_blank\" rel=\"noreferrer noopener\">Install SIPp testing tool on Ubuntu<\/a><\/li>\n<\/ul>\n\n","protected":false},"excerpt":{"rendered":"<p>Asterisk PBX supports several methods for transferring and forwarding calls &#8211; blind transfers, attended transfers, call forwarding, follow-me, and call parking. These features let users move active calls between extensions, forward calls to external numbers, and park calls for pickup from any phone. This guide covers how to configure each of these call handling features &#8230; <a title=\"Configure Call Transfer and Forwarding in Asterisk PBX\" class=\"read-more\" href=\"https:\/\/computingforgeeks.com\/configure-call-transfer-forwarding-asterisk\/\" aria-label=\"Read more about Configure Call Transfer and Forwarding in Asterisk PBX\">Read more<\/a><\/p>\n","protected":false},"author":3,"featured_media":162988,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[299,47,50,55],"tags":[],"cfg_series":[],"class_list":["post-44","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to","category-linux","category-linux-tutorials","category-networking"],"_links":{"self":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts\/44","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/comments?post=44"}],"version-history":[{"count":3,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts\/44\/revisions"}],"predecessor-version":[{"id":163883,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts\/44\/revisions\/163883"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/media\/162988"}],"wp:attachment":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/media?parent=44"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/categories?post=44"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/tags?post=44"},{"taxonomy":"cfg_series","embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/cfg_series?post=44"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}