Documento riservato · Giugno 2026
Mimir Lab × Giancarlo Passaglia

Stack tecnico,
pattern validati,
partner operativo.

Due workflow n8n che girano davvero (non slide), uno costruito sul tuo caso flotta, e gli SDK quirk già mappati da chi ha shippato. Da tecnico a tecnico.

→  per Giancarlo Passaglia
01

Chi è Mimir Lab

Mimir Lab è un laboratorio di automazione AI-first fondato da Gabriele Sechi a Cademario (Ticino, CH). Stack proprietario centrato su n8n Cloud + Anthropic API diretta, orchestrato da agenti TypeScript via MCP SDK. Non un’agenzia: un execution layer tecnico per consulenti e aziende con visione chiara ma senza capacità operativa per costruirla.

Operiamo come partner tra pari — non fornitore generico. Costruiamo, deployiamo e gestiamo workflow n8n complessi in produzione. La documentazione interna è codificata in skill e pattern library derivati da 2 478 workflow analizzati.

LayerTool / TecnologiaRuolo operativo
L1 — Orchestration Claude Code + OpenClaw + Anthropic API diretta Agent di sviluppo, dispatcher, reasoning complesso
L2 — Workflow n8n Cloud — mimirlab.app.n8n.cloud Automazione, orchestrazione pipeline, integrazione servizi
L3 — Data Google Sheets (Service Account) + filesystem locale State, log operativi, dashboard contabile real-time
L4 — Output Telegram · LinkedIn · AbaNinja · Drive Delivery, pubblicazione, fatturazione automatica, archivio
02

n8n: la differenza è la produzione

Sai cos’è n8n — non te lo spieghiamo. Il punto è un altro: la distanza tra “so montare un workflow” e “lo gestisco in produzione senza che si rompa”. Lì sta il valore, e lì si vede chi ha davvero shippato: gestione errori su ogni side-effect, niente deadlock sui branch, parsing difensivo dell’output AI, deploy gated da validazione. I due workflow qui sotto lo mostrano su casi veri, con esecuzioni reali — non a parole.

Ripasso lampo — gli elementi di un workflow n8n

Se ti serve allineare la terminologia che usiamo nei canvas qui sotto.

Trigger

Da dove parte il flusso: webhook HTTP, schedule cron, evento da un servizio.

Nodi & dati

Ogni nodo trasforma o instrada i dati. Set, Code, IF, Switch, chiamate API e AI.

Branching

IF e Switch dirammano: percorsi diversi a seconda dei dati (tier lead, evento turno…).

Side-effect

Le azioni reali: scrivi su CRM/DB, notifica Telegram, crea una bozza, logga.

03

Un workflow vero, dal vivo

Showcase Lead Intake — un workflow che riceve un lead da form, lo valida, controlla il CRM, lo fa classificare da Claude (hot / warm / cold), e poi diramma azioni differenziate prima di loggare e rispondere. 15 nodi, un singolo workflow.

Non è un mockup: l’abbiamo costruito, validato ed eseguito davvero su mimirlab.app.n8n.cloud il 4 giugno 2026, con una chiamata Anthropic reale. Clicca un nodo per leggerne il dettaglio, o premi Esegui demo per vedere scorrere l’esecuzione reale (lead “hot”).

↔ scorri il canvas · clicca un nodo
Trigger / Risposta Transform (Set / Code) Logica (IF / Switch / Merge) AI (Claude) Integrazione esterna
Esplora il workflow

Seleziona un nodo nel canvas per vederne il ruolo e il quirk n8n gestito in produzione, oppure lancia la demo per seguire l’esecuzione nodo per nodo.

●  Esecuzione reale #1009 · status success · Claude Sonnet 4.5 · ~$0.003
// log esecuzione — premi “Esegui demo”
Spiegone completo — nodo per nodo

Cosa fa ogni nodo del workflow Showcase Lead Intake, e il quirk n8n gestito in produzione. Lo stesso testo che vedi cliccando i nodi qui sopra, ma tutto in un colpo.

