Vai al contenuto
megapromotingParliamone

Competenza · Telefonia e contact center

Il livello di telefonia tra il vostro operatore e chi risponde — un uomo o un agente.

Costruiamo la centrale: trunk SIP, regole di instradamento per programma, menu IVR letti dal database, code di attesa, trasferimento a un umano, registrazione e analisi delle chiamate. La chiamata diventa una registrazione con trascrizione e riepilogo, non un ricordo.

Già costruitoTrei implementări proprii, citate mai jos. (1) Stratul Asterisk din platforma Kallina: 5.522 de linii de configurație de dialplan, scripturi AGI și punți audio în `asterisk/`, plus șabloane de trunk generate automat per număr. (2) `asterisk-manager` — un serviciu separat care administrează cozile, trunkurile și fluxul RTP prin interfața de management a centralei. (3) Middleware-ul pentru centrala virtuală a unui operator, care a rulat în producție: commitul de reconciliere din 14 iulie 2026 aduce în depozit cod care rulase pe server și era cu circa 40 de zile înaintea git-ului. Rezerva, spusă înainte să întrebi: gazda SIP prin care trec liniile noastre de test nu răspunde — verificat azi, 06.09.2026, fără răspuns la ping și fără răspuns pe HTTP. Nu prezentăm un număr de demonstrație pe care să suni acum, pentru că nu l-am putea ridica în fața ta.

Tra il vostro operatore telefonico e chi risponde effettivamente — una persona o un voice agent — deve esserci un livello che prende decisioni. Chi riceve la chiamata alle 23:40. Cosa succede se non risponde nessuno. Dove va la chiamata quando il cliente chiede «un uomo». Cosa resta della conversazione dopo che si è chiusa. Questo livello è una centrale, e noi lo costruiamo perché sia dell’azienda, non del fornitore di voce: se domani cambiate il motore dell’agente, le regole di routing, le code e la cronologia restano vostre.

Concretamente, cosa abbiamo costruito: dodici file di dialplan — produzione, IVR, coda, trasferimento, voicemail, deviazione, chiamate uscenti con agente — quattro script AGI in Python e due bridge audio, in totale 5.522 righe. Il motore IVR non ha i menu scritti nel file: li legge dal database tramite uno script AGI e restituisce una delle sei decisioni — verso un agente, verso un altro menu, verso una coda, trasferimento a un numero esterno, messaggio finale, o chiusura. Le code si chiamano in base al loro identificatore e non hanno membri scritti nella configurazione: vengono aggiunti e rimossi dall’esterno, tramite l’interfaccia di gestione, il che significa che un operatore può entrare o uscire dalla coda senza riavviare la centrale.

Il routing ha regole reali, non un solo «chiama qui»: orari di apertura e fuso orario, orario notturno del tipo 22:00 → 06:00, e corrispondenza per priorità — l’intestazione SIP `Diversion`, che porta il numero originale da cui è stato trasferito il chiamata, poi il proprio numero, poi la regola di riserva. I trunk sono generati per numero, con un nome costruito dal fornitore e dal numero, da una funzione di configurazione — non scritti a mano a ogni nuova riga.

Ciò che esce dalla chiamata è importante quanto la chiamata. Per la linea collegata al centralino virtuale di un operatore abbiamo costruito un middleware in Python che interroga la lista delle registrazioni ogni minuto, con una riconciliazione ampia ogni sei ore affinché un’interruzione di rete non faccia perdere nulla, e una scansione ogni tre minuti delle chiamate perse — quelle non hanno registrazione e altrimenti sarebbero completamente invisibili. Ogni registrazione viene scaricata, trascritta, analizzata e riflessa nell’analisi delle chiamate, e la chiamata persa diventa un alert. L’idempotenza sta in un set Redis, così che la stessa registrazione non venga elaborata due volte.

Cosa comprende

Il lavoro, per componenti

Il numero entra su un trunk generato, non scritto a mano

I template dei trunk sono parametrizzati e compilati da una funzione di configurazione, con nome formato da fornitore e numero. Nel template sono scritti trasporto, codec consentiti, gestione NAT, modalità DTMF e autenticazione. La conseguenza pratica: il decimo numero si collega come il primo, e le differenze tra operatori stanno in un solo posto.

