Shared behaviour

Settle, retry, wrap, pause, decline, redial.

These rules are the same in Progressive and Predictive. Hangup writes hold_dialer_call_attempts. Only Not Connected increments call_count and uses [2,2,2,2]. Abandoned is a fixed 5-minute retry. Final Disposal is archived to hold_dialer_disposed.

Hangup map

AMI / conditionStored status
DialStatus = ANSWER (talked)Received
Customer left on hold / connectingAbandoned
Cancel, DONTCALL, INVALIDARGS, causes 1, 21, 22, 27–29Rejected
NOANSWER, BUSY, CONGESTION, CHANUNAVAIL, causes 16–20Not Connected

Settle only updates rows still Calling. Agent, duration, and hold seconds are on the attempt row, not master.

Retry

Not ConnectedAbandoned
Wait1st of a round: retry_seconds same day, else next work_start. 2nd of a round: 1 / 7 / 14 daysAlways 5 minutes
Pattern[2,2,2,2] — four rounds of two triesIgnored
max_tries8th NC copies the row to hold_dialer_disposed and deletes it from masterIgnored
call_countIncrements on this settleUnchanged

After the first completed NC pair, priority_id becomes 2 (Hold + Not Connected). Claim order puts Abandoned first, then priority_no, then Pending / Callback / Not Connected, then oldest attempt. Any idle ready agent may claim any eligible lead.

Wrap and working hours

buffer_time is per-agent wrap after a connected call. A miss with no lead retries claim every 10 seconds. Originate is refused outside work_start–work_end on work_days except a due callback, or when isMaintainance = 1.

Maintenance

hold_dialer_config.isMaintainance (column spelling as stored) is the floor switch. 0 / null is fail-open (calls run). 1 stops new predictive/progressive originates and socket redial. Live talks are not hung. Dashboard and agent show a MAINTENANCE banner. Reloaded with the rest of config every 30 seconds.

Pause and decline

Panel pause writes hold_dialer_employee.panel_status = pause, queue-pauses the extension, and opens a row on hold_dialer_agent_pauses. Agent pause requires { reason } from public GET /api/pause-reasons. Use ondemand for an on-demand OLI call. other requires a short note (12 words). Invalid reason emits invalid_pause_reason and does not pause. Ready closes that row. Status includes pause_reason, pause_reason_note, and paused_at. Every day at 09:30 IST, overnight open pauses are closed and those employees are marked yet_to_login until they tap Active.

SIP deny on a live predictive hold records hold_dialer_agent_declines and blocks that extension for the same caller for decline_cooldown_seconds (default 30). The customer stays on hold. The next offer is any idle agent.

Redial

Socket redial with oli_id from a joined agent. Skips wrap and queue. No skill check. Blocked in maintenance (error: maintenance). ondemand: true allows redial from pause if SIP is idle. Reopens Received / Not Connected / Abandoned rows still on master. Finally disposed leads are gone from master until CRM pushes the oli_id again. Payload is in the Socket guide.

Config that actually moves the needle

SettingUsed?Meaning
dialer_typeYesProgressive or Predictive
buffer_timeYesWrap seconds
predictive_ratioYesCustomer legs per idle agent
decline_cooldown_secondsYesDecline block on the same hold
max_linesYesCap ringing + hold + connecting
max_tries / retry_* / hoursYesNot Connected only
isMaintainanceYes1 pauses new floor calls; live calls stay up
hold_timeout_secondsNoUnused leftover
max_abandon_rateNoUnused leftover