KnowledgebasePBX / VoIP › Queue callback — letting callers hang up and get called back

Queue callback — letting callers hang up and get called back

Queue callback (sometimes called "virtual hold") replaces the "all our agents are busy, your call is important" hold experience with "press 1 to keep your place in line and we'll call you back when an agent is free." Better customer experience, fewer abandoned calls, lower trunk usage during peak. This article covers the implementation on FreePBX® / Asterisk®.

The basic flow

  1. Caller enters queue.
  2. After N seconds of hold, prompt: "To stay on the line, press 1. To request a callback and keep your place in line, press 2."
  3. If caller presses 2: collect their callback number (default to CallerID), hang up, mark the queue position with a "virtual call."
  4. When that position reaches the front, originate an outbound call to the saved number, then bridge into the queue → next available agent.

FreePBX module: Queue Callback

Not in the open-source FreePBX core; either a paid Sangoma commercial module OR community implementations.

Commercial path: Admin → Module Admin → "Queue Callback" — buy the module, enable, then per-queue: Queues → [your queue] → Callback Options. Configure the prompt timeout, max callback queue size, retry policy.

Community path: lgaetz/asterisk-q-callback is a popular open-source implementation. Drop the AGI script into /var/lib/asterisk/agi-bin/, add the announcement WAVs, hook into your queue config.

Manual implementation (bare Asterisk or DIY)

If you're not using FreePBX's module, the dialplan pattern is:

; In the queue announce position section, periodically offer callback
exten => s,n,Background(callback-prompt)   ; "Press 1 to stay, 2 for callback"
exten => s,n,WaitExten(5)
exten => 2,1,Goto(queue-callback,s,1)      ; user pressed 2

[queue-callback]
exten => s,1,Read(CB_NUMBER,enter-callback-number,11)
exten => s,n,System(echo "${EPOCH}|${CB_NUMBER}|${QUEUENAME}|${CHANNEL(uniqueid)}" >> /var/spool/asterisk/callbacks/queue)
exten => s,n,Playback(callback-recorded)   ; "We've saved your spot, we'll call you back"
exten => s,n,Hangup()

A separate cron / dialplan watcher reads /var/spool/asterisk/callbacks/queue in FIFO order, originates a call to each saved number when an agent becomes free, and bridges the answered call back into the queue.

Originating the call:

asterisk -rx 'channel originate Local/${EXTEN}@cb-outbound application Queue support-queue,t,,30'

Pitfalls and edge cases

  • Number validation. Validate the callback number is in your routing territory before saving — you don't want to call international numbers unintentionally (toll fraud risk).
  • Don't-call lists. If your call center is subject to TCPA / state DNC rules, callback numbers ARE outbound dials — they may need DNC scrubbing or consent records before you dial back.
  • Caller answers but immediately hangs up. What does the queue do — drop the position, retry later, give up? Define the policy and document.
  • Queue empties while callback is pending. The call should drop into the next available agent (or supervisor); not stall.
  • Recording. Outbound callback calls are still subject to your call recording compliance rules (see the recording-compliance article).

Reporting

Track:

  • % of queue interactions that requested callback.
  • Average time from callback request to actual callback.
  • % of callbacks where the caller answers.
  • % of callbacks where the caller stays connected vs hangs up immediately.

If > 30% of callbacks aren't answered, your callback time is too long — callers gave up. If < 10% of callers request callback, the prompt isn't working (timing, audio quality, wording).

Customer experience details

  • State the expected callback time. "Our average callback time is 12 minutes" is a real, useful number.
  • Send a TEXT confirmation if you have SMS — "We've saved your spot. We'll call you back at <number> within 15 minutes." Massively reduces "did the callback request actually register" anxiety.
  • Make sure the outbound caller ID is recognizable as your business — callers won't answer a strange number returning the call.

Also Read

« « Back

Powered by WHMCompleteSolution