🔓 Unlock all 10,000+ workflows & prompts free Join Newsletter →
✅ Full access unlocked — explore all 10,000 AI workflow and prompt templates Browse Templates →
Home n8n Workflow
January 22, 2026

Everhour to Google Calendar, PTO always up to date

Lisa Granqvist Partner Workflow Automation Expert

You approve PTO in Everhour, and somehow the calendar still ends up wrong. Someone copies it late, someone forgets, and suddenly you’re planning a launch week with two “surprise” absences.

This Everhour Google Calendar automation hits ops managers and team leads first. But HR admins and agency owners feel it too, because staffing only works when everyone sees the same truth.

This workflow automatically turns approved Everhour time off into clean all‑day events in Google Calendar, keeps them updated when requests change, and removes stale entries so the calendar stays trustworthy.

How This Automation Works

See how this solves the problem:

n8n Workflow Template: Everhour to Google Calendar, PTO always up to date

The Challenge: PTO Lives in Everhour, Planning Lives in Calendar

Everhour is great for tracking time off, but it’s not where people look when they’re booking meetings or planning coverage. So you end up running two “sources of truth”: PTO requests in Everhour, and a calendar that someone tries to keep updated by hand. That’s where the cracks show. Multi-day requests get entered as one vague block. Changes don’t get reflected. Cancellations linger. And by the time you notice, you’re reshuffling deadlines, reassigning client calls, and apologizing for scheduling meetings on someone’s vacation day. Honestly, it’s exhausting.

It adds up fast. Here’s where it breaks down in real teams.

  • Approved PTO gets copied into Google Calendar late (or not at all), so staffing decisions happen with outdated info.
  • Multi-day absences turn into messy calendar entries, which means teammates can’t tell which days are actually off.
  • When a request changes, old events remain, so you see duplicates and stop trusting the calendar.
  • Manual updates invite small errors like wrong dates or wrong person, and those “small” errors create big scheduling problems.

The Fix: Sync Approved Everhour PTO Into Google Calendar

This workflow runs on a schedule inside n8n and pulls time-off assignments from Everhour using their API. It filters down to approved leave only, then expands each multi-day request into individual day entries so your calendar stays clear and consistent. For every day of absence, the workflow builds an all-day Google Calendar event and uses a stable external key (formatted like everhour:ASSIGNMENT_ID:YYYY-MM-DD) to find the matching event later. If an event already exists, it updates it. If it doesn’t, it creates it. Then it does the unglamorous part most automations skip: cleanup. It lists existing “Everhour PTO” events and deletes anything that no longer exists in Everhour, so cancellations and edits don’t leave junk behind.

The workflow starts with a scheduled trigger and configuration settings (your calendar ID lives here). Everhour leave is retrieved and validated, records are prepared day-by-day, then Google Calendar is searched by external key to create or update the matching event. Finally, stale calendar events are detected and removed so the calendar stays accurate over time.

What Changes: Before vs. After

Real-World Impact

Say you have a 15-person team and you average about 10 PTO requests a month. Manually, each request usually takes two touches: a first calendar entry (maybe 5 minutes), then an update or correction later (another 5 minutes). That’s roughly 100 minutes of calendar work monthly, plus the hidden cost of mistakes. With this workflow, you approve PTO in Everhour and the scheduled sync handles creation, updates, and cleanup automatically, so the “calendar admin” time drops close to zero.

Requirements

  • n8n instance (try n8n Cloud free)
  • Self-hosting option if you prefer (Hostinger works well)
  • Everhour for approved time-off data via API.
  • Google Calendar to publish a shared PTO calendar view.
  • Everhour API key (get it from your Everhour account API settings).

Skill level: Beginner. You’ll connect credentials, paste a calendar ID, and turn on the schedule.

Need help implementing this? Talk to an automation expert (free 15-minute consultation).

The Workflow Flow

A scheduled check runs automatically. You choose how often it runs (hourly, daily, whatever fits), and n8n starts the sync without anyone remembering to do it.

Everhour leave is fetched and filtered. The workflow pulls assignments from Everhour, then keeps only time-off entries that are marked approved, so pending requests don’t clutter the calendar.

