Gestión de campañas de influencers de redes sociales con puntuación de IA y promoción por Gmail
Este es unSocial Media, AI Summarizationflujo de automatización del dominio deautomatización que contiene 15 nodos.Utiliza principalmente nodos como If, Set, Code, Wait, Gmail. Gestión de campañas de influencers de redes sociales con puntuación de IA y promoción por Gmail
- •Cuenta de Google y credenciales de API de Gmail
- •Punto final de HTTP Webhook (n8n generará automáticamente)
- •Pueden requerirse credenciales de autenticación para la API de destino
- •Credenciales de API de Google Sheets
Nodos utilizados (15)
Categoría
{
"nodes": [
{
"id": "1",
"name": "Briefing de Campaña Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
240,
300
],
"parameters": {
"path": "campaign-brief",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 1
},
{
"id": "2",
"name": "Nota Adhesiva",
"type": "n8n-nodes-base.stickyNote",
"position": [
140,
180
],
"parameters": {
"width": 240,
"height": 160,
"content": "## Influencer Campaign Setup\n\n⚙️ **Configure campaign parameters:**\n- Target audience demographics\n- Budget allocation per platform\n- Content requirements\n- Timeline and deliverables"
},
"typeVersion": 1
},
{
"id": "3",
"name": "Configuración de Campaña",
"type": "n8n-nodes-base.set",
"position": [
440,
300
],
"parameters": {
"values": {
"number": [
{
"name": "totalBudget",
"value": "{{ $json.budget }}"
},
{
"name": "minFollowers",
"value": 10000
},
{
"name": "maxFollowers",
"value": 500000
},
{
"name": "minEngagementRate",
"value": 3
}
],
"string": [
{
"name": "campaignName",
"value": "{{ $json.campaign_name }}"
},
{
"name": "targetAudience",
"value": "{{ $json.target_audience }}"
},
{
"name": "brandEmail",
"value": "partnerships@yourbrand.com"
}
]
}
},
"typeVersion": 1
},
{
"id": "4",
"name": "Buscar Influenciadores Instagram",
"type": "n8n-nodes-base.httpRequest",
"position": [
640,
200
],
"parameters": {
"qs": {
"q": "{{ $json.targetAudience }}",
"count": 50
},
"url": "https://api.instagram.com/v1/users/search",
"method": "GET",
"headers": {
"Authorization": "Bearer {{ $credentials.instagram.accessToken }}"
}
},
"typeVersion": 1
},
{
"id": "5",
"name": "Buscar Influenciadores TikTok",
"type": "n8n-nodes-base.httpRequest",
"position": [
640,
300
],
"parameters": {
"qs": {
"limit": 50,
"keyword": "{{ $json.targetAudience }}"
},
"url": "https://api.tiktok.com/v1/users/search",
"method": "GET",
"headers": {
"Authorization": "Bearer {{ $credentials.tiktok.accessToken }}"
}
},
"typeVersion": 1
},
{
"id": "6",
"name": "Buscar Influenciadores YouTube",
"type": "n8n-nodes-base.httpRequest",
"position": [
640,
400
],
"parameters": {
"qs": {
"q": "{{ $json.targetAudience }}",
"type": "channel",
"maxResults": 50
},
"url": "https://api.youtube.com/v3/search",
"method": "GET",
"headers": {
"Authorization": "Bearer {{ $credentials.youtube.accessToken }}"
}
},
"typeVersion": 1
},
{
"id": "7",
"name": "Puntuar y Calificar Influenciadores",
"type": "n8n-nodes-base.code",
"position": [
840,
300
],
"parameters": {
"jsCode": "// Advanced influencer scoring and qualification algorithm\nconst campaignSettings = $node['Campaign Settings'].json;\nconst allInfluencers = [];\n\n// Process Instagram influencers\nconst instagramData = $node['Search Instagram Influencers'].json;\nif (instagramData.data) {\n instagramData.data.forEach(influencer => {\n allInfluencers.push({\n platform: 'instagram',\n username: influencer.username,\n follower_count: influencer.follower_count,\n engagement_rate: influencer.engagement_rate,\n profile_url: `https://instagram.com/${influencer.username}`,\n bio: influencer.bio,\n raw_data: influencer\n });\n });\n}\n\n// Process TikTok influencers\nconst tiktokData = $node['Search TikTok Influencers'].json;\nif (tiktokData.data) {\n tiktokData.data.forEach(influencer => {\n allInfluencers.push({\n platform: 'tiktok',\n username: influencer.username,\n follower_count: influencer.follower_count,\n engagement_rate: influencer.engagement_rate,\n profile_url: `https://tiktok.com/@${influencer.username}`,\n bio: influencer.bio,\n raw_data: influencer\n });\n });\n}\n\n// Process YouTube influencers\nconst youtubeData = $node['Search YouTube Influencers'].json;\nif (youtubeData.items) {\n youtubeData.items.forEach(channel => {\n allInfluencers.push({\n platform: 'youtube',\n username: channel.snippet.channelTitle,\n follower_count: channel.statistics?.subscriberCount || 0,\n engagement_rate: (channel.statistics?.viewCount / channel.statistics?.subscriberCount) * 100,\n profile_url: `https://youtube.com/channel/${channel.id}`,\n bio: channel.snippet.description,\n raw_data: channel\n });\n });\n}\n\n// Filter and score influencers\nconst qualifiedInfluencers = allInfluencers\n .filter(influencer => {\n return influencer.follower_count >= campaignSettings.minFollowers &&\n influencer.follower_count <= campaignSettings.maxFollowers &&\n influencer.engagement_rate >= campaignSettings.minEngagementRate;\n })\n .map(influencer => {\n let score = 0;\n \n // Follower count scoring (30% weight)\n const followerScore = Math.min((influencer.follower_count / campaignSettings.maxFollowers) * 30, 30);\n score += followerScore;\n \n // Engagement rate scoring (40% weight)\n const engagementScore = Math.min((influencer.engagement_rate / 10) * 40, 40);\n score += engagementScore;\n \n // Platform preference scoring (20% weight)\n const platformScores = { instagram: 20, tiktok: 15, youtube: 18 };\n score += platformScores[influencer.platform] || 10;\n \n // Bio relevance scoring (10% weight)\n const targetKeywords = campaignSettings.targetAudience.toLowerCase().split(' ');\n const bioRelevance = targetKeywords.filter(keyword => \n influencer.bio?.toLowerCase().includes(keyword)\n ).length;\n score += Math.min(bioRelevance * 3, 10);\n \n // Calculate estimated cost per post\n let costPerPost = 0;\n if (influencer.platform === 'instagram') {\n costPerPost = (influencer.follower_count / 1000) * 10; // $10 per 1k followers\n } else if (influencer.platform === 'tiktok') {\n costPerPost = (influencer.follower_count / 1000) * 8; // $8 per 1k followers\n } else if (influencer.platform === 'youtube') {\n costPerPost = (influencer.follower_count / 1000) * 25; // $25 per 1k subscribers\n }\n \n return {\n ...influencer,\n score: Math.round(score),\n estimated_cost: Math.round(costPerPost),\n cost_per_engagement: Math.round(costPerPost / (influencer.follower_count * influencer.engagement_rate / 100)),\n campaign_id: `${campaignSettings.campaignName}_${Date.now()}`,\n qualified_at: new Date().toISOString()\n };\n })\n .sort((a, b) => b.score - a.score)\n .slice(0, 20); // Top 20 influencers\n\nreturn qualifiedInfluencers;"
},
"typeVersion": 1
},
{
"id": "8",
"name": "Filtrar Mejores Influenciadores",
"type": "n8n-nodes-base.if",
"position": [
1040,
300
],
"parameters": {
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"conditions": [
{
"operator": {
"type": "number",
"operation": "gte"
},
"leftValue": "={{ $json.score }}",
"rightValue": 70
}
]
}
},
"typeVersion": 2
},
{
"id": "9",
"name": "Generar Contenido de Contacto",
"type": "n8n-nodes-base.code",
"position": [
1240,
300
],
"parameters": {
"jsCode": "// Generate personalized outreach email content\nconst influencer = $json;\nconst campaignSettings = $node['Campaign Settings'].json;\n\n// Create personalized subject line\nconst subjectLines = [\n `Partnership Opportunity with ${campaignSettings.campaignName}`,\n `Collaboration Proposal - ${influencer.platform.toUpperCase()} Creator`,\n `Exciting Brand Partnership for ${influencer.username}`,\n `${campaignSettings.campaignName} x ${influencer.username} - Let's Create Magic!`\n];\n\nconst randomSubject = subjectLines[Math.floor(Math.random() * subjectLines.length)];\n\n// Determine deliverables based on platform\nlet deliverables = [];\nif (influencer.platform === 'instagram') {\n deliverables = ['1 Feed Post', '3 Stories', '1 Reel'];\n} else if (influencer.platform === 'tiktok') {\n deliverables = ['1 Video Post', '2 Story Updates'];\n} else if (influencer.platform === 'youtube') {\n deliverables = ['1 Sponsored Video', '1 Community Post'];\n}\n\n// Calculate campaign timeline\nconst startDate = new Date();\nconst endDate = new Date(startDate.getTime() + 14 * 24 * 60 * 60 * 1000); // 2 weeks\n\nreturn {\n ...influencer,\n outreach_subject: randomSubject,\n deliverables: deliverables,\n campaign_start: startDate.toISOString(),\n campaign_end: endDate.toISOString(),\n proposal_sent_at: new Date().toISOString()\n};"
},
"typeVersion": 1
},
{
"id": "10",
"name": "Extraer Información de Contacto",
"type": "n8n-nodes-base.code",
"position": [
1440,
300
],
"parameters": {
"jsCode": "// Find or create influencer email\nconst influencer = $json;\nlet email = null;\n\n// Try to extract email from bio\nconst emailRegex = /\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b/;\nconst bioMatch = influencer.bio?.match(emailRegex);\n\nif (bioMatch) {\n email = bioMatch[0];\n} else {\n // Generate likely email patterns\n const username = influencer.username.toLowerCase().replace(/[^a-z0-9]/g, '');\n const possibleEmails = [\n `${username}@gmail.com`,\n `${username}@outlook.com`,\n `${username}@yahoo.com`,\n `contact@${username}.com`,\n `hello@${username}.com`,\n `${username}@${influencer.platform}.com`\n ];\n \n // Use the first pattern as fallback\n email = possibleEmails[0];\n}\n\nreturn {\n ...influencer,\n email: email,\n email_verified: bioMatch ? true : false\n};"
},
"typeVersion": 1
},
{
"id": "11",
"name": "Enviar Correo de Contacto",
"type": "n8n-nodes-base.gmail",
"position": [
1640,
300
],
"parameters": {
"sendTo": "={{ $json.email }}",
"message": "=<!DOCTYPE html>\n<html>\n<head>\n <style>\n body { font-family: Arial, sans-serif; margin: 20px; background-color: #f8f9fa; }\n .container { max-width: 600px; margin: 0 auto; background: white; padding: 30px; border-radius: 10px; }\n .header { background: linear-gradient(45deg, #667eea, #764ba2); color: white; padding: 20px; text-align: center; margin: -30px -30px 30px -30px; border-radius: 10px 10px 0 0; }\n .campaign-details { background: #e8f4f8; padding: 20px; margin: 20px 0; border-radius: 8px; }\n .deliverables { background: #f8f9fa; padding: 15px; margin: 15px 0; border-radius: 5px; }\n .compensation { background: #d4edda; padding: 15px; margin: 15px 0; border-radius: 5px; border-left: 4px solid #28a745; }\n .cta { background: #007bff; color: white; padding: 15px 30px; text-decoration: none; border-radius: 5px; display: inline-block; margin: 20px 0; }\n .stats { background: #fff3cd; padding: 15px; margin: 15px 0; border-radius: 5px; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"header\">\n <h2>🤝 Partnership Opportunity</h2>\n <p>We'd love to collaborate with you!</p>\n </div>\n \n <p>Hi {{ $json.username }},</p>\n \n <p>We've been following your {{ $json.platform }} content and are impressed by your authentic engagement with your audience. We'd love to partner with you for our {{ $node['Campaign Settings'].json.campaignName }} campaign!</p>\n \n <div class=\"stats\">\n <h3>📊 Why We Chose You</h3>\n <p><strong>Engagement Rate:</strong> {{ $json.engagement_rate }}%</p>\n <p><strong>Followers:</strong> {{ $json.follower_count.toLocaleString() }}</p>\n <p><strong>Platform:</strong> {{ $json.platform.toUpperCase() }}</p>\n <p><strong>Match Score:</strong> {{ $json.score }}/100</p>\n </div>\n \n <div class=\"campaign-details\">\n <h3>🎯 Campaign Details</h3>\n <p><strong>Campaign:</strong> {{ $node['Campaign Settings'].json.campaignName }}</p>\n <p><strong>Duration:</strong> {{ new Date($json.campaign_start).toLocaleDateString() }} - {{ new Date($json.campaign_end).toLocaleDateString() }}</p>\n <p><strong>Target Audience:</strong> {{ $node['Campaign Settings'].json.targetAudience }}</p>\n </div>\n \n <div class=\"deliverables\">\n <h3>📝 What We're Looking For</h3>\n <ul>\n {{#each $json.deliverables}}\n <li>{{ this }}</li>\n {{/each}}\n </ul>\n <p><em>All content subject to approval, but we trust your creative vision!</em></p>\n </div>\n \n <div class=\"compensation\">\n <h3>💰 Compensation</h3>\n <p><strong>Payment:</strong> ${{ $json.estimated_cost }} per campaign</p>\n <p><strong>Cost per engagement:</strong> ${{ $json.cost_per_engagement }}</p>\n <p><em>Payment processed within 7 days of content delivery</em></p>\n </div>\n \n <div style=\"text-align: center;\">\n <a href=\"mailto:{{ $node['Campaign Settings'].json.brandEmail }}?subject=Re: {{ $json.outreach_subject }}\" class=\"cta\">\n 💌 I'm Interested!\n </a>\n </div>\n \n <p>We're excited about the possibility of working together and would love to hear your thoughts!</p>\n \n <p style=\"color: #666; font-size: 14px; margin-top: 30px;\">\n Best regards,<br>\n {{ $node['Campaign Settings'].json.campaignName }} Team<br>\n {{ $node['Campaign Settings'].json.brandEmail }}\n </p>\n </div>\n</body>\n</html>",
"options": {
"contentType": "html"
},
"subject": "={{ $json.outreach_subject }}"
},
"typeVersion": 1
},
{
"id": "12",
"name": "Esperar 3 Días",
"type": "n8n-nodes-base.wait",
"position": [
1840,
300
],
"parameters": {
"unit": "days",
"amount": 3
},
"typeVersion": 1
},
{
"id": "13",
"name": "Enviar Correo de Seguimiento",
"type": "n8n-nodes-base.gmail",
"position": [
2040,
300
],
"parameters": {
"sendTo": "={{ $json.email }}",
"message": "=<!DOCTYPE html>\n<html>\n<head>\n <style>\n body { font-family: Arial, sans-serif; margin: 20px; background-color: #f8f9fa; }\n .container { max-width: 600px; margin: 0 auto; background: white; padding: 30px; border-radius: 10px; }\n .follow-up { background: #6f42c1; color: white; padding: 20px; text-align: center; margin: -30px -30px 30px -30px; border-radius: 10px 10px 0 0; }\n .quick-recap { background: #e8f4f8; padding: 15px; margin: 15px 0; border-radius: 5px; }\n .cta { background: #28a745; color: white; padding: 15px 30px; text-decoration: none; border-radius: 5px; display: inline-block; margin: 20px 0; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"follow-up\">\n <h2>👋 Quick Follow-up</h2>\n <p>Just checking in about our partnership opportunity</p>\n </div>\n \n <p>Hi {{ $json.username }},</p>\n \n <p>I wanted to follow up on the collaboration opportunity I sent a few days ago. I know you probably get a lot of partnership requests, but I genuinely think this could be a great fit for your audience.</p>\n \n <div class=\"quick-recap\">\n <h3>📋 Quick Recap</h3>\n <p><strong>Campaign:</strong> {{ $node['Campaign Settings'].json.campaignName }}</p>\n <p><strong>Compensation:</strong> ${{ $json.estimated_cost }}</p>\n <p><strong>Timeline:</strong> 2 weeks</p>\n <p><strong>Deliverables:</strong> {{ $json.deliverables.join(', ') }}</p>\n </div>\n \n <p>Would you be interested in a quick 15-minute call to discuss this further? I'm flexible with timing and would love to answer any questions you might have.</p>\n \n <div style=\"text-align: center;\">\n <a href=\"mailto:{{ $node['Campaign Settings'].json.brandEmail }}?subject=Re: {{ $json.outreach_subject }}\" class=\"cta\">\n 📞 Let's Chat\n </a>\n </div>\n \n <p>Thanks for considering, and I look forward to hearing from you!</p>\n \n <p style=\"color: #666; font-size: 14px; margin-top: 30px;\">\n Best,<br>\n {{ $node['Campaign Settings'].json.campaignName }} Team\n </p>\n </div>\n</body>\n</html>",
"options": {
"contentType": "html"
},
"subject": "Following up on our collaboration opportunity"
},
"typeVersion": 1
},
{
"id": "14",
"name": "Nota Adhesiva 1",
"type": "n8n-nodes-base.stickyNote",
"position": [
1940,
160
],
"parameters": {
"width": 240,
"height": 160,
"content": "## Campaign Tracking\n\n📊 **Monitor progress:**\n- Response rates by platform\n- Cost per acquisition\n- Engagement analytics\n- ROI optimization"
},
"typeVersion": 1
},
{
"id": "15",
"name": "Seguimiento del Progreso de la Campaña",
"type": "n8n-nodes-base.googleSheets",
"position": [
1640,
450
],
"parameters": {
"values": {
"values": [
"={{ $json.campaign_id }}",
"={{ $json.username }}",
"={{ $json.platform }}",
"={{ $json.follower_count }}",
"={{ $json.engagement_rate }}",
"={{ $json.score }}",
"={{ $json.estimated_cost }}",
"={{ $json.email }}",
"={{ $json.proposal_sent_at }}",
"pending_response"
]
},
"resource": "sheet",
"operation": "appendRow",
"sheetName": "Influencer Outreach Tracking",
"documentId": "your-google-sheet-id"
},
"typeVersion": 1
}
],
"connections": {
"1": {
"main": [
[
{
"node": "3",
"type": "main",
"index": 0
}
]
]
},
"3": {
"main": [
[
{
"node": "4",
"type": "main",
"index": 0
},
{
"node": "5",
"type": "main",
"index": 0
},
{
"node": "6",
"type": "main",
"index": 0
}
]
]
},
"4": {
"main": [
[
{
"node": "7",
"type": "main",
"index": 0
}
]
]
},
"5": {
"main": [
[
{
"node": "7",
"type": "main",
"index": 0
}
]
]
},
"6": {
"main": [
[
{
"node": "7",
"type": "main",
"index": 0
}
]
]
},
"7": {
"main": [
[
{
"node": "8",
"type": "main",
"index": 0
}
]
]
},
"8": {
"main": [
[
{
"node": "9",
"type": "main",
"index": 0
}
]
]
},
"9": {
"main": [
[
{
"node": "10",
"type": "main",
"index": 0
}
]
]
},
"10": {
"main": [
[
{
"node": "11",
"type": "main",
"index": 0
},
{
"node": "15",
"type": "main",
"index": 0
}
]
]
},
"11": {
"main": [
[
{
"node": "12",
"type": "main",
"index": 0
}
]
]
},
"12": {
"main": [
[
{
"node": "13",
"type": "main",
"index": 0
}
]
]
}
}
}¿Cómo usar este flujo de trabajo?
Copie el código de configuración JSON de arriba, cree un nuevo flujo de trabajo en su instancia de n8n y seleccione "Importar desde JSON", pegue la configuración y luego modifique la configuración de credenciales según sea necesario.
¿En qué escenarios es adecuado este flujo de trabajo?
Intermedio - Redes sociales, Resumen de IA
¿Es de pago?
Este flujo de trabajo es completamente gratuito, puede importarlo y usarlo directamente. Sin embargo, tenga en cuenta que los servicios de terceros utilizados en el flujo de trabajo (como la API de OpenAI) pueden requerir un pago por su cuenta.
Flujos de trabajo relacionados recomendados
Rodrigue
@gbadouCompartir este flujo de trabajo