{
  "name": "KyndredAI · Calendly reserva → Sheets + recordatorio WhatsApp",
  "nodes": [
    {
      "parameters": {
        "content": "# 🔷 KyndredAI · Calendly reserva → Sheets + recordatorio\n\nCuando alguien **reserva un turno** en Calendly, lo **registra en Google Sheets** y le manda una **confirmación por WhatsApp**. Pensada para clínicas, estudios y servicios con agenda (menos ausencias).\n\n**Cómo funciona:** Webhook (invitee.created) → extrae nombre + email + horario → Google Sheets → WhatsApp de confirmación.\n\n**Necesitás:** Calendly (plan con webhooks) + Google Sheets + WhatsApp Cloud API.\n\n💡 Para el **recordatorio antes del turno**, mirá la nota violeta (flujo programado aparte que usa el horario guardado).\n\nself-hosted o cloud · kyndredai.com",
        "height": 380,
        "width": 880,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        240,
        64
      ],
      "id": "ce111551-60ec-4f07-b091-45ef89611d77",
      "name": "README"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "calendly-reserva",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        48,
        480
      ],
      "id": "ecbb687c-8d78-4670-a565-16d8c4a026c0",
      "name": "Recibir reserva (Webhook)",
      "webhookId": "2222aaaa-aaaa-4222-8222-222222222222"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "33000001-aaaa-4000-8000-000000000001",
              "name": "nombre",
              "value": "={{ $json.body.payload.name }}",
              "type": "string"
            },
            {
              "id": "33000002-aaaa-4000-8000-000000000002",
              "name": "email",
              "value": "={{ $json.body.payload.email }}",
              "type": "string"
            },
            {
              "id": "33000003-aaaa-4000-8000-000000000003",
              "name": "telefono",
              "value": "={{ $json.body.payload.text_reminder_number }}",
              "type": "string"
            },
            {
              "id": "33000004-aaaa-4000-8000-000000000004",
              "name": "inicio",
              "value": "={{ $json.body.payload.scheduled_event.start_time }}",
              "type": "string"
            },
            {
              "id": "33000005-aaaa-4000-8000-000000000005",
              "name": "evento",
              "value": "={{ $json.body.payload.scheduled_event.name }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        320,
        480
      ],
      "id": "42ad6e12-6305-4068-91d1-9aa4fbf1f515",
      "name": "Datos de la reserva"
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": {
          "__rl": true,
          "value": "",
          "mode": "list",
          "cachedResultName": ""
        },
        "sheetName": {
          "__rl": true,
          "value": "",
          "mode": "list",
          "cachedResultName": ""
        }
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        608,
        480
      ],
      "id": "27a11793-ce07-4011-8803-394cb39ed318",
      "name": "Guardar en Sheets",
      "retryOnFail": true,
      "maxTries": 3,
      "waitBetweenTries": 2000
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://graph.facebook.com/v21.0/TU_PHONE_NUMBER_ID/messages",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"messaging_product\": \"whatsapp\",\n  \"to\": \"{{ $json.telefono }}\",\n  \"type\": \"text\",\n  \"text\": {\n    \"body\": \"¡Hola {{ $json.nombre }}! Confirmamos tu turno ({{ $json.evento }}) para el {{ $json.inicio }}. Si no podés, avisanos respondiendo este mensaje. ¡Te esperamos!\"\n  }\n}",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        880,
        480
      ],
      "id": "45ccf693-14be-44cf-907a-54c8359a1b02",
      "name": "Confirmar por WhatsApp",
      "retryOnFail": true,
      "maxTries": 3,
      "waitBetweenTries": 2000
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.noOp",
      "typeVersion": 1,
      "position": [
        1152,
        480
      ],
      "id": "8f656c19-48ec-4e92-9ebf-2bf9f2f14031",
      "name": "Listo"
    },
    {
      "parameters": {
        "content": "## ① Calendly\n\n1. Necesitás un plan de Calendly con **webhooks**.\n2. Creá una suscripción al evento **invitee.created** apuntando a la URL de este nodo.\n3. Para tener el **teléfono**, agregá la pregunta de teléfono / SMS reminder en tu tipo de evento (cae en `text_reminder_number`).",
        "height": 340,
        "width": 320,
        "color": 4
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        64,
        656
      ],
      "id": "c31a9112-239b-4e41-9d8a-9ab58c9307ae",
      "name": "Setup 1"
    },
    {
      "parameters": {
        "content": "## ② Sheets + WhatsApp\n\n**Sheets:** conectá tu Google → planilla + pestaña, mapeo automático. Encabezados: **nombre · email · telefono · inicio · evento**.\n\n**WhatsApp:** Cloud API — reemplazá `TU_PHONE_NUMBER_ID` y poné el token en Header Auth (`Authorization: Bearer ...`).",
        "height": 336,
        "width": 320,
        "color": 4
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        496,
        656
      ],
      "id": "8fadd05a-9550-4a18-91b9-8429ab382f1a",
      "name": "Setup 2"
    },
    {
      "parameters": {
        "content": "### ⏰ Recordatorio antes del turno\n\nEste flujo manda la **confirmación** al reservar. Para el **recordatorio (ej. 24 hs antes)**, armá un flujo programado aparte:\n\n**Schedule Trigger** (cada hora) → leé la planilla → filtrá los turnos que arrancan en ~24 hs → mandá el WhatsApp.\n\nLo dejamos separado para no acoplar dependencias.",
        "height": 336,
        "width": 320,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        912,
        656
      ],
      "id": "e51f32a9-3d22-4c30-a1b0-ff35cce5ec09",
      "name": "Nota recordatorio"
    }
  ],
  "connections": {
    "Recibir reserva (Webhook)": {
      "main": [
        [
          {
            "node": "Datos de la reserva",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Datos de la reserva": {
      "main": [
        [
          {
            "node": "Guardar en Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Guardar en Sheets": {
      "main": [
        [
          {
            "node": "Confirmar por WhatsApp",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Confirmar por WhatsApp": {
      "main": [
        [
          {
            "node": "Listo",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "pinData": {},
  "tags": []
}
