Automazione

Ho insegnato a Claude a leggere le mie email. Ecco come funziona il workflow.

La mattina apro Todoist, non Gmail.

Non è vero. Apro ANCHE Gmail, ma per un tempo decisamente inferiore a quanto mi capitasse nel passato.

Non è una scelta di stile — è il risultato di un workflow che ogni mattina alle 8:00 legge la mia casella, capisce se qualche messaggio richiede un’azione, crea i task e mi manda un briefing già pronto. Questo articolo spiega come è costruito, con i dettagli tecnici per chi è curioso e si diverte a “giocare” con l’automazione..

Il problema che volevo risolvere

La mia inbox riceve ogni giorno un mix eterogeneo: clienti che chiedono qualcosa, notifiche di sistemi che gestisco, newsletter di settore, promozioni, aggiornamenti automatici di plugin WordPress, email della società sportiva. Tutto nello stesso posto, tutto con la stessa urgenza apparente.

Il problema non è il volume — è il costo cognitivo di aprire la casella senza un sistema. Ogni mattina rischiavo di passare 20 minuti a classificare invece di lavorare.

L’architettura del workflow

Il workflow gira su n8n self-hosted sul mio VPS (Virtual Private Server), si “triggera” alle 8:00 dal lunedì al venerdì, e lavora su due rami in parallelo.

Ramo 1 — inbox primaria

Gmail viene interrogato via OAuth2 per le email delle ultime 24 ore, escludendo le categorie Aggiornamenti, Promozioni e Social. Le email vengono aggregate in un unico blocco di testo (troncato a 800 caratteri per email per risparmiare i token. occorre guardare anche al portafoglio) e passate a Claude tramite API diretta.

Il prompt è calibrato per essere deliberatamente inclusivo: preferisco un falso positivo che un’azione mancata o un messaggio importante andato perduto. Claude restituisce un JSON strutturato con subject, mittente, descrizione dell’azione richiesta, data di scadenza se presente, e priorità da 1 a 3.

Per ogni task, un Code node calcola la “due date”, la data di scadenza: se Claude ha trovato una scadenza esplicita la usa, altrimenti calcola il prossimo giorno lavorativo escludendo sabati, domeniche e i festivi italiani. I task vengono creati su Todoist via REST API v1 (la v8 è deprecata — dettaglio non banale che ha richiesto un po’ di debugging).

Ramo 2 — aggiornamenti e promozioni

Gmail filtra le email non lette delle categorie updates, promotions e social. Claude le sintetizza in bullet list di massimo 100 caratteri ciascuno. Gli ID vengono raccolti e dopo l’invio del digest tutte queste email vengono marcate via API come lette su Gmail.

Convergenza

I due rami convergono su un nodo Merge. Un nodo Aggregate raccoglie tutti i task creati su Todoist in una lista unica: in questo modo il nodo di assemblaggio riceve un solo item strutturato da ciascun ramo.

Il nodo finale costruisce un’email HTML con due sezioni: tabella dei task con priorità, azione e scadenza nella parte superiore; bullet list degli aggiornamenti in fondo. L’email viene inviata a me con oggetto “AGENDA del [data estesa]” e marcata come importante tramite Gmail API.

 

 

L’angolo del nerd

Costruire questo workflow ha richiesto più iterazioni del previsto. I punti critici:

OAuth che non parte. Se n8n gira dietro un reverse proxy Nginx e le connessioni OAuth falliscono con un errore generico, il problema è quasi sempre la dimensione dei buffer degli header HTTP. Gli URL di autorizzazione OAuth sono lunghi, e Nginx di default li tronca. Due righe nel blocco server risolvono: large_client_header_buffers 4 32k e client_header_buffer_size 32k. Vale per Gmail, Google Drive, Todoist — qualsiasi servizio che usa OAuth2.

I nodi nativi di n8n non sono sempre aggiornati. Il nodo Todoist built-in chiamava un endpoint deprecato da mesi. In generale, quando un nodo nativo restituisce errori inspiegabili, vale la pena verificare la versione dell’API che usa — spesso basta sostituirlo con un nodo HTTP Request generico che punta all’endpoint corretto. Più controllo, zero dipendenza dagli aggiornamenti di n8n.

n8n serializza tutto come stringa. Quando si costruisce il body di una richiesta HTTP usando i campi grafici di n8n, i valori numerici vengono inviati come stringhe. Se l’API di destinazione richiede un intero (come il campo priority di Todoist), arriva un errore 400 apparentemente inspiegabile. La soluzione più robusta: costruire l’intero body JSON in un Code node con JavaScript, e passarlo come raw string al nodo HTTP Request. Risolve anche il problema delle espressioni dinamiche annidate, che nei body raw in modalità grafica non funzionano.

Rami paralleli con volumi diversi. Quando due rami di un workflow convergono su un nodo finale ma producono numeri di item diversi — uno genera N task, l’altro 1 riepilogo — il Merge di n8n non sa come abbinarli. Soluzione: un nodo Aggregate prima del Merge che comprime gli N item in un array unico. Il nodo finale riceve così un item per ramo e può lavorare senza ambiguità.

Quello che funziona oggi

Ogni mattina alle 8:00 ricevo un’email con:

  • tutti i task che richiedono un’azione, già su Todoist con scadenza
  • un riassunto sintetico di ogni newsletter e promozione ricevuta
  • le email di aggiornamento già marcate come lette

Il tempo che ci passo: zero. Apro Todoist e so già cosa fare.

Quello che si può replicare

Questo tipo di workflow funziona per chiunque gestisca una casella ad alto volume con email di natura diversa. Il pattern — classificazione AI + azione automatica su tool di produttività + digest formattato — è replicabile su qualsiasi combinazione di client email e task manager che esponga API.

Se gestisci un team, si scala facilmente: un inbox condiviso, Todoist con progetti per area, assegnazione automatica per mittente o keyword.

Se ti interessa capire se ha senso per il tuo caso specifico, l’audit gratuito è esattamente il posto da cui partire.