Il centralino decide dove va la chiamata, secondo regole scritte

Orari di apertura e fuso orario, orario notturno del tipo 22:00 → 06:00, corrispondenza per priorità: l’intestazione SIP `Diversion` (il numero da cui è stato trasferito), poi il proprio numero, poi la regola di riserva. La ricerca della regola avviene tramite uno script AGI che interroga la piattaforma durante la chiamata, con un proprio timeout — quindi una regola modificata nell’interfaccia si applica alla chiamata successiva, senza riavvio.

La chiamata arriva all’agente, alla coda o alla persona

Verso l’agente vocale, l’audio passa attraverso un bridge che converte il codec in entrambe le direzioni, `g711_ulaw` ↔ `PCM16`. Verso le persone, la chiamata entra in una coda gestita dall’esterno. E il trasferimento è a portata di chi parla: trasferimento cieco tramite `##` e trasferimento assistito tramite `*2`, con la chiamata che atterra in un contesto scritto apposta per questo, che distingue le estensioni interne di quattro cifre dai numeri esterni.

Menu IVR letto dal database, non dal file

Il motore IVR riceve l’identificatore del menu e lo legge dal database tramite uno script AGI. Il risultato è una delle sei decisioni: verso un agente, verso un altro menu (ricorsivo), verso una coda, trasferimento esterno, messaggio finale, chiusura. I messaggi possono essere sintetizzati oppure possono essere file audio registrati in precedenza. Cambiare un menu significa cambiare una riga nel database, non modificare un file di configurazione sul server.

Code con membri dinamici

Ogni coda porta il nome derivato dal proprio identificatore. I membri non sono persistiti nella configurazione: vengono aggiunti e rimossi durante il funzionamento tramite l’interfaccia di gestione del centralino, ed è abilitato il posizionamento simultaneo su più posti liberi. In pratica, un operatore entra o esce dalla coda senza che il centralino venga riavviato e senza che le chiamate in attesa ne siano influenzate.

Dispatching verso persone sul campo

Un agente può chiamare lui stesso qualcuno all’esterno e tornare con la risposta. Il meccanismo è implementato con una tabella propria e stati espliciti — si sta chiamando, in corso, si riprova, completato, fallito, senza risposta, scaduto — con massimo tre tentativi e una pausa di due minuti tra di essi, e il risultato (incluso il tempo stimato di arrivo) viene restituito in modo strutturato alla conversazione che lo ha richiesto. Non è un concetto: sono cinque funzioni server dedicate, più una pulizia delle chiamate rimaste bloccate.

Le chiamate diventano dati, comprese quelle a cui nessuno ha risposto

Un processo pianificato legge la lista delle registrazioni ogni minuto, con riconciliazione ampia ogni sei ore affinché un’interruzione non faccia perdere nulla. La registrazione viene scaricata in WAV, trascritta, analizzata e riflessa nell’analisi delle chiamate insieme all’audio. Separatamente, ogni tre minuti vengono lette le chiamate non prese in carico — che non hanno registrazione e altrimenti non esisterebbero da nessuna parte — e diventano un alert. Una chiamata persa è un cliente perso; renderla visibile è il miglioramento più economico in un call center.

Freni rispetto all’API dell’operatore

Il client che comunica con il centralino dell’operatore ha un proprio limitatore di rate, con bucket di token, e una gestione esplicita degli errori. Non è una precauzione teorica: un middleware che interroga ogni minuto e riconcilia ogni sei ore può, senza freno, colpire il limite dell’operatore ed essere bloccato proprio quando ne avete bisogno.

Come si presenta

Il percorso, passo dopo passo.

01

Inventario delle linee prima di qualsiasi configurazione

Quali numeri esistono, presso quale operatore, chi risponde oggi su ciascuno, in quale orario, e cosa accade ora quando nessuno risponde. Sembra burocrazia; è la parte che previene le sorprese. Dalla nostra esperienza, in un parco di numeri esistono quasi sempre linee per le quali la base dice una cosa e la centrale un’altra — e non si scoprono al lancio, ma ora.

02

