Immaginate questa scena: siamo a un bar e vi sto raccontando di un progetto che ho appena concluso. Il mio cliente, Arcatech, gestisce un'attività di vendita di ricambi meccanici. Sembra semplice, vero? Invece no. Hanno a che fare con tantissimi fornitori diversi, molti dei quali in Turchia, e nessuno dei pezzi ha nomi prevedibili. I clienti li contattano continuamente chiedendo “Avete questo?” e nella metà dei casi inviano una foto sfocata di un pezzo di metallo casuale senza alcun contesto.
Arcatech stava annegando. Rispondevano manualmente ai clienti, chiedevano manualmente ai fornitori disponibilità e prezzi, aggiornavano manualmente i fogli di calcolo… tutto manuale. Giorni sprecati in cose che avrebbero dovuto essere automatizzate anni fa.
Così ho costruito per loro un sistema CRM personalizzato che funge fondamentalmente da cervello operativo multilingue e alimentato dall'IA.
Il Problema Centrale
Avevano bisogno di tre cose:
- Un modo per gestire migliaia di pezzi attraverso più fornitori.
- Un modo per rispondere rapidamente ai clienti, anche quando il cliente non sa come si chiama il pezzo.
- Un modo per parlare automaticamente con i fornitori, molti dei quali rispondono solo tramite WhatsApp.
E volevano tutto questo in un unico flusso di lavoro, veloce, pulito e in tempo reale.
La Soluzione Che Ho Costruito
Ho costruito l'intero sistema utilizzando Elixir + Phoenix LiveView, perché nulla batte Elixir per i processi in tempo reale e i flussi di lavoro tolleranti ai guasti. Il CRM consente ad Arcatech di:
- caricare e gestire cataloghi di parti
- ricevere richieste dei clienti con foto
- consentire a un agente AI di identificare il pezzo utilizzando LLM
- interrogare i fornitori automaticamente tramite WhatsApp
- raccogliere disponibilità, prezzi e spedizione
- aggiornare MongoDB in tempo reale
- presentare il prezzo finale per l'approvazione di Arcatech
- e quindi inviare automaticamente il preventivo finale al cliente nella sua lingua
Così, invece di ore di scambi avanti e indietro, le cose accadono in minuti.
Il Flusso di Lavoro dell'Agente AI
Ecco come funziona l'“agente AI” sotto il cofano:
- Il cliente invia un messaggio o una foto
- L'utente potrebbe non conoscere il nome del pezzo. Nessun problema, elaboro l'immagine tramite un LLM per classificarla e abbinarla a articoli di catalogo conosciuti (o articoli simili).
- L'agente prepara una richiesta al fornitore
- Per i pezzi non in magazzino, l'agente invia un messaggio a uno o più fornitori.
- I fornitori rispondono su WhatsApp, perché è così che conducono gli affari.
- Le risposte vengono analizzate automaticamente
- Il mio agente estrae disponibilità, tempi di consegna previsti, prezzi, costi di spedizione, ecc.
- Aggiornamenti del database
- Tutto viene memorizzato automaticamente in MongoDB Atlas.
- Utilizzo MongoDB perché è flessibile, gestisce bene le strutture di elementi nidificati e funziona bene con la ricerca vettoriale del mio agente.
- Approvazione del prezzo
- L'agente chiede ad Arcatech:
- “Il cliente ha bisogno di questo pezzo. Il prezzo del fornitore è X. Quanto dovremmo addebitare?”
- Arcatech conferma il prezzo finale.
- L'agente risponde al cliente (multilingue)
- Per la traduzione, utilizzo Gemini (veloce + economico)
- Per il ragionamento, il flusso di lavoro e le conversazioni, utilizzo GPT-5 (preview).
- Insieme, sono più che sufficienti.
Il Problema di WhatsApp
Questa è stata la parte divertente. WhatsApp non ha un'API ufficiale gratuita per questo tipo di flusso di lavoro: o usi l'API Business a pagamento o fai il reverse-engineering di WhatsApp Web. Ho trovato una libreria Go chiamata Whatsmeow
che in pratica ti fornisce un client WhatsApp Web stabile con supporto per l'invio/ricezione di messaggi. Il problema? È Go, non Elixir.
Avevo due opzioni:
- Scrivere un wrapper Elixir attorno alla loro implementazione WebSocket
- avrebbe richiesto troppo tempo
- non ne valeva la pena
- e se qualcosa si fosse rotto, avrei dovuto debuggare i protocolli WhatsApp alle 3 del mattino.
- Costruire un microservizio Go separato dedicato a WhatsApp
- semplice
- stabile
- facile da scalare
Ovviamente, ho scelto l'opzione 2.
L'Architettura
Ecco come si presenta l'architettura finale:
- App Elixir / Phoenix LiveView
- Esegue l'app CRM, la logica di business, la logica dell'agente AI, i dashboard e tutti i flussi di lavoro.
- Ospitata su Fly.io, con 2 nodi Elixir per la ridondanza.
- Microservizio Go che utilizza Whatsmeow
- Mantiene attiva una sessione persistente di WhatsApp Web.
- Comunica con i nodi Elixir tramite WebSockets.
- Affidabile, stateless e facile da scalare orizzontalmente.
- Ospitato anch'esso su Fly.io.
- MongoDB Atlas (cloud)
- Memorizza tutte le richieste dei clienti, i cataloghi dei pezzi, le risposte dei fornitori, gli embedding vettoriali e gli stati delle conversazioni.
- Stack LLM
- GPT-5 per ragionamento, flussi di lavoro e messaggistica
- Google Gemini per traduzione ed embedding
- Embedding memorizzati in MongoDB per un rapido recupero di pezzi simili
Tutto insieme forma una pipeline di vendita completamente automatizzata che funziona attraverso lingue, paesi e app di messaggistica.
Perché Non Usare un Nodo Elixir per WhatsApp?
Ho considerato l'uso di goerlang/node
L'idea era di far comportare il processo Go come un nodo Erlang e unirsi al cluster BEAM.
Ma questo comporta mal di testa:
- networking full mesh
- split del cluster tra regioni
- problemi di denominazione dei nodi
- debug di sistemi distribuiti senza una buona ragione
Un semplice WebSocket tra Go ed Elixir è:
- più pulito
- più sicuro
- più facile da scalare
- più facile da monitorare
- più facile da distribuire
A volte la soluzione più noiosa è quella giusta.
Configurazione del Deployment
Tutto funziona su Fly.io perché:
- clustering facile per le app BEAM
- networking privato tra servizi
- failover automatico
- scalabilità semplice
Ho:
- 2 istanze Elixir (Phoenix LiveView)
- 1 istanza Go (connettore WhatsApp)
- MongoDB Atlas esterno
- API LLM esterne
Questa configurazione gestisce la concorrenza in modo eccellente.
Il Risultato Finale
Arcatech ora gestisce le richieste dei clienti in minuti, non in ore.
- Niente più messaggistica manuale ai fornitori
- Niente più ricerca su WhatsApp di vecchie conversazioni
- Niente più confusione su quale sia il pezzo
- Niente più barriere linguistiche
- Prezzi in tempo reale, assistiti dall'IA
- Cronologia delle conversazioni completamente tracciabile
- Flusso di lavoro cliente-fornitore pulito
E la parte migliore?
Abbiamo costruito tutto in circa 4 settimane.
Windsurf
All my projects and even this website is build using Windsurf Editor. Windsurf is the most intuitive AI coding experience, built to keep you and your team in flow.
Contattaci
Se ti serve uno sviluppatore che consegna soluzioni veloci, affidabili e pratiche, contattami. Trasformiamo insieme la tua idea o il tuo progetto in qualcosa che funziona davvero.