Cal.com to Google Sheets, clean interview tracking
Your interview tracker looks “fine” until it suddenly doesn’t. A booking lands in Cal.com, someone copies the time into Google Sheets, the timezone shifts, and now your dashboard says the candidate is interviewing tomorrow when it’s actually today.
This Cal.com Sheets sync hits recruiters first, but HR coordinators and agency ops folks feel it too. When the tracker lies, people miss interviews, hiring managers lose trust, and you spend your afternoon doing spreadsheet cleanup instead of moving candidates forward.
This workflow pulls bookings from Cal.com, updates the right row in Google Sheets using email matching, fixes the timezone formatting (Asia/Riyadh), and removes junk rows so your pipeline stays usable.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: Cal.com to Google Sheets, clean interview tracking
flowchart LR
subgraph sg0["Manual Start Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Manual Start Trigger", pos: "b", h: 48 }
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Retrieve Booking Details"]
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Booking API Request"]
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Format Schedule Time"]
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Map Candidate Fields", pos: "b", h: 48 }
n5@{ icon: "mdi:database", form: "rounded", label: "Update Interview Timestamp", pos: "b", h: 48 }
n6@{ icon: "mdi:database", form: "rounded", label: "Google Sheet Lookup", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Email List", pos: "b", h: 48 }
n8@{ icon: "mdi:swap-vertical", form: "rounded", label: "Iterate Email Batches", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Validate Missing Emails", pos: "b", h: 48 }
n10@{ icon: "mdi:database", form: "rounded", label: "Remove Unmatched Rows", pos: "b", h: 48 }
n10 --> n8
n7 --> n8
n4 --> n5
n2 --> n3
n6 --> n7
n3 --> n4
n8 --> n9
n9 --> n10
n9 --> n8
n1 --> n2
n5 --> n6
n0 --> n1
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0 trigger
class n9 decision
class n5,n6,n10 database
class n1,n2 api
class n3 code
classDef customIcon fill:none,stroke:none
class n1,n2,n3 customIcon
The Challenge: Interview Trackers Drift Out of Sync
Interview tracking breaks in slow motion. Cal.com has the source-of-truth booking, but your hiring team lives in Google Sheets because it’s quick, shared, and works with everything. Then reality happens. Candidates reschedule. A teammate pastes the wrong time format. Someone sorts the sheet and the “Interview Date” column no longer lines up with the right person. Worst part, you often notice it only after a missed call or a “wait, I thought this was next week” message.
It adds up fast. Here’s where it breaks down in day-to-day hiring.
- Manual copy-paste creates small errors that turn into scheduling chaos during busy weeks.
- Timezone formatting gets inconsistent, so dashboards and filters stop being reliable.
- Duplicate or irrelevant rows creep in, which makes the sheet feel “messy” and harder to trust.
- Email mismatches mean updates hit the wrong candidate, or don’t happen at all.
The Fix: Cal.com Bookings Sync + Sheet Cleanup
This n8n workflow turns Cal.com booking data into clean, consistent rows in your Google Sheets interview tracker. It starts by pulling the latest booking details through an HTTP request to Cal.com, then extracts the candidate info you actually care about (name, email, interview time). Next, it converts the timestamp into a readable format and normalizes it to the Asia/Riyadh timezone, so your sheet stops flipping between formats. After that, it updates the correct candidate row by matching on email. Finally, it audits the sheet for missing or unmatched entries and removes rows that shouldn’t be there, keeping your tracker lean and decision-ready.
The workflow begins when you run it in n8n (manual trigger), pulls booking data from Cal.com, formats and maps it into your spreadsheet fields, then looks up emails in Google Sheets to update only valid candidates. If it detects blank or unmatched entries during iteration, it removes them so your tracker stays clean.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you’re running 20 interviews a week. Manually, each booking usually means opening Cal.com, copying name/email, converting the time, finding the candidate row, then double-checking it later, which is easily 10 minutes per interview. That’s about 3 hours a week just to keep the tracker accurate. With this workflow, you trigger one run, let it update timestamps and remove unmatched rows automatically, and you’re mostly just spot-checking. For a busy hiring month, that’s a lot of time back.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Cal.com for booking data pulled via API.
- Google Sheets to store and update your interview tracker.
- Cal.com API key (get it from your Cal.com settings/API page).
Skill level: Intermediate. You’ll connect accounts, add credentials, and confirm your Sheet column names match the workflow.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
A run starts on demand. This workflow uses a manual trigger, which is perfect if you want to test safely, or run it as part of a daily routine while you’re rolling it out.
Cal.com bookings are pulled via API. n8n makes HTTP requests to retrieve booking details, then selects the interview fields you care about instead of dumping raw payloads into your sheet.
The interview time gets standardized. A small code step formats the schedule time into a readable string (like “30 June, 09:00 AM”) and converts it to Asia/Riyadh so every row follows the same rule.
Google Sheets is updated and cleaned. The workflow maps candidate fields, updates the interview timestamp, looks up existing rows by email, then iterates through email batches to detect missing records. When it finds blanks or unmatched entries, it removes those rows to keep your tracker tight.
You can easily modify the timezone and the matching logic to fit your hiring process. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
Start the workflow manually while you validate the Cal.com API and Google Sheets updates.
- Add the Manual Start Trigger node as the workflow trigger.
- Keep Flowpast Branding as a reference note (no configuration required).
Step 2: Connect Google Sheets
These nodes update and clean the “Accepted” sheet in the “Resumes” spreadsheet.
- Open Update Interview Timestamp and set Operation to
appendOrUpdate. - Set Spreadsheet to
[YOUR_ID]and Sheet Name toAcceptedin Update Interview Timestamp. - Open Google Sheet Lookup and set the same Spreadsheet and Sheet Name values.
- In Google Sheet Lookup, confirm the Filters include lookupColumn set to
SUMMARY. - Open Remove Unmatched Rows and set Operation to
delete. - Set Start Index to
{{ $json.row_number }}in Remove Unmatched Rows. - Credential Required: Connect your Google Sheets credentials to Update Interview Timestamp, Google Sheet Lookup, and Remove Unmatched Rows.
Step 3: Set Up Booking Data Retrieval
These nodes pull attendees and booking details from Cal.com to build the interview schedule.
- In Retrieve Booking Details, set URL to
https://api.cal.com/v1/attendeesand enable Send Query. - Add a query parameter in Retrieve Booking Details with name
apiKeyand value[CONFIGURE_YOUR_API_KEY]. - In Booking API Request, set URL to
https://api.cal.com/v1/bookingsand enable Send Query. - Add a query parameter in Booking API Request with name
apiKeyand value[CONFIGURE_YOUR_API_KEY]. - Add the booking ID parameter in Booking API Request with name
idand value{{ $json.attendees[0].bookingId }}.
⚠️ Common Pitfall: Replace [CONFIGURE_YOUR_API_KEY] with your real Cal.com API key in both HTTP request nodes or the workflow will return empty results.
Step 4: Set Up Data Processing
This step formats the schedule time and maps fields to the Google Sheet column names.
- Open Format Schedule Time and keep the provided JavaScript Code to format
startTimeinto a readable string. - In Map Candidate Fields, set Include to
selectedand enable Include Other Fields. - Set the Email field in Map Candidate Fields to
{{ $json.email.toLowerCase() }}. - Set the Interview Schedule field in Map Candidate Fields to
{{ $json.startFormatted }}.
Step 5: Configure Output and Cleanup Logic
Update the sheet, then iterate through email rows and remove records without a summary.
- Confirm the execution flow: Map Candidate Fields → Update Interview Timestamp → Google Sheet Lookup → Split Email List → Iterate Email Batches → Validate Missing Emails → Remove Unmatched Rows.
- In Split Email List, set Field to Split Out to
Emailand Include toallOtherFields. - Keep Iterate Email Batches as the loop controller for the email list.
- In Validate Missing Emails, ensure the condition checks leftValue
{{ $json['SUMMARY '] }}equals rightValue=.
⚠️ Common Pitfall: The Validate Missing Emails condition expects the SUMMARY column (note the trailing space). If your sheet column name differs, the delete loop may never run.
Step 6: Test and Activate Your Workflow
Validate end-to-end execution and then enable the workflow for ongoing use.
- Click Execute Workflow to run from Manual Start Trigger.
- Verify Retrieve Booking Details and Booking API Request return booking data.
- Check that Update Interview Timestamp appends or updates rows in the
Acceptedsheet. - Confirm Remove Unmatched Rows deletes rows where
SUMMARYis=. - When results are correct, toggle the workflow to Active for production use.
Watch Out For
- Cal.com credentials can expire or need specific permissions. If things break, check your Cal.com API key status and scopes in Cal.com settings first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Common Questions
About 30 minutes if your Cal.com API key and Sheet are ready.
Yes, but you will need someone comfortable connecting accounts and matching spreadsheet columns. No coding is required unless you want to change the date formatting logic.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Cal.com API access (typically included with your Cal.com plan).
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
You can change the timezone and output format in the “Format Schedule Time” step, then adjust the mapped columns in “Map Candidate Fields.” If your sheet uses a different unique identifier than email, swap the lookup to match on candidate ID instead. Common tweaks include adding a “Stage” update after booking, writing a “Last Updated” timestamp, or sending a Gmail confirmation to internal interviewers.
Most of the time it’s an expired or incorrect Cal.com API key. Regenerate the key, update it in the two HTTP Request nodes, and confirm the endpoint you’re calling is still valid for your Cal.com account. Also check for rate limits if you’re pulling a lot of bookings at once. If only some bookings fail, it can be missing fields in the payload, so the mapping step ends up empty.
Plenty for most small teams. On n8n Cloud Starter, you can run thousands of executions per month, and if you self-host there’s no execution cap beyond your server. In practice, this workflow processes bookings in batches, so you can cleanly handle weeks of interviews in one run.
Often, yes, because you’re doing more than “send booking to sheet.” This workflow includes lookup logic, looping through email batches, and cleanup actions (deleting unmatched rows), and those get awkward or expensive in tools that price by task. n8n also lets you self-host, which is helpful if your hiring volume spikes. Zapier or Make can still be fine for a simple one-way append into Sheets, especially if you never need deduping or validation. If you’re unsure, Talk to an automation expert and we’ll map the simplest option for your process.
Once your tracker updates itself and cleans itself, hiring feels calmer. Honestly, that reliability is what lets you move faster without adding more tools.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.