01Lead Intake Webhookwebhook
Riceve il lead da un form esterno via POST, con responseMode: responseNode per rispondere a valle.
Quirk · Webhook (non Schedule/Poll): evita i 409 conflict da polling concorrente sull’istanza condivisa.
02Normalize & Validateset
Estrae i campi con doppio fallback $json.body?.x ?? $json.x, normalizza l’email, calcola il flag valid.
Quirk · Campi richiamabili a valle via $("Normalize & Validate") anche dopo il branching.
03Is Lead Valid?if
Bivio: valido → ricerca CRM; non valido → risposta 400.
Quirk · Niente Merge a valle dell’IF — i rami chiudono via Respond.
04Respond 400 InvalidrespondToWebhook
Errore 400 strutturato con echo dei campi ricevuti.
Quirk · Fallimento esplicito invece che silenzioso.
05HubSpot Search Contacthubspot
Cerca il contatto per email esatta: serve sapere se esiste e prenderne l’id.
Quirk · alwaysOutputData per gestire il “nuovo lead” + onError: continueRegularOutput.
06Enrich Contextset
Fan-in: riprende i dati del lead e aggiunge is_existing_contact.
Quirk · Espressione esplicita perché dopo HubSpot l’$json è il contatto, non il lead.
07Classify Lead with Claudeanthropic
Classifica il lead in tier hot/warm/cold + intent + urgency, output JSON rigido.
Quirk · Prompt strutturato per il caching; modello dalla tabella ufficiale, mai claude-3-*.
08Parse Claude JSONcode
Strip dei fence ```json, parse difensivo con fallback, clamp dei valori.
Quirk · Nell’esecuzione reale Claude HA wrappato l’output in ```json nonostante l’istruzione contraria.
09Route by Tierswitch
Instrada per tier: hot → Slack+Deal, warm → Gmail, cold → audit.
Quirk · rules.values con conditions complete; ogni ramo ha la sua azione.
10Slack: Hot Lead Alertslack
Branch HOT: messaggio su #sales-alerts con urgency e intent.
Quirk · onError: continueRegularOutput: se Slack è giù il flusso prosegue.
11HubSpot Create Dealhubspot
Branch HOT: crea il deal in pipeline qualifiedtobuy.
Quirk · Catena seriale Slack→Deal: prima notifico il team, poi scrivo nel CRM.
12Gmail: Draft Warm Replygmail
Branch WARM: crea una bozza HTML personalizzata, non un invio.
Quirk · Bozza, non send: escalation graduale, il sales rivede prima di inviare.
13Converge Branchesmerge
Concatena i rami in un singolo stream per l’audit.
Quirk · Mode append (non il default): dopo uno Switch il default deadlocca.
14Sheets Audit LoggoogleSheets
Append/upsert su Google Sheets con chiave idempotente.
Quirk · mappingMode: defineBelow: evita lo schema drift di autoMapInputData.
15Respond OKrespondToWebhook
Risposta 200 con tier, urgency, execution_id e durata.
Quirk · Optional chaining: risposta valida anche nell’edge case senza classification.

Secondo caso reale — flotta autisti (il tuo caso)

Lo stesso motore, un dominio diverso: gestione turni di una flotta mista (mezzi grandi con tachigrafo e piccoli senza). Il driver, al mattino, prende un veicolo; il sistema valida l’abbinamento patente↔mezzo (B vs C/C1 + CQC), registra stato veicolo e km, traccia le pause live, e a fine turno calcola la conformità ore leggendo la regola applicabile al mezzo.

