I'm encountering significant difficulties getting my callin.io voice agent to communicate my calendar availability when asked over the phone.
I'm using the following JSON response format in my “respond to webhook” node:
json
{
"results": [
{
"toolCallId": "{{ $(‘Event = tool-call’).item.json.body.message.toolWithToolCallList[0].toolCall.id }}",
"output": {
"available": true,
"suggestedSlots": {{ JSON.stringify($json.availSlots) }},
"message": "We’ve got available slots at {{ $json.availSlots.toString() }}. Do any of those work for you?"
}
}
]
}
The callin.io workflow functions correctly and successfully books the call without any errors. However, my voice agent fails to convey this information audibly. It consistently states that no availability exists at the requested time and is unable to check my calendar, even though an HTTP GET request has been sent to my cal.com calendar with the proper credentials. The workflow itself is able to book a call based on the availability and the time I requested.
I have also established a function/tool within callin.io to verify my calendar availability and have explicitly instructed the agent to use it in the assistant prompt.
I'm uncertain why this is not functioning as expected. It's possible that I'm using an incorrect JSON response format, or my function might not be configured properly. I'm hoping for assistance with this issue.
I've also incorporated the following into my assistant prompt:
When receiving a function response:
- If
output.available
is true, extract eachtime
insuggestedSlots
and read them aloud to the user, formatted in human-friendly language. Example: “We’ve got times at 7:15 PM, 7:30 PM, and 8:15 PM. Do any of those work?” - If
output.message
exists, read it naturally. - If
output.available
is false andsuggestedSlots
exists, offer those as fallback options. - If
suggestedSlots
is empty or missing andoutput.message
exists, only read the message and let the user know no times are currently available.
Make sure the Respond to Webhook node executes only after all booking logic has finished.
Include distinct inputs in the output JSON, for instance:
{
"bookingStatus": "success",
"slotTime": "2025-06-14T10:00:00Z",
"available": true,
"suggestedSlots": ["2025-06-14T10:00:00Z"]
}
Utilize decision nodes (IF) to differentiate between available and unavailable scenarios, and transmit a suitable response for each situation.