← All projects
n8n

Google Calendar ↔ EspoCRM sync

Calendar meetings show up in the CRM by themselves, without duplicates and without the paid extension — a reusable pattern for capturing leads from any source.

Stack
n8nGoogle CalendarEspoCRMREST API

What it solves

Keeping the CRM in sync with the calendar is one of those invisible jobs nobody does: every sales meeting that goes unrecorded is a follow-up that never happens. This workflow removes that friction entirely.

How it’s built

The flow reads future events from a Google Calendar, discards cancelled ones and normalizes the data — dates, title, description. The key is using the Google event ID as a unique key: if the meeting already exists in EspoCRM it updates it; if not, it creates it. A loop that processes events one by one, with a pause, avoids hammering the API.

Why it’s interesting

Instead of paying for the official EspoCRM extension, this replicates that function with n8n — free and self-hosted — and on top of that it stays fully customizable. But the most valuable part is the pattern: trigger → normalize → check for duplicate → create/update. That same architecture works to capture leads from a web form, WhatsApp (via Evolution API) or email, creating them as records in EspoCRM automatically. One workflow that solves a concrete problem and, along the way, leaves the template assembled for all the others.

The workflow, in the open

The full workflow is published on GitHub: you can download it, import it into your own n8n and see exactly how it’s built, node by node → sync-calendar-espocrm-sanitizado.json