Trunk, poi test in entrambe le direzioni, separatamente

Il numero entra nel trunk, e le chiamate in entrata e quelle in uscita vengono testate come due cose distinte, perché si guastano in modo distinto. Abbiamo documentato un caso in cui le chiamate in entrata funzionavano perfettamente per giorni, mentre tutte le chiamate in uscita venivano respinte dalla centrale dell’operatore con `403 Forbidden`, senza alcuna modifica da parte nostra. Un unico test “ha squillato e ha funzionato” non copre questo caso.

03

Dialplan: routing, IVR, coda, trasferimento, voicemail

Le regole di orario e di priorità, i menu, le code e i percorsi di trasferimento si scrivono come dialplan e come righe nel database, non come intesa verbale. Alla fine sa esattamente cosa accade a una chiamata alle 23:40, di sabato, quando l’agente non comprende la richiesta.

04

Le chiamate entrano nei Suoi sistemi

Il risultato della chiamata — transcript, riepilogo, sentiment, indirizzo della registrazione, durata — viene trasmesso ulteriormente tramite un webhook firmato, e l’organizzazione viene identificata in base al numero di telefono. Laddove esiste un CRM, la chiamata si collega alla scheda e può modificare automaticamente lo stato; di questa parte scriviamo nella pagina CRM e automazione delle vendite.

05

La continuità si discute all’inizio, non dopo il primo guasto

Una centrale su un singolo host è un unico punto di guasto, e noi abbiamo vissuto esattamente questo: quando l’host non risponde, tutte le linee che lo attraversano cadono insieme a lui, indipendentemente da quanto bene sia configurato l’agente. La firma del guasto è chiara — la chiamata restituisce “request timed out” con l’identificatore di chiamata SIP vuoto, cioè la chiamata SIP non si è mai stabilita. Per questo, in un progetto reale, la domanda “cosa succede quando l’host cade” si pone e si mette a budget all’inizio: un secondo host, monitoraggio che chiama una persona, e un percorso di riserva verso numeri ordinari.

Ce vede utilizatorulAplicațiaRețea și securitateGăzduire și dateFIECARE STRAT, ALES ȘI EXPLICAT
Straturile unei linii telefonice: trunkul operatorului, centrala cu regulile de rutare, puntea audio către agent, coada și transferul către om, apoi înregistrarea, transcrierea și analiza.

I dati

Cosa tocchiamo, dove risiedono e quanto rimangono

Le domande che pone chiunque abbia un responsabile della protezione dei dati — poste qui prima che le ponga lui.

Dove arriva la registrazione delle chiamate
La registrazione delle chiamate della centrale oggi viene scritta localmente, in formato CSV, sull’host della centrale; la sua scrittura in un database PostgreSQL è preparata nella configurazione, ma rimane disattivata. Lo diciamo perché ha una conseguenza diretta: se desidera report sulle chiamate al di fuori della centrale, l’attivazione della registrazione nel database è un lavoro da eseguire, non una casella da spuntare. I transcript e le analisi restano separati, nella piattaforma, collegati al Suo spazio di lavoro.
Cosa viene memorizzato da una chiamata
Il numero del chiamante e il numero chiamato, il momento, la durata, l’esito, la registrazione audio, il transcript e l’analisi. Per le chiamate non prese esistono il numero, il momento e il motivo della mancata risposta — non esiste audio, perché non si è prodotto. La registrazione viene scaricata in WAV a 8 kHz, mono, e convertita in un formato compresso per la consegna alle persone.
L’idempotenza, affinché i dati non si duplicano
Ogni record elaborato viene marcato in un set Redis. La riconciliazione ampia può rileggere la stessa finestra temporale senza reinviare nulla. È il dettaglio che fa la differenza tra un sistema che può essere riavviato con serenità e uno che, a ogni riavvio, reinvia tutti gli avvisi di ieri.
Chi può ascoltare una registrazione
I dati delle chiamate sono legati allo spazio di lavoro dell’azienda, e l’accesso passa tramite autenticazione. Non esiste un archivio comune tra i clienti e non esiste accesso «dalla piattaforma» senza un’identità. Chi esattamente del vostro team ha il diritto di ascoltare si stabilisce in fase di implementazione, non di default.
La conservazione e l’avviso di registrazione sono vostre decisioni
Per quanto tempo vengono conservati audio, trascrizione ed evidenza delle chiamate, e cosa viene detto all’inizio della conversazione sul fatto che sia registrata, sono decisioni del titolare del trattamento — cioè vostre. La cancellazione su richiesta è implementata nella piattaforma; la cancellazione automatica alla scadenza si esegue oggi tramite procedura, non tramite un orologio, quindi se vi serve automatica, va inserita come lavoro nel progetto.

