Calendar Integrations
Create events and appointments in Google Calendar, Outlook Calendar, and Microsoft Bookings from your Buildorado workflows.
Calendar integrations automate appointment booking and event scheduling directly from your Buildorado workflows. When a user submits a form with date, time, and contact information, Buildorado can instantly create a calendar event with attendees, location, reminders, and a detailed description pulled from the form data. This eliminates the back-and-forth of manual scheduling and ensures every booking is confirmed the moment the form is submitted. All calendar integrations authenticate via OAuth 2.0 and store credentials with AES-256 encryption through AWS KMS.
Google Calendar
Google Calendar is the most widely used calendar integration in Buildorado. Create events with attendees, locations, and custom details automatically from form submissions.
Setting Up Google Calendar
- Navigate to Settings > Integrations in your Buildorado dashboard.
- Find Google Calendar and click Connect.
- Sign in with your Google account in the authorization popup.
- Grant the following permissions:
calendar-- Full access to manage calendarscalendar.events-- Create and manage events
- Once authorized, Google Calendar shows as Connected with your Google account email.
Both personal Google accounts and Google Workspace accounts are supported.
Operations
createEvent
Create a new calendar event.
| Field | Type | Required | Description |
|---|---|---|---|
summary | string | Yes | Event title |
description | string | No | Event description |
startDateTime | datetime | Yes | Start date and time (e.g., 2024-03-15T10:00:00) |
endDateTime | datetime | Yes | End date and time |
timeZone | timezone | No | IANA timezone (e.g., America/New_York). Defaults to the calendar's timezone |
attendees | string | No | Comma-separated email addresses of attendees |
location | string | No | Event location (address or virtual meeting URL) |
Output:
| Field | Type | Description |
|---|---|---|
id | string | Google Calendar event ID |
htmlLink | string | Direct URL to the event |
status | string | Event status (confirmed, tentative, cancelled) |
updateEvent
Update an existing calendar event.
| Field | Type | Required | Description |
|---|---|---|---|
eventId | string | Yes | Event ID to update |
summary | string | No | Updated event title |
description | string | No | Updated description |
startDateTime | datetime | No | Updated start date and time |
endDateTime | datetime | No | Updated end date and time |
Output:
| Field | Type | Description |
|---|---|---|
id | string | Event ID |
updated | string | Timestamp of the update |
listEvents
List upcoming calendar events.
| Field | Type | Required | Description |
|---|---|---|---|
calendarId | string | No | Calendar ID (defaults to primary) |
timeMin | datetime | No | Filter events starting after this date-time |
timeMax | datetime | No | Filter events ending before this date-time |
maxResults | number | No | Maximum number of events to return |
Output:
| Field | Type | Description |
|---|---|---|
events | string | Events as JSON |
Mapping Date/Time Form Fields
When your form includes date and time fields, map them to the Google Calendar event:
[Form: Appointment Booking]
-- [Google Calendar: createEvent]
summary: "Meeting with {{form.clientName}}"
startDateTime: "{{form.appointmentDate}}T{{form.appointmentTime}}:00"
endDateTime: computed from start + duration
attendees: "{{form.clientEmail}}"
location: "{{form.meetingLocation}}"Date format considerations:
- If your form uses a date field, Buildorado provides the value in ISO format (e.g.,
2024-03-15). - If your form uses a time field, the value comes as
HH:MM(e.g.,14:30). - Combine them with the
Tseparator:{{form.date}}T{{form.time}}:00produces2024-03-15T14:30:00.
For all-day events, use date-only values without the time component:
startDateTime: "{{form.eventDate}}"
endDateTime: "{{form.eventEndDate}}"Timezone Handling
Timezones are critical for scheduling across regions. Google Calendar handles timezones using IANA timezone identifiers:
| Timezone | IANA Identifier |
|---|---|
| US Eastern | America/New_York |
| US Central | America/Chicago |
| US Mountain | America/Denver |
| US Pacific | America/Los_Angeles |
| UK | Europe/London |
| Central Europe | Europe/Berlin |
| India | Asia/Kolkata |
| Japan | Asia/Tokyo |
| Australia Eastern | Australia/Sydney |
Best practices for timezone handling:
- If your form collects the user's timezone, map it to the
timeZonefield:{{form.timezone}}. - If your form does not collect timezone, set a default timezone in the action configuration.
- Avoid relying on the calendar's default timezone if your users are in different regions. Explicitly set the timezone to prevent off-by-hours scheduling errors.
Attendees and Invitations
When you include email addresses in the attendees field, Google Calendar sends invitation emails to each attendee. The attendees receive a standard Google Calendar invitation they can accept, decline, or mark as tentative.
attendees: "{{form.clientEmail}}, {{form.advisorEmail}}, [email protected]"Multiple attendees are separated by commas. Each receives an independent invitation.
Note: Invitation emails are sent by Google, not by Buildorado. The invitation appears to come from the Google account that owns the calendar.
Template Variables in Event Details
Use template variables throughout the event configuration to personalize every field:
summary: "Consultation: {{form.firstName}} {{form.lastName}}"
description: "Client: {{form.firstName}} {{form.lastName}}
Email: {{form.email}}
Phone: {{form.phone}}
Topic: {{form.consultationTopic}}
Notes: {{form.additionalNotes}}
Submitted via Buildorado on {{submission.createdAt}}"
location: "{{form.preferredOffice}}"Common Patterns
Appointment booking with confirmation email:
[Form: Book Appointment]
-- [Google Calendar: createEvent]
summary: "{{form.serviceType}} - {{form.clientName}}"
startDateTime: "{{form.date}}T{{form.time}}:00"
endDateTime: calculated
attendees: "{{form.email}}"
-- [Email: Send confirmation]
to: "{{form.email}}"
subject: "Your appointment is confirmed"
body: "Your {{form.serviceType}} is scheduled for {{form.date}} at {{form.time}}.
View it on your calendar: {{googleCalendar_1.htmlLink}}"Conditional calendar selection:
[Form: Meeting Request]
-- Branch: meetingType
-- "Sales" -- [Google Calendar: Create on [email protected] calendar]
-- "Support" -- [Google Calendar: Create on [email protected] calendar]
-- "General" -- [Google Calendar: Create on [email protected] calendar]Tips for Google Calendar
- The connected Google account must have write access to the target calendar. For shared calendars, ensure the account has "Make changes to events" permission.
- Google Calendar API has a quota of 1,000,000 queries per day and 500 requests per 100 seconds per user. These limits are generous for most workflows.
- For recurring events, create the first event and note the event ID. Recurring event support in the action node requires the recurrence rule (RRULE) format.
Outlook Calendar
Outlook Calendar integration creates events in Microsoft 365 calendars, ideal for organizations that use the Microsoft ecosystem.
Setting Up Outlook Calendar
- Navigate to Settings > Integrations and click Connect next to Outlook Calendar.
- Sign in with your Microsoft 365 account in the authorization popup.
- Grant the following permissions:
User.Read-- Read your profileCalendars.ReadWrite-- Create and manage calendar eventsoffline_access-- Maintain the connection
- Once authorized, Outlook Calendar shows as Connected.
Operations
createEvent
Create a new calendar event in Outlook.
| Field | Type | Required | Description |
|---|---|---|---|
subject | string | Yes | Event title |
body | string | No | Event description (HTML supported) |
startDateTime | datetime | Yes | Start date and time in ISO 8601 format |
endDateTime | datetime | Yes | End date and time in ISO 8601 format |
timeZone | timezone | No | Timezone (e.g., America/New_York) |
location | string | No | Event location |
attendees | string | No | Comma-separated email addresses |
isOnlineMeeting | boolean | No | Create as a Teams meeting |
Output:
| Field | Type | Description |
|---|---|---|
id | string | Outlook event ID |
webLink | string | Web link to view the event |
onlineMeetingUrl | string | Teams meeting URL (if isOnlineMeeting is true) |
updateEvent
Update an existing calendar event.
| Field | Type | Required | Description |
|---|---|---|---|
eventId | string | Yes | Event ID to update |
subject | string | No | Updated event title |
body | string | No | Updated description |
startDateTime | datetime | No | Updated start date and time |
endDateTime | datetime | No | Updated end date and time |
timeZone | timezone | No | Updated timezone |
location | string | No | Updated location |
Output:
| Field | Type | Description |
|---|---|---|
id | string | Event ID |
webLink | string | Web link to the event |
listEvents
List upcoming calendar events.
| Field | Type | Required | Description |
|---|---|---|---|
top | number | No | Number of events to return |
startDateTime | datetime | No | Filter events starting after this date-time |
endDateTime | datetime | No | Filter events ending before this date-time |
Output:
| Field | Type | Description |
|---|---|---|
events | string | Events as JSON |
Teams Meeting Integration
Set isOnlineMeeting to true to automatically generate a Microsoft Teams meeting link for the event. The Teams join URL is available in the output as onlineMeetingUrl, which you can include in confirmation emails:
[Outlook Calendar: createEvent]
subject: "Meeting with {{form.clientName}}"
isOnlineMeeting: true
-- [Email: Send to {{form.email}}]
body: "Join via Teams: {{outlookCalendar_1.onlineMeetingUrl}}"Timezone Differences
Outlook Calendar uses Windows timezone names instead of IANA identifiers:
| Region | Outlook Timezone Name |
|---|---|
| US Eastern | Eastern Standard Time |
| US Central | Central Standard Time |
| US Pacific | Pacific Standard Time |
| UK | GMT Standard Time |
| Central Europe | Central European Standard Time |
| India | India Standard Time |
| Japan | Tokyo Standard Time |
If your form collects IANA timezone values, you may need to map them to the Windows equivalents in a code node.
Tips for Outlook Calendar
- For shared or room calendars, specify the calendar owner's email or calendar ID.
- Outlook Calendar supports rich HTML in the event body, including tables, links, and formatted text.
- Admin consent may be required for organization-wide calendar access.
Microsoft Bookings
Microsoft Bookings is a scheduling tool within Microsoft 365 designed for customer-facing appointment booking.
Setting Up Microsoft Bookings
- Navigate to Settings > Integrations and click Connect next to Microsoft Bookings.
- Sign in with your Microsoft 365 account.
- Grant permissions for reading and managing Bookings data. The following scopes are requested:
User.Read-- Read your profileBookingsAppointment.ReadWrite.All-- Manage bookingsoffline_access-- Maintain the connection
- Once authorized, Bookings shows as Connected.
Operations
listBusinesses
List all booking businesses the user has access to.
| Field | Type | Required | Description |
|---|---|---|---|
top | number | No | Number of businesses to return |
Output:
| Field | Type | Description |
|---|---|---|
businesses | string | Businesses as JSON |
listServices
List all services for a booking business.
| Field | Type | Required | Description |
|---|---|---|---|
businessId | string | Yes | The booking business ID |
top | number | No | Number of services to return |
Output:
| Field | Type | Description |
|---|---|---|
services | string | Services as JSON |
createAppointment
Create a new appointment in a booking business.
| Field | Type | Required | Description |
|---|---|---|---|
businessId | string | Yes | Bookings business ID |
serviceId | string | Yes | The service being booked |
startDateTime | datetime | Yes | Appointment start time |
endDateTime | datetime | Yes | Appointment end time |
timeZone | timezone | No | Timezone |
customerName | string | Yes | Customer's full name |
customerEmail | string | Yes | Customer's email address |
customerPhone | string | No | Customer's phone number |
customerNotes | string | No | Additional notes from the customer |
staffMemberIds | string | No | Comma-separated staff member IDs |
Output:
| Field | Type | Description |
|---|---|---|
id | string | Appointment ID |
serviceId | string | Service ID |
serviceName | string | Service name |
startDateTime | string | Appointment start |
endDateTime | string | Appointment end |
customerName | string | Customer name |
customerEmail | string | Customer email |
Tips for Microsoft Bookings
- Bookings is included with Microsoft 365 Business Standard and higher plans.
- Use the
listBusinessesoperation to discover business IDs, then uselistServicesto find available services. - Bookings automatically sends confirmation and reminder emails to customers through Microsoft 365.
- Staff member auto-assignment distributes bookings evenly when no specific staff member is selected.
Best Practices for Calendar Integrations
Validate Date and Time Before Creating Events
Use conditional logic to ensure the selected date is in the future:
[Form: Appointment]
-- Branch: appointmentDate is after today
-- true -- [Google Calendar: createEvent]
-- false -- [Email: "Please select a future date"]Include All Relevant Details in the Event
Pack the event description with all form data so the organizer has full context without navigating back to Buildorado:
description: "Appointment Details
Client: {{form.name}}
Email: {{form.email}}
Phone: {{form.phone}}
Service: {{form.service}}
Notes: {{form.notes}}
Submission: {{submission.id}}"Send Confirmation After Event Creation
Always follow calendar event creation with a confirmation email or message that includes the event URL:
[Calendar: createEvent]
-- [Email: "Your appointment is confirmed. View: {{calendar_1.htmlLink}}"]Error Handling
Calendar API calls can fail if the connected account is deauthorized, the calendar is deleted, or the time slot conflicts with an existing event. Attach an error handler node to handle failures gracefully.