English
Calendar — find free slots
Reads the calendar availability over a window and returns free slots, ready to be offered by an AI node.
This node reads the availability of a Google Calendar over a time window and returns free slots of a given length. Its main use is to give Compose (AI) real slots to propose in a reply: "I can do Tuesday 2 pm or Thursday 10 am" is only worth something if the calendar is really free at those times.
It needs the Google Calendar access of a Google account, shown as the Calendar capability in Connections. See Google. The availability read is that of the member running the workflow.
To book the slot once the client has chosen, use Calendar — create an event. For an Outlook calendar, use Find an Outlook slot.
At a glance
- Type:
google_calendar.find_free· version 1 - Category: Data
- Kind: Step — one stage of a run
- Effect: No external effect (
none) — nothing is written outside Mankomail; safe to replay - Needs a carrier email: No
- Connection: Google (capability
calendar) - Inputs:
main - Outputs:
main
Connection
This node needs a Google connection with the calendar capability granted.
Parameters
credential
Google account — The account holding Google Calendar access. Connect it once in Connections; the workflow always runs with the account of the member running it.
- Type: Connection (
credential) - Required: Yes
- Default:
""(empty)
calendar
Calendar — Left empty, the account’s primary calendar.
- Type: Remote resource (
resourceLocator) - Required: No
- Default:
{"mode":"id","value":"primary","label":"Agenda principal"} - Ways to choose: pick from a list, type an ID, paste a URL (
calendar) - Listed with the connection in:
credential
from
From — ISO 8601 date. Without a zone suffix it is read in the node’s “Time zone”; with one (Z, +02:00), as is. Accepts {{ }} expressions: {{ now }} if your workflow computes it.
- Type: Text (
string) - Required: Yes
- Default:
""(empty) - 60 characters at most
- Example:
2026-04-12T08:00:00 - Expressions:
{{ }}accepted
to
Until
- Type: Text (
string) - Required: Yes
- Default:
""(empty) - 60 characters at most
- Expressions:
{{ }}accepted
slotMinutes
Slot length (min)
- Type: Number (
number) - Required: No
- Default:
30 - Whole number, from 5 to 480
workingHoursStart
Working hours — start — HH:MM. Left empty, the whole day counts (nights included).
- Type: Text (
string) - Required: No
- Default:
09:00 - 5 characters at most
- Example:
09:00 - Expressions:
{{ }}accepted
workingHoursEnd
Working hours — end
- Type: Text (
string) - Required: No
- Default:
18:00 - 5 characters at most
- Example:
18:00 - Expressions:
{{ }}accepted
includeWeekend
Include weekends
- Type: Yes / no (
boolean) - Required: No
- Default:
false
timeZone
Time zone — IANA identifier (Europe/Paris, America/Montreal).
- Type: Text (
string) - Required: No
- Default:
Europe/Paris - 100 characters at most
- Expressions:
{{ }}accepted
maxSlots
Slot count — An email offering thirty slots offers nothing. Three to five is plenty.
- Type: Number (
number) - Required: No
- Default:
10 - Whole number, from 1 to 50
Outputs
main
Data produced
What this node adds to the run data, and how to read it in an expression. <step> stands for the step key: the node name turned into an identifier (see Data and expressions).
{{ data.<step>.slots }}—array of { start, end }. The free slots found, in chronological order.startandendare UTC instants in ISO 8601 with milliseconds, for example2026-04-14T07:00:00.000Z.{{ data.<step>.slots.0.start }}—string. The start of the first free slot (UTC).{{ data.<step>.count }}—number. The number of slots returned.0when the calendar has no free slot in the window.{{ data.<step>.summary }}—string. A readable sentence giving the number of slots found and their length.
Example
A prospect asks for a call next week. The node is named Free slots:
calendar: (id mode) primary
from: 2026-04-13T00:00:00+02:00
to: 2026-04-18T00:00:00+02:00
slotMinutes: 30
workingHoursStart: 09:00
workingHoursEnd: 18:00
timeZone: Europe/Paris
maxSlots: 3If Monday morning is busy until 10:00, the step data reads:
json
{
"slots": [
{ "start": "2026-04-13T08:00:00.000Z", "end": "2026-04-13T08:30:00.000Z" },
{ "start": "2026-04-13T08:30:00.000Z", "end": "2026-04-13T09:00:00.000Z" },
{ "start": "2026-04-13T09:00:00.000Z", "end": "2026-04-13T09:30:00.000Z" }
],
"count": 3
}The times are in UTC: 08:00Z is 10:00 in Paris. A Compose (AI) step can then receive {{ data.free_slots.slots }} in its instructions and propose them in the client's language and time zone.
Tips
- Window. From and Until are required ISO 8601 instants. A value without an offset (
2026-04-13T09:00:00) is read in the node's Time zone; with one (+02:00,Z), it is taken as is — as for Outlook. Until must be after From. - Working hours. Working hours — start and — end (
HH:MM, 09:00 and 18:00 by default) are applied to every working day of the window, in the Time zone field. Monday to Friday only, unless Include weekends is on — as for Outlook. If either field is empty, is not a validHH:MM, or the end is not after the start, working hours are ignored and the whole day counts, nights included. - How slots are cut. Busy periods are merged, then each free stretch is cut into consecutive slots of Slot length minutes (5 to 480, 30 by default), starting at the beginning of the free stretch rather than on a round hour: a meeting ending at 14:10 gives a first slot at 14:10. Slot count is between 1 and 50, 10 by default.
- Calendar. Left as is, the account's primary calendar. It can be picked from the list, typed as an id, or pasted as a Google Calendar URL carrying
cidorsrc. - Test runs. Reading availability changes nothing: in test runs the node really queries Google Calendar and returns real free slots.
- Errors.
credential.capability_missing: Google Calendar is not connected for the member running the workflow.google.bad_locator: From or Until is not a readable date, or Until is not after From.google.not_found: the calendar does not exist or the account cannot see it. Empty From or Until fails withnode_invalid_param.google.unavailableis retried automatically. See Error handling.