Crea il tuo primo workflow n8n: webhooks, chiamate API e notifiche
Costruisci due workflow n8n reali da zero sulla tua istanza self-hosted. Un webhook che recupera dati meteo e li invia su Discord, e un monitor RSS che pubblica nuovi articoli in un canale.
Hai n8n in esecuzione sul tuo VPS. E adesso?
In questo tutorial costruirai due workflow reali. Non esempi giocattolo che rimandano dati nel nulla. Queste sono automazioni che manterrai in funzione:
- Webhook meteo: ricevere una richiesta HTTP, chiamare l'API meteo di wttr.in, formattare la risposta e inviarla a un canale Discord.
- Monitor RSS: controllare un feed RSS di un blog a intervalli regolari e pubblicare i nuovi articoli su Discord.
Entrambi i workflow coprono i concetti fondamentali di n8n durante la costruzione: nodi (nodes), connessioni (connections), espressioni (expressions), il sistema draft/publish di n8n 2.0 e la gestione degli errori.
Prerequisiti:
- Un'istanza n8n funzionante sul tuo VPS. Se non ne hai ancora una, segui prima Installare n8n con Docker Compose su un VPS.
- Un server Discord dove puoi creare un webhook (o un workspace Slack. Le istruzioni sono intercambiabili; qui usiamo Discord).
- Dimestichezza di base con il terminale e
curl.
Cosa sono i nodi e le connessioni in n8n?
I nodi sono i singoli passaggi di un workflow. Ogni nodo fa una cosa sola: ricevere un trigger, fare una richiesta HTTP, trasformare dati o inviare un messaggio. Le connessioni sono le linee tra i nodi. Passano i dati dall'output di un nodo all'input del successivo. Ogni workflow è una catena di nodi collegati da sinistra a destra.
I tipi di nodo usati in questo tutorial:
| Nodo | Scopo |
|---|---|
| Webhook | Ascolta le richieste HTTP in arrivo e avvia il workflow |
| HTTP Request | Chiama un'API esterna e restituisce la risposta |
| Set | Crea o ristruttura campi dati |
| If | Dirama il workflow in base a una condizione |
| Discord | Invia un messaggio a un canale Discord tramite webhook |
| RSS Feed Trigger | Interroga un feed RSS e si attiva quando compaiono nuovi elementi |
| Error Trigger | Cattura i fallimenti del workflow e avvia un workflow di notifica |
Come costruisci il tuo primo workflow n8n?
Apri la tua istanza n8n nel browser. Clicca su Add workflow nella pagina Workflows. n8n ti presenta un canvas vuoto con un placeholder del nodo trigger.
Questo primo workflow fa quanto segue: ricevere il nome di una città tramite un webhook HTTP, recuperare il meteo attuale da wttr.in, formattare il risultato e pubblicarlo in un canale Discord.
Passaggio 1: Creare un webhook Discord
Prima di costruire in n8n, ti serve un posto dove inviare le notifiche.
- Apri il tuo server Discord. Fai clic destro sul canale dove vuoi ricevere gli aggiornamenti meteo.
- Seleziona Modifica canale > Integrazioni > Webhooks.
- Clicca su Nuovo webhook. Dagli un nome come
n8n Weather Bot. - Clicca su Copia URL webhook. Salva questo URL. Ha un aspetto simile a:
https://discord.com/api/webhooks/123456789/abcDEF...
Tratta questo URL come una password. Chiunque lo possieda può pubblicare nel tuo canale.
Passaggio 2: Aggiungere il nodo trigger Webhook
Clicca sul pulsante + sul placeholder del canvas. Cerca Webhook e selezionalo.
Configura il webhook:
- HTTP Method: POST
- Path:
weather
Lascia tutto il resto ai valori predefiniti. Il path rende unico il tuo URL webhook. Con il path impostato su weather, i tuoi URL webhook saranno:
- URL di test:
https://tuo-dominio-n8n.com/webhook-test/weather - URL di produzione:
https://tuo-dominio-n8n.com/webhook/weather
Nota la differenza: /webhook-test/ vs /webhook/. Questa distinzione conta. Approfondiremo tra poco.
Passaggio 3: Testare il webhook con curl
Clicca su Listen for test event nel nodo webhook. n8n ora attende una richiesta in arrivo sull'URL di test.
Apri un terminale sulla tua macchina locale e invia una richiesta di test:
curl -X POST https://your-n8n-domain.com/webhook-test/weather \
-H "Content-Type: application/json" \
-d '{"city": "Paris"}'
Torna su n8n. Il nodo webhook dovrebbe mostrare un segno di spunta verde con i dati ricevuti. Vedrai il body JSON con city: "Paris" nel pannello di output.
Se non succede nulla, verifica che:
- La tua istanza n8n sia raggiungibile da internet (il reverse proxy è configurato).
- Hai cliccato Listen for test event prima di inviare la richiesta curl.
- L'URL corrisponda esattamente, incluso il prefisso
/webhook-test/.
Passaggio 4: Aggiungere il nodo HTTP Request (chiamare l'API meteo)
Clicca sul pulsante + a destra del nodo Webhook. Cerca HTTP Request e aggiungilo.
Configuralo:
- Method: GET
- URL:
https://wttr.in/{{ $json.city }}?format=j1
La parte {{ $json.city }} è un'espressione n8n (expression). Estrae il campo city dai dati del webhook in arrivo. Quando qualcuno invia {"city": "Paris"}, n8n sostituisce l'espressione con Paris, producendo l'URL finale https://wttr.in/Paris?format=j1.
Il parametro ?format=j1 dice a wttr.in di restituire JSON strutturato invece del report meteo in arte ASCII.
Clicca su Test step per eseguire solo questo nodo. Dovresti vedere una risposta JSON con dati meteo che includono campi come current_condition, temp_C, weatherDesc e altri.
Occhio attento: guarda il pannello di output. La risposta è annidata. La temperatura attuale si trova in $json.current_condition[0].temp_C e la descrizione in $json.current_condition[0].weatherDesc[0].value. Ti serviranno questi percorsi nel passaggio successivo.
Passaggio 5: Aggiungere un nodo Set per formattare il messaggio
La risposta grezza dell'API meteo è voluminosa. Ti servono solo pochi campi per il messaggio Discord.
Aggiungi un nodo Set dopo il nodo HTTP Request. Clicca su Add field e crea questa assegnazione:
| Nome campo | Tipo | Valore (espressione) |
|---|---|---|
message |
String | Weather in {{ $('Webhook').item.json.city }}: {{ $json.current_condition[0].temp_C }}°C, {{ $json.current_condition[0].weatherDesc[0].value }}. Humidity: {{ $json.current_condition[0].humidity }}%. Wind: {{ $json.current_condition[0].windspeedKmph }} km/h. |
L'espressione {{ $('Webhook').item.json.city }} risale all'output del nodo Webhook per ottenere il nome della città. I riferimenti $json senza nome del nodo prendono i dati dal nodo immediatamente precedente (HTTP Request).
Clicca su Test step. L'output dovrebbe mostrare un singolo campo message con qualcosa come:
Weather in Paris: 14°C, Partly cloudy. Humidity: 72%. Wind: 15 km/h.
Passaggio 6: Aggiungere il nodo Discord
Aggiungi un nodo Discord dopo il nodo Set.
- Imposta Connection Type su Webhook.
- Sotto Credential for Discord, clicca su Create New Credential.
- Incolla il tuo URL webhook Discord dal passaggio 1 nel campo Webhook URL. Clicca su Save.
- Imposta Operation su Send a Message.
- Nel campo Message, usa l'espressione:
{{ $json.message }}
Clicca su Test step. Controlla il tuo canale Discord. Dovresti vedere il messaggio meteo pubblicato dal tuo bot.
Verifica: apri Discord. Il messaggio dovrebbe apparire nel canale per cui hai configurato il webhook. Se non c'è, ricontrolla l'URL webhook nelle impostazioni del credential.
Passaggio 7: Testare il workflow completo
Torna al nodo Webhook. Clicca di nuovo su Listen for test event. Invia un'altra richiesta curl:
curl -X POST https://your-n8n-domain.com/webhook-test/weather \
-H "Content-Type: application/json" \
-d '{"city": "Tokyo"}'
Osserva l'esecuzione attraversare tutti e quattro i nodi. Ogni nodo diventa verde quando completa. Un bollettino meteo per Tokyo dovrebbe apparire nel tuo canale Discord.
Controlla la scheda Executions nella barra laterale sinistra. Vedrai una voce di log per questa esecuzione di test con timing, stato e dati di ogni nodo. Questo log di esecuzione è dove fai il debug dei problemi.
Come riceve dati esterni il nodo webhook di n8n?
Il nodo Webhook crea un endpoint HTTP sulla tua istanza n8n. Quando un servizio esterno (o un comando curl) invia una richiesta a quell'endpoint, n8n riceve i dati e avvia il workflow. Il nodo supporta i metodi GET, POST, PUT, PATCH, DELETE e HEAD. POST con body JSON è il pattern più comune.
Come testi un webhook n8n con curl?
Lo hai già fatto sopra. Ecco cosa conta:
| URL di test | URL di produzione | |
|---|---|---|
| Formato percorso | /webhook-test/<path> |
/webhook/<path> |
| Quando attivo | Solo mentre hai "Listen for test event" o "Execute workflow" aperto nell'editor | Solo dopo aver pubblicato il workflow |
| Mostra dati nell'editor | Sì, in diretta nel pannello di output del nodo | No (controlla la scheda Executions) |
| Caso d'uso | Costruzione e debug | Integrazioni esterne reali |
Durante lo sviluppo, usa sempre l'URL di test. Ti permette di vedere i dati fluire attraverso ogni nodo in tempo reale. L'URL di produzione funziona solo dopo la pubblicazione del workflow.
Qual è la differenza tra workflow in bozza e pubblicati in n8n 2.0?
n8n 2.0 ha separato il salvataggio dall'attivazione. Le tue modifiche restano in bozza e non influenzano la versione live finché non pubblichi esplicitamente. Da n8n 2.4 (gennaio 2026), l'editor salva automaticamente il tuo lavoro ogni pochi secondi. Non c'è più un pulsante Save manuale.
Ecco la sequenza:
- Costruisci e testi il tuo workflow usando l'URL di test. n8n salva automaticamente mentre lavori.
- Le tue modifiche esistono solo in bozza. La versione live (se presente) continua a funzionare invariata.
- Clicchi su Publish. Ora l'URL di produzione è attivo e il workflow si avvia automaticamente quando viene attivato.
- Se modifichi il workflow in seguito, le tue modifiche restano in bozza finché non pubblichi di nuovo.
In n8n 1.x, salvare e attivare erano la stessa azione. Non lo sono più.
Pubblica il tuo workflow meteo adesso. Clicca sul pulsante Publish in alto a destra (o premi Shift+P). Lo stato del workflow cambia in "Active".
Verifica con curl usando l'URL di produzione questa volta:
curl -X POST https://your-n8n-domain.com/webhook/weather \
-H "Content-Type: application/json" \
-d '{"city": "Berlin"}'
Controlla Discord. Il bollettino meteo di Berlino dovrebbe apparire. Poi controlla la scheda Executions in n8n per vedere l'esecuzione di produzione registrata.
Come gestisci gli errori in un workflow n8n?
Il nodo Error Trigger cattura i fallimenti del workflow e avvia un workflow di notifica separato. Quando un workflow attivo fallisce (per esempio, l'API meteo è giù o Discord rifiuta il messaggio), n8n attiva l'Error Trigger nel workflow di errore collegato. Questo funziona solo per le esecuzioni pubblicate e attivate automaticamente. Le esecuzioni di test manuali non lo attivano.
Costruire un workflow di notifica errori
- Torna alla pagina Workflows. Clicca su Add workflow. Chiamalo
Error Handler. - Aggiungi un nodo Error Trigger come trigger. Questo nodo riceve automaticamente i dati di errore quando un workflow collegato fallisce.
- Aggiungi un nodo Discord dopo l'Error Trigger.
- Configuralo con lo stesso credential webhook Discord creato in precedenza.
- Imposta il messaggio su:
⚠️ Workflow failed: {{ $json.workflow.name }}
Error: {{ $json.execution.error.message }}
Execution ID: {{ $json.execution.id }}
- Il workflow di errore si attiva automaticamente perché contiene un nodo Error Trigger. Non serve pubblicarlo separatamente.
Collegare il workflow di errore al tuo workflow meteo
- Apri il tuo workflow Weather Webhook.
- Clicca sul menu tre punti (⋮) in alto a destra, poi su Settings.
- Sotto Error Workflow, seleziona il workflow
Error Handlerappena creato. - Clicca su Publish per applicare la modifica.
Ora se l'API meteo va in down o qualsiasi nodo del tuo workflow genera un errore durante un'esecuzione di produzione, riceverai una notifica Discord con il nome del workflow, il messaggio di errore e l'ID di esecuzione. Puoi usare quell'ID per trovare l'esecuzione fallita nella scheda Executions e ispezionare esattamente cosa è andato storto.
Questo è un pattern da riutilizzare in ogni workflow che costruisci. Crea un solo workflow Error Handler, poi collega tutti gli altri workflow ad esso.
Riferimento rapido delle espressioni n8n
Le espressioni permettono di fare riferimento a dati dei nodi precedenti. Si trovano tra doppie parentesi graffe {{ }} e sono disponibili nella maggior parte dei campi dei nodi.
| Espressione | Cosa fa |
|---|---|
{{ $json.fieldName }} |
Accede a un campo dell'output del nodo precedente |
{{ $json.nested.field }} |
Accede a proprietà JSON annidate |
{{ $('NodeName').item.json.field }} |
Accede all'output di un nodo specifico per nome |
{{ $json.current_condition[0].temp_C }} |
Accede a un elemento di array |
{{ $now.toFormat('yyyy-MM-dd') }} |
Data attuale formattata con Luxon |
{{ $now.toFormat('HH:mm') }} |
Ora attuale (formato 24h) |
{{ $if($json.score > 80, "high", "low") }} |
Espressione condizionale |
{{ $json['field with spaces'] }} |
Notazione con parentesi quadre per caratteri speciali |
n8n usa Luxon per la gestione delle date. Se devi formattare date da risposte API, i metodi Luxon sono disponibili su qualsiasi oggetto DateTime.
Come costruisci un workflow monitor RSS in n8n?
Ora costruisci un secondo workflow che funziona a orario invece che con un webhook. Questo monitora un feed RSS e pubblica i nuovi articoli su Discord.
Passaggio 1: Creare il workflow
Clicca su Add workflow nella pagina Workflows. Chiamalo RSS to Discord.
Passaggio 2: Aggiungere l'RSS Feed Trigger
Clicca sul placeholder del trigger e cerca RSS Feed Trigger. Aggiungilo.
Configuralo:
- Feed URL: Usa un qualsiasi feed RSS di un blog. Per esempio:
https://blog.n8n.io/rss/(il blog di n8n). - Poll Times: Imposta su Every X > Value:
30> Unit: Minutes.
Questo controlla il feed ogni 30 minuti cercando nuovi elementi. L'RSS Feed Trigger ricorda quali elementi ha già visto. Alla prima esecuzione, restituisce tutti gli elementi attuali. Dopo, solo quelli nuovi.
Clicca su Fetch Test Event per recuperare gli elementi attuali del feed. Dovresti vedere voci con campi come title, link, contentSnippet, isoDate e creator.
Passaggio 3: Aggiungere un nodo Set per formattare il messaggio
Aggiungi un nodo Set. Crea un campo:
| Nome campo | Tipo | Valore (espressione) |
|---|---|---|
message |
String | 📰 New post: **{{ $json.title }}**\n{{ $json.link }}\nPublished: {{ $json.isoDate }} |
Il \n inserisce interruzioni di riga nel messaggio Discord. I ** intorno al titolo lo rendono grassetto nel Markdown di Discord.
Passaggio 4: Aggiungere il nodo Discord
Aggiungi un nodo Discord. Usa lo stesso credential webhook. Imposta il messaggio su {{ $json.message }}.
Clicca su Test step. Una notifica formattata del post del blog dovrebbe apparire nel tuo canale Discord.
Passaggio 5: Pubblicare il workflow
Clicca su Publish. L'RSS Feed Trigger ora controllerà il feed ogni 30 minuti e pubblicherà i nuovi elementi su Discord.
Collega l'Error Handler: apri le impostazioni del workflow e imposta l'Error Workflow sul tuo workflow Error Handler. Pubblica di nuovo per applicare la modifica.
Verifica: controlla la scheda Executions dopo 30 minuti (o cambia temporaneamente l'intervallo di polling a 1 minuto). Dovresti vedere un'esecuzione registrata, anche se non c'erano nuovi elementi (il workflow si esegue ma non produce output se non c'è nulla di nuovo).
Come esporti e importi workflow n8n?
Esporta i tuoi workflow come JSON per fare backup, condividerli o spostarli tra istanze n8n.
Esportare un workflow
- Apri il workflow che vuoi esportare.
- Clicca sul menu tre punti (⋮) > Download.
- n8n salva un file
.jsonsul tuo computer.
Puoi anche esportare dalla riga di comando se hai accesso shell al container n8n:
docker exec n8n n8n export:workflow --id=<workflow-id> --output=/tmp/workflow.json
Importare un workflow
- Nella pagina Workflows, clicca sul menu tre punti > Import from file.
- Seleziona il tuo file
.json. - n8n importa il workflow come bozza. Controllalo, aggiorna i credentials, poi pubblica.
Nota: i workflow esportati non includono credentials. Dovrai aggiungerli di nuovo dopo l'importazione su una nuova istanza.
Risoluzione dei problemi
Il webhook restituisce 404: L'URL di test è attivo solo mentre hai "Listen for test event" aperto nell'editor. L'URL di produzione è attivo solo dopo la pubblicazione del workflow. Assicurati di usare l'URL giusto per la modalità giusta.
Il messaggio Discord non appare: Verifica l'URL webhook nel tuo credential Discord. Testalo direttamente con curl:
curl -X POST "https://discord.com/api/webhooks/YOUR/WEBHOOK_URL" \
-H "Content-Type: application/json" \
-d '{"content": "Test message from curl"}'
Se questo funziona ma n8n no, il problema è nella configurazione del tuo nodo Discord in n8n.
L'espressione restituisce undefined:
Apri l'editor delle espressioni (clicca sul campo, poi sul toggle espressione). n8n mostra i dati disponibili dai nodi precedenti. Verifica il percorso esatto del campo. Errore comune: usare $json.field quando i dati sono annidati in $json.data.field.
L'RSS Feed Trigger si attiva per tutti gli elementi alla prima esecuzione: È il comportamento previsto. Alla prima esecuzione dopo la pubblicazione, il trigger restituisce tutti gli elementi attuali del feed perché non ha uno storico di ciò che ha già elaborato. Le esecuzioni successive restituiscono solo i nuovi elementi.
Il workflow di errore non si attiva: I workflow di errore si attivano solo su workflow pubblicati ed eseguiti automaticamente. Le esecuzioni di test manuali non li attivano. Verifica che il workflow di errore sia collegato nelle impostazioni del workflow principale.
Controlla i log: Se qualcosa non funziona a livello dell'applicazione n8n, controlla i log del container:
docker logs n8n --tail 50
Per il monitoraggio continuo:
docker logs n8n -f
Prossimi passi
Due workflow funzionanti e un gestore degli errori. Da qui:
- Proteggi i tuoi endpoint webhook con header di autenticazione.
- Aggiungi elaborazione AI ai tuoi workflow con Ollama o Claude.
- Esplora la guida completa per il hardening in produzione.
- Impara i fondamenti di Docker Compose per gestire stack multi-servizio. Vedi Docker Compose per deployment VPS multi-servizio.
Copyright 2026 Virtua.Cloud. Tutti i diritti riservati. Questo contenuto è un'opera originale del team Virtua.Cloud. La riproduzione, ripubblicazione o redistribuzione senza autorizzazione scritta è vietata.
Pronto a provare?
Distribuisci il tuo server in pochi secondi. Linux, Windows o FreeBSD.
Vedi piani VPS