CalDAVconnect
Home Blog Pricing Docs
Log in Join the beta

How CalDAVconnect Syncs in Seconds

· 4 min read
CalDAV Technical Sync Webhooks

Most calendar sync tools work on a simple principle: check for changes every few minutes, then push them across. It works β€” but it's slow. A 5-minute polling interval means a meeting you just booked might not show up elsewhere for several minutes. For tools like Calendly that read your availability in real time, that's a problem.

CalDAVconnect takes a different approach, and this post explains how it works under the hood.

Two directions, two mechanisms

Bidirectional sync means changes need to flow in both directions: from your CalDAV server (Nextcloud, SOGo, Radicale, BaΓ―kal, Posteo) to Google Calendar or Microsoft 365, and back the other way. These two directions have fundamentally different technical characteristics β€” and CalDAVconnect handles them differently.

Cloud β†’ CalDAV: webhooks

When you create or edit an event in Google Calendar or Microsoft 365, the cloud provider sends a webhook notification to CalDAVconnect almost immediately. There's no waiting, no polling β€” the provider pushes the change the moment it happens.

CalDAVconnect receives the webhook, dispatches a sync job, and the change appears in your CalDAV server within 1–2 seconds.

This is the fastest possible approach. Webhooks are the same mechanism used by payment processors (Stripe notifying your server of a payment) or CI/CD pipelines (GitHub triggering a deployment on push). The event is pushed to you, rather than you checking for it.

CalDAV β†’ Cloud: CTag polling

The reverse direction is technically more interesting. CalDAV is an open protocol β€” servers like Nextcloud and SOGo don't push change notifications to external services. There's no webhook equivalent on the CalDAV side.

The naive solution would be to repeatedly fetch all events from the CalDAV server and compare them. This works, but it's expensive: downloading potentially thousands of events every few seconds is wasteful and slow.

CalDAVconnect uses a smarter approach: CTag polling.

The CalDAV protocol defines a property called CTag (Collection Tag) β€” a hash value that changes whenever anything in the calendar is modified. To check whether a calendar has changed, CalDAVconnect makes a single lightweight PROPFIND request and reads only the CTag value. The response is a few dozen bytes. No events are downloaded, no iCal data is parsed.

PROPFIND /remote.php/dav/calendars/user/personal/ HTTP/1.1
Depth: 0

β†’ Response: CTag = "abc123..."

A daemon process runs permanently on the server, checking each active CalDAV connection every 15 seconds:

  • If the CTag matches the stored value β†’ nothing has changed, nothing to do
  • If the CTag differs β†’ a change has been detected, dispatch a sync job

The CTag check takes approximately 120ms per calendar. Changes are detected within an average of 7–8 seconds β€” roughly half the 15-second polling interval.

Why this matters

The combination means CalDAVconnect responds to changes from either side in seconds:

| Direction | Mechanism | Typical latency | |---|---|---| | Google Calendar β†’ CalDAV | Webhook | 1–2 seconds | | Microsoft 365 β†’ CalDAV | Webhook | 1–2 seconds | | CalDAV β†’ Google Calendar | CTag polling | avg. 7–8 seconds | | CalDAV β†’ Microsoft 365 | CTag polling | avg. 7–8 seconds |

For comparison, ICS feed subscriptions β€” the most common workaround for Nextcloud/Google Calendar sync β€” update every 24–48 hours and are read-only. CalDAVconnect is roughly 10,000Γ— faster, in both directions.

Practical implications

Calendly works correctly. Calendly reads your availability from Google Calendar. If you book a meeting in Nextcloud, CalDAVconnect syncs it to Google within seconds β€” so Calendly sees the blocked slot before anyone else can book it.

No double bookings. The short sync window means conflicts are detected and reflected before they can cause scheduling problems in practice.

Server-friendly. The CTag check is intentionally lightweight. A single HTTP request per calendar per 15 seconds is negligible load β€” both for your CalDAV server and for CalDAVconnect's infrastructure.

What about scale?

The CTag checks run in parallel across all active connections. At 120ms per check with parallel execution, CalDAVconnect can handle hundreds of active calendars within the 15-second polling window without degradation.


CalDAVconnect is currently in public beta and free to use. If you're running Nextcloud, SOGo, Radicale, BaΓ―kal, or Posteo and want to sync with Google Calendar or Microsoft 365, join the beta.

Ready to sync your calendars?

CalDAVconnect is currently in Public Beta β€” free to use during the beta period.