https://retellai.com/?utm_source=discord&utm_medium=seo logo
I have a multi-prompt agent with a callback prompt...
# ❓・ai-evy-support
t
@AI Evy I have a multi-prompt agent with a callback prompt which stores a callback time (callback_ts). Problem is the agent is storing the incorrect day, month and year. How to resolve?
a
Thanks for tagging me @TheScrutiniser. I'll look through relevant sources and get back to you shortly.
### Answer The issue of your agent storing incorrect day, month, and year for
callback_ts
is likely related to how the prompt instructs the agent to interpret and confirm date/time information from the user. Based on the multi-prompt agent approach, you should explicitly define confirmation logic in your prompt to ensure the agent correctly captures and verifies the date/time before storing it. [(1) ]() Here's how you can address this: 1. Add explicit confirmation in your callback prompt — similar to how appointment booking is handled:
Copy code
3. Confirm the date, time, and timezone selected by user: "Just to confirm, you want to book the appointment at ...". Make sure this is a time from the available slots.
4. Once confirmed, call function book_appointment to book the appointment.
2. Apply the same pattern to your callback prompt — have the agent repeat back the full date (day, month, year) and time before calling the function that stores
callback_ts
. 3. Consider timezone handling — ensure your prompt specifies that the agent should confirm the timezone with the user, as date/time mismatches often stem from timezone confusion. If the issue persists after prompt adjustments, you may need to review how your custom function parses and stores the date/time value passed from the agent. Check out these potentially useful sources for more details: - [Build a multi-prompt agent]() Would you like me to provide a general answer on date/time handling patterns that might help?
​ To learn more, see the sources I considered: [[1] Build a multi-prompt agent](https://docs.retellai.com/build/single-multi-prompt/write-multi-prompt) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
t
@AI Evy I started a test chat and asked the agent what today's date is. It said "Thursday, June the 13th." Today is actually Monday, January the 19th. Why is it wrong?
a
Thanks for the follow-up, @TheScrutiniser. I'll get back to you soon.
### Answer The agent is likely not using the
{{current_time}}
system variable, or there may be a conflicting dynamic variable overriding it. [(1) ]() How to fix this: 1. Use the system default variable
{{current_time}}
in your prompt to provide the agent with the current date and time. This variable automatically returns the current time in
America/Los_Angeles
format (e.g., "Thursday, March 28, 2024 at 11:46:04 PM PST") . 2. Check for conflicting dynamic variables — if you have a test/custom variable set (like a hardcoded date) , it could be overriding the system variable. One community user resolved a similar issue by deleting a test data variable that was causing the wrong date to appear. [(2) ]() 3. Specify timezone if needed — you can use
{{current_time_[timezone]}}
(e.g.,
{{current_time_America/New_York}}
) to get the time in your specific timezone. [(1) ]() Add something like this to your prompt:
Copy code
The current date and time is: {{current_time}}
If you already have
{{current_time}}
in your prompt and it's still wrong, check your agent's dynamic variable configuration for any overrides that might be conflicting.
​ To learn more, see the sources I considered: [[1] Dynamic Variables](https://docs.retellai.com/build/dynamic-variables) [[2] when using {{current_time}}, it says todays date is Jan 29th](https://discord.com/channels/1186424376300679209/1341124870922174587) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
t
@AI Evy if I want to specify the London timezone, how would I rewrite this system variable: {{current_time_America/New_York}}
a
Thanks for the follow-up, @TheScrutiniser. I'll get back to you soon.
### Answer To specify the London timezone, you would use:
Copy code
{{current_time_Europe/London}}
[(1) ]() The format is
{{current_time_[timezone]}}
where you replace
[timezone]
with your desired timezone identifier. For example, just as the documentation shows
{{current_time_Australia/Sydney}}
for Sydney time, you use
Europe/London
for London.
​ To learn more, see the sources I considered: [[1] Dynamic Variables](https://docs.retellai.com/build/dynamic-variables) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
t
@AI Evy how do I store the date/time in a format that google sheets can use?
a
Thanks for the follow-up, @TheScrutiniser. I'll get back to you soon.
### Answer The available sources don't provide specific documentation on formatting date/time values for Google Sheets compatibility within Retell AI. However, based on what's documented: 1. The
{{current_time_Europe/London}}
variable
returns the date/time in a format like "Thursday, March 28, 2024 at 11:46:04 PM PST" [(1) ]() 2. For Google Sheets integration, you would typically handle the date/time formatting in your middleware (like N8N or Make) between Retell and Google Sheets, rather than within Retell itself. [(2) ](

▾

) The workshop on [Personalization with Google Sheets](

▾

) covers connecting Retell to Google Sheets through N8N, where you can transform the date/time format before writing to your spreadsheet. Recommended approach: - Capture the date/time from the agent using an Extract Dynamic Variables node or through your custom function - Use your middleware (N8N, Make, etc.) to convert the string to a Google Sheets-compatible format (e.g.,
YYYY-MM-DD HH:mm:ss
or ISO 8601) Would you like a general answer on common date/time formats that Google Sheets accepts?
​ To learn more, see the sources I considered: [[1] Dynamic Variables](https://docs.retellai.com/build/dynamic-variables) [[2] Personalization with Google Sheets](

https://www.youtube.com/watch?v=A9H3a33gM2M▾

) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
t
@AI Evy In the Agent Edge to the "callback" prompt, it contains the following json. please tell me what it's doing and if I can include dynamic variables in it. { "type": "object", "properties": { "callback_ts": { "type": "string", "description": "The timestamp of the best time to callback." } }, "required": [ "callback_ts" ] }
a
Thanks for the follow-up, @TheScrutiniser. I'll get back to you soon.
### Answer This JSON is a schema definition that tells the LLM what data to extract and pass when transitioning to the "callback" prompt. Here's what each part does: -
"type": "object"
— defines the expected output as a JSON object -
"properties"
— lists the fields to extract: -
callback_ts
— a string field for capturing the callback timestamp -
"description"
— tells the LLM what this field should contain ("The timestamp of the best time to callback") -
"required": ["callback_ts"]
— makes this field mandatory before the transition can occur Regarding dynamic variables: Yes, you can include dynamic variables in tool descriptions. [(1) ]() Dynamic variables work in: - Tool descriptions - Property descriptions So you could modify the description to include context like:
Copy code
json
{
  "type": "object",
  "properties": {
    "callback_ts": {
      "type": "string",
      "description": "The timestamp of the best time to callback. Current time is {{current_time_Europe/London}}. Format as YYYY-MM-DD HH:mm."
    }
  },
  "required": [
    "callback_ts"
  ]
}
By adding
{{current_time_Europe/London}}
to the description, you give the LLM awareness of the actual current date/time, which should help it calculate and store the correct callback timestamp.
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
​ To learn more, see the sources I considered: [[1] Dynamic Variables](https://docs.retellai.com/build/dynamic-variables) ​
t
add a dynamic variable (optional) call "best_tel"
@AI Evy add a dynamic variable (optional) call "best_tel". This is to recieve a phone number, if given, to be confirmed by the agent in the "callback" prompt before being passed to Make.com, along with the best time (callback_ts).
a
Thanks for the follow-up, @TheScrutiniser. I'll get back to you soon.
### Answer To add
best_tel
as an optional dynamic variable to your Agent Edge schema, update your JSON like this:
Copy code
json
{
  "type": "object",
  "properties": {
    "callback_ts": {
      "type": "string",
      "description": "The timestamp of the best time to callback. Current time is {{current_time_Europe/London}}. Format as YYYY-MM-DD HH:mm."
    },
    "best_tel": {
      "type": "string",
      "description": "The phone number to call back on, if provided by the user."
    }
  },
  "required": [
    "callback_ts"
  ]
}
[(1) ]() Key points: -
best_tel
is optional because it's not included in the
"required"
array — only
callback_ts
is mandatory - The agent will extract and pass
best_tel
to Make.com only if the user provides a phone number [(2) ](

▾

) - In your "callback" prompt, instruct the agent to confirm both values before proceeding: "Just to confirm, you'd like a callback at [callback_ts] on [best_tel]?" Dynamic variables can be used in property descriptions, so you could enhance the
best_tel
description with context if needed (e.g., referencing
{{user_number}}
as a default) . [(1) ]() When passing these to Make.com, both values will be available in the
retell_llm_dynamic_variables
object for your scenario to process. [(2) ](

▾

)
​ To learn more, see the sources I considered: [[1] Dynamic Variables](https://docs.retellai.com/build/dynamic-variables) [[2] Make x Retell Tutorial | How to trigger a call from google sheet](

https://www.youtube.com/watch?v=pjm8y3uILg4▾

) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
t
@AI Evy how do I get the agent to repeat a phne number slowly?
a
Thanks for the follow-up, @TheScrutiniser. I'll get back to you soon.
### Answer To get the agent to repeat a phone number slowly, there are two approaches based on community solutions: 1. Prompt the agent to speak digits individually with pauses [(1) ]() Instruct the agent in your prompt to say the number digit-by-digit with dashes/pauses:
Copy code
When speaking a phone number, transform the format as follows:  
- Input formats like 4158923245, (415) 892-3245, or 415-892-3245  
- Should be pronounced as: "four one five - eight nine two - three two four five"  
- Important: Don't omit the space around the dash when speaking   
- Example: "Let me confirm: four one five - eight nine two - three two four five. Is that correct?"
2. Disable Speech Normalization Go to Speech Normalization in settings and disable speech normalization for numbers — this prevents automatic conversion of phone numbers to numeric format. However, be aware that disabling normalization means: - Numbers, dates, currencies won't be automatically converted to spoken form - TTS models might occasionally mispronounce unnormalized text - You'll need to manually format text in prompts for proper pronunciation 3. Adjust voice speed [(2) ]() You can also reduce the overall
voice_speed
parameter (value ranging from 0.5 to 2, where lower = slower speech) . The prompting approach (option 1) combined with disabled speech normalization tends to work best for phone number clarity.
​ To learn more, see the sources I considered: [[1] Callback number stated as "+1123123457" instead of (123) 123-4567](https://discord.com/channels/1186424376300679209/1400917737324154982) [[2] Create Voice Agent](https://docs.retellai.com/api-references/create-agent) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
t
@AI Evy I have the following json object that is used in Make.com to send the phone number to be called to my Retell agent. I wish to add another field, called reg_plate. It will be used after the call ends. Please give me the correct json with the field added> here is the current json: { "from_number": "+441244727227", "tasks": [ { "to_number": "{{1.
11
}}" } ] }
a
Thanks for the follow-up, @TheScrutiniser. I'll get back to you soon.
### Answer To add a
reg_plate
field that can be passed as a dynamic variable and used after the call ends, you would include it in
retell_llm_dynamic_variables
. [(1) ]() Here's your updated JSON:
Copy code
json
{
  "from_number": "+441244727227",
  "tasks": [
    {
      "to_number": "{{1.`11`}}",
      "retell_llm_dynamic_variables": {
        "reg_plate": "YOUR_REG_PLATE_VALUE"
      }
    }
  ]
}
Replace
"YOUR_REG_PLATE_VALUE"
with your Make.com variable (e.g.,
{{1.reg_plate}}
) . The
retell_llm_dynamic_variables
object allows you to pass custom data to your agent that can be referenced in prompts using
{{reg_plate}}
and will be available in post-call webhooks. Note: The
default_dynamic_variables
structure shown in the Retell LLM documentation demonstrates how dynamic variables are passed as key-value pairs within an object.
​ To learn more, see the sources I considered: [[1] Get Retell LLM](https://docs.retellai.com/api-references/get-retell-llm) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
t
@AI Evy I have Make.com store a value from a Google Sheet into a variable, reg_plate, along with a phone number to be called. I wish to pass on reg_plate to a human when transferring the call as a whisper before connecting both parties. How to do this?
a
Thanks for the follow-up, @TheScrutiniser. I'll get back to you soon.
### Answer To pass
reg_plate
as a whisper to a human agent during a warm transfer, you can use dynamic variables in the warm transfer instructions. [(1) ]() Step 1: Pass
reg_plate
as a dynamic variable when creating the call
In your Make.com scenario, include
reg_plate
in `retell_llm_dynamic_variables`: [(2) ](

▾

)
Copy code
json
{
  "from_number": "+441244727227",
  "tasks": [
    {
      "to_number": "{{1.`11`}}",
      "retell_llm_dynamic_variables": {
        "reg_plate": "{{1.reg_plate}}"
      }
    }
  ]
}
Step 2: Use the dynamic variable in warm transfer instructions Dynamic variables can be used in warm transfer instructions. [(1) ]() When configuring your Transfer Call tool, set up the warm transfer prompt to include
{{reg_plate}}
. For example:
Copy code
The caller's registration plate is {{reg_plate}}. Please assist them with their inquiry.
This whisper message will be spoken to the human agent before connecting both parties, giving them the
reg_plate
context. [(3) ]() Where dynamic variables work: - Warm transfer instructions - Transfer call phone numbers - Tool descriptions - Prompts [(1) ]()
​ To learn more, see the sources I considered: [[1] Dynamic Variables](https://docs.retellai.com/build/dynamic-variables) [[2] Make x Retell Tutorial | How to trigger a call from google sheet](

https://www.youtube.com/watch?v=pjm8y3uILg4▾

) [[3] Platform Changelogs | Retell AI](https://www.retellai.com/changelog) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
t
@AI Evy when I pass that in a test chat, is reads it out literally. Here is the transcript: Hi, I've got someone selling their car. Their reg plate is {{reg_plate}}. Are you free?
a
Thanks for the follow-up, @TheScrutiniser. I'll get back to you soon.
### Answer The agent is reading
{{reg_plate}}
literally because the dynamic variable has no assigned value in your test chat. [(1) ]() Default Behavior: When a dynamic variable has no assigned value, it remains in its raw form with the curly braces intact. For example: - If
reg_plate
is not provided:
"Their reg plate is {{reg_plate}}"
- If
reg_plate
is set to "AB12 CDE":
"Their reg plate is AB12 CDE"
Why this happens in test chat: In a test chat, dynamic variables like
{{reg_plate}}
are only substituted if you: 1. Set agent-level default dynamic variables in your agent configuration 2. Pass them via the API when creating the call To fix this for testing: Configure agent-level default dynamic variables as a fallback. These will be used when specific variables aren't included in the call request. In production, when Make.com triggers the call with
retell_llm_dynamic_variables
containing
reg_plate
, the value will be substituted correctly. Alternatively, you can add defensive prompting to handle unset variables:
Copy code
If {{reg_plate}} appears with curly braces, say "I don't have the registration plate on file."
Otherwise, say "Their reg plate is {{reg_plate}}."
​ To learn more, see the sources I considered: [[1] Dynamic Variables](https://docs.retellai.com/build/dynamic-variables) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
t
@AI Evy when I use test chat, I have the option to create temporary dynamic variables for testing only. how can I use it for this purpose?
a
Thanks for the follow-up, @TheScrutiniser. I'll get back to you soon.
### Answer To test your dynamic variables in the test chat, you can configure agent-level default dynamic variables which serve as a fallback for testing purposes. [(1) ]() Here's how to use it: 1. Configure agent-level default dynamic variables in your agent settings — these default values will only be used when specific variables aren't included in the call request 2. Set a test value for
reg_plate
— for example, set
reg_plate
to a sample value like
"AB12 CDE"
in the default dynamic variables configuration 3. Test your agent — when you run the test chat, the agent will use your default value instead of reading
{{reg_plate}}
literally Before deploying to production, you can test your dynamic variables using the web interface. Important note: One community user reported that dynamic variables don't always populate correctly in chat-only test mode for multi-prompt agents — they worked in voice testing but not chat testing. [(2) ]() If you experience this, try testing via voice call instead, or ensure the variable is being set correctly in your agent configuration. In production, when Make.com triggers the call with
retell_llm_dynamic_variables
containing the actual
reg_plate
value from Google Sheets, it will override the default and substitute correctly.
​ To learn more, see the sources I considered: [[1] Dynamic Variables](https://docs.retellai.com/build/dynamic-variables) [[2] Dynamic Variables Don't Populate in Chat-Only Test Mode (Multi-Prompt Agent)](https://discord.com/channels/1186424376300679209/1421373431781396580) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
t
@AI Evy sitll reading it literally. are you sure I have to use double curly-braces?
a
Thanks for the follow-up, @TheScrutiniser. I'll get back to you soon.
### Answer Yes, double curly braces
{{variable_name}}
is the correct syntax for dynamic variables in Retell AI. [(1) ]() The issue is that the variable must have a value assigned for it to be substituted. If
reg_plate
has no assigned value, it remains in its raw form with the curly braces intact. Troubleshooting steps: 1. Verify the default variable is set correctly — When you configure agent-level default dynamic variables, ensure the variable name matches exactly (case-sensitive) . The variable name should be
reg_plate
without the curly braces in the configuration. 2. Check where you're setting the test variable — In one Discord thread, a user found that variables need to be referenced in tool/property descriptions with the full syntax
{{variable_name}}
for proper substitution. [(2) ]() 3. Confirm the variable exists — You can check if a variable is set using this equation in conversation flow conditions: [(1) ]()
Copy code
Equation: {{reg_plate}} exists
Result: True if variable is set
If you've set the default dynamic variable but it's still reading literally, the variable name in your warm transfer instructions may not match exactly what you configured, or the default variable configuration may not have saved properly. Double-check the spelling and ensure there are no extra spaces around the variable name (spaces are trimmed when evaluating) .
​ To learn more, see the sources I considered: [[1] Dynamic Variables](https://docs.retellai.com/build/dynamic-variables) [[2] Dynamic Variable is not sending via custom function.](https://discord.com/channels/1186424376300679209/1430715756030722149) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
t
@AI Evy ok, here is the transcript. notice when it first whispers it is read literally again, but when I ask for the reg explicitly, it gives me the correct value: Hi, I've got someone selling their car. Their reg plate is {{reg_plate}}. Are you free? what's the reg? The reg plate is B X six eight M X G
a
Thanks for the follow-up, @TheScrutiniser. I'll get back to you soon.
### Answer This behavior suggests the whisper message field where you've placed
{{reg_plate}}
may not be evaluating dynamic variables at the time the whisper is spoken, but the agent's prompt/context does have access to the variable value (which is why it can retrieve it when asked directly) . Where dynamic variables are documented to work: [(1) ]() - Prompts - Begin message - Tool configurations (URLs, tool descriptions, property descriptions) - Voicemail prompts and messages - Transfer call phone numbers - Warm transfer instructions - Webhook URL The whisper message is listed under warm transfer capabilities, but based on your transcript, it appears the variable substitution may not be happening correctly in that specific field. Potential workarounds: 1. Pre-compose the whisper content in your prompt — Instead of relying on variable substitution in the whisper field itself, have the agent dynamically construct what to say. Instruct the agent in your prompt to include the reg plate information when transferring. 2. Use a static whisper with a prompt-based handoff — Keep the whisper simple (e.g., "Incoming transfer for a car sale") and use the three-way message feature to have the agent verbally introduce the context including
{{reg_plate}}
once all parties are connected. [(2) ]() 3. Contact Retell support — This may be a bug where whisper messages don't evaluate dynamic variables as expected, even though warm transfer instructions are listed as a supported location.
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
t
@AI Evy is there a way to have the agent call one number at a time from a spreadsheet, and is there a mechanism to throttle the time between each call?
a
Thanks for the follow-up, @TheScrutiniser. I'll get back to you soon.
### Answer --- Yes, Retell AI has a Batch Dialer feature that supports calling from a contact list with throttling controls. [(1) ]() Batch Call Window allows you to: - Define exactly when calls are allowed to run (specific hours and days of the week) - Control concurrency across campaigns - Prevent calls from going out after hours - Ensure outreach stays within business rules For CPS (Calls Per Second) throttling: The batch dialer supports CPS limits to control the rate at which calls are initiated. How to use it: 1. Upload your contact list (from a spreadsheet) or push contacts via API to the batch dialer 2. Configure your Batch Call Window to set allowed calling times 3. Set CPS throttling limits to control call pacing Since you're already using Make.com with Google Sheets, you could also loop over sheet rows and trigger calls one at a time via the Create Phone Call API, adding delays between each call in your Make.com scenario. [(2) ]() The batch dialer approach is more robust for production campaigns with built-in scheduling and compliance features.
​ To learn more, see the sources I considered: [[1] Platform Changelogs | Retell AI](https://www.retellai.com/changelog) [[2] Discord message from @moetechy_ on 2025-04-18](https://discord.com/channels/1186424376300679209/1294891368505937952/1362827273971175475) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
t
@AI Evy When transferring a call to a human, if the phone is busy (engaged tone), is it possible to call another number?
a
Thanks for the follow-up, @TheScrutiniser. I'll get back to you soon.
### Answer Yes, you can handle transfer failures and route to an alternative number. For Conversation Flow agents: The Call Transfer Node has a built-in mechanism for handling transfer failures. When a transfer fails (including busy/engaged scenarios) , a transition is triggered. [(1) ]() > "Transition happens when transfer fails. There's already a pre-populated edge for this, feel free to connect that to a node to handle transfer failure." You can connect this failure edge to another Call Transfer Node with a different phone number, or to a Conversation Node that asks the user if they'd like to try an alternative number. For warm transfers specifically: You can configure an Agent detection timeout — the maximum time the AI will wait to determine whether the transfer target answers. If the agent does not pick up within this timeframe, the transfer is marked as failed and fallback actions can be triggered. [(2) ]() > "With agent detection timeout, Retell AI allows you to configure how long the AI will wait for the agent to answer. If the agent does not pick up, the system can automatically trigger fallback actions such as sending a text, scheduling a callback, or rerouting the call." Implementation approach: 1. Create your primary transfer node with the first phone number 2. Connect the "transfer failed" edge to a second transfer node with your backup number 3. Optionally add a conversation node between them to inform the caller: "That line is busy, let me try another number"
​ To learn more, see the sources I considered: [[1] Call Transfer Node](https://docs.retellai.com/build/conversation-flow/call-transfer-node) [[2] Warm Transfer vs Cold Transfer - The AI Advantage in Call Centers | Retell AI](https://www.retellai.com/blog/effortless-handoffs-with-retell-ais-warm-transfer-feature) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
t
@AI Evy When reading or writing to a google spreadsheet, do I need to use a link to the sheet that is "Anyone with the link", or can I make it restricted access?
a
Thanks for the follow-up, @TheScrutiniser. I'll get back to you soon.
### Answer You do not need to make the Google Sheet "Anyone with the link." You can use restricted access, but you must properly authenticate your integration. When connecting Google Sheets through platforms like N8N or Make.com, the connection is established via OAuth authentication with your Google account. [(1) ](

▾

) Key requirements for restricted access: 1. Enable the correct Google APIs — You need to enable both the Google Sheets API and Google Drive API in your Google Cloud project. 2. Configure OAuth scopes — In your Google Cloud Console credentials, add the appropriate scopes for Google Sheets and Google Drive under "Data Access." 3. Add yourself as a test user — The email address associated with your Google Sheet must be added as a tester in your OAuth consent screen configuration. 4. Sign in and authorize — After creating your OAuth credentials, you must sign in with the email address that owns the sheet and grant the application permission to access it. As noted in the workshop: "You need to make sure that you sign in and then you allow it" — this authorization step is what grants your integration access to your restricted sheets without needing to make them publicly accessible.
​ To learn more, see the sources I considered: [[1] Personalization with Google Sheets](

https://www.youtube.com/watch?v=A9H3a33gM2M▾

) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.