Content repurposing automático
Reutiliza contenido automáticamente adaptándolo a diferentes plataformas.
El content repurposing es la estrategia de tomar un contenido y transformarlo en múltiples formatos para diferentes plataformas. Con automatización, puedes convertir un blog post en 20+ piezas de contenido sin esfuerzo manual.
Por qué repurposing es esencial
El problema:
- Crear contenido original es costoso y lento
- Cada plataforma tiene formatos diferentes
- Tu audiencia está distribuida en múltiples canales
- El contenido tiene vida útil limitada
La solución:
- Un contenido = múltiples formatos
- Automatizar la transformación
- Maximizar el ROI de cada pieza
1 Blog Post puede convertirse en:
├── 1 Thread de Twitter (5-10 tweets)
├── 3-5 Posts de LinkedIn
├── 5-10 Tweets individuales
├── 1 Newsletter
├── 1 Video corto (script)
├── 5 Instagram stories
├── 1 Infografía (outline)
├── 1 Episodio de podcast (guión)
└── Múltiples respuestas en Quora/Reddit
Total: 20-30 piezas de contenido
Blog → Tweet Thread
Zap: Artículo a hilo de Twitter automático
Trigger: WordPress - New Post Action 1: Formatter - Extract key sections Action 2: Code - Create thread structure Action 3: Airtable - Save thread drafts Action 4: Slack - Notify for review
// Código para crear thread desde artículo
const title = inputData.title;
const content = inputData.content;
const url = inputData.url;
const author = inputData.author || 'Academia Tooldata';
// Limpiar HTML y dividir en secciones
const cleanContent = content.replace(/<[^>]*>/g, '');
const sections = cleanContent.split(/\n\n+/).filter(s => s.length > 30);
const thread = [];
// Tweet 1: Hook con promesa de valor
thread.push({
number: 1,
text: `🧵 ${title}
Te explico los puntos más importantes en este hilo:
↓`,
type: 'hook'
});
// Tweets de contenido (máximo 8)
const contentTweets = sections.slice(0, 8);
contentTweets.forEach((section, index) => {
// Truncar a 250 chars para dejar espacio
let tweetText = section.substring(0, 250);
// Agregar emoji relevante
const emojis = ['💡', '📊', '🎯', '✅', '🔑', '📈', '⚡', '🚀'];
tweetText = `${emojis[index % emojis.length]} ${tweetText}`;
if (section.length > 250) {
tweetText += '...';
}
thread.push({
number: index + 2,
text: tweetText,
type: 'content'
});
});
// Tweet final: CTA
thread.push({
number: thread.length + 1,
text: `📝 Si te fue útil este hilo:
1. Dale RT al primer tweet para ayudar a otros
2. Sígueme para más contenido de este tipo
3. Lee el artículo completo aquí: ${url}
¿Preguntas? Déjalas en los comentarios 👇`,
type: 'cta'
});
return {
threadJson: JSON.stringify(thread),
tweetCount: thread.length,
title: title
};
Airtable como gestor de threads
Estructura de tabla "Tweet Threads":
| Thread ID | Source URL | Title | Tweet # | Content | Status | Scheduled |
|-----------|------------|-------|---------|---------|--------|-----------|
| THR001 | /blog/... | Title | 1 | Hook... | Draft | - |
| THR001 | /blog/... | Title | 2 | Point 1 | Draft | - |
| THR001 | /blog/... | Title | 3 | Point 2 | Draft | - |
Workflow:
1. Zap crea registros con Status = "Draft"
2. Editor revisa y ajusta en Airtable
3. Cambia Status a "Approved"
4. Otro Zap publica los aprobados
Video → Clips + Quotes
Zap: Video de YouTube a múltiples contenidos
Trigger: YouTube - New Video in Channel Action 1: Get transcript (via API service) Action 2: Code - Extract clips and quotes Action 3: Create social posts Action 4: Queue for editing
// Extraer contenido de video
const transcript = inputData.transcript;
const videoTitle = inputData.videoTitle;
const videoUrl = inputData.videoUrl;
const duration = inputData.duration; // en segundos
// Identificar momentos clave por palabras señal
const keyPhrases = [
'lo más importante',
'el secreto es',
'mi consejo',
'el error más común',
'la clave está en',
'te recomiendo',
'en resumen'
];
// Parsear transcript con timestamps (formato simplificado)
const lines = transcript.split('\n');
const moments = [];
lines.forEach((line, index) => {
keyPhrases.forEach(phrase => {
if (line.toLowerCase().includes(phrase)) {
// Capturar contexto (líneas antes y después)
const context = lines.slice(
Math.max(0, index - 2),
Math.min(lines.length, index + 3)
).join(' ');
moments.push({
timestamp: index * 10, // Aproximación
phrase: phrase,
content: context,
type: 'key_moment'
});
}
});
});
// Crear contenido para cada momento
const outputs = {
clips: moments.slice(0, 5).map((m, i) => ({
title: `Clip ${i + 1}: ${m.phrase}`,
startTime: m.timestamp,
suggestedDuration: 60,
content: m.content
})),
quotes: moments.map(m => ({
text: m.content.substring(0, 200),
hashtags: ['tip', 'consejo', videoTitle.split(' ')[0].toLowerCase()]
})),
socialPosts: moments.slice(0, 3).map(m => ({
platform: 'linkedin',
text: `💡 De mi último video "${videoTitle}":
"${m.content.substring(0, 300)}"
Ver video completo: ${videoUrl}
#${videoTitle.split(' ')[0]}`
}))
};
return {
clipsJson: JSON.stringify(outputs.clips),
quotesJson: JSON.stringify(outputs.quotes),
postsJson: JSON.stringify(outputs.socialPosts),
momentCount: moments.length
};
Workflow de producción de clips
1. VIDEO SUBIDO A YOUTUBE
↓
2. ZAPIER EXTRAE TRANSCRIPT
↓
3. IDENTIFICAR MOMENTOS CLAVE
↓
4. CREAR TAREAS EN NOTION/ASANA
├── Clip 1: [timestamp] "Frase clave"
├── Clip 2: [timestamp] "Frase clave"
└── Clip 3: [timestamp] "Frase clave"
↓
5. EDITOR CREA CLIPS
↓
6. CLIPS APROBADOS → PROGRAMAR
├── TikTok
├── Instagram Reels
├── YouTube Shorts
└── LinkedIn Video
Blog → LinkedIn Posts
Zap: Artículo a múltiples posts de LinkedIn
Trigger: RSS - New Item (Blog) Action 1: Code - Generate LinkedIn variations Action 2: Airtable - Save drafts Action 3: Buffer - Schedule posts
// Generar variaciones para LinkedIn
const title = inputData.title;
const content = inputData.content;
const url = inputData.url;
// Limpiar y extraer
const cleanContent = content.replace(/<[^>]*>/g, '');
const paragraphs = cleanContent.split('\n\n').filter(p => p.length > 50);
const keyPoints = paragraphs.slice(0, 5);
const linkedInPosts = [];
// Post 1: Announcement style
linkedInPosts.push({
type: 'announcement',
day: 0,
content: `📝 Acabo de publicar: "${title}"
${keyPoints[0]?.substring(0, 200)}...
👉 Lee el artículo completo (link en comentarios)
¿Qué opinas? Me encantaría leer tu perspectiva.
#${title.split(' ')[0]} #contenido #aprendizaje`
});
// Post 2: Key insight
linkedInPosts.push({
type: 'insight',
day: 2,
content: `💡 Aprendizaje clave de esta semana:
${keyPoints[1]?.substring(0, 300)}
Esto lo aprendí mientras escribía sobre ${title.toLowerCase()}.
¿Has experimentado algo similar?
👇 Cuéntame en los comentarios`
});
// Post 3: Question hook
linkedInPosts.push({
type: 'question',
day: 4,
content: `¿Sabías que ${keyPoints[2]?.substring(0, 150).toLowerCase()}?
Esto es solo uno de los puntos que cubro en mi artículo reciente.
Otros temas incluyen:
• ${keyPoints[0]?.substring(0, 50)}...
• ${keyPoints[1]?.substring(0, 50)}...
• ${keyPoints[3]?.substring(0, 50)}...
Link en el primer comentario 📎`
});
// Post 4: List format
linkedInPosts.push({
type: 'list',
day: 7,
content: `5 cosas que aprendí sobre ${title.split(':')[0]}:
1️⃣ ${keyPoints[0]?.substring(0, 80)}
2️⃣ ${keyPoints[1]?.substring(0, 80)}
3️⃣ ${keyPoints[2]?.substring(0, 80)}
4️⃣ ${keyPoints[3]?.substring(0, 80)}
5️⃣ ${keyPoints[4]?.substring(0, 80) || 'La práctica es clave'}
¿Cuál te resonó más?
Profundizo en cada punto aquí: [link]`
});
// Post 5: Story format
linkedInPosts.push({
type: 'story',
day: 10,
content: `La semana pasada compartí un artículo sobre ${title.toLowerCase()}.
La respuesta fue increíble.
Pero un comentario me hizo reflexionar:
"${keyPoints[0]?.substring(0, 100)}"
Esto me recordó por qué empecé a escribir sobre estos temas.
A veces el contenido que crees "básico" es exactamente lo que alguien necesita escuchar.
¿Qué contenido has creado que tuvo impacto inesperado?`
});
return {
postsJson: JSON.stringify(linkedInPosts),
postCount: linkedInPosts.length
};
Newsletter automática
Zap: Contenido de la semana → Newsletter
Trigger: Schedule - Every Friday at 2pm Action 1: Airtable - Get published content this week Action 2: Code - Compile newsletter Action 3: Mailchimp - Create Campaign Draft
// Compilar newsletter semanal
const posts = JSON.parse(inputData.postsJson);
const articles = JSON.parse(inputData.articlesJson);
const videos = JSON.parse(inputData.videosJson);
const currentDate = new Date();
const weekNumber = Math.ceil(currentDate.getDate() / 7);
const month = currentDate.toLocaleString('es', { month: 'long' });
const newsletter = {
subject: `📬 Lo mejor de la semana ${weekNumber} de ${month}`,
preheader: `${articles.length} artículos, ${videos.length} videos y más contenido para ti`,
sections: []
};
// Sección: Artículo destacado
if (articles.length > 0) {
newsletter.sections.push({
title: '📝 Artículo de la semana',
content: `<h3>${articles[0].title}</h3>
<p>${articles[0].excerpt}</p>
<a href="${articles[0].url}">Leer artículo completo →</a>`
});
}
// Sección: Video destacado
if (videos.length > 0) {
newsletter.sections.push({
title: '🎬 Video destacado',
content: `<h3>${videos[0].title}</h3>
<p>${videos[0].description}</p>
<a href="${videos[0].url}">Ver video →</a>`
});
}
// Sección: Quick tips
newsletter.sections.push({
title: '💡 Tips rápidos',
content: posts.slice(0, 3).map(p =>
`<li>${p.content.substring(0, 100)}...</li>`
).join('')
});
// Sección: Lo que viene
newsletter.sections.push({
title: '🔮 La próxima semana',
content: `<p>Estoy preparando contenido sobre [tema].
¿Hay algo específico que te gustaría que cubra?
Responde a este email.</p>`
});
return {
newsletterJson: JSON.stringify(newsletter),
subject: newsletter.subject,
preheader: newsletter.preheader
};
Distribución automatizada
Sistema completo de distribución
CONTENIDO ORIGINAL
│
▼
┌────────────────┐
│ PROCESAMIENTO │
│ │
│ • Extraer key │
│ points │
│ • Generar │
│ variaciones │
│ • Crear assets │
└───────┬────────┘
│
▼
┌────────────────────────────────────────────┐
│ DISTRIBUCIÓN POR CANAL │
├────────────┬────────────┬────────────┬─────┤
│ Twitter │ LinkedIn │ Email │ YT │
├────────────┼────────────┼────────────┼─────┤
│ Thread │ Post largo │ Newsletter │Short│
│ Tweets x10 │ Posts x5 │ Semanal │Clips│
│ Quote card │ Carousel │ │ │
└────────────┴────────────┴────────────┴─────┘
│
▼
┌────────────────┐
│ PROGRAMACIÓN │
│ │
│ Día 0: Announce│
│ Día 1: Thread │
│ Día 2: LinkedIn│
│ Día 3: Tips │
│ Día 5: Insight │
│ Día 7: Recap │
└────────────────┘
Zap maestro: Content amplification
Trigger: Notion - Page Status Changed to "Published" Multi-step workflow:
Paso 1: Identificar tipo de contenido
└── Code: Analizar page properties
Paso 2: Generar todos los formatos
├── Thread de Twitter (Code)
├── Posts de LinkedIn (Code)
├── Tweets individuales (Code)
└── Snippets para email (Code)
Paso 3: Guardar en sistema de gestión
└── Airtable: Crear registros para cada pieza
Paso 4: Programar distribución
├── Buffer: Agregar a cola
└── Mailchimp: Agregar a draft de newsletter
Paso 5: Notificar equipo
└── Slack: "Contenido procesado y programado"
Paso 6: Tracking
└── Google Sheets: Registrar para métricas
Automatización de assets visuales
Zap: Crear imágenes con Canva
Trigger: Airtable - New Record (Quote approved) Action: Canva - Create Design from Template Action: Airtable - Update with image URL
Templates de Canva:
• Quote card (1080x1080) - Instagram
• Quote card (1200x628) - LinkedIn/Twitter
• Story template (1080x1920) - Instagram Stories
• Thumbnail (1280x720) - YouTube
Datos dinámicos:
• Texto de la quote
• Nombre del autor
• URL del contenido original
• Colores de marca
Métricas de repurposing
Dashboard de performance
Métricas a trackear:
POR CONTENIDO ORIGINAL:
• Total de piezas derivadas
• Alcance total combinado
• Engagement total
• Tráfico generado al original
POR FORMATO:
• Threads: Engagement rate
• Posts LinkedIn: Impresiones
• Tweets: Retweets/Likes
• Newsletter: Open rate
POR CANAL:
• Twitter: Followers ganados
• LinkedIn: Conexiones nuevas
• Email: Suscriptores nuevos
Zap: Reporte mensual de repurposing
Contenido del reporte:
📊 *Reporte de Content Repurposing - {{Mes}}*
*Contenido producido*
• Piezas originales: {{original_count}}
• Piezas derivadas: {{repurposed_count}}
• Ratio de multiplicación: {{ratio}}x
*Por tipo*
• Threads: {{threads_count}}
• Posts LinkedIn: {{linkedin_count}}
• Tweets: {{tweets_count}}
• Newsletter mentions: {{email_count}}
*Performance*
• Total alcance: {{total_reach}}
• Total engagement: {{total_engagement}}
• Tráfico a originales: {{traffic_to_original}}
*Top contenido repurposeado*
1. "{{top1_title}}" - {{top1_engagement}} interactions
2. "{{top2_title}}" - {{top2_engagement}} interactions
3. "{{top3_title}}" - {{top3_engagement}} interactions
*ROI de repurposing*
Horas ahorradas estimadas: {{hours_saved}}
Valor equivalente: ${{value_saved}}
Ejercicio práctico
Implementa tu sistema de content repurposing:
Toma un blog post existente y manualmente identifica:
- 5-10 puntos clave para un thread
- 3-5 variaciones para LinkedIn
- 10 tweets individuales
Crea un Zap que:
- Se dispare con nuevo contenido (RSS o Notion)
- Genere al menos un formato (thread o posts)
- Guarde los resultados en Airtable o Sheets
Configura programación automática:
- Conecta con Buffer o Hootsuite
- Distribuye el contenido a lo largo de 2 semanas
Crea un reporte básico:
- Trackea cuántas piezas se generan
- Mide engagement por formato
Tiempo estimado: 45-60 minutos
Resumen
En esta lección aprendiste a:
- Transformar un blog post en thread de Twitter automáticamente
- Extraer clips y quotes de videos para redes sociales
- Generar múltiples posts de LinkedIn desde un artículo
- Compilar newsletters automáticas con contenido de la semana
- Distribuir contenido automáticamente en múltiples canales
- Medir el ROI del content repurposing
El content repurposing automatizado te permite maximizar el valor de cada pieza de contenido que creas, llegando a más audiencia con menos esfuerzo.
Siguiente módulo: Proyecto Final - Aplicarás todo lo aprendido para construir un sistema completo de automatización para tu negocio.
¿Completaste esta lección?
Marca esta lección como completada. Tu progreso se guardará en tu navegador.