Calendar¶
Overview¶
The Calendar task works with your team’s calendars from inside a workflow. Pick one action per task:
| Action | What it does |
|---|---|
| Book a meeting | Puts a meeting on one person’s calendar and invites the guests. |
| Change or move a meeting | Changes the time, title, guests or anything else. Blank fields are left as they are. |
| Cancel a meeting | Removes the meeting and, if you want, emails the guests a cancellation. |
| Find meetings | Looks meetings up by person, client, dates and title. |
| Find open times | Lists times one or more people are free, ready to offer a customer. |
Meetings booked here behave exactly like meetings booked on the calendar screen. They go onto the person’s connected Outlook or Google calendar, guests get a normal calendar invitation, a Teams or Google Meet link is added if you ask for one, and a meeting linked to a client shows on that client’s record.
When to use this task:
- Book a consultation as soon as a website form comes in.
- Offer a customer three open times by SMS or WhatsApp, then book the one they choose.
- Let an AI Prompt chat agent check free times while it talks to a customer.
- Move or cancel a meeting when a deal changes.
- Check whether a client already has a meeting booked before sending a reminder.
Configuration¶
Builder fields¶
The Field column is the label as it appears in the task builder; Key is the name the value is stored under and referenced by.
| Field | Key | Type | Default | Notes |
|---|---|---|---|---|
| Action | action |
select | create_event |
Options: Book a meeting · Change or move a meeting · Cancel a meeting · Find meetings · Find open times |
| Let the AI see meeting titles | ai_show_titles |
checkbox | 0 |
|
| Longest meeting the AI may book (minutes) | ai_max_minutes |
number | 60 |
|
| Whose calendar | owner_user_id |
select | – | Only shown when action is create_event |
| Meeting | event_id |
text | – | Only shown when action is update_event, cancel_event |
| Title | title |
text | – | Only shown when action is create_event, update_event |
| Starts | start |
text | – | Only shown when action is create_event, update_event |
| Length (minutes) | duration_minutes |
number | 30 |
Only shown when action is create_event |
| New length (minutes, optional) | update_duration_minutes |
number | – | Only shown when action is update_event |
| Ends (optional) | end |
text | – | Only shown when action is create_event, update_event |
| All-day | all_day |
checkbox | 0 |
Only shown when action is create_event |
| All-day | update_all_day |
select | __keep__ |
Options: — Leave unchanged — · Make it all-day · Give it a start and end time. Only shown when action is update_event |
| Location (optional) | location |
text | – | Only shown when action is create_event, update_event |
| Add an online meeting link | online_meeting |
checkbox | 0 |
Only shown when action is create_event |
| Online meeting link | update_online_meeting |
select | __keep__ |
Options: — Leave unchanged — · Add a link · Remove the link. Only shown when action is update_event |
| Guests (optional) | attendees |
textarea | – | Only shown when action is create_event, update_event |
| Client (optional) | client_id |
text | – | Only shown when action is create_event, update_event, find_events |
| Notes (optional) | description |
textarea | – | Only shown when action is create_event, update_event |
| Only book if the time is still free | only_if_free |
checkbox | 0 |
Only shown when action is create_event |
| Treat all-day entries as busy | all_day_busy |
checkbox | 1 |
|
| Don’t book the same meeting twice | skip_duplicate |
checkbox | 1 |
Only shown when action is create_event |
| Email guests that it is canceled | notify_attendees |
checkbox | 1 |
Only shown when action is cancel_event |
| Whose calendars | user_ids |
select | – | Only shown when action is find_events, find_free_time |
| From | from |
text | – | Only shown when action is find_events, find_free_time |
| To | to |
text | – | Only shown when action is find_events, find_free_time |
| Title contains (optional) | title_contains |
text | – | Only shown when action is find_events |
| Include canceled meetings | include_cancelled |
checkbox | 0 |
Only shown when action is find_events |
| Return | return |
select | all |
Options: All matching meetings · The first meeting only · Just how many there are. Only shown when action is find_events |
| Meeting length (minutes) | length_minutes |
number | 30 |
Only shown when action is find_free_time |
| Working days | working_days |
select | 1,2,3,4,5 |
Options: Monday · Tuesday · Wednesday · Thursday · Friday · Saturday · Sunday. Only shown when action is find_free_time |
| Day starts | work_start |
time | 08:00 |
Only shown when action is find_free_time |
| Day ends | work_end |
time | 17:00 |
Only shown when action is find_free_time |
| Gap around other meetings (minutes) | buffer_minutes |
number | 0 |
Only shown when action is find_free_time |
| Earliest booking from now (minutes) | min_notice_minutes |
number | 60 |
Only shown when action is find_free_time |
| Meetings can start | step_minutes |
select | 30 |
Options: On the hour · Every 30 minutes · Every 15 minutes. Only shown when action is find_free_time |
| Most times per day | max_per_day |
number | 3 |
Only shown when action is find_free_time |
| Most times in total | max_slots |
number | 10 |
Only shown when action is find_free_time |
Dates and times¶
Anywhere the task asks for a date or time you can type:
- a date and time, like
2026-10-05 14:00— read in the account’s time zone; - a date, like
2026-10-05; now,today,tomorrow, or+2 hours,+3 days,+1 week;- a time from an earlier step, like
{{task_5_first_slot_start}}— these carry their own zone and are used exactly.
Typed times are read, and times are written back, in the account’s time zone from General Settings. If none is set, the task uses America/Chicago and says so in its result.
Book a meeting¶
Whose calendar takes one person. To book whoever Find open times picked, switch the field
to Variable and drag in first_slot_user_id from that step.
Only book if the time is still free checks the person’s calendar first (not for all-day meetings, which are always booked). If the time has been
taken since it was offered, nothing is booked, booked is no and slot_taken is yes, so an
If step can offer new times.
Don’t book the same meeting twice is on by default. If the workflow runs again (a retry, or the same customer submitting twice) for the same person, time and client, the task reuses the meeting it already booked and says so.
Change or move a meeting¶
Set Meeting to the event_id from an earlier Calendar step or a
Calendar Trigger. Only the fields you fill in change:
- Setting just a new Starts keeps the meeting’s length; New length changes it on its own.
- All-day and Online meeting link start at — Leave unchanged —. Turning a timed meeting into an all-day one keeps its day; giving an all-day meeting times needs a new Starts.
- Leaving Guests blank keeps the current guests and their replies.
- A client, when set, must be one of this account’s clients.
A repeating meeting can only be changed one meeting at a time; the task will not change a whole series.
Find open times¶
Whose calendars takes one or more people. With several, a time counts as open if any of them
is free, and it goes to whoever has the fewest meetings that week, so bookings are spread evenly.
Ties go to the first person in the list. Every slot also lists everyone who was free
(free_user_ids).
Open times never overlap each other. Most times per day spreads the times across each day rather than taking the first few, so a customer is offered a morning, a midday and an afternoon.
All-day entries count as busy for the whole day in the account’s time zone — so nobody is booked while on leave. BaseCloud cannot yet tell a day off from an all-day note such as a public holiday or “working from home”, so if your team keeps notes like that, turn off Treat all-day entries as busy. The same setting applies to Only book if the time is still free. All-day entries do not count as meetings when spreading bookings evenly. Meetings the person declined never count as busy.
Output Fields¶
Book, change or find meetings¶
| Field | Description |
|---|---|
event_id |
The meeting’s ID. Use it in a later Change or Cancel step. |
title, description, location |
The meeting details. |
start, end |
Exact times (ISO, UTC); the date for all-day meetings, with end the last day. |
start_local, end_local |
2026-10-05 14:00 in the account’s time zone. All-day meetings give the date only. |
start_label, end_label |
Readable, e.g. Mon, Oct 5, 2:00 PM — ready for an SMS or email. |
all_day |
yes / no. |
owner_user_id, owner_name |
Whose calendar the meeting is on. |
client_id, client_name |
The linked client, when there is one. |
meeting_link |
The Teams or Meet link, when one was added. |
web_link |
Opens the meeting in Outlook or Google Calendar. |
attendee_emails |
The guests, comma-separated. |
booked |
Book only: yes / no. |
slot_taken |
Book only: yes when Only book if the time is still free stopped the booking. |
already_booked |
Book only: yes when an earlier run’s meeting was reused. |
synced |
Book only: yes when the meeting reached Outlook or Google. |
cancelled |
yes once a meeting is canceled; on other actions, whether the meeting is canceled. |
updated |
Change only: yes / no. |
time_zone |
The zone used for this run. |
Find meetings adds count, found (yes/no), events (the list, up to 200) and truncated (yes when there were more),
events_text (one meeting per line) and the first meeting’s fields with a first_ prefix, such
as first_event_id and first_start_label.
Find open times¶
| Field | Description |
|---|---|
count, found |
How many times were found. |
slots |
The list. Each has start, end, start_local, label, user_id, user_name and free_user_ids. |
slots_text |
One time per line, e.g. Tue, Oct 6, 9:00 AM (with the person’s name when several were checked). |
free_ranges_text |
Every free stretch per day, e.g. Mon, Oct 5: free 8:00 AM–10:30 AM, 11:00 AM–5:00 PM, no free time, or not a working day. |
free_ranges |
The same as a list: each day’s date, label, user_id, user_name, working_day and ranges (start, end, label). |
working_hours |
The hours searched, e.g. Mon–Fri, 8:00 AM–5:00 PM (America/Chicago). |
first_slot_start, first_slot_end, first_slot_label |
The earliest time. |
first_slot_user_id, first_slot_user_name |
Who that time goes to. |
now |
The current date and time in the task’s zone, so an AI can work out “next Wednesday”. |
searched_from, searched_to, length_minutes |
What was searched. |
Testing¶
Running the task by hand does exactly what a live run does: Book a meeting books it (and sends the invitations), Change changes it, Cancel cancels it. Test with your own calendar and your own email as the guest. Don’t book the same meeting twice also applies, so running Book again for the same person and time returns the meeting it already booked.
Using it with AI Prompt¶
Attach a Calendar task to an AI Prompt task’s tools port and pick whose calendars the AI can use. The task’s own action is not used while it is attached — under What the AI may do you choose what the AI can do with it instead:
| What the AI may do | On to begin with | What it does |
|---|---|---|
| Check the calendar | Yes | Sees when those people are busy, for any dates it needs — up to 31 days at a time, up to 12 months ahead. |
| Find a guest's booking | Yes | Finds the upcoming meeting it booked for a guest, so “can we make it 10 instead?” in a later message knows which meeting that is. Looked up by the client this workflow is about, or else by an email the customer gave — and then it sees only when the meeting is, not what it is about. |
| Book a meeting | No — tick it | Books a meeting on one of those calendars. |
The AI decides when to check and when to book, while it works on its reply. What it sees when it checks:
Tue, Oct 6: busy 8:00 AM–9:00 AM, 1:30 PM–2:00 PM
Thu, Oct 8: busy all day, 10:00 AM–11:00 AM
Sat, Oct 10: nothing booked
Meetings people declined don’t count as busy; all-day entries are listed as “all day”.
Put your rules in the prompt — the hours and days you take meetings, how long they usually are, how far ahead to offer, and whether to confirm before booking. For example:
The customer may want a meeting. We meet 7 AM–5 PM, Monday to Saturday, never Sunday, for an hour unless they ask otherwise. Check the calendar before offering times, and offer at most three. Only book once they have said yes to a time and given their name and email.
What the AI can never do, whatever it is asked:
- book on anyone else’s calendar than the people you picked;
- book a time that is no longer free (checked again at the moment of booking);
- book longer than Longest meeting the AI may book (60 minutes to begin with);
- book a second upcoming meeting for a guest it can identify (by their email, or the client this workflow is about) — it gets their existing one back instead;
- book more than 5 meetings in one reply;
- change or cancel a meeting.
The AI writes the meeting itself. It takes the title, the place and whether to add an online link from the conversation — “Quote for bathroom — Jane Smith”, “12 Oak Street” — so you don’t have to set them. The task’s Title, Location and Online meeting settings are only used when the AI leaves one out, and Link to client is always the task’s.
Meeting titles are hidden from the AI unless you turn on Let the AI see meeting titles — keep it off for any chat with customers, or it could read out what someone’s meetings are about.
Meetings the AI books are marked as made by an automation, so the Calendar Trigger’s “A meeting is booked” does not start a workflow for them.
Examples¶
Offer three times by SMS¶
- Find open times — your sales team,
+1 dayto+7 days, 30 minutes, Most times per day 1, Most times in total 3. - SMS —
Hi {{first_name}}, we can call you at:\n{{task_1_slots_text}}\nReply 1, 2 or 3.
Book straight from a form¶
- Find open times — Whose calendars: the sales team, Most times in total 1.
- Calendar: Book a meeting — Whose calendar:
{{task_1_first_slot_user_id}}, Starts:{{task_1_first_slot_start}}, Guests:{{email}}, Client:{{client_id}}, Add an online meeting link on. - Email — confirm
{{task_2_start_label}}and{{task_2_meeting_link}}.
Troubleshooting¶
| What you see | Why |
|---|---|
| “is not a user on this account” | The person picked, or the ID passed in, belongs to someone outside this account. |
| “is not a start time BaseCloud can read” | Use a format from Dates and times. |
| “is a repeating meeting” | Change or cancel one meeting of the series instead. |
| The meeting is “in BaseCloud only” | The person has no connected Outlook or Google calendar, or it could not be reached. |
| “No time zone is set for this account” | Set the time zone in General Settings. |
| “organized by someone outside this account” | Only the organizer can change or cancel that meeting; the step reports updated / cancelled as no. |