bohmez
07/22/2026, 5:19 PMAI Evy
07/22/2026, 5:19 PMAI Evy
07/22/2026, 5:20 PMAI Evy
07/22/2026, 5:20 PMstart_time to a constant/dynamic variable?
The built-in Cal.com tool doesn't support binding LLM-generated parameters to dynamic variables directly. However, you could use a Code Tool to calculate the correct date range and return it, or use a custom function to handle the availability check with your own date logic [(3) ]() .
Action Items:
1. Replace {{current_time_America/Regina}} with a custom dynamic variable (e.g., {{current_date_regina}}) that you populate when creating the call
2. Update your prompt to reference this custom variable instead
3. Consider using a Code Tool or custom function to control date generation for Cal.com callsAI Evy
07/22/2026, 5:20 PM{{current_time}} system variable:
Question 1: Is {{current_time_America/Regina}} valid?
Yes, the timezone format appears correct based on the documented pattern. The changelog indicates that {{current_time_[timezone]}} supports timezone-specific formatting, with examples like current_time_Australia/Sydney and current_time_America/New_York [(1) ]() . Your America/Regina follows this pattern.
Question 2: Can current_time be overridden by user-set variables?
Yes, this is a known issue documented in community discussions. One user reported: "{{current_time}} has many limitations. I don't think it really works unless you happen to be in the 'right' time zone by coincidence, and the LLM is Retell LLM, not a custom one." [(2) ]()
The core problem is architectural: "The client sends dynamic variables to the backend. The backend uses these dynamic variables to update the LLM's prompt on the fly." For system variables like {{current_time}}, "the client doesn't need to send it to the backend. However, this raises a critical question: how would the backend know your time zone? Likely, it doesn't—the backend will default to its own time zone."
Additionally, the default timezone for {{current_time}} is PST , which may explain why your Regina-specific variable isn't resolving correctly.
Recommended Solution:
Instead of relying on {{current_time_America/Regina}}, create a custom dynamic variable that you populate at call creation. As documented in the community: "To fix this, you should send the time with time zone information in a human-readable format. Additionally, you'll need to update your prompt accordingly, ensuring that your customAI Evy
07/22/2026, 5:20 PMAI Evy
08/15/2026, 12:19 AMbohmez
08/15/2026, 12:19 AMAI Evy
08/15/2026, 12:19 AMring_duration_ms, which appears in both the Create Voice Agent [(1) ]() and Create Phone Call agent_override [(2) ]() schemas. It's shown as an example value of 30000 (30 seconds) in the request/response bodies [(2) ]() [(1) ]() . Since it's part of the agent configuration object, it can be set at the agent level or overridden per-call via agent_override.agent.ring_duration_ms in the Create Phone Call API [(2) ]() .
I don't see the default value or the exact behavior description (i.e., what happens precisely at expiration) documented in the available sources beyond the field's presence and example.
2. Voicemail arriving before your timeout
The sources don't document a way to treat "answered by machine within X seconds" as equivalent to no-answer/auto-drop before the call connects. What is documented is the voicemail_option object, which detects voicemail after the call connects (within the first 3 minutes) and applies a configured action — either hangup or leaving a static message [(3) ]() [(1) ]() [(2) ]() . This is a post-connection detection mechanism, not a ring-phase cutoff.
I don't have documentation confirming whether a machine pickup is billed differently than a no-answer disconnect, or whether ring_duration_ms interacts with voicemail detection timing.AI Evy
08/15/2026, 12:19 AMring_duration_ms low to shorten the unanswered window [(2) ]() [(1) ]()
- Configuring voicemail_option with a hangup action to end quickly if voicemail is detected after connect [(3) ]() [(1) ]() [(2) ]()
- Monitoring call status via [Get Call API]() polling or webhooks (call_started, call_ended, call_analyzed, call_failed) to trigger the next call in your sequence [(4) ]()
I don't see a documented "escalation dialer" pattern or best-practice guide in these sources — this would need to be assembled from the general Batch calling and monitoring docs .
Given the gaps here (default ring_duration_ms value, exact machine-detection-before-connect behavior) , you may want to test empirically or check with support for confirmation.AI Evy
08/15/2026, 12:19 AMAI Evy
08/15/2026, 12:19 AMAI Evy
08/15/2026, 1:29 AMbohmez
08/15/2026, 1:29 AMAI Evy
08/15/2026, 1:30 AMfrom_number and to_number [(1) ]() :
javascript
const phoneCallResponse = await client.call.createPhoneCall({
from_number: '+14157774444',
to_number: '+12137774445',
}) ;
console.log(phoneCallResponse.agent_id) ;
For monitoring the outcome, real-time webhooks are the documented approach. The call_ended event triggers when a call completes, transfers, or errors, and includes all call fields except call_analysis [(2) ]() . The call_analyzed event fires when analysis is complete . If a call doesn't connect (e.g., dial_failed, dial_no_answer, dial_busy) , the call_started event will not fire, but call_ended and call_analyzed will still be triggered .
You'd inspect the disconnection_reason field in the call_ended payload to detect a no-answer outcome and then trigger the next call in your sequence. Sample payload structure :AI Evy
08/15/2026, 1:30 AMjson
{
"event": "call_ended",
"call": {
"call_type": "phone_call",
"from_number": "+12137771234",
"to_number": "+12137771235",
"direction": "inbound",
"call_id": "Jabr9TXYYJHfvl6Syypi88rdAHYHmcq6",
"agent_id": "oBeDLoLOeuAbiuaMFXRtDOLriTJ5tSxD",
"call_status": "registered",
"metadata": {},
"retell_llm_dynamic_variables": {
"customer_name": "John Doe"
},
"start_timestamp": 1714608475945,
"end_timestamp": 1714608491736,
"disconnection_reason": "user_hangup",
"transcript": "...",
"transcript_object": [ [Object], [Object], [Object], [Object] ],
"transcript_with_tool_calls": [ [Object], [Object], [Object], [Object] ],
"opt_out_sensitive_data_storage": false
}
}
Retell also recommends using webhooks over polling for production systems, since they provide real-time updates on call status (started, ended, analyzed, failed) without the overhead of continuous API calls [(3) ]() . Alternatively, you can poll the Get Call API for transcript, recording, and call status data .
For idempotency in your orchestration logic, use event + call_id as a unique key for call_started, call_ended, and call_analyzed events since they fire at most once per call [(2) ]() .
Briefing the worker with the call summary
You can pass the call summary into the next outbound call using retell_llm_dynamic_variables, which injects key-value string pairs into your prompt/tools [(1) ]() :AI Evy
08/15/2026, 1:30 AMjavascript
const registerCallResponse = await retell.call.createPhoneCall({
from_number: '+14157774444', // replace with the number you purchased
to_number: '+12137774445', // replace with the number you want to call
// Optional: per-call agent selection and overrides
override_agent_id: 'agent_abc123',
override_agent_version: 0, // or omit to use latest
agent_override: {
agent: {
voice_speed: 1.1,
enable_backchannel: true,
},
// retell_llm or conversation_flow overrides are also supported
},
retell_llm_dynamic_variables: { // dynamic variables (optional, string values only)
name: 'John Doe',
blood_group: 'B+'
},
custom_sip_headers: { // replace with custom sip headers you want to send (optional)
'X-Custom-Header': 'Custom Value'
}
}) ;
console.log(registerCallResponse) ;AI Evy
08/15/2026, 1:30 AMAI Evy
08/15/2026, 1:30 AMAI Evy
08/15/2026, 1:30 AM