Automate creating ClickUp tasks and Slack alerts from Calendly bookings using Make.com webhooks, idempotent mapping, timezone handling, and custom fields.
Introduction
You spend hours turning Calendly bookings into actionable work: copying attendee details, adding the correct due date and custom fields in ClickUp, and pinging the right Slack channel. This manual work creates delays and causes lost context when bookings arrive outside business hours.
By the end of this guide you will have a production-ready Make.com scenario that listens to Calendly webhooks, creates or updates ClickUp tasks with correct timezone-aware dates and custom fields, deduplicates retries, and posts a rich Slack notification. The primary keyword for this guide is Calendly to ClickUp automation.
What You'll Need
- Calendly account with webhooks enabled (paid tier required for webhooks in many plans). Ensure you can create webhooks for your account or organisation.
- ClickUp workspace, API token with access to the target Workspace and List, and knowledge of the List ID and any required custom field IDs.
- Slack workspace and a bot token that can post messages to channels and use Block Kit.
- Make.com account (formerly Integromat) to orchestrate webhooks, HTTP calls, and error handling. A paid Make.com plan is recommended for higher operation limits and routers.
- Basic familiarity with JSON, timezones, and ClickUp custom field formats.
How It Works (The Logic)
When Calendly sends an invitee.created webhook to Make.com, the scenario will:
- Verify and parse the webhook payload, extract metadata and hook_uuid for idempotency.
- Normalize start_time to a Unix millisecond timestamp in the desired timezone.
- Check a datastore (Make.com Data Store or an external Google Sheet/Airtable) for previously processed hook_uuid or Calendly event ID to avoid duplicates.
- Create a ClickUp task in the target List, setting name, description, assignee, start_date and due_date, and any custom fields (using ClickUp custom field IDs and option IDs where needed).
- If the Create Task call returns a partial success because of required fields, perform a follow-up update for custom fields.
- Post a Slack message to a channel with a Block Kit payload including action buttons and a link to the ClickUp task.
Step-by-Step Setup
- Create the Calendly webhook
- In Calendly, add a webhook endpoint pointing to the Make.com Webhook module URL you will create in the scenario. Configure the webhook to send invitee.created and invitee.canceled events.
- If available, attach metadata like { "internal_sync_id": "your-company-prefix-{{some-id}}" } so you have a stable external id you control. This helps idempotency.
- Make.com: receive and validate the webhook
- Add a Webhooks, Custom webhook module as the scenario trigger. Copy the generated URL into Calendly.
- Immediately follow the Webhook with a JSON validation module or a simple Router that checks for payload.event == "invitee.created".
- Extract these fields: payload.event.start_time, payload.event.end_time, payload.event.invitee.name, payload.event.invitee.email, payload.event.id, hook_uuid, and metadata if present.
- Gotcha: Calendly times are usually in UTC. Treat them as UTC on receipt.
- Deduplication check using Make.com Data Store (or Google Sheets/Airtable)
- Add a Make Data Store module: Search Items where key == hook_uuid or event.id or metadata.internal_sync_id.
- If found, terminate the flow with a 200 response to Calendly and log the duplicate. If not found, write the hook_uuid into the Data Store with a TTL if desired.
- Gotcha: Webhook retries are common. Use hook_uuid combined with event.id to detect both duplicate webhooks and replays.
- Convert times and prepare ClickUp payload
- Add a Date/Time formatter module in Make.com to convert payload.event.start_time from ISO to Unix milliseconds, and shift to the desired timezone if your ClickUp team expects local times. ClickUp expects Unix ms for start_date and due_date.
- Build the Create Task JSON payload. Required fields to set are: name, description, assignees (ClickUp user IDs), start_date, due_date, due_date_time true/false depending on event granularity.
- For custom_fields, include an array of objects with { id: "<field_id>", value: }. For dropdown fields in ClickUp, you must use the internal option id, not the display name. Retrieve option IDs beforehand via the ClickUp API or the ClickUp UI export.
- Create the ClickUp task via HTTP module
- Use the Make.com HTTP module to POST to https://api.clickup.com/api/v2/list/{list_id}/task with header Authorization: {CLICKUP_TOKEN} and Content-Type: application/json.
- Map fields precisely:
- name: "Call: {{invitee.name}}"
- description: "Calendly invitee: {{invitee.email}}\nEvent ID: {{event.id}}\nCalendly link: {{payload.event.uri}}"
- assignees: [123456] // map to numeric ClickUp user IDs
- start_date: {{start_ts_ms}}
- due_date: {{end_ts_ms}}
- due_date_time: true
- custom_fields: include each custom field object
- Gotcha: If ClickUp returns 200 with a task but some custom fields are missing, call the Update Task endpoint separately to set those fields. This can be done in a follow-up HTTP module.
- Store the mapping and handle errors
- Write a record to your Data Store linking Calendly event.id and the ClickUp task_id. This helps future updates or cancellations map correctly.
- Add Make.com error handlers: use routers that catch HTTP failures, send yourself a Slack DM on error, and implement exponential backoff for transient 429/5xx responses.
- Post a Slack Block Kit notification
- Use the Slack module chat.postMessage, or HTTP POST to https://slack.com/api/chat.postMessage with bearer token.
- Construct blocks: header with "New Calendly Booking", a section with attendee name, local date and time, ClickUp task link, and buttons: "Open ClickUp" (task URL) and "Open Calendly" (event link).
- Map helpful context: include timezone, attendee email, and internal_sync_id.
- Handle invitee.canceled and updates
- For invitee.canceled events, look up the mapping by event.id and move the ClickUp task to a "Cancelled" status or add a comment via the Comments endpoint.
- For updates, update task dates and custom fields using the stored ClickUp task_id.
Real-World Business Scenario
A sales consultancy we worked with used this exact setup for pre-call admin. Each new Calendly booking created a ClickUp task assigned to the sales rep with the correct local start and end time, a link to the Calendly event, and a custom field showing lead sector. Slack notifications go to the sales channel with buttons to jump to ClickUp or reschedule. The result: reps had the task and conversation context before the call, reducing prep time by 20 minutes per call and eliminating missed follow-ups.
Common Variations
- Use Airtable instead of Make.com Data Store if you need a human-editable log of processed events and mappings.
- Add an OpenAI step after the webhook to summarise the invitee notes into a quick prep paragraph and add it to the ClickUp description.
- Only create ClickUp tasks for bookings above a certain duration or for specific event types by adding a Router filter in Make.com.
Final notes and next steps
You built a robust Calendly to ClickUp automation that handles idempotency, timezone conversion, custom field mapping, error handling, and Slack notifications. If you want someone to implement this for you and map your specific ClickUp custom field IDs and Slack channel, Olmec Dynamics builds these automations for clients; see what we do at Olmec Dynamics for tailored implementations: visit Olmec Dynamics for details.
No related posts were found in our internal library when researching this topic, so this is a fresh guide for Calendly to ClickUp automation using Make.com and Slack.