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:
| Nodo | Cosa fa |
|---|---|
| Trigger cron | Si 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/ |
| IF | Se il file esiste → continua; altrimenti → notifica errore su Telegram |
| Groq API | Llama 3.3 70B con response_format: json_object → produce 3 versioni ottimizzate |
| HTTP Request ×3 | Pubblica su Graph API (IG), Graph API (FB page feed), LinkedIn UGC Posts API |
| Telegram | Notifica 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:
- Scrivo un file
.mdincontenuti/linkedin/YYYYMMDD_titolo.mdcon la bozza del post - Eseguo
python publish.py YYYYMMDD linkedinche lo copia sul Pi comeYYYYMMDD_contenuto.md - 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.