Il problema

Gestire contenuti su LinkedIn, Instagram e Facebook manualmente richiede circa 45 minuti al giorno. Moltiplicato per 6 giorni lavorativi, significa quasi 4,5 ore a settimana spese su copia-incolla, ricerca hashtag e adattamento del tono per ogni piattaforma. Senza contare che ogni piattaforma ha le sue preferenze: LinkedIn vuole bullet point e tono professionale, Instagram emoji e CTA, Facebook un approccio conversazionale senza hashtag.

La soluzione era ovvia. L'implementazione no.

L'architettura in 6 nodi

Il workflow gira su n8n self-hosted su un Raspberry Pi e segue questo schema:

NodoCosa fa
Trigger cronSi attiva ogni giorno lun–sab alle 09:00
Code (fs)Legge fs.readFileSync e cerca il file con data odierna in /home/node/.n8n/contenuti/
IFSe il file esiste → continua; altrimenti → notifica errore su Telegram
Groq APILlama 3.3 70B con response_format: json_object → produce 3 versioni ottimizzate
HTTP Request ×3Pubblica su Graph API (IG), Graph API (FB page feed), LinkedIn UGC Posts API
TelegramNotifica di conferma con preview del testo pubblicato

Una nota su n8n 2.x: il nodo executeCommand non è più disponibile. Per leggere file dal filesystem bisogna usare il nodo Code con require('fs'). È una differenza importante rispetto alle guide più datate che trovi online.

Un solo prompt, tre testi diversi

La parte più interessante dell'architettura è come Groq genera il contenuto. Invece di fare tre chiamate API separate, uso response_format: json_object con un unico prompt che produce direttamente un oggetto con tre chiavi:

  • LinkedIn: tono professionale, bullet point, hashtag tecnici, massimo 1300 caratteri
  • Instagram: testo coinvolgente, emoji moderate, hashtag in fondo, CTA, massimo 2200 caratteri
  • Facebook: conversazionale, breve, invito ai commenti, senza hashtag

Una sola chiamata API, tre versioni ottimizzate per ogni algoritmo. Il costo per post con Groq (llama-3.3-70b-versatile) è praticamente zero nel tier gratuito.

I 3 problemi che nessuna guida ti dice

Questa è la parte che vale il tempo di lettura.

1. Il token Meta non è il page token. L'API di Instagram e Facebook richiede token diversi a seconda di cosa vuoi fare. Il user token non basta per postare su una Facebook Page. Serve derivare il page access token dinamicamente chiamando /me/accounts ad ogni esecuzione e usando il token della pagina specifica. Ho perso due ore su questo prima di capirlo.

2. instagram_content_publish non è incluso di default. Anche con un token long-lived generato correttamente, se non abiliti esplicitamente questo scope nell'app Meta, Instagram restituisce errore 10: "Application does not have permission for this action". Il fix è: abilitare il permesso nelle impostazioni dell'app Meta Developer, rigenerare il token, estenderlo con fb_exchange_token per portarlo a 60 giorni.

3. Il JSON si rompe se il testo ha virgolette. Questo è stato il bug più subdolo. Telegram riceveva un body malformato ogni volta che Groq restituiva testo contenente virgolette doppie, backslash o newline. La notifica arrivava, ma con il testo troncato o corrotto. Il fix: nel nodo Code, sanitizzo il testo con un replace che rimuove \r\n"\\ prima di usarlo come previewText.

La parte tecnica si risolve in un sabato. La parte che richiede tempo è quella creativa: scrivere contenuti buoni. L'automazione non sostituisce la strategia — la libera per lavorarci.

Come aggiungo un contenuto

Il flusso operativo è volutamente semplice:

  1. Scrivo un file .md in contenuti/linkedin/YYYYMMDD_titolo.md con la bozza del post
  2. Eseguo python publish.py YYYYMMDD linkedin che lo copia sul Pi come YYYYMMDD_contenuto.md
  3. n8n lo legge automaticamente alle 09:00 e pubblica su tutte e tre le piattaforme

La naming convention è importante: il workflow cerca il file il cui nome inizia con la data odierna in formato YYYYMMDD. Se non trova nulla, notifica su Telegram tramite un bot secondario.

Costo reale

Questo è uno dei vantaggi più concreti del self-hosting:

  • n8n su Raspberry Pi: 0 €/mese
  • Groq API (llama-3.3-70b): gratuito nei limiti attuali, poi ~0.001 €/post
  • Token Meta e LinkedIn: gratuiti (scadono ogni 60 giorni, rinnovo semi-automatico)
  • Telegram bot: gratuito

Costo per post: essenzialmente zero. Costo in tempo dopo il setup iniziale: zero.

Cosa aggiungerei

Il sistema funziona, ma ci sono tre evoluzioni naturali che prima o poi implementerò. Immagini generate con AI per Instagram (al momento uso un'immagine statica da URL). Scheduling differenziato per piattaforma: LinkedIn performa meglio la mattina presto, Instagram la sera. Un analytics loop che modifica automaticamente il prompt Groq in base alle performance dei post precedenti.

Il terzo punto è il più interessante — e il più ambizioso. Ma questo lo racconto in un prossimo articolo.