# Interview scheduling n8n template

> An importable n8n workflow that starts when a Greenhouse candidate reaches an interview stage, checks interviewer free/busy in Google Calendar, and emails up to five options in the candidate's time zone. The candidate picks one on an n8n form, the workflow re-checks availability and books the event with a Google Meet link. Free-text availability is parsed by Claude for the coordinator. You need n8n, Greenhouse, Google Calendar, Gmail, an Anthropic API key and Slack.

- Platform: n8n
- Download: https://www.lumeor.studio/templates/n8n/automate-interview-scheduling.json
- Trigger: Greenhouse webhook, candidate stage change
- Credentials needed: Google Calendar OAuth2, Gmail OAuth2, Anthropic API, Slack
- Full guide: https://www.lumeor.studio/guides/automate-interview-scheduling/
- Last updated: 2026-10-14

## What this workflow does

1. **Greenhouse stage change** (Webhook) fires when a recruiter moves a candidate.
2. **Prepare scheduling request** (Code) ignores stages you have not configured, looks up the interview plan (length, interviewer pool) and builds a free/busy query for the next week.
3. **Query free/busy** (HTTP Request to the Google Calendar freeBusy API) returns busy blocks without exposing event details.
4. **Build slot options** (Code) is the slot engine: working hours in each interviewer's time zone, a 15-minute buffer, weekdays only, a rough daily load limit, and at most two options per day.
5. **Slots found?** (If) sends a no-availability case to the coordinator.
6. **Email options to candidate** (Gmail) lists the times in the candidate's time zone with a link to the form.
7. **Wait for candidate choice** (Wait, form) shows a dropdown of options plus a free-text box, and waits up to 72 hours.
8. **Re-check free/busy** and **Resolve choice** (Code) confirm the chosen slot is still open and route to book, parse reply or coordinator.
9. **Create interview event** (Google Calendar) books the candidate and interviewer with a Meet link and sends invites.
10. **Parse reply with Claude** (HTTP Request) reads free-text availability into intent and time windows using a strict schema, and **Summarize reply** (Code) handles refusals and missing output.
11. **Notify coordinator in Slack** gets timeouts, conflicts, parsed replies and errors.

## Before you import

- A Google account that can read interviewers' free/busy and create events on a recruiting calendar. In Google Workspace, free/busy sharing inside the domain is usually enough.
- Greenhouse webhook access for stage changes. Check the payload paths against a real event.
- An Anthropic API key. The template uses `claude-opus-5-5` at low effort; `claude-haiku-5-5` is cheaper for high-volume, simple classification like short replies.
- An n8n instance reachable from the internet, so the candidate form link works.

## Setup

1. Import the JSON and connect Google Calendar, Gmail, Anthropic and Slack credentials.
2. Replace `REPLACE_WITH_LONG_RANDOM_TOKEN` in the webhook path and register the production URL in Greenhouse.
3. In **Prepare scheduling request**, fill `PLANS` with job IDs, stage names, lengths and interviewer pools, and `INTERVIEWERS` with time zones, hours and daily caps.
4. Replace `REPLACE_WITH_RECRUITING_CALENDAR@yourcompany.com` on **Create interview event** and `REPLACE_WITH_SLACK_COORDINATOR_CHANNEL_ID`.
5. Adjust `STEP_MIN`, `BUFFER_MIN` and `MAX_OPTIONS` in **Build slot options** if needed.

## Test it

Use a test candidate with your own email. Move them to the configured stage and check that the options email lists times that are actually free. Pick one: the invite should arrive with a Meet link. Run it again, then block the chosen time on the interviewer's calendar before submitting the form, and confirm the coordinator gets a conflict message. Finally, choose "None of these work" and type "next Tuesday after 2pm".

## Make it production-ready

- Place tentative holds on offered slots and release them when the candidate chooses or the wait expires.
- Store each candidate's time zone in Greenhouse and read it instead of the default.
- Write the booking back to the Greenhouse activity feed, and send day-before reminders.
- Count real interviews per interviewer per day from the recruiting calendar instead of the rough busy-block limit.
- Verify Greenhouse's webhook signature and add an n8n error workflow.

Read the full guide on [automating interview scheduling](/guides/automate-interview-scheduling/) for panels and Microsoft 365, or [talk to Lumeor](/start/) about extending it to multi-session loops.

---

Source: https://www.lumeor.studio/templates/automate-interview-scheduling/
Published by Lumeor Studio, Newtown, PA. hello@lumeor.studio. Get a written scope: https://www.lumeor.studio/start/