Un caso

Le chiamate lunghe sparivano. Quelle brevi, no.

La situazione

In un flusso di analisi delle conversazioni, una parte delle chiamate arrivava all’analisi e una parte no. Il pattern è stato quello che ha indicato la causa: mancavano esattamente le chiamate lunghe. Un difetto che viene segnalato come «a volte non funziona» e si cerca, erroneamente, nella trascrizione.

Cosa abbiamo costruito

C’erano due percorsi di trascrizione ed entrambi fallivano, per motivi diversi. Il percorso multimodale inviava l’intero file audio codificato nel corpo della richiesta; oltre una certa dimensione, il limite del corpo del server intermedio ha risposto con 413. Il percorso di riserva richiedeva un modello di trascrizione che la chiave di accesso non permetteva più, quindi rispondeva con 403. Entrambi fallivano, il processo segnalava che tutti i modelli di trascrizione erano falliti e la chiamata veniva abbandonata. Le chiamate brevi restavano sotto il limite del corpo, quindi passavano: da qui lo schema. La correzione è stata: si salta il percorso multimodale per i file WAV oltre 12 MB (soglia configurabile dall’ambiente), si riutilizza il transcript già calcolato invece di trascrivere una seconda volta, e la trascrizione di ultima istanza è stata spostata su un modello consentito.

Cosa è emerso

Verificato sulla registrazione rimasta bloccata: una conversazione di 21 minuti, file WAV da 41 MB — via multimodale aggirata, trascrizione recuperata, analisi generata, riga e audio arrivati nell’analisi delle chiamate, zero fallimenti. La riconciliazione ha poi confermato che non esistono altre registrazioni bloccate.

Cosa non dice il caso

La soglia di 12 MB è una proprietà del server intermediario, non della chiamata. Quando cambiano gateway, chiave o modello, la soglia va verificata di nuovo — per questo l’abbiamo resa configurabile da ambiente, non scritta nel codice.

Domande

Cosa ci chiedono le persone prima di chiamare

Avete un numero che posso chiamare adesso, per sentire l’agente?

Non oggi, e preferiamo dirlo piuttosto che dare un numero che suona a vuoto. La parte dell’agente si può ascoltare nella pagina, subito. La parte telefonica dipende da un host SIP, e l’host attraverso cui passano le nostre linee di test non risponde alla data di scrittura — verificato oggi, nessuna risposta al ping e nessuna risposta su HTTP. Per un vostro progetto, la telefonia si alza su un host dedicato al progetto, non su quello di test.

Perché una centrale propria e non direttamente il fornitore di agenti vocali?

Perché le regole di instradamento, le code, il trasferimento, la casella vocale e lo storico delle chiamate sono dell’azienda, non del fornitore di voce. Con una centrale propria potete cambiare il motore dell’agente senza riscrivere il comportamento del vostro telefono, potete inviare la stessa chiamata prima a un agente, poi a una persona, e potete tenere da voi la registrazione delle chiamate. Senza di essa, siete vincolati a ciò che il fornitore sceglie di esporre.

Cosa succede se il server della centrale cade?

Crollano tutte le linee che passano attraverso di esso. Non è un’ipotesi: è ciò che abbiamo vissuto noi, e la firma è facile da riconoscere — la chiamata restituisce «request timed out» con l’identificatore della chiamata SIP vuoto, quindi non è colpa dell’agente, del numero o del prompt. La conclusione che abbiamo tratto e che ora inseriamo in ogni progetto: la continuità non è una funzione della centrale, è una decisione di architettura e di budget, presa all’inizio. Si risolve con un secondo host e con un percorso di riserva verso numeri ordinari, non con un’impostazione.

