{
  "name": "Calendly Bookings to Notion",
  "nodes": [
    {
      "parameters": {
        "content": "## Calendly Bookings to Notion CRM\n\nEvery discovery call booked in Calendly appears in your Notion CRM before the meeting - name, email, meeting time, and their answers to your screening questions.\n\n**Setup time:** 10 minutes  ·  **Level:** Beginner\n\n**You'll need accounts/credentials for:** Calendly, Notion\n\n**Replace these before running:**\n- `REPLACE_WITH_YOUR_DATABASE`\n\n**Setup steps:**\n1. Connect Calendly with a personal access token in the trigger node.\n2. Connect Notion: share your CRM database with your integration, then select it in the Notion node.\n3. Match the property names in the Notion node to your database columns (template expects: Name, Email, Meeting, Date, Notes).\n4. Activate and book a test slot on your own Calendly.\n\nFree templates and updates: navkhan103.github.io",
        "height": 596,
        "width": 400,
        "color": 4
      },
      "id": "sticky-setup",
      "name": "Setup — read me first",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -440,
        -40
      ]
    },
    {
      "parameters": {
        "content": "### How it runs\n\nStarts from **New Booking**.\n\n1. A Calendly Trigger fires when an invitee books (invitee.created).\n2. A Code node extracts name, email, event type, start time, and any custom question answers.\n3. A Notion node creates a page in your CRM database with those properties.",
        "height": 322,
        "width": 400,
        "color": 7
      },
      "id": "sticky-how",
      "name": "How it runs",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -440,
        596
      ]
    },
    {
      "parameters": {
        "content": "### If something breaks\n\nThe read and AI nodes here **retry 3× automatically** (5s apart), which absorbs rate limits and brief timeouts.\n\nNodes that **send or write deliberately do not retry** — a send that reached the far end but lost its response would otherwise fire twice, so you'd get duplicate messages or duplicate rows.\n\nTo be told when one of those fails, build a workflow starting with an **Error Trigger** node that posts to Slack or email, then set it under **three-dot menu > Settings > Error Workflow**. Do it once and point every workflow at it.",
        "height": 400,
        "width": 400,
        "color": 3
      },
      "id": "sticky-fail",
      "name": "If something breaks",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -440,
        958
      ]
    },
    {
      "parameters": {
        "events": [
          "invitee.created"
        ]
      },
      "id": "c6d7e8f9-0001-4000-8000-000000000001",
      "name": "New Booking",
      "type": "n8n-nodes-base.calendlyTrigger",
      "typeVersion": 1,
      "position": [
        0,
        0
      ]
    },
    {
      "parameters": {
        "jsCode": "const p = $input.first().json.payload || $input.first().json;\nconst qa = (p.questions_and_answers || []).map(x => `${x.question}: ${x.answer}`).join('\\n');\nreturn [{ json: {\n  name: p.name || `${p.first_name || ''} ${p.last_name || ''}`.trim(),\n  email: p.email || '',\n  meeting: p.scheduled_event?.name || 'Meeting',\n  start: p.scheduled_event?.start_time || '',\n  notes: qa || 'No screening answers'\n} }];"
      },
      "id": "c6d7e8f9-0002-4000-8000-000000000002",
      "name": "Extract Invitee",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        220,
        0
      ]
    },
    {
      "parameters": {
        "resource": "databasePage",
        "databaseId": {
          "__rl": true,
          "mode": "list",
          "value": "REPLACE_WITH_YOUR_DATABASE"
        },
        "title": "={{ $json.name }}",
        "propertiesUi": {
          "propertyValues": [
            {
              "key": "Email|email",
              "emailValue": "={{ $json.email }}"
            },
            {
              "key": "Meeting|rich_text",
              "textContent": "={{ $json.meeting }}"
            },
            {
              "key": "Date|date",
              "date": "={{ $json.start }}"
            },
            {
              "key": "Notes|rich_text",
              "textContent": "={{ $json.notes }}"
            }
          ]
        }
      },
      "id": "c6d7e8f9-0003-4000-8000-000000000003",
      "name": "Create Notion Page",
      "type": "n8n-nodes-base.notion",
      "typeVersion": 2.2,
      "position": [
        440,
        0
      ]
    }
  ],
  "connections": {
    "New Booking": {
      "main": [
        [
          {
            "node": "Extract Invitee",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Invitee": {
      "main": [
        [
          {
            "node": "Create Notion Page",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  }
}