Înapoi Blog
smart-missed-calls freepbx vitalpbx lansare missed-calls

Smart Missed Calls e live: lista de apeluri ratate care se curăță singură

Lansăm Smart Missed Calls — singurul modul care face diferența reală între un apel ratat pe o extensie (banal) și un apel la care nu a răspuns NIMENI din echipă (problema reală). Lista se curăță automat când cineva re-apelează sau apelantul revine. Pentru FreePBX și VitalPBX.

PBXTools Team ·
Smart Missed Calls e live: lista de apeluri ratate care se curăță singură

TL;DR

Smart Missed Calls e disponibil pe portalul PBXTools. Modulul rezolvă două probleme pe care raportul standard CDR din FreePBX/VitalPBX le ratează sistematic:

  1. „Apel ratat pe o extensie” ≠ „apel ratat de toată echipa”. Dacă apelul a fost răspuns la queue/IVR/ring group de oricine, nu apare în listă.
  2. Lista se curăță singură. Când un coleg re-apelează numărul sau apelantul revine și răspunde cineva, intrarea trece automat la închisă, cu motiv și audit log.

Funcționează pe FreePBX (14-17) și VitalPBX (4.x multi-tenant). Trei pași de instalare. Fără modificări în dialplan.

👉 Activează acum

Problema cu raportul „missed calls” pe care toți o ignorăm

Logezi pe FreePBX → Reports → CDR Reports. Filtrezi disposition = NO ANSWER. Primești 47 de rânduri. Trimiți capture pe grup și scrii „echipa, nu mai răspundeți telefonul?”.

Doar că datele sunt corecte și concluzia e greșită.

Un apel intrat pe coada „Vânzări”:

  • Sună 8 secunde la ext 101 → NO ANSWER (rând 1)
  • Sună 8 secunde la ext 102 → NO ANSWER (rând 2)
  • Sună 8 secunde la ext 103 → NO ANSWER (rând 3)
  • Sună 8 secunde la ext 104 → NO ANSWER (rând 4)
  • Răspunde Maria din ext 105 → ANSWERED (rând 5)

În raport ai 4 rânduri „missed”. În realitate, apelul a fost servit. Niciun client pierdut, niciun re-apel necesar. Maria a vorbit 4 minute cu el, a închis comanda, a marcat tichetul.

Dacă te uiți la primele 4 rânduri și acționezi ca atare, faci două lucruri proaste: (1) creezi o ședință de plâns pentru o problemă care nu există, (2) îi distragi pe ext 101-104 de la apelurile reale care vin în acel moment.

Cum vede Smart Missed Calls același apel

Algoritmul real, simplificat la esență. Pentru fiecare apel inbound, agentul nostru rulează pe centrală un query care agregă toate rândurile CDR cu același linkedid (= toate evenimentele unui singur apel logic) și verifică simultan:

-- Condiție 1: niciun operator nu a răspuns DEFINITIV
SUM(disposition = 'ANSWERED'
    AND lastapp = 'Dial'
    AND dst REGEXP '^[0-9]+$'
    AND CAST(dst AS UNSIGNED) BETWEEN 10 AND 999) = 0

-- Condiție 2: există dovadă că a sunat fără răspuns
AND (
    SUM(disposition = 'NO ANSWER') >= 1
    OR SUM(lastapp = 'missed_calls') >= 1  -- markerul nativ FreePBX
)

Pentru exemplul de mai sus, condiția 1 EȘUEAZĂ (Maria a răspuns, ext 105 între 10 și 999). Apelul nu e ratat. Punct. Nu apare în Smart Missed Calls.

Pentru un alt apel care a sunat la 4 extensii și nimeni n-a răspuns — condiția 1 trece (zero ANSWERED), condiția 2 trece (4 NO ANSWER). Asta e missed real.

Aglomerarea: același client care insistă apare o dată

Un alt detaliu critic. Andrei sună de 6 ori în 10 minute, nimeni nu prinde. În raportul brut ai 6 entry-uri „Andrei a sunat și nu i-a răspuns”. Tu vrei să vezi: „Andrei sună insistent, e prioritar”, nu să cauți 6 rânduri identice.

Smart Missed Calls aglomerează automat per cheia (client, caller_number, did):

FieldValoare
caller_number+40 745 123 456
caller_nameAndrei Popescu (din CRM)
did0376443322
route_labelCoadă Vânzări
extensions["101", "102", "103", "104"]
missed_count6
first_missed_at14:02:11
last_missed_at14:11:48
statusopen

Un singur entry. Cu istoric clar. Cu badge mare „×6” lângă nume. Manager-ul vede prioritatea instant.

Lista se curăță singură — trei căi automate

Asta e partea pe care, sincer, nu am văzut-o implementată în niciun alt sistem CDR-based pe care l-am evaluat. Lista din dashboard e dinamică. Entry-urile dispar SINGURE când problema se rezolvă, fără să bifeze cineva nimic.

Calea 1: cleared_by=returned

Maria, din ext. 105, formează numărul lui Andrei. Apelul outbound se duce, Andrei răspunde, vorbesc 8 minute. La următorul ciclu CDR (în maxim 5 minute), agentul detectează rândul:

src=105, dst=+40745123456, disposition=ANSWERED, lastapp=Dial

Recunoaște că +40745123456 e un caller_number cu entry deschis pentru clientul ăsta și marchează entry-ul:

status=cleared
cleared_by=returned
cleared_by_extension=105
cleared_call_at=14:23:09

Audit log: action=cleared_returned, actor_type=agent, note="Returned by extension 105".

Entry-ul iese din lista „open” automatic. Maria n-a făcut niciun click special.

