Dropmuse
02/10/2026, 5:27 PMAI Evy
02/10/2026, 5:27 PMAI Evy
02/10/2026, 5:27 PMdial_busy – The number dialed is busy
- dial_no_answer – The number dialed did not answer
- dial_failed – SIP error codes are not available or error is unknown
2. If using warm transfer, check these settings:
- Agent detection timeout – This is the maximum time the AI will wait to determine if the transfer target is a human. The default is 30 seconds. If human detection doesn't succeed within this timeframe, the transfer is marked as failed. [(2) ]()
- Human detection – When enabled, the caller is only connected once a human is detected on the receiving end.
- Ensure you have the "transfer failed" edge connected to a node to handle failures. [(1) ]()
3. If using custom telephony (like Twilio SIP trunking) :
Warm transfers require additional permissions from your telephony provider compared to cold transfers. [(3) ]() If cold transfers work but warm transfers fail, you may need to contact your provider about permissions.
To help troubleshoot further, could you share:
- A call ID from a failed transfer?
- Are you using warm or cold transfer?
- What telephony provider are you using (Retell numbers or custom SIP) ?AI Evy
02/10/2026, 5:27 PMAI Evy
02/10/2026, 5:27 PMDropmuse
02/10/2026, 5:30 PMDropmuse
02/10/2026, 5:30 PMAI Evy
02/10/2026, 5:30 PMAI Evy
02/10/2026, 5:30 PMAI Evy
02/10/2026, 5:31 PMAI Evy
02/10/2026, 5:31 PMAI Evy
02/10/2026, 5:31 PMDropmuse
02/10/2026, 5:36 PMAI Evy
02/10/2026, 5:36 PMAI Evy
02/10/2026, 5:36 PMAI Evy
02/10/2026, 5:36 PMAI Evy
02/10/2026, 5:36 PMDropmuse
02/10/2026, 5:38 PMAI Evy
02/10/2026, 5:38 PMAI Evy
02/10/2026, 5:38 PM{{is_business_hours}} set to true or false
3. Update your prompt to reference this variable:
If {{is_business_hours}} is true, immediately call the transfer_call function to transfer to +447470144361.
If {{is_business_hours}} is false, act as the receptionist.
Alternative: Consider using Conversation Flow
For this type of conditional logic at call start, Conversation Flow may be better suited than a single-prompt agent. [(2) ]() Conversation Flow provides a structured framework that can help with deterministic branching based on variables, reducing reliance on the LLM to make time-based decisions. [(3) ]()
The key takeaway: the agent needs external data (passed via dynamic variables) to know the current time—it cannot calculate this itself.AI Evy
02/10/2026, 5:38 PMAI Evy
02/10/2026, 5:38 PMDropmuse
02/10/2026, 5:42 PMAI Evy
02/10/2026, 5:42 PMAI Evy
02/10/2026, 5:42 PM{{current_time}} system variable
Retell provides a default system variable {{current_time_[timezone]}} that gives you the current time in a specified timezone. [(1) ]()
For your Europe/London timezone, use:
{{current_time_Europe/London}}
This will return the current time formatted like: "Thursday, March 28, 2024 at 11:46:04 PM GMT"
Then update your prompt to parse this time and check against your business hours.
Option 2: Pass a pre-calculated is_business_hours variable
Create a custom dynamic variable (e.g., {{is_business_hours}}) and calculate the value in your backend before the call.
- Variable name: is_business_hours
- Default value: You can set a default value at the agent level (e.g., "false") which will be used when the variable isn't provided in the call request.
When creating the outbound call or responding to the inbound webhook, pass:
json
{
"is_business_hours": "true"
}
Important: All values in retell_llm_dynamic_variables must be strings—numbers, booleans, or other data types are not supported.
For inbound calls, you can supply dynamic variables via the [Inbound Call Webhook]() .AI Evy
02/10/2026, 5:42 PMAI Evy
02/10/2026, 5:42 PMDropmuse
02/10/2026, 5:44 PMAI Evy
02/10/2026, 5:44 PMAI Evy
02/10/2026, 5:44 PM{{current_time_Europe/London}} system variable:
Step 1: Add the variable to your prompt
Include {{current_time_Europe/London}} directly in your agent's prompt. [(1) ]()
This will automatically return the current time formatted like: "Thursday, March 28, 2024 at 11:46:04 PM GMT"
Step 2: Update your prompt to reference it
Modify your prompt to something like:
The current time is: {{current_time_Europe/London}}
Based on this time, determine if it falls within business hours:
- Monday: 8:30am–6:30pm
- Tuesday: 8:30am–7:00pm
- Wednesday: 8:30am–6:30pm
- Thursday: 8:30am–6:30pm
- Friday: 8:30am–1:00pm
- Saturday: 8:30am–12:00pm
- Sunday: Closed
If within business hours, immediately call transfer_call to +447470144361.
If outside business hours, act as the receptionist.
No configuration is required for system variables—they work automatically without needing to set default values.
Note: The LLM will need to parse the time string and compare it against your business hours. Since this relies on the LLM's interpretation, results may occasionally be inconsistent. For more deterministic behavior, Option 2 (calculating is_business_hours in your backend and passing it as "true" or "false") would be more reliable.AI Evy
02/10/2026, 5:44 PMAI Evy
02/10/2026, 5:44 PMDropmuse
02/10/2026, 5:46 PMAI Evy
02/10/2026, 5:46 PMAI Evy
02/10/2026, 5:46 PMjson
{ "is_business_hours": "false" }
Step 2: Pass the variable when creating calls
For outbound calls, when using the Create Phone Call API, set your variables in the retell_llm_dynamic_variables field. Note that all values must be strings: [(2) ]()
json
{
"is_business_hours": "true"
}
For inbound calls, you supply dynamic variables via the Inbound Call Webhook. [(3) ]() This webhook lets you use different agents or pass different variables based on conditions like the incoming phone number or time of day.
Step 3: Update your prompt
Reference the variable in your prompt:
If {{is_business_hours}} is "true", immediately call transfer_call to +447470144361.
If {{is_business_hours}} is "false", act as the receptionist.
Your backend logic (outside of Retell) would:
1. Check the current time in Europe/London
2. Compare against your business hours schedule
3. Return "true" or "false" as a string in the webhook response or API call
This approach is more deterministic because the time calculation happens in your code rather than relying on the LLM to interpret a time string.AI Evy
02/10/2026, 5:46 PMAI Evy
02/10/2026, 5:46 PMDropmuse
02/10/2026, 5:47 PMAI Evy
02/10/2026, 5:47 PMAI Evy
02/10/2026, 5:47 PMis_business_hours variable for inbound calls) :
## Step 1: Set Up the Inbound Call Webhook
You need to configure a webhook endpoint that Retell will call when an inbound call comes in. This webhook allows you to pass dynamic variables based on conditions like time of day. [(1) ]()
## Step 2: Create Your Backend Logic
In your backend code (Node.js, Python, etc.) , create an endpoint that:
1. Receives the webhook request from Retell
2. Gets the current time in Europe/London timezone
3. Compares it against your business hours
4. Returns the appropriate response with the dynamic variable
Your webhook response should include the call_inbound object with dynamic_variables. [(2) ]() One community member noted that using this structure fixed issues with variables not being set:
json
{
"call_inbound": {
"dynamic_variables": {
"is_business_hours": "true"
}
}
}
## Step 3: Configure Agent-Level Default Dynamic Variables
In your Retell dashboard, set a default value for is_business_hours. Default variables serve as a fallback and will only be used when specific variables aren't included in the call request. [(1) ]()
Set the default to "false" so if your webhook fails, the agent defaults to acting as a receptionist.
## Step 4: Update Your Agent Prompt
Reference the variable in your prompt:
If {{is_business_hours}} is "true", immediately call transfer_call to +447470144361. Do not speak before transferring.
If {{is_business_hours}} is "false", act as the receptionist.AI Evy
02/10/2026, 5:47 PMretell_llm_dynamic_variables must be strings—numbers, booleans, or other data types are not supported.
- The spaces around the variable name will be trimmed when evaluating the variable.
- You can use the inbound webhook to check if it is business hours or not, then send a variable to let the agent know. [(3) ]()AI Evy
02/10/2026, 5:47 PMAI Evy
02/10/2026, 5:47 PMDropmuse
02/10/2026, 5:49 PMAI Evy
02/10/2026, 5:49 PMAI Evy
02/10/2026, 5:50 PM{{current_time_Europe/London}}) is expected because the LLM must interpret the time string and compare it against your business hours schedule. This relies on the LLM's interpretation, which can be inconsistent.
[(1) ]()
Why Option 1 is unreliable for your use case:
The system variable returns a formatted string like "Thursday, March 28, 2024 at 11:46:04 PM GMT".
The LLM then has to:
1. Parse this string
2. Extract the day and time
3. Compare against your business hours rules
4. Decide whether to transfer
This multi-step reasoning can fail intermittently, especially with complex schedules like yours (different hours for each day) .
Recommendation: Switch to Option 2
For deterministic behavior with business hours logic, calculating is_business_hours in your backend and passing it as "true" or "false" is more reliable.
The key difference is that your backend code does the time calculation (which is 100% accurate) , and the LLM only needs to check a simple string comparison ("true" vs "false") .
If you want to continue with Option 1, you could try simplifying your prompt to make the LLM's job easier, but there's no guarantee of consistent results since the time parsing happens within the LLM's reasoning.
Would you like help setting up Option 2 with your specific backend environment?AI Evy
02/10/2026, 5:50 PMAI Evy
02/10/2026, 5:50 PMDropmuse
02/10/2026, 9:36 PMAI Evy
02/10/2026, 9:36 PMAI Evy
02/10/2026, 9:36 PMis_business_hours = "true" or "false")
3. Call the Register Phone Call API with your dynamic variable in retell_llm_dynamic_variables
4. Dial to the SIP URI returned by the API
Here's the example code pattern from the documentation:
javascript
const client = new Retell({
apiKey: 'YOUR_RETELL_API_KEY',
}) ;
server.app.post(
"/voice-webhook",
async (req: Request, res: Response) => {
// Register the phone call to get call id
const phoneCallResponse = await client.call.registerPhoneCall({
agent_id: 'oBeDLoLOeuAbiuaMFXRtDOLriTJ5tSxD',
from_number: "+12137771234", // optional
to_number: "+12137771235", // optional
direction: "inbound", // optional
}) ;
// Start phone call websocket
const voiceResponse = new VoiceResponse() ;
const dial = voiceResponse.dial() ;
dial.sip(
`sip:${phoneCallResponse.call_id}@sip.retellai.com`,
) ;
res.set("Content-Type", "text/xml") ;
res.send(voiceResponse.toString() ) ;
},
) ;
You can add retell_llm_dynamic_variables to the registerPhoneCall request: [(2) ]()
javascript
{
"retell_llm_dynamic_variables": {
"is_business_hours": "true"
}
}AI Evy
02/10/2026, 9:37 PMAI Evy
02/10/2026, 9:37 PMDropmuse
02/10/2026, 9:37 PMAI Evy
02/10/2026, 9:37 PMAI Evy
02/10/2026, 9:37 PMX- or x-) are automatically received, extracted, and available in the call. They're also automatically added to your collection of dynamic variables—you can access them by stripping the X- or x- prefix. [(3) ]()
For example, if your Twilio Flow sends this SIP header:
{
"X-is-business-hours": "true"
}
Then in your Retell agent, you can reference it as {{is-business-hours}} in your prompt.
This means you could configure Twilio Flow to calculate business hours and pass the result as a custom SIP header before forwarding the call to Retell via your SIP trunk.AI Evy
02/10/2026, 9:37 PMAI Evy
02/10/2026, 9:37 PMDropmuse
02/10/2026, 9:39 PMAI Evy
02/10/2026, 9:39 PMAI Evy
02/10/2026, 9:39 PMX- or x-) are automatically received, extracted, and added to your dynamic variables—you can access them by stripping the X- or x- prefix. [(1) ]()
For example, if Twilio sends:
json
{
"X-is-business-hours": "true"
}
Then in your Retell agent prompt, reference it as {{is-business-hours}}.
Option 2: Use the Inbound Call Webhook
Configure an Inbound Call Webhook in Retell. When a call arrives via your SIP trunk, Retell will POST to your webhook endpoint. [(2) ]()
Your webhook response can include dynamic variables:
json
{
"call_inbound": {
"dynamic_variables": {
"is_business_hours": "true"
}
}
}
Since Twilio Flow already knows it's business hours (because it decided to send the call to Retell instead of the business) , you'd have your webhook return "is_business_hours": "true" for all calls that reach Retell.
The simplest approach: If Twilio Flow only sends calls to Retell during off-hours, then every call reaching your Retell agent is automatically outside business hours—you may not even need the dynamic variable. Just configure your agent to always act as the receptionist.AI Evy
02/10/2026, 9:39 PMAI Evy
02/10/2026, 9:39 PM