Requests are converted into day-by-day calendar events. Multi-day PTO becomes one all-day event per date, each with a stable external key so updates are matched correctly instead of creating duplicates.

Google Calendar is updated and cleaned. If an event exists for that external key, it’s updated. If not, it’s created. Then the workflow lists existing PTO events and deletes ones that no longer exist in Everhour.

You can easily modify the schedule frequency to match how quickly your team needs updates. You can also tweak the event title template or split PTO into multiple calendars. See the full implementation guide below for customization options.

Step-by-Step Implementation Guide

Step 1: Configure the Scheduled Trigger

Set up the schedule that initiates the time-off sync and kicks off parallel data preparation.

  1. Add or open Scheduled Interval Starter and keep the interval rule for hours-based execution.
  2. Confirm the node runs on your desired schedule (e.g., hourly) using its built-in interval configuration.
  3. Note the parallel branch: Scheduled Interval Starter outputs to both Retrieve Everhour Leave and Configuration Settings in parallel.

Step 2: Connect Everhour and Google Calendar

Wire up the Everhour API and Google Calendar access used across all calendar search, update, and cleanup steps.

  1. Open Retrieve Everhour Leave and verify URL is https://api.everhour.com/resource-planner/assignments.
  2. Credential Required: Connect your httpHeaderAuth credentials for Retrieve Everhour Leave.
  3. Open Locate Event by External Key and confirm the URL expression is {{ 'https://www.googleapis.com/calendar/v3/calendars/' + $items("Configuration Settings")[0].json.calendarId + '/events' }}.
  4. Credential Required: Connect your googleApi credentials for Locate Event by External Key, List Assignment Calendar Events, and List All Everhour Calendar Events.
  5. Credential Required: Connect your googleApi credentials for Modify All-Day Event, Generate All-Day Event, and Remove Calendar Event.
  6. In Configuration Settings, set calendarId to your target calendar identifier (replace [YOUR_EMAIL] with the calendar ID or email).
⚠️ Common Pitfall: The Google Calendar nodes will fail without valid googleApi credentials, even though the workflow includes the calendarId in Configuration Settings.

Step 3: Set Up Leave Validation and Payload Construction

Filter approved leave, expand it into daily records, and prepare search fields for calendar lookup and deduplication.

  1. In Validate Approved Leave, keep the condition that checks {{ $json.status }} equals approved.
  2. Review Prepare Leave Records to ensure the code expands multi-day leave into per-day records and generates externalKey values like everhour:<id>:<date>.
  3. In Compose Calendar Payload, confirm includeOtherFields is enabled and the assignment searchQuery value is set to {{ $json.externalKey }}.
  4. Note the parallel branch: Compose Calendar Payload outputs to Locate Event by External Key, Assemble Assignment Clusters, and Compile Global Key Set in parallel.
Keep the externalKey format consistent in Prepare Leave Records because it is used by lookup and stale-event detection logic across the workflow.

Step 4: Configure Calendar Lookup, Update, and Create Logic

Search for existing events by external key and either update or create all-day events in the calendar.

  1. In Locate Event by External Key, keep query parameters: singleEvents true, maxResults 1, and q {{ $json.externalKey }}.
  2. Ensure Append Found Event ID runs in Run Once for Each Item mode and preserves the mapping from Compose Calendar Payload.
  3. In Verify Event Presence, keep the condition {{ $json.found }} is true to route updates vs. creates.
  4. Configure Modify All-Day Event with eventId {{ $json.existingEventId }}, start {{ $json.startDate }}, and end {{ $json.endDateExclusive }}.
  5. In Modify All-Day Event, keep summary as {{ $json.employeeName }} - {{ $json.type }} and description as =Everhour PTO\nKey: {{$json.externalKey}}\nType: {{$json.type}}\nStatus: {{$json.status}}\nNote: {{$json.note}}\n.
  6. Configure Generate All-Day Event with start {{ $json.startDate }} and end {{ $json.endDateExclusive }}, using the same summary and description fields.

Step 5: Configure Stale Event Cleanup