Calea 2: cleared_by=answered_later

Sau Andrei, supărat că n-a prins pe nimeni, sună din nou peste 30 de minute. De data asta răspunde cineva (oricine, oriunde în queue/IVR). Inbound ANSWERED cu același caller_number și același DID. Entry-ul se închide:

status=cleared
cleared_by=answered_later
cleared_by_extension=<extensia care a răspuns>

Audit log: cleared_answered. Iar dispare singur din listă.

Calea 3: cleared_by=manual

Cazul în care cineva a tratat clientul în afara telefonului — l-a sunat pe whatsapp, i-a trimis email, l-a vizitat fizic. Pentru asta există butonul „Marchează rezolvat” în Filament (vizibil doar dacă admin-ul a permis smart_missed_calls_allow_manual_resolve pe client).

User-ul cu permisiune apasă, opțional adaugă o notă, confirmă. Entry-ul:

status=cleared
cleared_by=manual
cleared_by_user_id=<id-ul user-ului>
cleared_note="Sunat pe WhatsApp, am preluat comanda"

Audit complet: cleared_manual cu actor_type=user și actor_user_id.

Plus: retenție și redeschidere

  • cleared_by=expired — un cron orar închide automat entry-urile mai vechi de N zile (setare per client). Lipsa retenției = mod „forever”, entry-urile rămân deschise până la close real.
  • reopened — dacă apelantul sună din nou DUPĂ ce s-a închis entry-ul, sistemul îl redeschide automat și incrementează missed_count. În audit apare reopened cu actor_type=agent.

Audit log — pentru când nu poți avea încredere oarbă

Una din funcțiile pe care managerii o folosesc cel mai des. Tabelul smart_missed_calls_audit e append-only. Fiecare event scrie un rând cu:

  • action (created / incremented / notified / cleared_* / reopened)
  • actor_type (agent / user / cron)
  • actor_user_id (când există)
  • note (opțional, pentru manual)
  • metadata (JSON — extensia care a re-apelat, ora, etc.)

Asta-ți permite ca admin să verifici dacă un agent marchează manual „rezolvat” fără să fi re-apelat efectiv. Vei vedea: cleared_manual de user 12 fără audit cleared_returned ulterior. Semnal clar pentru o discuție constructivă.

Și dacă bănuiești că un manual resolve a fost forțat, ai action reopen (admin-only) care redeschide entry-ul și păstrează istoricul închiderii anterioare în audit.

Notificări — 5 frecvențe + dedupe

Cinci moduri de a fi anunțat, configurabile per client:

  • off — nimic, doar dashboard
  • realtime — email la fiecare entry nou (cu dedupe per (caller, did) 5 min default + rate-limit 50/h ca să nu inunde inbox-ul)
  • hourly — un singur email la începutul fiecărei ore cu lista din ora trecută
  • daily — la notify_daily_at (default 08:00) cu raportul de ieri
  • weekly — la notify_weekly_day la notify_daily_at
  • monthly — la notify_monthly_day la notify_daily_at

Plus: destinatari nelimitați configurabili per portal, opțional „use extension email” (se trimite la email-ul user-ului asociat extensiei chemate, nu la inbox generic).

Privacy și non-interferență

Două promisiuni tehnice care contează:

1. Datele tale rămân la tine. La portal pleacă strict metadata: caller_number, caller_name (când există în CDR), did, route_label, extensions[], missed_count, first/last_missed_at, status. Niciodată audio, niciodată recording-uri, niciodată conținut conversațional.

2. Nu atingem nimic din FreePBX/VitalPBX. Nu modificăm dialplan-ul. Nu adăugăm AMI. Nu deschidem porturi. Nu ștergem fișiere de recording native. Citim asteriskcdrdb (FreePBX) sau bazele per-tenant (VitalPBX) read-only. UCP, Sonata, Call Reports native — toate funcționează cum le știi. Suntem strict observatori.

Comunicarea cu portalul PBXTools se face prin WebSocket peste HTTPS pe portul 443. Niciun port forwarding, niciun VPN. Funcționează prin orice firewall corporate.

Pentru clienți enterprise oferim deployment self-hosted al întregului portal în VPC-ul lor. În acel caz nici metadata nu pleacă din infrastructura clientului.

Compatibilitate la lansare

SistemVersiuniStatus
FreePBX14, 15, 16, 17✅ Suport complet, dual fallback (lastapp='missed_calls' + agregare CDR)
VitalPBX4.x multi-tenant✅ Suport complet, izolare strictă per tenant
FusionPBX🛣️ Q2 2026
Issabel🛣️ Q2 2026

Cum activezi

# 1. Cont gratuit pe portal + adaugi PBX-ul
https://portal.pbxtools.ro/register

# 2. Pe centrală, comanda de install (o linie):
curl -fsSL https://portal.pbxtools.ro/agent/install \
  | bash -s -- --api-key <CHEIA_TA>

# 3. În portal: activezi modulul pe Client
#    - smart_missed_calls_enabled = true
#    - retention_days (sau lasă null = forever)
#    - allow_manual_resolve (recomandat: true)
#    - notify_frequency, notify_daily_at, destinatari

La următorul ciclu de keepalive (5 minute) primești backfill cu apelurile din ultimele 24 de ore.

Ce urmează

  • FusionPBX + Issabel — Q2 2026
  • Push mode sub 30s prin AMI listening (Enterprise)
  • Mobile push pentru caller VIP (din CRM)
  • Voicemail-to-text integrat în digest

Activează Smart Missed Calls. Pentru întrebări tehnice — contact sau [email protected].