{
  "name": "Blog → Campaña de contenido con IA (con revisión humana)",
  "nodes": [
    {
      "parameters": {
        "pollTimes": {
          "item": [
            {
              "mode": "everyHour"
            }
          ]
        },
        "feedUrl": "https://TU-BLOG.com/rss.xml"
      },
      "id": "f803e874-d5d0-4ad8-aa4c-8c69f83206c3",
      "name": "Nuevo artículo en el blog",
      "type": "n8n-nodes-base.rssFeedReadTrigger",
      "typeVersion": 1,
      "position": [
        0,
        0
      ],
      "notes": "Cambia la URL por el feed RSS real del blog. Cada artículo nuevo dispara la campaña."
    },
    {
      "parameters": {},
      "id": "2a328427-9205-4142-92e3-7edafcd3299c",
      "name": "Probar con una URL",
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        0,
        220
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "8b6e9f95-5e56-4310-9e03-1493da4f73aa",
              "name": "link",
              "value": "https://TU-BLOG.com/un-articulo",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "7e0d3315-3037-42f7-ac30-06eb98dfec64",
      "name": "URL de prueba",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        220,
        220
      ]
    },
    {
      "parameters": {
        "url": "={{ $json.link }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "text",
              "outputPropertyName": "html"
            }
          }
        }
      },
      "id": "2745af0c-36a1-456a-a0b5-a228014d57e2",
      "name": "Descargar artículo",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        460,
        100
      ]
    },
    {
      "parameters": {
        "operation": "extractHtmlContent",
        "dataPropertyName": "html",
        "extractionValues": {
          "values": [
            {
              "key": "titulo",
              "cssSelector": "h1"
            },
            {
              "key": "cuerpo",
              "cssSelector": "article",
              "returnValue": "text"
            }
          ]
        },
        "options": {
          "trimValues": true,
          "cleanUpText": true
        }
      },
      "id": "b3decc2a-f3c2-4cd2-b80c-7f2be4a61176",
      "name": "Extraer texto",
      "type": "n8n-nodes-base.html",
      "typeVersion": 1.2,
      "position": [
        680,
        100
      ]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Convierte este artículo en una mini campaña.\n\nTÍTULO: {{ $json.titulo }}\nURL: {{ $('Descargar artículo').item.json.url ?? $json.url }}\nTEXTO:\n{{ $json.cuerpo.slice(0, 12000) }}\n\nEntrega:\n1. post_linkedin: 900-1300 caracteres, primera línea que enganche antes del \"ver más\", 3 párrafos cortos máximo, cierre con pregunta y enlace.\n2. ganchos: 3 primeras líneas alternativas para test A/B.\n3. carrusel: 6-8 diapositivas {titulo (máx 8 palabras), texto (máx 25 palabras)}; la última es el CTA.\n4. newsletter: {asunto (máx 50 caracteres), preheader (máx 90), cuerpo (120-180 palabras)}.\n5. video_corto: guion de 30 s en 6-8 frases de pantalla para tipografía animada.",
        "hasOutputParser": true,
        "messages": {
          "messageValues": [
            {
              "message": "Eres el redactor de contenidos B2B de una consultora tecnológica (adopción de IA, seguridad y cumplimiento para empresas que manejan datos de terceros). Ajusta aquí la voz de marca de cada cliente.\n\nVOZ DE MARCA\n- Tuteo, directo y cercano. Frases cortas. Sin jerga ni humo comercial.\n- Honesto con los límites: si algo no aplica, se dice. Nada de prometer certificados ni resultados que el artículo no respalde.\n- Ideas fuerza de la marca que puedes usar cuando encajen: \"La IA no tiene permisos propios: usa los de quien pregunta\", \"Comprar la licencia no es adoptar nada\".\n\nREGLAS\n- Usa SOLO datos, fechas y cifras que aparezcan en el artículo. Si no hay cifra, no la inventes.\n- Público: dirección y responsables de despachos, gestorías, finanzas, clínicas y notarías.\n- El CTA siempre lleva a una acción real de la empresa (leer el artículo completo o pedir una auditoría).\n- Devuelve exclusivamente el JSON pedido."
            }
          ]
        }
      },
      "id": "77d7781f-bbe6-4781-8d0a-0390c0e2b2c3",
      "name": "Redactar piezas con Claude",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.5,
      "position": [
        920,
        100
      ]
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "claude-sonnet-4-5",
          "cachedResultName": "Claude Sonnet"
        },
        "options": {
          "maxTokensToSample": 4000,
          "temperature": 0.6
        }
      },
      "id": "8243a91f-ae98-416e-9c48-f71f5792e4ba",
      "name": "Claude (Anthropic)",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "typeVersion": 1.3,
      "position": [
        880,
        320
      ],
      "notes": "Conecta tu credencial de Anthropic. Se puede cambiar por OpenAI o Gemini sin tocar el resto."
    },
    {
      "parameters": {
        "jsonSchemaExample": "{\n  \"post_linkedin\": \"Texto del post…\",\n  \"ganchos\": [\n    \"Gancho A\",\n    \"Gancho B\",\n    \"Gancho C\"\n  ],\n  \"carrusel\": [\n    {\n      \"titulo\": \"Título de la diapositiva\",\n      \"texto\": \"Texto breve\"\n    }\n  ],\n  \"newsletter\": {\n    \"asunto\": \"Asunto\",\n    \"preheader\": \"Preheader\",\n    \"cuerpo\": \"Cuerpo\"\n  },\n  \"video_corto\": [\n    \"Frase 1\",\n    \"Frase 2\"\n  ]\n}"
      },
      "id": "670ddee4-b240-4f6f-a920-a3801eb28b67",
      "name": "Formato JSON",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "typeVersion": 1.2,
      "position": [
        1060,
        320
      ]
    },
    {
      "parameters": {
        "jsCode": "// Une el resultado de la IA con los datos del artículo y lo prepara para la hoja y el aviso\nconst art = $('Extraer texto').first().json;\nconst src = $('Descargar artículo').first().json;\nreturn $input.all().map(item => {\n  const o = item.json.output ?? item.json;\n  const carrusel = (o.carrusel || []).map((s, i) => `${i + 1}. ${s.titulo} — ${s.texto}`).join('\\n');\n  return { json: {\n    fecha: new Date().toISOString().slice(0, 10),\n    articulo: art.titulo,\n    url: src.url || '',\n    post_linkedin: o.post_linkedin,\n    gancho_a: o.ganchos?.[0] ?? '', gancho_b: o.ganchos?.[1] ?? '', gancho_c: o.ganchos?.[2] ?? '',\n    carrusel,\n    newsletter_asunto: o.newsletter?.asunto ?? '',\n    newsletter_preheader: o.newsletter?.preheader ?? '',\n    newsletter_cuerpo: o.newsletter?.cuerpo ?? '',\n    guion_video: (o.video_corto || []).join(' / '),\n    estado: 'Pendiente de revisión',\n    caracteres_post: (o.post_linkedin || '').length,\n  }};\n});"
      },
      "id": "a0f113fc-5fde-4a91-9c3e-7a4a095c98df",
      "name": "Preparar piezas",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1200,
        100
      ]
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": {
          "__rl": true,
          "mode": "url",
          "value": "https://docs.google.com/spreadsheets/d/PON_AQUI_TU_HOJA"
        },
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Calendario"
        },
        "columns": {
          "mappingMode": "autoMapInputData",
          "value": {}
        },
        "options": {}
      },
      "id": "c7049b2f-7077-4e11-a194-9e1cb2afb839",
      "name": "Calendario de contenidos",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        1440,
        0
      ],
      "notes": "Cada campaña queda como una fila 'Pendiente de revisión'. Nada se publica solo."
    },
    {
      "parameters": {
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "name",
          "value": "#contenido"
        },
        "text": "=:memo: *Nueva campaña lista para revisar*\n*Artículo:* {{ $json.articulo }}\n*Gancho principal:* {{ $json.gancho_a }}\n*Newsletter:* {{ $json.newsletter_asunto }}\n\nRevisa y aprueba en el calendario de contenidos antes de publicar. Responsable: equipo de Marketing.",
        "otherOptions": {}
      },
      "id": "bd412c5a-2600-4fac-a8a1-99bacedd1982",
      "name": "Avisar al responsable",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.2,
      "position": [
        1440,
        220
      ]
    },
    {
      "parameters": {
        "content": "## Blog → campaña de contenido\nCada artículo nuevo del blog se convierte en: post de LinkedIn + 3 ganchos A/B + guion de carrusel + bloque de newsletter + guion de vídeo de 30 s.\n\n**Con revisión humana:** todo llega a una hoja como *Pendiente de revisión* y se avisa al responsable en Slack. La IA redacta; una persona decide.\n\nHecho por Johan Barrios",
        "height": 220,
        "width": 520,
        "color": 5
      },
      "id": "5e3c58b5-a9c7-46fb-be55-896dd9811c50",
      "name": "Nota: cómo funciona",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -40,
        -260
      ]
    },
    {
      "parameters": {
        "content": "### Voz de marca en el prompt\nTuteo, frases cortas, sin humo. Solo cifras que estén en el artículo. CTA siempre a una acción real (leer el artículo o pedir la auditoría).",
        "height": 200,
        "width": 420,
        "color": 4
      },
      "id": "8b56f0ac-5380-40d4-9f77-0612c65570a7",
      "name": "Nota: voz de marca",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        880,
        -260
      ]
    }
  ],
  "connections": {
    "Nuevo artículo en el blog": {
      "main": [
        [
          {
            "node": "Descargar artículo",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Probar con una URL": {
      "main": [
        [
          {
            "node": "URL de prueba",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "URL de prueba": {
      "main": [
        [
          {
            "node": "Descargar artículo",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Descargar artículo": {
      "main": [
        [
          {
            "node": "Extraer texto",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extraer texto": {
      "main": [
        [
          {
            "node": "Redactar piezas con Claude",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Redactar piezas con Claude": {
      "main": [
        [
          {
            "node": "Preparar piezas",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Preparar piezas": {
      "main": [
        [
          {
            "node": "Calendario de contenidos",
            "type": "main",
            "index": 0
          },
          {
            "node": "Avisar al responsable",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude (Anthropic)": {
      "ai_languageModel": [
        [
          {
            "node": "Redactar piezas con Claude",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Formato JSON": {
      "ai_outputParser": [
        [
          {
            "node": "Redactar piezas con Claude",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "pinData": {},
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "tags": []
}