{
  "name": "Reseñas: borrador de respuesta con IA para aprobar",
  "nodes": [
    {
      "parameters": {
        "content": "## Borradores de respuesta a reseñas\nToma las reseñas nuevas (de una hoja de Google o de un webhook), pide a la IA un borrador con tu tono y lo guarda en la hoja con estado **Pendiente de revisión**.\n\n**Este flujo nunca publica nada.** Una persona lee cada borrador, lo corrige y lo publica a mano en tu Perfil de Empresa de Google.\n\nExplicación y ejemplos en «Cómo responder reseñas de Google con ChatGPT sin que suene a robot» de fernandorivera.es.",
        "height": 380,
        "width": 440,
        "color": 4
      },
      "id": "53ebfa41-892a-5ef1-bf0b-723f271abfdf",
      "name": "Nota: qué hace",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -640,
        -500
      ]
    },
    {
      "parameters": {
        "content": "## 1. Prepara la hoja\nPestaña **Reseñas**, columnas en la fila 1:\n\n`ID reseña` · `Fecha` · `Estrellas` · `Texto` · `Borrador IA` · `Estado` · `Revisado por`\n\nCada reseña nueva entra con `Estado` vacío. El flujo rellena `Borrador IA` y pone `Pendiente de revisión`. Cuando la publiques, cambia el estado a `Publicada` y pon tu nombre en `Revisado por`.\n\n**No pegues el nombre del cliente** ni datos de su compra: solo estrellas y texto.",
        "height": 380,
        "width": 440,
        "color": 5
      },
      "id": "dbab422c-bacf-58f3-ae1e-820965a56fe7",
      "name": "Nota: la hoja",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -180,
        -500
      ]
    },
    {
      "parameters": {
        "content": "## 2. Elige cómo entran las reseñas\n- **Hoja (arriba):** cada hora mira las filas con `Estado` vacío. Sirve si pegas las reseñas a mano o las vuelca otra herramienta.\n- **Webhook (abajo):** otra herramienta envía un POST con `id`, `estrellas` y `texto` en el cuerpo (JSON).\n\nBorra la entrada que no uses.\n\nCambia `TU_ID_DE_HOJA` en los dos nodos de Google Sheets, crea las credenciales de Google y OpenAI, y pega tu guía de tono en el nodo de OpenAI.",
        "height": 380,
        "width": 440,
        "color": 6
      },
      "id": "b119e514-0413-568d-86bb-d6338b9d302f",
      "name": "Nota: elige la entrada",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        280,
        -500
      ]
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 1
            }
          ]
        }
      },
      "id": "efe9e02d-7de8-5095-9dc4-4af855f062a4",
      "name": "Cada hora",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        -600,
        0
      ]
    },
    {
      "parameters": {
        "documentId": {
          "__rl": true,
          "value": "TU_ID_DE_HOJA",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Reseñas",
          "mode": "name"
        },
        "options": {}
      },
      "id": "9fa387c5-7a5a-55ae-b858-96c200ba2d48",
      "name": "Leer reseñas",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        -380,
        0
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose"
          },
          "conditions": [
            {
              "id": "403f646f-ffb5-582f-8dd4-930d87c0a657",
              "leftValue": "={{ $json['Estado'] }}",
              "rightValue": "",
              "operator": {
                "type": "string",
                "operation": "empty",
                "singleValue": true
              }
            },
            {
              "id": "2e295c7a-55d1-5644-8fb8-ccc294197cc1",
              "leftValue": "={{ $json['ID reseña'] }}",
              "rightValue": "",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "looseTypeValidation": true,
        "options": {}
      },
      "id": "ba2bde84-5086-56bd-87b3-f1b1f42f2d03",
      "name": "Sin borrador todavía",
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2,
      "position": [
        -160,
        0
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "3bf10a3a-5090-5f4f-b9aa-bca4dae4225a",
              "name": "id",
              "value": "={{ $json['ID reseña'] }}",
              "type": "string"
            },
            {
              "id": "8919e76a-0b43-555d-8335-946584acfba1",
              "name": "fecha",
              "value": "={{ $json['Fecha'] }}",
              "type": "string"
            },
            {
              "id": "9604e985-1327-5b7a-9512-b04d45170013",
              "name": "estrellas",
              "value": "={{ $json['Estrellas'] }}",
              "type": "string"
            },
            {
              "id": "0997bdb8-1e07-587a-af33-7c6a160be0a2",
              "name": "texto",
              "value": "={{ $json['Texto'] }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "76d373f2-f465-5fcd-9ca1-7e4a50857934",
      "name": "Datos de la hoja",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        60,
        0
      ]
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "nueva-resena",
        "options": {}
      },
      "id": "796650af-e0f2-53eb-9a4c-c90f0ae4989f",
      "name": "Webhook: nueva reseña",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        -380,
        240
      ],
      "webhookId": "67e316cc-7bda-5dad-a428-741e1e91f105"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "afb7d561-1b44-5200-9ef0-e3b5309a8211",
              "name": "id",
              "value": "={{ $json.body.id }}",
              "type": "string"
            },
            {
              "id": "1473dd0c-80ff-5380-ae50-832243f4ab68",
              "name": "fecha",
              "value": "={{ $json.body.fecha || $now.toFormat('yyyy-MM-dd') }}",
              "type": "string"
            },
            {
              "id": "99ea653c-5be1-5df6-976b-03c0050064b6",
              "name": "estrellas",
              "value": "={{ $json.body.estrellas }}",
              "type": "string"
            },
            {
              "id": "1b6a827c-2b86-521d-b1b9-f0b362151817",
              "name": "texto",
              "value": "={{ $json.body.texto }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "0539c49b-811f-5358-afc7-fd25fe154aa7",
      "name": "Datos del webhook",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        60,
        240
      ]
    },
    {
      "parameters": {},
      "id": "24e19d3c-5201-508d-9540-ffc7d2cd34ab",
      "name": "Reseña lista",
      "type": "n8n-nodes-base.noOp",
      "typeVersion": 1,
      "position": [
        280,
        120
      ]
    },
    {
      "parameters": {
        "modelId": {
          "__rl": true,
          "value": "gpt-4o-mini",
          "mode": "list",
          "cachedResultName": "GPT-4O-MINI"
        },
        "messages": {
          "values": [
            {
              "content": "Eres la persona que contesta las reseñas de [nombre de la tienda], una [tipo de negocio] en [ciudad]. Escribe una respuesta a la reseña siguiendo estas reglas:\n1. Tono: [pega aquí tu guía de tono].\n2. Máximo 4 frases. Nada de frases hechas como «tu opinión es muy importante para nosotros».\n3. Menciona algo concreto de lo que cuenta el cliente.\n4. Si es una queja: agradece, reconoce el problema sin excusas y ofrece hablarlo en la tienda o por [canal de contacto]. No prometas compensaciones.\n5. No inventes datos, nombres, fechas, políticas ni explicaciones que no aparezcan en la reseña.\n6. No incluyas datos personales del cliente.\n7. Firma como [nombre o «el equipo de…»].\n8. Si la reseña trata de acusaciones, salud o un conflicto con una persona del equipo, no redactes respuesta: escribe solo «REVISAR EN PERSONA».\nDevuelve solo el texto de la respuesta.",
              "role": "system"
            },
            {
              "content": "=Estrellas: {{ $json.estrellas }}\nReseña: «{{ $json.texto || '(sin texto)' }}»"
            }
          ]
        },
        "options": {
          "temperature": 0.6
        }
      },
      "id": "9841a746-acca-5eb6-ac44-343b10fc34a5",
      "name": "Redactar borrador (OpenAI)",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "typeVersion": 1.8,
      "position": [
        500,
        120
      ]
    },
    {
      "parameters": {
        "operation": "appendOrUpdate",
        "documentId": {
          "__rl": true,
          "value": "TU_ID_DE_HOJA",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Reseñas",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "ID reseña": "={{ $('Reseña lista').item.json.id }}",
            "Fecha": "={{ $('Reseña lista').item.json.fecha }}",
            "Estrellas": "={{ $('Reseña lista').item.json.estrellas }}",
            "Texto": "={{ $('Reseña lista').item.json.texto }}",
            "Borrador IA": "={{ $json.message.content }}",
            "Estado": "Pendiente de revisión"
          },
          "matchingColumns": [
            "ID reseña"
          ],
          "schema": [
            {
              "id": "ID reseña",
              "displayName": "ID reseña",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Fecha",
              "displayName": "Fecha",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Estrellas",
              "displayName": "Estrellas",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Texto",
              "displayName": "Texto",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Borrador IA",
              "displayName": "Borrador IA",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Estado",
              "displayName": "Estado",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Revisado por",
              "displayName": "Revisado por",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            }
          ]
        },
        "options": {}
      },
      "id": "ca2dc53e-8fc7-5fe8-8697-82fe65c15f45",
      "name": "Guardar para revisión",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        720,
        120
      ]
    },
    {
      "parameters": {
        "content": "### Por qué no publica solo\nUna respuesta desafortunada a una queja se ve mucho y dura años. La IA no conoce tus políticas ni a tus clientes: hace el borrador, y la última palabra es tuya.\n\nNo añadas aquí un nodo que publique en Google.",
        "height": 220,
        "width": 340,
        "color": 3
      },
      "id": "40c3fe5a-0cc8-50b1-886e-24cc25a261b5",
      "name": "Nota: nunca publica",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        640,
        300
      ]
    }
  ],
  "connections": {
    "Cada hora": {
      "main": [
        [
          {
            "node": "Leer reseñas",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Leer reseñas": {
      "main": [
        [
          {
            "node": "Sin borrador todavía",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sin borrador todavía": {
      "main": [
        [
          {
            "node": "Datos de la hoja",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Datos de la hoja": {
      "main": [
        [
          {
            "node": "Reseña lista",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook: nueva reseña": {
      "main": [
        [
          {
            "node": "Datos del webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Datos del webhook": {
      "main": [
        [
          {
            "node": "Reseña lista",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Reseña lista": {
      "main": [
        [
          {
            "node": "Redactar borrador (OpenAI)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Redactar borrador (OpenAI)": {
      "main": [
        [
          {
            "node": "Guardar para revisión",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "timezone": "Europe/Madrid"
  },
  "tags": []
}
