Viral TikTok Video Machine
-
Resumen general
Este workflow convierte automáticamente una foto + idea que envías a un bot de Telegram en un vídeo tipo UGC “talking head” (labios sincronizados) usando VEED/FAL + ElevenLabs, genera el guion y el audio con IA, crea una caption optimizada para TikTok, lo registra en Google Sheets y lo publica en múltiples redes vía Blotato (TikTok, IG, YouTube, etc.).
El disparador es el nodo “Telegram Trigger”, que se activa cuando envías un mensaje (idealmente, una foto con un caption que describe el tema del vídeo).
El flujo: extrae la foto y el tema, investiga tendencias con Perplexity, genera guion con GPT-4, sintetiza la voz con ElevenLabs, monta el vídeo con FAL/VEED, crea la caption, guarda todo en Sheets, te devuelve el vídeo por Telegram y lo envía a Blotato para publicación multicanal, actualizando el estado a “DONE” en la hoja.
-
Mapa rápido de nodos
| Nodo | Tipo | Descripción corta |
|---|---|---|
| Telegram Trigger | Trigger (Telegram) | Dispara el workflow al recibir mensaje/foto en el bot. |
| Workflow Configuration | Set | Configuración estática: API keys, voz, modelo Perplexity, etc. |
| Extract Photo and Theme | Set | Extrae photoUrl (file_id) y el theme del caption/texto. |
| Get Photo File from Telegram | Telegram (file) | Descarga el fichero de la foto desde Telegram (binario). |
| Build Public Image URL | HTTP Request | Sube la foto a tmpfiles.org y obtiene una URL pública. |
| Search Trends with Perplexity | Perplexity (custom) | Busca 3 tendencias virales relacionadas con el tema. |
| Generate Script with GPT-4 | OpenAI (Chat) | Genera un guion corto (máx. ~30 s) basado en tendencias + tema. |
| ElevenLabs Voice Synthesis | HTTP Request | Convierte el guion en audio usando ElevenLabs (voz clonada). |
| Convert .mpga to .mp3 | Code | Duplica el binario de audio y lo normaliza a .mp3 + audio/mpeg. |
| Upload Audio to Public URL | HTTP Request | Sube el MP3 a tmpfiles.org y obtiene URL pública de audio. |
| FAL.ai Video Generation | HTTP Request | Envía imagen + audio a FAL/VEED para generar el vídeo talking-head. |
| Wait for VEED | Wait | Espera 10 min antes de consultar el resultado del vídeo. |
| Download VEED Video | HTTP Request | Consulta el estado del job en FAL y obtiene la URL del vídeo final. |
| Generate Caption with GPT-4 | OpenAI (Chat) | Crea una caption de TikTok con hashtags virales para el vídeo. |
| Save to Google Sheets | Google Sheets | Guarda IDEA, CAPTION, URL IMAGE/AUDIO/VIDEO en una fila nueva. |
| Send a video | Telegram | Envía el vídeo generado al chat de Telegram original. |
| Upload Video to BLOTATO | Blotato | Sube el vídeo a Blotato para su distribución multicanal. |
| Tiktok / Instagram / Youtube / etc. | Blotato | Publican el vídeo en distintas redes sociales. |
| Merge1 | Merge | Fusiona las salidas de los nodos Blotato para continuar el flujo. |
| Update Status to “DONE” | Google Sheets | Marca en la hoja que el vídeo ha sido publicado (STATUS = DONE). |
| Step 1–5 / How It Works | Sticky Note | Documentación visual del flujo (no afectan a la ejecución). |
-
Explicación nodo por nodo (detalle)
3.1. Disparador y configuración inicial
🧩 Telegram Trigger (n8n-nodes-base.telegramTrigger)
-
Qué hace
Es el nodo que dispara todo. Está configurado conupdates: ["message"], por lo que se activa cuando el bot recibe mensajes; en tu descripción se espera foto + caption. -
Datos que entrega
La estructura típica incluyemessage.photo(array con distintas resoluciones de la imagen),message.caption(texto de la foto),message.text(si no es foto) ymessage.chat.id(para responder luego). -
Conexiones
Su salida va a Workflow Configuration, que además de añadir la configuración mantiene todo el payload original del mensaje gracias aincludeOtherFields: true.
🧩 Workflow Configuration (Set)
-
Qué hace
Es un nodo Set usado como “config” central. Añade campos:-
elevenLabsApiKey:"YOUR_ELEVENLABS_API_KEY" -
elevenLabsVoiceId:"YOUR_VOICE_ID" -
falApiKey:"YOUR_FAL_API_KEY" -
scriptMaxDuration:30 -
perplexityModel:"sonar"
-
-
Por qué está así
-
Centraliza valores que se usan en varios nodos (Perplexity, ElevenLabs, FAL).
-
includeOtherFields: truehace que el JSON original (del trigger) siga disponible (ej.message.chat.id,message.photo, etc.).
-
-
Conexiones
Sale hacia Extract Photo and Theme. Todos los nodos que referencian$('Workflow Configuration')leen aquí sus “constantes”.
Mejora de seguridad: aquí estás guardando API keys en texto plano. En n8n es más seguro usar Credenciales y leerlas desde los nodos HTTP/IA en vez de un Set con claves visibles.
🧩 Extract Photo and Theme (Set)
-
Asignaciones principales
-
photoUrl-
Si
message.photoexiste, coge el último elemento del array (suele ser la foto en mayor resolución) y lee sufile_id. -
Si no hay foto, pone
''(cadena vacía).
-
-
theme-
Prioridad:
-
caption(texto de la foto). -
Si no, el texto del mensaje (
message.text). -
Si nada, fallback
"viral content".
-
-
-
-
includeOtherFields: true
Mantiene todo el JSON original (message, etc.) y sumaphotoUrlytheme. -
Conexiones
-
Sale a Get Photo File from Telegram (que usa
photoUrl). -
El nodo se consulta desde otros vía
$('Extract Photo and Theme')para recuperarthemeomessage.caption.
-
Riesgos / mejoras
Si no hay foto (
photoUrl == ''), el nodo de descarga de foto fallará: convendría añadir un nodo IF para controlar “¿hay foto?” y manejar el caso sin foto.Buen uso del fallback del
theme.
3.2. Obtención de imagen y URL pública
🧩 Get Photo File from Telegram (Telegram)
-
Parámetros clave
-
resource: "file" -
fileId: {{ $json.photoUrl }}
-
-
Qué hace
Usa elfile_idde Telegram para descargar el archivo físico (la imagen). El resultado es un item que tiene:-
binary.data→ el contenido binario de la imagen. -
Posiblemente metadatos:
fileName,mimeType, etc. -
jsonseguirá teniendo campos previos si vienen arrastrados.
-
-
Conexiones
Sale hacia:-
Build Public Image URL para subir la imagen a tmpfiles.org.
-
🧩 Build Public Image URL (HTTP Request)
-
Configuración
-
method: POST -
url: https://tmpfiles.org/api/v1/upload -
sendBody: true -
contentType: "multipart-form-data" -
bodyParameters:-
Un parámetro de tipo
formBinaryDatallamadofileque lee debinary.data.
-
-
-
Qué hace
Sube la imagen a tmpfiles.org como archivo multipart/form-data.
ConresponseFormat: "json", la respuesta será algo así como:Esa URL se usará luego para FAL.
-
Conexiones
-
Su salida alimenta Search Trends with Perplexity (aunque ese nodo no depende de la imagen, solo del caption).
-
También se usa más adelante en FAL.ai Video Generation vía
$('Build Public Image URL').first().json.data.url.
-
Detalle técnico n8n
El HTTP Request normalmente reemplaza el JSON de entrada por la respuesta. Como estás referenciando$('Extract Photo and Theme')en otros nodos, no te afecta aquí, pero es bueno saber que el JSON de este item ahora es el de tmpfiles.org.
3.3. Investigación de tendencias y generación de guion
🧩 Search Trends with Perplexity (n8n-nodes-base.perplexity)
-
Modelo
-
Prompt
-
Usa directamente el caption original (
message.caption), no el campotheme. -
Pide exactamente 3 resultados, con foco en TikTok.
-
-
Salida típica
Algo como: -
Conexiones
Conecta con Generate Script with GPT-4, que usachoices[0].message.contentcomo contexto de tendencias.
Mejora concreta
Si el usuario no manda caption pero sí texto (
message.text), aquí no se hace fallback. Yo cambiaría a usar$('Extract Photo and Theme').first().json.themepara no duplicar lógica y beneficiarte del fallback ya definido.
🧩 Generate Script with GPT-4 (@n8n/n8n-nodes-langchain.openAi)
-
Modelo
modelId: "gpt-4o-mini"(ligero, buena idea para latencia/coste). -
Prompt
-
Usa las tendencias generadas por Perplexity (nodo anterior).
-
Usa el
themeya procesado (caption/text/fallback). -
Da instrucciones claras de formato y duración.
-
-
Salida esperada
Este nodo devuelve un objeto tipo: -
Conexiones
Se conecta a ElevenLabs Voice Synthesis, que usarámessage.contentcomo texto a convertir a voz.
Mejora posible
Si quieres respetar el
scriptMaxDurationdel config, podrías interpolar ese valor en el prompt en vez de hardcodear “30 seconds”.
3.4. Síntesis de voz y normalización de audio
🧩 ElevenLabs Voice Synthesis (HTTP Request)
-
URL dinámica
Usa el
voiceIdconfigurado. -
Headers
-
xi-api-key: {{ elevenLabsApiKey }} -
Content-Type: application/json -
Accept: audio/mpeg→ pide un MP3/MPEG como respuesta.
-
-
Cuerpo JSON
-
text= contenido generado por GPT-4 (script). -
stability / similarity_boostafinan la naturalidad de voz.
-
-
Opciones de respuesta
Esto hace que n8n trate la respuesta como binario:
-
binary.audiocontendrá el fichero devuelto (normalmente.mp3o.mpga).
-
-
Conexiones
Va a Convert .mpga to .mp3.
Riesgo
Dependes de que la estructura de salida del nodo GPT-4 sea siempre
message.content. Si la versión del nodo cambia, podría romperse. Una alternativa es usar{{ $json.content }}si el nodo lo expone así, revisando la salida real en n8n.
🧩 Convert .mpga to .mp3 (Code)
Este nodo es un Code node (JavaScript). Código:
// clone bajo un nuevo nombre de propiedad
item.binary.audio_mp3 = {
…b,
fileName: (b.fileName || ‘audio.mp3’).replace(/\.mpga$/i, ‘.mp3’),
mimeType: ‘audio/mpeg’
};
// (opcional) mantener el original:
// delete item.binary.audio;
return item;
});
-
Línea por línea
-
return items.map(item => { ... })-
Procesa todos los items (n8n puede manejar múltiples en paralelo).
-
-
const b = item.binary?.audio;-
Usa optional chaining (
?.) para leeritem.binary.audiosi existe.
-
-
if (!b) return item;-
Si no hay binario
audio, no toca el item.
-
-
item.binary.audio_mp3 = { ... }-
Crea una nueva propiedad binaria llamada
audio_mp3. -
Usa
...bpara copiar todos los metadatos (data, fileName, mimeType, etc.). -
Cambia
fileName: toma el existente oaudio.mp3por defecto y reemplaza extensión.mpgapor.mp3con una expresión regular. -
Fija
mimeTypeenaudio/mpeg.
-
-
Comentado:
// delete item.binary.audio;-
Si lo activas, elimina el binario original y solo deja
audio_mp3.
-
-
Devuelve el item modificado.
-
-
Por qué es necesario
El nodo siguiente (Upload Audio to Public URL) espera el binario en la propiedadaudio_mp3. Además, te aseguras de tener un MIME y un nombre coherentes.
Mejoras del Code node
Podrías validar el tamaño del archivo (por límites de tmpfiles.org o FAL).
Si siempre recibes un
audio/mpegcorrecto de ElevenLabs, podrías saltarte este paso y renombrar solo en el upload.
🧩 Upload Audio to Public URL (HTTP Request)
-
Configuración
-
method: POST -
url: https://tmpfiles.org/api/v1/upload -
contentType: multipart-form-data -
Body: parámetro
fileformBinaryDataapuntando aaudio_mp3.
-
-
Qué hace
Sube el audio MP3 a tmpfiles.org, igual que hiciste con la imagen.
La respuesta JSON tendrádata.urlcon la URL pública del audio. -
Conexiones
Sale hacia FAL.ai Video Generation, que usará esa URL comoaudio_url.
3.5. Generación de vídeo con FAL / VEED
🧩 FAL.ai Video Generation (HTTP Request)
-
URL
https://queue.fal.run/veed/fabric-1.0(endpoint de cola de jobs de VEED/FAL). -
Headers
-
Authorization: {{ falApiKey }} -
Content-Type: application/json
-
-
Body JSON
-
image_url: coge la URL desde el nodo Build Public Image URL y la transforma de forma que:-
http://tmpfiles.org/ID/archivo→https://tmpfiles.org/dl/ID/archivo -
La parte
/dl/suele ser un endpoint de descarga directa, importante para FAL.
-
-
audio_url: usa la URL del audio actual ($json.data.url, la respuesta del nodo tmpfiles de audio) y aplica el mismo replace. -
resolution: "480p"reduce tamaño y peso del vídeo (bueno para velocidad/coste).
-
-
Salida esperada
Algo como:que identifica el job en la cola.
-
Conexiones
Se encadena a Wait for VEED.
Detalle interesante
Aquí mezclas datos de un nodo anterior ($('Build Public Image URL')) con el JSON actual ($json.data.url). Es una técnica muy típica en n8n: usar$()para “saltar” a otro nodo y no depender de si el JSON actual arrastra ese dato.
🧩 Wait for VEED (Wait)
-
Configuración
-
amount: 10 -
unit: "minutes"
-
-
Qué hace
Para la ejecución 10 minutos y luego reanuda. El item que entra sale igual, por lo que sigue teniendorequest_id. -
Conexiones
-
Va a Download VEED Video, que usará
request_idpara consultar el resultado.
-
Mejora importante
Un wait fijo de 10 minutos es simple pero poco eficiente:
Si el vídeo se genera en 1–2 minutos, estás “parado” 8–9 min.
Sería mejor un bucle de polling: cada X segundos/minutos haces un HTTP GET y un IF
status === "completed".
O, si FAL tiene webhooks, usar el modo “Wait for webhook” del Wait node.
🧩 Download VEED Video (HTTP Request)
-
URL dinámica
-
Headers
Igual que antes:AuthorizationconfalApiKey,Content-Type: application/json. -
Qué hace
Consulta el job en la cola. Cuando el job está listo, la respuesta suele incluir algo como: -
Conexiones
Se conecta a Generate Caption with GPT-4. -
Uso posterior del vídeo
-
Save to Google Sheets referenciará
$('Download VEED Video').item.json.video.urlcomoURL VIDEO.
-
Falta manejador de error
Si
status≠completed(fallo, timeout, etc.), el flujo sigue como si nada. Lo ideal: nodo IF o Switch para verificarstatusy derivar a un flujo de error.
3.6. Caption, registro en Sheets y envío
🧩 Generate Caption with GPT-4
-
Modelo
Otra vezgpt-4o-mini. -
Prompt
-
Usa de nuevo
theme. -
Usa las mismas tendencias que antes (Perplexity).
-
Define estructura de caption y hashtags.
-
-
Salida esperada
json.message.contentserá el texto de la caption. -
Conexiones
Va a Save to Google Sheets.
🧩 Save to Google Sheets (Google Sheets – append)
-
Operación
operation: "append", por lo que añade una nueva fila al final. -
Columnas mapeadas
-
De nuevo, usas
$()para “saltar” a otros nodos y consolidar todos los datos en una fila. -
Dejas
STATUSsin valor en este nodo; se actualizará luego a"DONE".
-
-
DocumentId / sheetName
Están convalue: "="(placeholder). En tu n8n real tendrás que seleccionar el documento y la hoja correctos. -
Conexiones
Va a Send a video.
Buena práctica
Estás guardando tanto las URLs como la idea original y la caption. Esto te permite tener trazabilidad completa de qué se publicó y con qué contenido.
🧩 Send a video (Telegram)
-
Operación
operation: "sendVideo" -
Parámetros clave
-
chatId: {{ $('Telegram Trigger').first().json.message.chat.id }}-
Responde en el mismo chat que envió la foto.
-
-
file: {{ $json['URL VIDEO'] }}-
Toma la URL del vídeo desde la fila que acaba de crear Google Sheets.
-
-
-
Qué hace
Envía el vídeo final al usuario en Telegram como mensaje de vídeo. -
Conexiones
Se conecta a Upload Video to BLOTATO, de modo que solo después de enviar el vídeo al usuario continúa la publicación en redes.
3.7. Publicación multicanal con Blotato y actualización de estado
🧩 Upload Video to BLOTATO
-
Tipo
Nodo de la comunidad@blotato/n8n-nodes-blotato.blotato. -
Propósito
Recibe la info del vídeo (probablemente URL o binario) y la sube a Blotato para que sea reutilizable por los demás nodos de publicación (TikTok, IG, etc.). En el JSON exportado no se ven sus parámetros porque suelen omitirse credenciales al exportar. -
Conexiones
Desde este nodo salen 9 ramas paralelas:-
Tiktok
-
Linkedin
-
Facebook
-
Instagram
-
Twitter (X)
-
Youtube
-
Threads
-
Bluesky
-
Pinterest
-
🧩 Nodos Tiktok / Linkedin / Facebook / Instagram / Twitter (X) / Youtube / Threads / Bluesky / Pinterest
-
Todos son nodos
@blotato/n8n-nodes-blotato.blotatosin parámetros visibles en el JSON. -
Qué hacen normalmente
-
Usan Blotato como backend para publicar el vídeo, usando:
-
El asset de vídeo cargado.
-
La caption generada (posiblemente referenciada en su configuración real).
-
-
Se encargan de detalles like privacidad, programación, etc. (en Blotato, no en n8n).
-
-
Conexiones
Todos se conectan a Merge1 con distintos índices de entrada (0..8).
Oportunidad de mejora
Aquí sería muy útil capturar el ID de cada post devolvido por Blotato (si lo hace) y guardarlo en la hoja o en otra tabla para tener trazabilidad por plataforma.
🧩 Merge1 (Merge)
-
Modo
mode: "chooseBranch"numberInputs: 9 -
Qué hace este modo en n8n
-
“Choose Branch” te permite seleccionar, dentro de la configuración, qué input (1,2,3,…) va a pasar a la salida.
-
El resto de inputs se ignoran en la salida del Merge.
-
-
Conexiones
-
Entradas: los 9 nodos Blotato.
-
Salida: Update Status to “DONE”.
-
Problema de diseño
Con
chooseBranch, solo una de las plataformas (por ejemplo, TikTok) será la que pase el item al nodo siguiente.Sin embargo, la ejecución de las otras ramas sí se realiza, simplemente no “pasas” sus items.
Si tu intención es: “cuando todas las plataformas terminen, entonces actualizo el status en Sheets”, este diseño no lo garantiza.
Para ese caso, podrías:
Usar un patrón con Merge by Index + configuración adecuada, o
No usar Merge, y simplemente actualizar el estado justo después de Save to Google Sheets (indicando que se ha lanzado la publicación, no necesariamente completado).
🧩 Update Status to “DONE” (Google Sheets – appendOrUpdate)
-
Operación
operation: "appendOrUpdate" -
Columnas
-
Matching:
-
matchingColumns: ["URL VIDEO"]
-
-
Valores a escribir:
-
Busca la fila cuya
URL VIDEOcoincida con la que guardaste en el primer guardado. -
Actualiza
STATUSa"DONE".
-
-
-
Qué consigue
Convierte tu hoja en una especie de “pipeline”:-
Primera escritura → fila con URL de todo y
STATUSvacío. -
Al final del workflow → misma fila, ahora
STATUS = DONE.
-
Detalle sutil
Estás usando como referencia
$('Save to Google Sheets'), no el JSON actual, lo cual evita problemas si en las ramas de Blotato cambian el JSON.
3.8. Stickies (documentación)
Nodos:
-
Step 1 – Telegram Setup
-
Step 2 – API Keys Configuration
-
Step 3 – AI Processing
-
Step 4 – Voice & Video Generation
-
Step 5 – Publishing
-
How It Works
Todos son nodos stickyNote, puramente documentativos:
-
Explican paso a paso cómo configurar el bot de Telegram, claves de API, nodos de IA y publicación.
-
No afectan a la ejecución, pero son muy buenas prácticas para dejar el flujo autoexplicativo.

