{
  "name": "Torus Academy - Webhook cita a Google Calendar",
  "nodes": [
    {
      "id": "nodo-webhook",
      "name": "Webhook - Recibe la cita",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [240, 300],
      "parameters": {
        "httpMethod": "POST",
        "path": "torus-academy-cita",
        "responseMode": "responseNode",
        "options": {}
      },
      "notes": "Esta es la URL que configurarás como Webhook en Vapi o Retell (módulo 3.4). Genera una URL de prueba y una URL de producción; usa siempre la de producción para la llamada real."
    },
    {
      "id": "nodo-normalizar",
      "name": "Normalizar datos de la cita",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [460, 300],
      "parameters": {
        "mode": "manual",
        "assignments": {
          "assignments": [
            {
              "id": "asig-nombre",
              "name": "nombre_cliente",
              "type": "string",
              "value": "={{$json.body.nombre}}"
            },
            {
              "id": "asig-telefono",
              "name": "telefono_cliente",
              "type": "string",
              "value": "={{$json.body.telefono}}"
            },
            {
              "id": "asig-servicio",
              "name": "servicio",
              "type": "string",
              "value": "={{$json.body.servicio}}"
            },
            {
              "id": "asig-inicio",
              "name": "fecha_hora_inicio",
              "type": "string",
              "value": "={{$json.body.fecha_hora_inicio}}"
            },
            {
              "id": "asig-fin",
              "name": "fecha_hora_fin",
              "type": "string",
              "value": "={{$json.body.fecha_hora_fin}}"
            }
          ]
        },
        "options": {}
      },
      "notes": "Este nodo lee el payload JSON que envía el agente (ver módulo 3.1) y le da nombres de campo claros y estables, para no depender del formato exacto que use Vapi o Retell."
    },
    {
      "id": "nodo-calendario",
      "name": "Crear evento en Google Calendar",
      "type": "n8n-nodes-base.googleCalendar",
      "typeVersion": 1.3,
      "position": [680, 300],
      "parameters": {
        "operation": "create",
        "calendar": {
          "__rl": true,
          "mode": "list",
          "value": "PON_AQUI_EL_ID_DE_TU_CALENDARIO"
        },
        "start": "={{$json.fecha_hora_inicio}}",
        "end": "={{$json.fecha_hora_fin}}",
        "additionalFields": {
          "summary": "={{$json.servicio}} - {{$json.nombre_cliente}}",
          "description": "=Cliente: {{$json.nombre_cliente}}\nTeléfono: {{$json.telefono_cliente}}\nReservado automáticamente por el agente telefónico."
        }
      },
      "notes": "Tras importar, sustituye 'PON_AQUI_EL_ID_DE_TU_CALENDARIO' seleccionando tu propio calendario (módulo 3.2) desde el desplegable de este nodo, y conecta tu credencial de Google Calendar (OAuth, módulo 3.2) la primera vez que abras el nodo."
    },
    {
      "id": "nodo-respuesta",
      "name": "Responder al agente",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.4,
      "position": [900, 300],
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ { \"confirmado\": true, \"cliente\": $json.nombre_cliente, \"inicio\": $json.fecha_hora_inicio } }}"
      },
      "notes": "Esta respuesta JSON es la que Vapi o Retell recibirán como resultado del Tool Call, y que el agente puede usar para confirmar la cita en voz alta."
    }
  ],
  "connections": {
    "Webhook - Recibe la cita": {
      "main": [
        [{ "node": "Normalizar datos de la cita", "type": "main", "index": 0 }]
      ]
    },
    "Normalizar datos de la cita": {
      "main": [
        [{ "node": "Crear evento en Google Calendar", "type": "main", "index": 0 }]
      ]
    },
    "Crear evento en Google Calendar": {
      "main": [
        [{ "node": "Responder al agente", "type": "main", "index": 0 }]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "meta": {
    "descripcion": "Blueprint incluido en los recursos del curso Torus Academy. Recibe por Webhook los datos de una cita solicitada por el agente telefónico, crea el evento en Google Calendar y devuelve una confirmación en JSON. Importar con: menú de n8n > Import from File. Configurar después de importar: credencial de Google Calendar (OAuth) y el ID del calendario del negocio (módulo 3.2). No importa credenciales: n8n no exporta claves ni tokens por seguridad.",
    "version_curso": "2026-08-30"
  }
}
