Skip to content

How to Connect Calendly to Odoo: Scheduling Integration Guide

DeployMonkey Team · March 23, 2026 9 min read

Why Connect Calendly to Odoo?

Calendly handles meeting scheduling with elegance — prospects pick a time, fill in details, and the meeting appears on your calendar. But without connecting it to Odoo, your sales team must manually create CRM leads, log activities, and update contact records. That manual step means leads slip through the cracks, especially during high-volume periods.

By integrating Calendly with Odoo, every booking automatically creates or updates a contact, generates a CRM lead or opportunity, and logs a calendar event — all without anyone lifting a finger.

Integration Methods

MethodComplexityCostBest For
ZapierLow$20+/moQuick setup, low volume
Calendly WebhooksMediumFree (Calendly Pro+)Real-time, no middleware cost
n8n / MakeMedium$0-29/moVisual workflow builder
Custom Odoo ModuleHighDev timeDeep CRM integration

Step 1: Get Calendly API Access

  1. Log into Calendly and go to Integrations & Apps
  2. Select API & Webhooks
  3. Generate a Personal Access Token
  4. Note your organization URI from the API response

Step 2: Configure Webhooks

Calendly Pro and higher plans support webhooks. Create a webhook subscription for booking events:

curl -X POST https://api.calendly.com/webhook_subscriptions \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://your-odoo.com/calendly/webhook",
    "events": ["invitee.created", "invitee.canceled"],
    "organization": "https://api.calendly.com/organizations/YOUR_ORG",
    "scope": "organization"
  }'

Step 3: Handle Webhooks in Odoo

from odoo import http
import json

class CalendlyWebhook(http.Controller):
    @http.route('/calendly/webhook', type='json', auth='none', csrf=False)
    def handle(self, **kwargs):
        data = json.loads(http.request.httprequest.data)
        event = data.get('event')
        payload = data.get('payload', {})
        
        if event == 'invitee.created':
            invitee = payload.get('invitee', {})
            event_type = payload.get('event_type', {})
            scheduled = payload.get('scheduled_event', {})
            
            # Find or create partner
            partner = http.request.env['res.partner'].sudo().search(
                [('email', '=', invitee['email'])], limit=1
            )
            if not partner:
                partner = http.request.env['res.partner'].sudo().create({
                    'name': invitee['name'],
                    'email': invitee['email'],
                })
            
            # Create CRM lead
            http.request.env['crm.lead'].sudo().create({
                'name': f"Calendly: {event_type.get('name', 'Meeting')}",
                'partner_id': partner.id,
                'email_from': invitee['email'],
                'description': f"Scheduled: {scheduled.get('start_time')}",
            })
        
        return {'status': 'ok'}

Step 4: Create Calendar Events

Extend the webhook handler to also create Odoo calendar events so the meeting appears on the assigned salesperson's calendar:

# Add to the webhook handler
from dateutil import parser

start_dt = parser.isoparse(scheduled['start_time'])
end_dt = parser.isoparse(scheduled['end_time'])

http.request.env['calendar.event'].sudo().create({
    'name': event_type.get('name', 'Calendly Meeting'),
    'start': start_dt,
    'stop': end_dt,
    'partner_ids': [(4, partner.id)],
    'description': f"Booked via Calendly by {invitee['name']}",
})

Workflow Examples

  • Sales demo booking: Prospect books demo on Calendly, lead created in Odoo CRM, assigned to sales rep, calendar event synced
  • Customer success check-in: Existing customer books quarterly review, Odoo activity logged against their account
  • Support callback: Customer schedules callback, helpdesk ticket created with time slot
  • Interview scheduling: HR shares Calendly link, recruitment application updated with interview time

Handling Cancellations

When Calendly sends an invitee.canceled webhook, update the corresponding Odoo records. Mark the CRM lead activity as canceled and remove or update the calendar event. Store the Calendly event URI as an external reference in Odoo to link records reliably.

Calendly vs Odoo Appointments

FeatureCalendlyOdoo Appointments
Standalone scheduling pageYes, polishedYes, basic
Round-robin assignmentPro planEnterprise
Payment collectionYes (Stripe/PayPal)No
CRM integrationVia API/webhookNative
Custom brandingPro planYes

If you already use Calendly and want to keep its polished scheduling experience, integrate it with Odoo. If you prefer an all-in-one solution, Odoo's built-in Appointments module works well for simpler needs.

DeployMonkey + Calendly

DeployMonkey instances are publicly accessible with stable URLs, making webhook integration straightforward. Our AI agent can help set up the webhook endpoint, test bookings, and verify CRM lead creation.