-
Alternativas y mejoras
4.1. Claridad y estructura del flujo
-
Dividir en sub-workflows
Podrías separar en 3–4 workflows:-
Input & IA (Telegram → tendencias → guion → audio).
-
Media pipeline (imagen/audio → vídeo).
-
Publishing (Sheets + Blotato + Telegram de vuelta).
-
(Opcional) Gestión de errores (workflow de error global).
Con nodos Execute Workflow, mantienes cada parte más limpia, testeable y reutilizable.
-
-
Uso coherente de
theme-
Ahora
Search Trends with Perplexityusamessage.captiondirectamente. Mejor usar siempretheme(que ya tiene fallback) para que toda la lógica se concentre en un solo sitio.
-
4.2. Rendimiento y robustez
-
Eliminar wait fijo de 10 minutos
En vez deWait for VEEDfijo:-
Añadir un bucle (Function + Wait + HTTP Request + IF) que pregunte cada, por ejemplo, 30–60 segundos.
-
Detener cuando
status === "completed"o cuando pase un timeout total.
-
-
Unificar llamadas a GPT
Ahora haces:-
1 llamada para script.
-
1 llamada para caption.
Podrías: -
Hacer una sola llamada solicitando script + caption + hashtags, y luego separarlos mediante un Code node o un Item Lists/IF si los markers son claros.
-
-
Manejo de errores
-
Añadir nodos IF después de:
-
Perplexity (¿resultado vacío?).
-
GPT-4 (¿mensaje sin
content?). -
ElevenLabs (si no hay
binary.audio). -
FAL (si
status≠completed). -
Google Sheets (si falla la escritura).
-
-
Configurar un Error Workflow en n8n para registrar fallos en una hoja de errores, Slack o email.
-
4.3. Seguridad
-
API keys en Credenciales
-
Sustituir
Workflow Configurationpara claves sensibles por credenciales:-
ElevenLabs API key → Credentials en HTTP Request.
-
FAL API key → Credentials.
-
Perplexity / OpenAI → nodos de IA con credenciales propias.
-
-
Mantener en el Set solo parámetros no sensibles (duración, modelos, resolución, etc.).
-
-
Almacenamiento de archivos
-
tmpfiles.orges útil para prototipos, pero para producción quizá prefieras:-
S3 / Cloudflare R2 / GCS.
-
Un hosting más controlado y estable.
-
-
Puedes usar nodos S3/Google Cloud Storage y evitar dependencias externas poco controlables.
-
4.4. Diseño de publicación
-
Merge1 / estado DONE
-
Ahora el
STATUS = DONEse actualiza después de pasar por Merge1, pero Merge enchooseBranchsolo pasa una de las entradas. -
Si tu intención es marcar DONE cuando publicas en todas las plataformas:
-
O bien actualizas el estado antes de lanzar Blotato (STATUS = “PUBLISHED REQUESTED”).
-
O bien diseñas un patrón de “síncrono” para cada plataforma y marcas DONE solo cuando todas devuelven éxito (más complejo, requiere conservar contadores o flags).
-
-
-
Log por plataforma
-
Añadir una segunda hoja “Posts Por Plataforma”:
-
Columnas: FECHA, PLATFORM, URL_VIDEO, POST_ID, STATUS.
-
-
Cada nodo Blotato rellenaría una fila, lo que te da visibilidad granular.
-
-
Recomendaciones prácticas y variaciones
5.1. Qué cambiaría yo para optimizar este workflow
-
Centralizar tema y caption
-
Cambiar el prompt de Perplexity a usar
{{ $('Extract Photo and Theme').first().json.theme }}. -
De esta forma, da igual si el usuario escribe texto sin foto, caption, etc.
-
-
Eliminar claves del Set
-
Mover
elevenLabsApiKey,falApiKeyy cualquier otra clave a Credenciales de n8n y dejar solo IDs de modelo/voz enWorkflow Configuration.
-
-
Mejorar la espera de VEED
-
Reemplazar
Wait for VEEDpor:-
HTTP Request (status)→IF status == "completed":-
Sí →
Download VEED Video. -
No →
Wait 30s→ volver aHTTP Request (status)medianteLoop.
-
-
-
-
Validar presencia de foto y audio
-
Añadir un nodo IF después de
Extract Photo and Theme:-
Si
photoUrl == ''→ enviar mensaje al usuario por Telegram explicando que hace falta una foto.
-
-
Después de ElevenLabs, otro IF:
-
Si no hay
binary.audio, parar y notificar error.
-
-
-
Arreglar Merge1 según objetivo
-
Si solo te interesa saber que se ha lanzado publicación, puedes:
-
Mover Update Status to “DONE” justo después de Save to Google Sheets, sin pasar por Merge.
-
-
Si quieres indicador de “publicado en X redes”, diseñar un sistema de contadores o registrar estado por red.
-
5.2. Variaciones útiles del mismo flujo
-
Versión “batch desde Google Sheets”
-
Trigger: Google Sheets Trigger o Schedule.
-
Por cada fila con
STATUS = "PENDING":-
Leer IDEA + URL_IMAGE (o solo texto).
-
Generar script+audio+vídeo.
-
Actualizar la misma fila con
URL_VIDEO,CAPTION,STATUS="DONE".
-
-
Ideal para tener una lista de ideas predefinidas en la hoja.
-
-
Versión “solo TikTok” (más simple)
-
Eliminar nodos Blotato y redes adicionales.
-
Publicar solo en TikTok (o incluso solo en Telegram + Sheets).
-
Perfecto para tener un flujo mínimo mientras pruebas la calidad del vídeo/voz/guion, antes de escalar a multicanal.
-