Anche questo è costruito ed eseguito davvero sul cloud Mimir (esecuzioni reali #1141 fine turno e #1142 blocco patente). L’input arriverebbe da una Mini App Telegram “schedina” — qui mostrata come payload sul webhook. Le anagrafiche e le regole (IT/UE) sono una tabella di config, non codice: la flotta mista è gestita per riga.

↔ scorri il canvas · clicca un nodo
Trigger / Risposta Logica (Code) Routing / Bivio (IF / Switch) Notifica dispatcher
Esplora il workflow flotta

Seleziona un nodo per vederne il ruolo e il quirk gestito, o lancia la demo per seguire un turno reale: mattina con check patente, pause live, fine turno con verifica conformità ore.

●  Esecuzioni reali #1141 (fine turno · compliant) & #1142 (blocco patente B su mezzo >3,5t) · n8n cloud Mimir
// log esecuzione — premi “Esegui demo”
Spiegone completo — nodo per nodo

Cosa fa ogni nodo del workflow Fleet Driver Intake & Compliance. Anagrafiche (driver, veicoli) e regole vivono in una tabella di config: la flotta mista IT/CH è gestita per riga, non per codice. Mini App Telegram “schedina” = UI driver futura (qui input come payload sul webhook).

01Schedina Webhookwebhook
Riceve la schedina dal driver (in produzione: Telegram Mini App): event_type, driver_id, vehicle_id + campi del momento.
Quirk · responseMode: responseNode + onError: continueRegularOutput: il driver riceve sempre una risposta.
02Normalize & Validatecode
Normalizza i campi (doppio fallback body) e calcola valid (event_type valido + driver + veicolo).
Quirk · Schedina malformata bloccata qui con 400, niente dati sporchi a valle.
03Is Valid?if
Bivio: valida → anagrafiche; non valida → 400.
Quirk · Nessun Merge a valle dell’IF.
04Respond 400 InvalidrespondToWebhook
Errore 400 strutturato con i campi ricevuti.
Quirk · Fallimento esplicito invece che silenzioso.
05Lookup Driver & Vehiclecode
Risolve driver e veicolo dalle anagrafiche → classe mezzo, tachigrafo sì/no, rule_set. In produzione: Sheets/Postgres.
Quirk · Le regole NON sono hardcodate: il rule_set arriva dall’anagrafica veicolo → flotta mista IT/CH per riga.
06Route by Eventswitch
Instrada per event_type: inizio / pausa / fine turno (+ fallback).
Quirk · Rules nominate + fallbackOutput; ogni ramo ha la sua logica.
07Eligibility Checkcode
Mattina: valida l’abbinamento driver↔mezzo — patente adeguata alla classe (B vs C/C1) + CQC valida e non scaduta.
Quirk · Il “wow”: assegnazione illegale (patente B su mezzo >3,5t, o CQC scaduta) bloccata prima della partenza.
08Eligible?if
Idoneo → apre il turno; non idoneo → blocco + alert dispatcher.
Quirk · Decisione binaria sull’esito dell’eligibility.
09Open Shiftcode
Apre il turno: schedina numerata + stato veicolo (km, carburante, condizioni, pulizia).
Quirk · La schedina numerata = chiave immutabile del turno, ottima per l’audit.
10Block + Dispatcher Alertcode
Assegnazione non idonea: blocca e prepara l’alert al dispatcher col motivo (produzione: Telegram).
Quirk · Audita anche il tentativo bloccato — tracciabilità completa.
11Log Breakcode
Pausa: timestamp dell’inizio/fine pausa nel momento in cui avviene (live).
Quirk · Pause timestampate live → compliance solida, cruciale sui mezzi senza tachigrafo.
12Close Shift + Compliancecode
Fine: km+consegne, poi calcola ore/pause/guida e le confronta col rule_set del mezzo → flag violazioni.
Quirk · Mezzo con tachigrafo → “tachigrafo = fonte legale, qui operativo”; mezzo piccolo → “qui la schedina È il registro”.
13Audit Logcode
Scrive la riga di audit della schedina (in produzione: Sheets/Postgres, idempotente per slip_id).
Quirk · Convergenza dei rami su singolo nodo (no Merge) → niente deadlock.
14Notify Dispatchercode
Compone il messaggio per il dispatcher (turno aperto / pausa / chiuso + esito, o blocco). Produzione: @Mimirlab_Bot.
Quirk · Un solo punto di notifica per tutti i rami.
15Respond OKrespondToWebhook
Risposta 200 con esito, slip_id, eligibility/compliance e execution_id.
Quirk · Optional chaining: risposta valida anche negli edge case (es. blocco senza compliance).
04

Il nostro n8n, in profondità

Architettura dell’istanza

RisorsaValoreNote
Instance mimirlab.app.n8n.cloud — Starter plan Migrato da Docker localhost il 2026-04-07
Project ID zBy2aF6Ma4YyEX2u Container principale — tutti i workflow e credenziali dentro
Command Center duFEnIWzfjfzkK1V Pipeline brief + publish — sempre attivo
System Health Agent s6EPgHPhNN2sfdpJ Monitoring errori ogni 30 min
Agenti TypeScript OrchestratorAgent → BriefAgent / PublishAgent / N8nDocsAgent MCP SDK over stdio — npx tsx, no compile step
Sorgenti workflow mimir_v4.ts, brief-v2.ts, mimir_v5.ts SDK TypeScript — mai export JSON grezzo (credential exposure AUTH-05)

Pattern SDK validati in produzione

Questi pattern emergono da incidenti reali, non da documentazione ufficiale.

#PatternProblema evitatoFix
P-01 JSON fence stripping Claude wrappa l’output in ```json…``` anche con istruzione esplicita. JSON.parse() diretto → crash. raw.replace(/```json\s*/gi,'').replace(/```/g,'').trim() prima di ogni JSON.parse
P-02 Webhook > Poll / Schedule Più workflow che pollano la stessa risorsa (RSS, Sheets, Telegram) sull’istanza condivisa → 409 conflicts. Webhook trigger ovunque possibile. n8n→n8n via execute_workflow MCP colpisce sempre il primo webhook node.
P-03 Mai newCredential() via MCP Credential creata in global space, non assegnata al workflow del project → “credentials not shared with workflow” Credential ID hardcodato sempre. LinkedIn: assegnazione obbligatoria via UI n8n dopo ogni deploy.
P-04 Sheets mappingMode: defineBelow autoMapInputData fallisce runtime se i nomi colonna dello sheet non coincidono esattamente con le chiavi dell’input JSON. Sempre defineBelow + mapping esplicito chiave→espressione per ogni campo in append / insert.
P-05 HTTP body: specifyBody: “string” “json” con expressions dentro → parse failure silenzioso a runtime su payload dinamici. Sempre specifyBody: “string” per payload costruiti con espressioni n8n.
P-06 Mai Merge downstream di If Merge aspetta entrambi i branch. If ne esegue sempre uno solo → deadlock garantito, workflow stalla. Route diretti verso il nodo successivo. Se serve aggregazione: Merge in Append mode.
P-07 validate_workflow come unico deploy gate API n8n restituisce 200 anche su workflow corrotti. update_workflow via MCP: HTTP response inaffidabile. Sequenza: validate → valid:trueget_workflow_details (verifica struttura) → publish_workflow.
P-08 Sheets read: returnAllMatches readAllRows deprecato in n8n v4+ — fallisce silenziosamente su dataset grandi. operation: ‘read’ + options.returnAllMatches: true
P-09 Strip backtick fences su ogni output LLM Anche con system prompt che vieta il markdown, Haiku e Sonnet wrappano output strutturato in fences intermittentemente. Funzione safeParse(raw) in ogni Code node che consuma output LLM. No eccezioni.

Routing modelli Anthropic

ModelloString esatta (n8n / API diretta)Use case
Haiku 4.5 claude-haiku-4-5-20251001 Bulk ops, RSS parsing, classificazione, ACK rapidi — costo minimo
Sonnet 4.6 claude-sonnet-4-6-20251001 Build / fix workflow, reasoning multi-step, brief generation
Opus 4.6 claude-opus-4-6-20251001 Architettura, analisi critica, quality gate complessi

⚠ Mai usare claude-3-haiku, claude-3-sonnet o qualsiasi stringa claude-3-* — legacy, non disponibili sullo stack corrente.

Integrazioni live

IntegrazioneAuthUso operativo
Google Sheets Service Account OAuth2 Brief_Log, Publish_Log, Offset_Tracker, CRM_State — state e log persistenti
Telegram Bot token — @Mimirlab_Bot Output operativi real-time, ACK, brief delivery, comandi
Anthropic API HTTP Header auth (API key) LLM diretta via HTTP Request node — nessun wrapper generico
LinkedIn OAuth2 (company + personal) Company EN 112515148 / Personal IT 0etrgkpbX9 — credenziali via UI obbligatoria
AbaNinja REST API (in build) Registrazione fatture automatica, gestione ricevute spese, sync contabile
Google Drive Service Account Archivio ricevute e fatture per categoria / anno

Deploy flow

1. Scrivi SDK TypeScript (mimir_v4.ts / mimir_v5.ts)
   — mai export JSON n8n grezzo: possono contenere credential espansi (AUTH-05)

2. validate_workflow  →  valid:true   ← gate OBBLIGATORIO, non saltare
3. get_workflow_details               ← verifica struttura post-update
   — update_workflow via MCP può restituire HTTP 200 su aggiornamento fallito

4. publish_workflow                   ← solo se valid:true confermato

5. Credenziali LinkedIn / Google OAuth: assegnare via UI dopo deploy
   — newCredential() via MCP crea credential in global space, non nel project
   — risultato: "credentials not shared with workflow" a runtime
05

Casi reali

In produzione · Content Automation

Brief Pipeline — content automation AI

Pipeline autonoma: 10 feed RSS in parallelo (n8n Blog, VentureBeat AI, NYT AI, Google Research, DeepMind, OpenAI, MIT Tech Review, HN Anthropic…) → XML parsing custom con finestra 7 giorni → Claude Haiku per generazione post EN+IT → Google Sheets log (Brief_Log con campi Date, POST_EN, POST_IT, Status, Input_Tokens, Output_Tokens) → Telegram delivery → publish LinkedIn company EN + personal IT. ~45 secondi end-to-end. Cron automatico alle 08:00 Europe/Zurich.

Brief v2 in design: relevance classifier pre-LLM (Haiku, score ≥0.7), Jina AI per full-text scraping degli articoli rilevanti invece dei soli RSS snippet, quality gate anti-allucinazione (confronto claim generati vs fonti usate prima del publish), dedup URL via Sheets. Source intelligence derivata dal mining su 2 478 workflow — reference: template n8n #4708 (rss-monitor-distribute) e #4624 (quality-gate-validation).

n8n Cloud Anthropic Haiku Google Sheets Telegram LinkedIn Produzione
In build · TASK 002 · Contabilità automatizzata

Contabilità n8n-first + AbaNinja

Stack contabile completamente automatizzato: scan ricevuta spesa → archivia in Google Drive per categoria (spese/utenze/software/professionali) → genera fattura HTML via template Jinja2 → webhook AbaNinja REST per registrazione automatica nel gestionale. Google Sheets come dashboard real-time.

Architettura decisionale: AbaNinja come single source of truth contabile (gestito da commercialista), n8n come orchestratore, Sheets come monitoring operativo. Script Python: archivia_ricevuta.py, genera_fattura.py, report_mensile.py. Template fattura HTML con Jinja2 — config via JSON secret non committato (.secrets/contabilita_config.json).

n8n Cloud AbaNinja REST Google Drive Python / Jinja2 In build
Completato · Knowledge Mining

mimir-knowledge — pattern library da 2 478 workflow

Download completo di 2 478 workflow pubblici dal template repository n8n → pipeline Lavoisier di classificazione → 194 workflow experience_class=‘transform’ → clustering multi-label su pattern_tags + integrations + triggers → 33 cluster identificati, 9 HIGH-Mimir con alignment diretto ai casi d’uso interni.

Cluster HIGH-Mimir per dimensione: agent-with-tools (36), rag-foundation (31), content-generation-ai (15), content-multichannel-publish (15), email-classifier-router (14), agent-long-term-memory (11), rss-monitor-distribute (8), rag-living-data (7), lead-enrichment (7). Output: SQLite knowledge.db + digest MD per Brief v2 intelligence.

2 478 workflow analizzati 33 cluster Pattern mining SQLite Completato
06

Come possiamo lavorare insieme

Non gestiamo sub-fornitura come un service provider generico. L’idea è una collaborazione tecnica tra pari: tu hai i clienti e la relazione; noi abbiamo l’execution n8n/AI e il know-how operativo già mappato.

Come funziona in pratica

  1. Tu mandi la spec
    Un caso, un brief, anche a voce. Ti facciamo le domande giuste — niente onboarding lungo.
    ~30 min
  2. Costruiamo e validiamo
    Workflow su n8n, validate gate obbligatorio, run di test reale. Lo vedi girare prima di approvare.
    giorni, non settimane
  3. Review tua
    Lo ispezioni, lo importi sulla tua istanza, lo testi. Modifiche additive finché non è come lo vuoi.
    al tuo ritmo
  4. Deploy + manutenzione
    Va in produzione. Restiamo agganciati per fix e iterazioni — o te lo gestisci tu, il codice è tuo.
    continuativo

Le domande scomode (continuità, capacity, codice)

Siamo un lab piccolo, lo diciamo chiaro. Per questo: niente lock-in. I workflow e il codice che costruiamo per i tuoi clienti sono tuoi — esportabili e importabili sulla tua istanza n8n in autonomia, anche se domani sparissimo.

Capacity: scope concordati con finestre di consegna realistiche. Ti diciamo no quando siamo pieni, invece di accumulare ritardi sul tuo cliente.

Documentazione: ogni consegna lascia walkthrough + workflow.json (come quello del caso flotta, già nella cartella condivisa). Resti operativo anche senza di noi.

Primo passo concreto
Un tuo workflow, costruito come prova
Smetti di leggere e mettici alla prova: scegli un caso reale di un tuo cliente. Lo costruiamo, validato ed eseguito — come i due qui sopra. A prova vista, definiamo insieme i termini: i numeri vengono solo dopo, sul concreto.

Intanto, se vuoi toccare con mano: il workflow.json del caso flotta è già nella cartella condivisa — importalo sulla tua istanza n8n e fallo girare tu.