{
  "name": "Triage de correos de soporte (plano de Saphia Labs)",
  "nodes": [
    {
      "parameters": {
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "simple": true,
        "filters": {
          "q": "-category:promotions -category:social -label:n8n-triage -in:drafts"
        }
      },
      "id": "trig",
      "name": "Gmail Trigger",
      "type": "n8n-nodes-base.gmailTrigger",
      "typeVersion": 1.2,
      "position": [
        0,
        0
      ]
    },
    {
      "parameters": {
        "operation": "read",
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "TU_SPREADSHEET_ID"
        },
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "respuestas"
        },
        "options": {}
      },
      "id": "faq",
      "name": "Sheets: respuestas aprobadas",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        260,
        0
      ],
      "executeOnce": true
    },
    {
      "parameters": {
        "jsCode": "// Una fila por correo, cada una con la lista completa de respuestas aprobadas\nconst faqs = $input.all().map(r => ({ pregunta: r.json.pregunta, respuesta: r.json.respuesta }));\nreturn $('Gmail Trigger').all().map(e => ({ json: {\n  id: e.json.id, threadId: e.json.threadId,\n  de: e.json.from || e.json.From || '', asunto: e.json.subject || e.json.Subject || '',\n  texto: String(e.json.text || e.json.snippet || '').slice(0, 3000),\n  faqs,\n} }));"
      },
      "id": "code",
      "name": "Code: unir correo y respuestas",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        520,
        0
      ]
    },
    {
      "parameters": {
        "resource": "text",
        "operation": "message",
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "claude-sonnet-5-5"
        },
        "messages": {
          "values": [
            {
              "role": "user",
              "content": "={{ 'CORREO\\nDe: ' + $json.de + '\\nAsunto: ' + $json.asunto + '\\n' + $json.texto + '\\n\\nRESPUESTAS APROBADAS\\n' + JSON.stringify($json.faqs, null, 2) }}"
            }
          ]
        },
        "options": {
          "system": "Eres quien atiende el buzón de [organización]. Recibes un correo y una lista de respuestas aprobadas (pregunta frecuente → respuesta). Devuelve SOLO un JSON:\n{\"tema\": \"pedido | queja | precio | admision | otro\", \"urgencia\": \"alta | media | baja\", \"tono\": \"neutral | molesto | urgente\", \"resumen\": \"una frase\", \"borrador\": \"respuesta lista para enviar o null\"}\nReglas del borrador: solo si el correo coincide con una respuesta aprobada; adapta el saludo y el nombre, no cambies precios, plazos ni políticas; de usted, máximo 6 líneas; si hay queja, reconoce el problema en una frase antes de responder. Si no coincide con ninguna respuesta aprobada, borrador = null. Urgencia alta: amenazas de cancelar, plazos de hoy, menores en riesgo, dinero cobrado de más.",
          "maxTokens": 4000
        }
      },
      "id": "claude",
      "name": "Claude: clasificar y redactar",
      "type": "@n8n/n8n-nodes-langchain.anthropic",
      "typeVersion": 1,
      "position": [
        780,
        0
      ]
    },
    {
      "parameters": {
        "jsCode": "// Extrae el JSON de la respuesta (quita ```json``` si viene) y lo une con su correo\nconst texto = ($input.item.json.content || []).filter(b => b.type === 'text').map(b => b.text).join('\\n').trim();\nconst limpio = texto.replace(/^```(?:json)?\\s*/i, '').replace(/```\\s*$/, '');\nlet r; try { r = JSON.parse(limpio); } catch (e) { r = { tema: 'otro', urgencia: 'media', tono: 'neutral', resumen: 'No se pudo interpretar la respuesta del modelo', borrador: null, error: texto.slice(0, 300) }; }\nconst c = $('Code: unir correo y respuestas').item.json;\nreturn { json: { ...r, id: c.id, threadId: c.threadId, de: c.de, asunto: c.asunto, fecha: $now.toISO() } };",
        "mode": "runOnceForEachItem"
      },
      "id": "parse",
      "name": "Code: leer clasificación",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1040,
        0
      ]
    },
    {
      "parameters": {
        "operation": "addLabels",
        "messageId": "={{ $json.id }}",
        "labelIds": [
          "TU_LABEL_ID"
        ]
      },
      "id": "label",
      "name": "Gmail: etiquetar n8n-triage",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        1300,
        -160
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose",
            "version": 2
          },
          "conditions": [
            {
              "id": "c1",
              "leftValue": "={{ $json.borrador }}",
              "rightValue": "",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "if",
      "name": "IF: hay borrador",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        1300,
        0
      ]
    },
    {
      "parameters": {
        "resource": "draft",
        "subject": "=Re: {{ $json.asunto }}",
        "emailType": "text",
        "message": "={{ $json.borrador }}",
        "options": {
          "threadId": "={{ $json.threadId }}",
          "sendTo": "={{ $json.de }}"
        }
      },
      "id": "draft",
      "name": "Gmail: crear borrador",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        1560,
        -80
      ]
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "TU_SPREADSHEET_ID"
        },
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "registro"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "fecha": "={{ $('Code: leer clasificación').item.json.fecha }}",
            "de": "={{ $('Code: leer clasificación').item.json.de }}",
            "asunto": "={{ $('Code: leer clasificación').item.json.asunto }}",
            "tema": "={{ $('Code: leer clasificación').item.json.tema }}",
            "urgencia": "={{ $('Code: leer clasificación').item.json.urgencia }}",
            "tono": "={{ $('Code: leer clasificación').item.json.tono }}",
            "resumen": "={{ $('Code: leer clasificación').item.json.resumen }}",
            "borrador": "={{ $('Code: leer clasificación').item.json.borrador ? 'sí' : 'no' }}"
          },
          "matchingColumns": [],
          "schema": [
            {
              "id": "fecha",
              "displayName": "fecha",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "de",
              "displayName": "de",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "asunto",
              "displayName": "asunto",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "tema",
              "displayName": "tema",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "urgencia",
              "displayName": "urgencia",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "tono",
              "displayName": "tono",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "resumen",
              "displayName": "resumen",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "borrador",
              "displayName": "borrador",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            }
          ]
        },
        "options": {}
      },
      "id": "log",
      "name": "Sheets: registrar",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        1820,
        0
      ]
    },
    {
      "parameters": {
        "chatId": "TU_CHAT_ID",
        "text": "=🔴 Correo urgente: {{ $json.de }} · {{ $json.asunto }}\n{{ $json.resumen }}",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "id": "alert",
      "name": "Telegram: alerta urgente",
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        1560,
        160
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose",
            "version": 2
          },
          "conditions": [
            {
              "id": "u1",
              "leftValue": "={{ $json.urgencia }}",
              "rightValue": "alta",
              "operator": {
                "type": "string",
                "operation": "equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "ifu",
      "name": "IF: urgencia alta",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        1300,
        160
      ]
    }
  ],
  "connections": {
    "Gmail Trigger": {
      "main": [
        [
          {
            "node": "Sheets: respuestas aprobadas",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sheets: respuestas aprobadas": {
      "main": [
        [
          {
            "node": "Code: unir correo y respuestas",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code: unir correo y respuestas": {
      "main": [
        [
          {
            "node": "Claude: clasificar y redactar",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude: clasificar y redactar": {
      "main": [
        [
          {
            "node": "Code: leer clasificación",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code: leer clasificación": {
      "main": [
        [
          {
            "node": "Gmail: etiquetar n8n-triage",
            "type": "main",
            "index": 0
          },
          {
            "node": "IF: hay borrador",
            "type": "main",
            "index": 0
          },
          {
            "node": "IF: urgencia alta",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF: hay borrador": {
      "main": [
        [
          {
            "node": "Gmail: crear borrador",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Sheets: registrar",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gmail: crear borrador": {
      "main": [
        [
          {
            "node": "Sheets: registrar",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF: urgencia alta": {
      "main": [
        [
          {
            "node": "Telegram: alerta urgente",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    }
  },
  "settings": {
    "executionOrder": "v1",
    "timezone": "America/Bogota"
  },
  "meta": {
    "templateCredsSetupCompleted": false,
    "probadoEn": "n8n 2.41.6, octubre 2026",
    "fuente": "https://saphialabs.com/recursos/flujos/#f3",
    "preparacion": "Crea una hoja con pestañas \"respuestas\" (columnas pregunta, respuesta) y \"registro\" (fecha, de, asunto, tema, urgencia, tono, resumen, borrador), y una etiqueta n8n-triage en Gmail. Reemplaza TU_SPREADSHEET_ID, TU_LABEL_ID y TU_CHAT_ID."
  }
}