Le chiamate in uscita funzionano sicuramente, se quelle in entrata funzionano?

No. Sono due cose diverse, e l’operatore può trattarle in modo diverso. Abbiamo documentato un caso in cui, con la nostra configurazione invariata e con le chiamate in entrata funzionanti, la centrale dell’operatore ha iniziato a respingere tutte le chiamate in uscita con `403 Forbidden` — la prova che il problema fosse dall’operatore è stata che un secondo account, con configurazione strutturalmente identica, continuava a chiamare verso l’esterno. Per questo non promettiamo una campagna di chiamate in uscita prima di un test di uscita riuscito sul vostro numero.

Potete lavorare con la centrale virtuale che mi dà l’operatore?

Sì, e lo abbiamo fatto: abbiamo scritto un middleware in Python sopra l’API di una centrale virtuale dell’operatore, con client proprio, limitatore di frequenza, download delle registrazioni, trascrizione, analisi e alerting, eseguito in produzione. Cosa va saputo in anticipo: l’accesso all’API estesa è spesso un servizio separato, contrattato a parte, e le credenziali possono non funzionare al primo tentativo — da noi, il ciclo di chiarimento della specifica e di reset della password con l’operatore è durato mesi, con il servizio già fatturato. Per questo, in un’offerta che dipende dall’API di un operatore, inseriamo esplicitamente la condizione: il lavoro inizia dopo che l’autenticazione è stata dimostrata, non dopo che è stata promessa.

Le chiamate vengono registrate e chi può ascoltarle?

Possono essere registrate, trascritte e analizzate. Rimangono legate all’area di lavoro della tua azienda e l’accesso richiede autenticazione — non esiste un deposito comune tra i clienti. Chi del tuo team ha diritto all’ascolto si stabilisce in fase di implementazione. L’avviso all’interlocutore e la base giuridica della registrazione sono decisioni tue in qualità di titolare del trattamento; le scriviamo nello сценарio, non le diamo per scontate.

Che cosa succede alle chiamate a cui non risponde nessuno?

Sono il caso peggiore trattato nella maggior parte delle aziende, perché non lasciano traccia: non hanno registrazione, non hanno transcript, esistono solo nei registri delle chiamate. Da noi, un processo legge i registri ogni tre minuti, identifica le chiamate non prese in carico e le trasforma in un alert e in una riga visibile. Per essere chiari su cosa dipende: le vediamo solo nella misura in cui l’operatore le espone nei propri registri.

Potete creare menu del tipo «premi 1 per...»?

Sì, e i menu stanno nel database, non in file sul server. Il motore legge la configurazione del menu durante la chiamata e decide una delle sei strade: verso un agente, verso un altro menu, verso una coda, trasferimento a un numero esterno, un messaggio finale, oppure chiusura. I messaggi possono essere sintetizzati o registrati in anticipo. In pratica, una modifica del menu non richiede interventi sulla centrale.

Come faccio a sapere se una chiamata si è persa per strada, tra la centrale e l’analisi?

Attraverso una riconciliazione, ed è un elemento che costruiamo esplicitamente. L’interrogazione rapida ha una finestra di alcune decine di ore, e sopra di essa viene eseguita ogni sei ore una riconciliazione su una finestra di una settimana, che rilegge più pagine di risultati. Ogni record elaborato viene marcato, quindi la rilettura non duplica nulla. Senza riconciliazione, un’interruzione di un’ora significa un buco permanente nei dati — e nessuno se ne accorge.

Su cosa si basano le affermazioni sopra (22 fonti)

22 di esse sono codice e file dei nostri repository. Non ne pubblichiamo il nome né la riga: insieme, in un'unica pagina, descriverebbero con troppa precisione come sono costruiti sistemi che non sono solo nostri. Le esaminiamo con te, nel repository, su richiesta — la verifica resta possibile, solo che avviene in una discussione.

Cosa vorresti che funzionasse meglio?

Raccontaci il tuo processo. Insieme stabiliamo cosa vale la pena costruire, cosa possiamo collegare e come verifichiamo il risultato.

Parliamone