You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
When a booking is created through Cal.com, the Google Calendar integration makes multiple sequential API calls (event creation, then PATCH to update description/location/conference data). If the PATCH call is rejected by Google with a 403 Rate Limit Exceeded error, Cal.com does not retry the request due to two gaps in the gaxios retry configuration:
PATCH is excluded from httpMethodsToRetry — only GET, HEAD, PUT, OPTIONS, and DELETE are retried. PATCH and POST are not.
Because of these two gaps, a transient rate limit error on a PATCH request is never retried. The calendar event update is permanently lost, but the booking still appears successful in Cal.com's database and UI, and downstream workflow tasks (like reminder emails) are still queued.
The retryConfig seen in the logs may be the default from gaxios (the HTTP client inside google-auth-library) rather than something Cal.com explicitly sets. If so, the fix would involve Cal.com explicitly passing a custom retryConfig when instantiating the Google Calendar API client to override these defaults.
Steps to Reproduce
Self-host Cal.com (v6.2.0 via Cloudron package com.cal.cloudronapp@2.13.0) with Google Calendar integration connected
A booking is created via the booking page, triggering a Google Calendar event
The initial event creation (POST/insert) succeeds, but the follow-up PATCH (to add description, location, and Google Meet conference data) is rejected by Google with a 403 Rate Limit Exceeded error
Cal.com logs BookingCreatingMeetingFailed but still queues workflow reminder emails for the booking
The booking appears on the Cal.com dashboard with no indication of failure
This is more likely to occur on self-hosted instances using their own Google Cloud API project, which may have lower default per-user burst rate limits than Cal.com's hosted infrastructure. The Google Cloud Console quotas dashboard may not show any limit being hit, because these are short-burst per-user rate limits that don't appear in the daily aggregate view.
Actual Results
The PATCH request to Google Calendar fails with 403 Rate Limit Exceeded and is not retried (currentRetryAttempt: 0 stays at 0)
The relevant code is likely in packages/app-store/googlecalendar/lib/CalendarService.ts or wherever the Google API client is instantiated. If Cal.com is not explicitly setting a retryConfig, it would need to start overriding the gaxios defaults.
Evidence
Sanitized server logs from Cloudron showing the full error chain:
1. Google Calendar API rejects the PATCH with 403:
Issue Summary
When a booking is created through Cal.com, the Google Calendar integration makes multiple sequential API calls (event creation, then PATCH to update description/location/conference data). If the PATCH call is rejected by Google with a
403 Rate Limit Exceedederror, Cal.com does not retry the request due to two gaps in thegaxiosretry configuration:PATCHis excluded fromhttpMethodsToRetry— onlyGET,HEAD,PUT,OPTIONS, andDELETEare retried.PATCHandPOSTare not.403is excluded fromstatusCodesToRetry— only[100-199],[429], and[500-599]are retried. Google's [error handling docs](https://developers.google.com/workspace/calendar/api/guides/errors) state thatrateLimitExceededcan return either403or429, and both should be handled with exponential backoff.Because of these two gaps, a transient rate limit error on a PATCH request is never retried. The calendar event update is permanently lost, but the booking still appears successful in Cal.com's database and UI, and downstream workflow tasks (like reminder emails) are still queued.
The
retryConfigseen in the logs may be the default fromgaxios(the HTTP client insidegoogle-auth-library) rather than something Cal.com explicitly sets. If so, the fix would involve Cal.com explicitly passing a customretryConfigwhen instantiating the Google Calendar API client to override these defaults.Steps to Reproduce
com.cal.cloudronapp@2.13.0) with Google Calendar integration connected403 Rate Limit ExceedederrorBookingCreatingMeetingFailedbut still queues workflow reminder emails for the bookingThis is more likely to occur on self-hosted instances using their own Google Cloud API project, which may have lower default per-user burst rate limits than Cal.com's hosted infrastructure. The Google Cloud Console quotas dashboard may not show any limit being hit, because these are short-burst per-user rate limits that don't appear in the daily aggregate view.
Actual Results
403 Rate Limit Exceededand is not retried (currentRetryAttempt: 0stays at 0)BookingCreatingMeetingFailedserver-sideExpected Results
403 rateLimitExceedederrors, per Google's own API documentationTechnical details
com.cal.cloudronapp@2.13.0The retry configuration from the error response:
Two fixes are needed:
"PATCH"and"POST"tohttpMethodsToRetry[403, 403]tostatusCodesToRetryThe relevant code is likely in
packages/app-store/googlecalendar/lib/CalendarService.tsor wherever the Google API client is instantiated. If Cal.com is not explicitly setting aretryConfig, it would need to start overriding the gaxios defaults.Evidence
Sanitized server logs from Cloudron showing the full error chain:
1. Google Calendar API rejects the PATCH with 403:
2. CalendarManager reports the failure:
3. EventManager logs the integration failure:
4. But the workflow reminder email is still queued:
Related Issues