{
  "name": "LinkedFlow · 4 · El informe del lunes",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            { "field": "weeks", "triggerAtDay": [1], "triggerAtHour": 7, "triggerAtMinute": 0 }
          ]
        }
      },
      "id": "d4000000-0000-4000-8000-000000000001",
      "name": "Lunes 07:00",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [-780, 0]
    },
    {
      "parameters": {
        "url": "https://app.linkedflow.pro/api/v1/dashboard/stats",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendHeaders": true,
        "headerParameters": { "parameters": [{ "name": "Accept", "value": "application/json" }] },
        "options": {}
      },
      "id": "d4000000-0000-4000-8000-000000000002",
      "name": "GET /dashboard/stats",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [-540, 0],
      "credentials": {
        "httpHeaderAuth": { "id": "REEMPLAZAR", "name": "LinkedFlow API (Authorization: Bearer …)" }
      },
      "notes": "Contadores planos del workspace: visitas, invitaciones, aceptadas, mensajes, respuestas, cuentas y errores."
    },
    {
      "parameters": {
        "url": "https://app.linkedflow.pro/api/v1/dashboard/funnel",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendHeaders": true,
        "headerParameters": { "parameters": [{ "name": "Accept", "value": "application/json" }] },
        "options": {}
      },
      "id": "d4000000-0000-4000-8000-000000000003",
      "name": "GET /dashboard/funnel",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [-300, 0],
      "credentials": {
        "httpHeaderAuth": { "id": "REEMPLAZAR", "name": "LinkedFlow API (Authorization: Bearer …)" }
      },
      "notes": "Devuelve stages[] con count y conversion_from_previous: ahí se ve en qué escalón se cae la gente."
    },
    {
      "parameters": {
        "url": "https://app.linkedflow.pro/api/v1/errors/unmanaged",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendHeaders": true,
        "headerParameters": { "parameters": [{ "name": "Accept", "value": "application/json" }] },
        "options": {}
      },
      "id": "d4000000-0000-4000-8000-000000000004",
      "name": "GET /errors/unmanaged",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [-60, 0],
      "credentials": {
        "httpHeaderAuth": { "id": "REEMPLAZAR", "name": "LinkedFlow API (Authorization: Bearer …)" }
      },
      "notes": "Devuelve { unmanaged: [], retrying: [] }. Lo que está en unmanaged espera una decisión tuya."
    },
    {
      "parameters": {
        "jsCode": "// Se leen los tres nodos por su nombre en vez de juntarlos con un Merge:\n// menos piezas y no hay que configurar entradas múltiples.\nconst stats = $('GET /dashboard/stats').first().json;\nconst funnel = $('GET /dashboard/funnel').first().json;\nconst errores = $('GET /errors/unmanaged').first().json;\n\nconst etapas = (funnel.stages || []).map((e) =>\n  `${e.label}: ${e.count}` + (e.conversion_from_previous !== null ? ` (${e.conversion_from_previous}% del paso anterior)` : '')\n);\n\n// El escalón donde más gente se cae — el dato que de verdad decide la semana.\nconst caidas = (funnel.stages || [])\n  .filter((e) => e.conversion_from_previous !== null)\n  .sort((a, b) => a.conversion_from_previous - b.conversion_from_previous);\nconst cuelloBotella = caidas[0]\n  ? `${caidas[0].label}: solo pasa el ${caidas[0].conversion_from_previous}%`\n  : 'sin datos suficientes';\n\nconst sinGestionar = (errores.unmanaged || []).length;\nconst reintentando = (errores.retrying || []).length;\n\nconst informe = [\n  `Semana del ${new Date().toISOString().slice(0, 10)}`,\n  '',\n  'EMBUDO',\n  ...etapas.map((l) => '  ' + l),\n  '',\n  `CUELLO DE BOTELLA: ${cuelloBotella}`,\n  '',\n  'ACUMULADO',\n  `  Visitas ${stats.visits_total} · Invitaciones ${stats.invitations_total} · Aceptadas ${stats.accepted_total}`,\n  `  Mensajes ${stats.messages_total} · Respuestas ${stats.replies_total} (positivas ${stats.positive_replies_total})`,\n  `  Cuentas activas ${stats.accounts_active}, pausadas ${stats.accounts_paused} · Workflows activos ${stats.workflows_active}`,\n  '',\n  `PENDIENTE DE TI: ${sinGestionar} fallo(s) sin gestionar · ${reintentando} reintentándose solos`\n].join('\\n');\n\nreturn [{\n  json: {\n    informe,\n    cuello_botella: cuelloBotella,\n    errores_sin_gestionar: sinGestionar,\n    prompt: 'Con estos datos de prospección de LinkedIn, dame TRES decisiones concretas para esta semana. ' +\n      'Nada de gráficas ni de felicitaciones: qué cambio en la nota de invitación, qué segmento abandono y qué error arreglo primero. ' +\n      'Sé breve y directo.\\n\\n' + informe\n  }\n}];"
      },
      "id": "d4000000-0000-4000-8000-000000000005",
      "name": "Montar el informe",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [180, 0],
      "notes": "Sale un texto legible tal cual (campo «informe») y un «prompt» listo para el modelo. Aunque no enchufes IA, el informe ya sirve."
    },
    {
      "parameters": {},
      "id": "d4000000-0000-4000-8000-000000000006",
      "name": "IA + email (tus nodos)",
      "type": "n8n-nodes-base.noOp",
      "typeVersion": 1,
      "position": [420, 0],
      "notes": "Encadena tu modelo con {{ $json.prompt }} y un nodo de email. O manda {{ $json.informe }} tal cual y te ahorras la IA."
    }
  ],
  "connections": {
    "Lunes 07:00": { "main": [[{ "node": "GET /dashboard/stats", "type": "main", "index": 0 }]] },
    "GET /dashboard/stats": { "main": [[{ "node": "GET /dashboard/funnel", "type": "main", "index": 0 }]] },
    "GET /dashboard/funnel": { "main": [[{ "node": "GET /errors/unmanaged", "type": "main", "index": 0 }]] },
    "GET /errors/unmanaged": { "main": [[{ "node": "Montar el informe", "type": "main", "index": 0 }]] },
    "Montar el informe": { "main": [[{ "node": "IA + email (tus nodos)", "type": "main", "index": 0 }]] }
  },
  "settings": { "executionOrder": "v1" },
  "meta": {
    "descripcion": "Lee los contadores, el embudo y los fallos sin gestionar por la API y arma un informe con las tres decisiones de la semana. Las llamadas van encadenadas (no en paralelo con un Merge): así solo hay que configurar una credencial y no hay entradas múltiples que cuadrar. Los números son los mismos que pinta el dashboard de la app."
  }
}