Remove events in Google Calendar that no longer exist in Everhour, both globally and per assignment.

  1. In Compile Global Key Set, keep the logic that compiles currentKeys and calculates searchTimeMin and searchTimeMax.
  2. In List All Everhour Calendar Events, confirm q is set to everhour: and maxResults to 2500 for broad matching.
  3. In Detect Global Stale Events, keep the comparison against Compile Global Key Set so stale events are returned with eventId.
  4. In Assemble Assignment Clusters and List Assignment Calendar Events, preserve the per-assignment search with q set to {{ 'everhour:' + $json.assignmentId + ':' }}.
  5. In Detect Stale Events per Assignment, keep the regex match on description Key: everhour:<id>:<date> to detect stale items.
  6. In Remove Calendar Event, keep eventId as {{ $json.eventId }} and the operation set to delete.
⚠️ Common Pitfall: If event descriptions don’t include Key: {{$json.externalKey}}, both stale cleanup paths will skip deletions.

Step 6: Test and Activate Your Workflow

Run a manual test to verify Everhour data is fetched, events are created or updated, and stale events are removed correctly.

  1. Click Execute Workflow and confirm Retrieve Everhour Leave returns time-off records.
  2. Verify that Validate Approved Leave passes only approved items and that Prepare Leave Records outputs per-day entries with externalKey.
  3. Check that Verify Event Presence routes items to Modify All-Day Event when found and to Generate All-Day Event when not found.
  4. Confirm stale events are deleted by Remove Calendar Event from both Detect Global Stale Events and Detect Stale Events per Assignment.
  5. When the test output looks correct, toggle the workflow Active to enable scheduled runs.
🔒

Unlock Full Step-by-Step Guide

Get the complete implementation guide + downloadable template

Watch Out For

  • Everhour credentials can expire or lack API access. If things break, check your Everhour API key and account permissions 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.
  • Google Calendar OAuth scopes matter. If event creation or deletion fails, re-check the connected Google account and confirm it has access to the target calendar ID.

Common Questions

How quickly can I implement this Everhour Google Calendar automation?

Usually under an hour once you have the Everhour API key and the calendar ID.

Can non-technical teams implement this PTO sync?

Yes. No code changes are required, but you will need to connect Everhour and Google Calendar credentials in n8n.

Is n8n free to use for this Everhour Google Calendar workflow?

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 Everhour and Google Calendar access (the workflow uses their APIs).

Where can I host n8n to run this automation?

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.

How do I adapt this Everhour Google Calendar solution to my specific challenges?

You can adjust the schedule trigger to run hourly or daily, then edit the “Configuration Settings” and “Compose Calendar Payload” nodes to change the calendarId and event title/description templates. Many teams also add a user filter right after “Retrieve Everhour Leave” so only certain people (or departments) publish to a shared calendar. If you need multiple calendars, duplicate the create/update branch (“Generate All-Day Event” and “Modify All-Day Event”) and point each branch at a different calendar.

Why is my Everhour connection failing in this workflow?

Usually it’s an invalid or missing X-Api-Key header in your Everhour HTTP Header Auth credential. Regenerate the Everhour API key, update it in n8n, and confirm the account actually has API access. If it fails only sometimes, it may be rate limits, so spacing the schedule out can help. Also double-check that the Everhour endpoint used by “Retrieve Everhour Leave” is still correct for your workspace.

What’s the capacity of this Everhour Google Calendar solution?

For most small teams, it’s effectively unlimited.

Is this Everhour Google Calendar automation better than using Zapier or Make?

Often, yes, because this workflow needs two things that “simple zaps” struggle with: reliable deduplication (the external key per day) and cleanup of stale events. n8n also makes it easier to do branching logic around “update vs create” without paying extra for every path, and you can self-host for unlimited executions if volume grows. Zapier or Make can still work if you only need one-way creation and you don’t care about deletes, but that’s where calendars get messy. The cleanup portion is the difference between “it worked once” and “it stayed correct for months.” Talk to an automation expert if you want help choosing.

Once PTO reliably shows up in Google Calendar, planning gets calmer. Set it up once, and the calendar stays honest.

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.

Lisa Granqvist

Workflow Automation Expert

Expert in workflow automation and no-code tools.

×

Use template

Get instant access to this n8n workflow Json file

💬
Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Launch login modal Launch register modal