AutomationFlowsData & Sheets › Sync Cal.com Meeting Bookings to Notion with Contact Management

Sync Cal.com Meeting Bookings to Notion with Contact Management

BySimone Smerilli @simo on n8n.io

This workflow is especially suitable for founders and operators offering services to their clients and regularly scheduling sales or project update meetings.

Event trigger★★★★☆ complexity13 nodesCal TriggerNotion
Data & Sheets Trigger: Event Nodes: 13 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #6159 — we link there as the canonical source.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "xELlLseYTrTVfU4P",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Cal.com\u00a0Meeting Booking Sync to Notion with Contact Management",
  "tags": [],
  "nodes": [
    {
      "id": "e7dfd9ca-99e4-4374-af54-c8be4dd1a653",
      "name": "Cal.com Trigger",
      "type": "n8n-nodes-base.calTrigger",
      "position": [
        0,
        -5
      ],
      "parameters": {
        "events": [
          "BOOKING_CREATED",
          "BOOKING_CANCELLED",
          "BOOKING_RESCHEDULED"
        ],
        "options": {}
      },
      "notesInFlow": false,
      "typeVersion": 2
    },
    {
      "id": "8994a7e3-e4fc-4455-86b9-1d0ba761dc1e",
      "name": "Route based on trigger event type",
      "type": "n8n-nodes-base.switch",
      "position": [
        220,
        -5
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "new event",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "c0dce164-ae8c-4bd1-b26c-beded6ed6621",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.triggerEvent }}",
                    "rightValue": "BOOKING_CREATED"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "cancelled",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "199823f9-aa27-495e-bc59-fc2fae6e1da2",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.triggerEvent }}",
                    "rightValue": "BOOKING_CANCELLED"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "rescheduled",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "8f1771e2-393b-4ff2-85db-63f7b2cc07bb",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.triggerEvent }}",
                    "rightValue": "BOOKING_RESCHEDULED"
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "4c34bf5f-0396-403b-96e6-11f55feb281c",
      "name": "get contact",
      "type": "n8n-nodes-base.notion",
      "position": [
        440,
        -205
      ],
      "parameters": {
        "simple": false,
        "filters": {
          "conditions": [
            {
              "key": "Email|email",
              "condition": "equals",
              "emailValue": "={{ $json.attendees[0].email }}"
            }
          ]
        },
        "options": {},
        "resource": "databasePage",
        "operation": "getAll",
        "returnAll": true,
        "databaseId": {
          "__rl": true,
          "mode": "id",
          "value": "e8bedef48863478f89b16e546db13400"
        },
        "filterType": "manual"
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2,
      "alwaysOutputData": true
    },
    {
      "id": "a7fb5f6e-72bf-4cd1-bf70-782f291aef1e",
      "name": "doesn't exist",
      "type": "n8n-nodes-base.if",
      "position": [
        660,
        -205
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "05f342fd-f958-4ecf-b0b9-f39378909a09",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $('get contact').isEmpty() }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "9281555b-947d-4b72-9a59-9501afba54ce",
      "name": "create contact",
      "type": "n8n-nodes-base.notion",
      "position": [
        880,
        -280
      ],
      "parameters": {
        "title": "={{ $('Cal.com Trigger').item.json.attendees[0].name }}",
        "simple": false,
        "options": {},
        "resource": "databasePage",
        "databaseId": {
          "__rl": true,
          "mode": "id",
          "value": "e8bedef48863478f89b16e546db13400"
        },
        "propertiesUi": {
          "propertyValues": [
            {
              "key": "Email|email",
              "emailValue": "={{ $('Cal.com Trigger').item.json.attendees[0].email }}"
            }
          ]
        }
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "a07cf4d5-8368-4789-8820-6947ac12e2a1",
      "name": "create meeting",
      "type": "n8n-nodes-base.notion",
      "position": [
        1080,
        -120
      ],
      "parameters": {
        "title": "={{ $('Cal.com Trigger').item.json.title }}",
        "simple": false,
        "blockUi": {
          "blockValues": [
            {
              "text": {
                "text": [
                  {
                    "text": "={{ $('Cal.com Trigger').item.json.responses.camera_choice.value }}",
                    "annotationUi": {}
                  }
                ]
              },
              "richText": true
            },
            {
              "text": {
                "text": [
                  {
                    "text": "={{ $('Cal.com Trigger').item.json.responses.notes.value }}",
                    "annotationUi": {}
                  }
                ]
              },
              "richText": true
            }
          ]
        },
        "options": {},
        "resource": "databasePage",
        "databaseId": {
          "__rl": true,
          "mode": "id",
          "value": "4129a718ff694a1880ea2231e197ee6b"
        },
        "propertiesUi": {
          "propertyValues": [
            {
              "key": "Contacts|relation",
              "relationValue": [
                "={{ $ifEmpty($('get contact').item.json.id, $('create contact').id) }}"
              ]
            },
            {
              "key": "Event Time|date",
              "date": "={{ $('Cal.com Trigger').item.json.startTime }}",
              "timezone": "={{ $('Cal.com Trigger').item.json.organizer.timeZone }}"
            },
            {
              "key": "cal id|rich_text",
              "text": {
                "text": [
                  {
                    "text": "={{ $('Cal.com Trigger').item.json.bookingId.toString() }}",
                    "annotationUi": {}
                  }
                ]
              },
              "richText": true
            }
          ]
        }
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "82b37d6e-bcb8-434a-887a-dd82a9f23a23",
      "name": "get meeting",
      "type": "n8n-nodes-base.notion",
      "position": [
        440,
        195
      ],
      "parameters": {
        "simple": false,
        "filters": {
          "conditions": [
            {
              "key": "cal id|rich_text",
              "condition": "equals",
              "richTextValue": "={{ $('Cal.com Trigger').item.json.bookingId.toString() }}"
            }
          ]
        },
        "options": {},
        "resource": "databasePage",
        "operation": "getAll",
        "returnAll": true,
        "databaseId": {
          "__rl": true,
          "mode": "id",
          "value": "4129a718ff694a1880ea2231e197ee6b"
        },
        "filterType": "manual"
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "20be6e02-77cf-4ae2-a364-fe0e9f84629e",
      "name": "update meeting",
      "type": "n8n-nodes-base.notion",
      "position": [
        660,
        195
      ],
      "parameters": {
        "pageId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "simple": false,
        "options": {},
        "resource": "databasePage",
        "operation": "update",
        "propertiesUi": {
          "propertyValues": [
            {
              "key": "Event Time|date",
              "date": "={{ $('Cal.com Trigger').item.json.rescheduleStartTime }}",
              "timezone": "={{ $('Cal.com Trigger').item.json.organizer.timeZone }}"
            }
          ]
        }
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "d543c165-e15e-435d-8dff-0ea95abf46a7",
      "name": "get meeting1",
      "type": "n8n-nodes-base.notion",
      "position": [
        440,
        -5
      ],
      "parameters": {
        "simple": false,
        "filters": {
          "conditions": [
            {
              "key": "cal id|rich_text",
              "condition": "equals",
              "richTextValue": "={{ $('Cal.com Trigger').item.json.bookingId.toString() }}"
            }
          ]
        },
        "options": {},
        "resource": "databasePage",
        "operation": "getAll",
        "returnAll": true,
        "databaseId": {
          "__rl": true,
          "mode": "id",
          "value": "4129a718ff694a1880ea2231e197ee6b"
        },
        "filterType": "manual"
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "690087a3-47b7-4b74-895d-adcb9b31b616",
      "name": "delete",
      "type": "n8n-nodes-base.notion",
      "position": [
        660,
        -5
      ],
      "parameters": {
        "pageId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "simple": false,
        "operation": "archive"
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "6b498920-f27b-4c50-9c20-bec758f48c18",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        -320
      ],
      "parameters": {
        "color": 5,
        "width": 280,
        "height": 240,
        "content": "## Usage Guide\nEach node has Notes that explain its purpose and setup. Below you can find the written and video walkthroughs of this workflow.\n\n[Essay](https://www.simonesmerilli.com/business/cal-notion-automation)\n[Video](https://docs.n8n.io/workflows/sticky-notes/)\n\n*by [simo](https://www.simosme.com)*"
      },
      "typeVersion": 1
    },
    {
      "id": "fe6bdc79-95f1-4319-a8a8-5975cab6426c",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -260,
        200
      ],
      "parameters": {
        "color": 4,
        "width": 220,
        "height": 660,
        "content": "# Step 1\nConnect your Cal account. Create your API key in the [dedicated settings page](https://app.cal.com/settings/developer/api-keys). Watch the video above for more details about the connection.\n\nTo run a test on this node only, while the workflow is OFF, open the node (double click) > Execute step.\n\nSchedule a meeting via any of your Cal.com links and check out the output data. You will be able to map the output into subsequent nodes.\n\nTo test the reschedule and cancel events, select \"Execute step\" and then reschedule/cancel the previously created event.\n\nTo test the whole automation, activate the worflow, or select the \"Execute workflow\" button at the bottom of the canvas."
      },
      "typeVersion": 1
    },
    {
      "id": "b0465427-393c-4c0a-94c8-238a97916456",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        80,
        200
      ],
      "parameters": {
        "color": 4,
        "width": 260,
        "height": 660,
        "content": "# Step 2\n1. Connect your Notion workspace (if not already done). Find out how to do that [here](https://developers.notion.com/docs/authorization#internal-integration-auth-flow-set-up).\n\n2. Make sure your integration has access to your Notion Meetings & Contacts databases.\n\n3. Add a \"cal id\" text property to your Meetings database in Notion.\n\n4. Enter the Meetings database ID in the nodes that contain \"meeting\" in their label. See [here](https://developers.notion.com/docs/working-with-databases#adding-pages-to-a-database) (section \"Where can I find my database's ID?\") how to get a Notion database ID.\n\n5. Enter the Contacts database ID in the nodes that contain \"contact\" in their label.\n\n5. Configure the node by mapping the values from the Cal.com trigger as needed, depending on your specific Notion database configuration."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "callerPolicy": "workflowsFromSameOwner",
    "executionOrder": "v1",
    "timeSavedPerExecution": 5
  },
  "versionId": "a7a25047-6cb6-4c1f-87d8-c4a4e1a21858",
  "connections": {
    "Switch": {
      "main": [
        [
          {
            "node": "get contact",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "get meeting1",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "get meeting",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "get contact": {
      "main": [
        [
          {
            "node": "doesn't exist",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "get meeting": {
      "main": [
        [
          {
            "node": "update meeting",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "get meeting1": {
      "main": [
        [
          {
            "node": "delete",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "doesn't exist": {
      "main": [
        [
          {
            "node": "create contact",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "create meeting",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "create contact": {
      "main": [
        [
          {
            "node": "create meeting",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Cal.com Trigger": {
      "main": [
        [
          {
            "node": "Switch",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow is especially suitable for founders and operators offering services to their clients and regularly scheduling sales or project update meetings.

Source: https://n8n.io/workflows/6159/ — original creator credit. Request a take-down →

More Data & Sheets workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Data & Sheets

Sync your Google Contacts with your Notion database.

Google Contacts, HTTP Request, Notion +1
Data & Sheets

This enables webhooks for nearly realtime updates (every 5 seconds) from Notion Databases.

Notion, Supabase, Execute Workflow Trigger +1
Data & Sheets

Overview Seamlessly transfer your Notion contacts to Google Contacts with organized group labels, simplifying your CRM management.

Notion, Google Contacts, HTTP Request +1
Data & Sheets

This workflow is perfect for productivity-focused teams, remote workers, virtual assistants, and digital knowledge managers who receive documents, images, or notes through Telegram and want to automat

Telegram Trigger, Telegram, HTTP Request +3
Data & Sheets

This template takes approved Notion pages and syncs them to a Webflow CMS collection as draft items. It reads pages marked Status = Ready for publish in a specific Notion database/project, merges JSON

Notion, HTTP Request