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
| Method | Complexity | Cost | Best For |
|---|---|---|---|
| Zapier | Low | $20+/mo | Quick setup, low volume |
| Calendly Webhooks | Medium | Free (Calendly Pro+) | Real-time, no middleware cost |
| n8n / Make | Medium | $0-29/mo | Visual workflow builder |
| Custom Odoo Module | High | Dev time | Deep CRM integration |
Step 1: Get Calendly API Access
- Log into Calendly and go to Integrations & Apps
- Select API & Webhooks
- Generate a Personal Access Token
- 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
| Feature | Calendly | Odoo Appointments |
|---|---|---|
| Standalone scheduling page | Yes, polished | Yes, basic |
| Round-robin assignment | Pro plan | Enterprise |
| Payment collection | Yes (Stripe/PayPal) | No |
| CRM integration | Via API/webhook | Native |
| Custom branding | Pro plan | Yes |
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.