El problema
Gestionar contenido en LinkedIn, Instagram y Facebook manualmente requiere unos 45 minutos al día. Multiplicado por 6 días laborables, son casi 4,5 horas a la semana dedicadas a copiar y pegar, buscar hashtags y adaptar el tono para cada plataforma. Sin contar que cada plataforma tiene sus preferencias: LinkedIn quiere viñetas y tono profesional, Instagram emojis y CTA, Facebook un enfoque conversacional sin hashtags.
La solución era obvia. La implementación no.
La arquitectura en 6 nodos
El workflow funciona sobre n8n autoalojado en una Raspberry Pi y sigue este esquema:
| Nodo | Qué hace |
|---|---|
| Trigger cron | Se activa cada día de lunes a sábado a las 09:00 |
| Code (fs) | Lee con fs.readFileSync y busca el archivo con la fecha de hoy en /home/node/.n8n/contenuti/ |
| IF | Si el archivo existe → continúa; si no → notificación de error en Telegram |
| Groq API | Llama 3.3 70B con response_format: json_object → produce 3 versiones optimizadas |
| HTTP Request ×3 | Publica en Graph API (IG), Graph API (feed de la página FB), LinkedIn UGC Posts API |
| Telegram | Notificación de confirmación con vista previa del texto publicado |
Una nota sobre n8n 2.x: el nodo executeCommand ya no está disponible. Para leer archivos del sistema de archivos hay que usar el nodo Code con require('fs'). Es una diferencia importante respecto a las guías más antiguas que encuentras en internet.
Un solo prompt, tres textos distintos
La parte más interesante de la arquitectura es cómo Groq genera el contenido. En lugar de hacer tres llamadas API separadas, uso response_format: json_object con un único prompt que produce directamente un objeto con tres claves:
- LinkedIn: tono profesional, viñetas, hashtags técnicos, máximo 1300 caracteres
- Instagram: texto atractivo, emojis moderados, hashtags al final, CTA, máximo 2200 caracteres
- Facebook: conversacional, breve, invita a comentar, sin hashtags
Una sola llamada API, tres versiones optimizadas para cada algoritmo. El coste por publicación con Groq (llama-3.3-70b-versatile) es prácticamente cero dentro del nivel gratuito actual.
Los 3 problemas que ninguna guía te cuenta
Esta es la parte que merece la lectura.
1. El token de Meta no es el token de la página. La API de Instagram y Facebook requiere tokens distintos según lo que quieras hacer. El token de usuario no basta para publicar en una página de Facebook. Hay que derivar el page access token dinámicamente llamando a /me/accounts en cada ejecución y usando el token de la página concreta. Perdí dos horas en esto antes de entenderlo.
2. instagram_content_publish no está incluido por defecto. Incluso con un token de larga duración generado correctamente, si no habilitas explícitamente este scope en la app de Meta, Instagram devuelve el error 10: «Application does not have permission for this action». La solución: habilitar el permiso en la configuración de la app de Meta Developer, regenerar el token, extenderlo con fb_exchange_token para llevarlo a 60 días.
3. El JSON se rompe si el texto tiene comillas. Este fue el bug más traicionero. Telegram recibía un body malformado cada vez que Groq devolvía texto con comillas dobles, barras invertidas o saltos de línea. La notificación llegaba, pero con el texto truncado o corrupto. La solución: en el nodo Code, saneo el texto con un replace que elimina \r\n"\\ antes de usarlo como previewText.
La parte técnica se resuelve en un sábado. La parte que requiere tiempo es la creativa: escribir buen contenido. La automatización no sustituye a la estrategia — la libera para trabajar en ella.
Cómo añado un contenido
El flujo operativo es deliberadamente sencillo:
- Escribo un archivo
.mdencontenuti/linkedin/YYYYMMDD_titulo.mdcon el borrador de la publicación - Ejecuto
python publish.py YYYYMMDD linkedinque lo copia a la Pi comoYYYYMMDD_contenuto.md - n8n lo lee automáticamente a las 09:00 y publica en las tres plataformas
La convención de nombres importa: el workflow busca el archivo cuyo nombre empieza con la fecha de hoy en formato YYYYMMDD. Si no encuentra nada, notifica por Telegram a través de un bot secundario.
Coste real
Esta es una de las ventajas más concretas del autoalojamiento:
- n8n en Raspberry Pi: 0 €/mes
- Groq API (llama-3.3-70b): gratis dentro de los límites actuales, luego ~0,001 €/publicación
- Tokens de Meta y LinkedIn: gratis (caducan cada 60 días, renovación semiautomática)
- Bot de Telegram: gratis
Coste por publicación: prácticamente cero. Coste en tiempo tras la configuración inicial: cero.
Qué añadiría
El sistema funciona, pero hay tres evoluciones naturales que tarde o temprano implementaré. Imágenes generadas con IA para Instagram (por ahora uso una imagen estática desde una URL). Programación diferenciada por plataforma: LinkedIn rinde mejor a primera hora de la mañana, Instagram por la tarde. Un bucle de analítica que modifica automáticamente el prompt de Groq según el rendimiento de las publicaciones anteriores.
El tercer punto es el más interesante — y el más ambicioso. Pero eso lo cuento en un próximo artículo.