https://retellai.com/?utm_source=discord&utm_medium=seo logo
using your Test Agent / Test Audio / Webcall featu...
# ❓・ai-evy-support
a
@AI Evy using your Test Agent / Test Audio / Webcall feature, can I simulate a request to a live API endpoint to get order details, and test agent can answer actual data?
a
Thanks for tagging me @Ariz. I'll look through relevant sources and get back to you shortly.
### Answer Yes, you can simulate requests to live API endpoints during testing. Retell AI supports function calling, which allows your agent to call external APIs and use the returned data in responses. [(1) ]() To set this up, you need to define functions that your agent can call. When testing with Test Audio or Web Call features, these functions will execute and make actual API calls to your endpoints. Here's how function calling works: you define the function with parameters, and when the LLM decides to call it, Retell sends the function call to your backend via webhook. Your backend processes the request, calls your live API (like fetching order details) , and returns the data back to the agent. The agent can then use the actual data returned from your API in its responses during the test call.
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] Integrate Function Calling](https://docs.retellai.com/integrate-llm/integrate-function-calling) ​
a
@AI Evy then how come the Test Agent didnt provide any actual data after Ive provided the variables needed? Ive already setup the Node Function for the API endpoint. The agent's response was only providing placeholder data.
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
### Answer If your function node isn't executing or returning actual data, there are several common configuration issues to check: 1. Verify "Wait for Result" is enabled [(1) ]() In your function node configuration, ensure "Wait for Result" is turned ON. This makes the agent wait for your API endpoint to complete before continuing. 2. Check your function is properly added as a Tool [(2) ]() The function must be listed as a Tool in the state where you want it to execute. If it's marked as "Optional," the LLM decides whether to call it based on conversation context. 3. Improve your prompt instructions Simply stating the function should execute may not be sufficient. You need to explicitly describe the conditions when the function should be invoked. [(3) ]() [(2) ]() For example, describe exactly when the agent should call your order details API based on what information the user provides. 4. Verify your agent is Published [(4) ]() Make sure you've published your agent with the latest changes. Configuration updates won't take effect in testing until the agent is published. 5. Check the function result in call logs [(1) ]() After testing, review the call details to see if the function was actually triggered and what result it returned. This will help you determine if the issue is with function execution or how the agent uses the returned data. **6. Connect to a conversa
tion node** The function node itself isn't intended for conversation with the user. You should attach a conversation node after it to tell the user the result using the actual data returned from your API. If you've verified all of these and the function still isn't executing, the issue may be with your API endpoint configuration or the function's parameter schema.
​ To learn more, see the sources I considered: [[1] Tool Calling Infinite Loop](https://community.retellai.com/t/tool-calling-infinite-loop/616) [[2] Custom function not executing despite being configured as tool in state](https://community.retellai.com/t/custom-function-not-executing-despite-being-configured-as-tool-in-state/705) [[3] Function Calling Overview](https://docs.retellai.com/build/single-multi-prompt/function-calling) [[4] Function Node Not Triggering External Webhook](https://discord.com/channels/1186424376300679209/1422215353857212450) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy Im having trouble, Ive tested my API endpoint and it works. It uses GET method with URL structure of "/api/orders/{{order_short_id}}". The order_short_id variable should have been extracted from the previous node conversation but somehow it is not being used in the Function node that calls our API endpoint.
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
### Answer Based on the sources, there are several key issues that commonly prevent dynamic variables from being substituted in custom function URLs: 1. Ensure the variable is extracted BEFORE the function call [(1) ]() The variable must be extracted using the Extract Dynamic Variables node/function before the custom function that uses it. Response variables from a previous custom function are not automatically available for use in subsequent function calls' URL paths or query parameters. 2. Use double curly braces syntax [(2) ]() [(3) ]() Your URL syntax looks correct with
{{order_short_id}}
, but verify you're using double curly braces
{{variable_name}}
, not single braces. [(3) ]() 3. Variable name must match exactly [(1) ]() The variable name in your URL must match exactly what you extracted (case-sensitive) . Based on community cases, use the variable name directly like
{{order_short_id}}
rather than dot notation. 4. For GET requests with path variables Since you're using a GET request with the variable in the URL path (
/api/orders/{{order_short_id}}
) , the variable must be: - Extracted as a dynamic variable first (not just as a response variable from another function) - Referenced in the endpoint URL field of your custom function configuration [(4) ]() 5. Verify in call logs Check the `collec
ted_dynamic_variables` field in your call details to confirm the variable has a value when the function is invoked. [(1) ]() **Key takeaway**: If you extracted
order_short_id
using a custom function's response variables feature, that won't work for URL substitution. You need to use the Extract Dynamic Variables node/function to make it available for the subsequent custom function's URL.
​ To learn more, see the sources I considered: [[1] Custom function failure to substitute dynamic variable](https://community.retellai.com/t/custom-function-failure-to-substitute-dynamic-variable/231) [[2] Dynamic Variables](https://docs.retellai.com/build/dynamic-variables) [[3] Issue with Global Variables Not Passing in Query Parameters for Custom Function Tool](https://community.retellai.com/t/issue-with-global-variables-not-passing-in-query-parameters-for-custom-function-tool/773) [[4] Custom Function](https://docs.retellai.com/build/conversation-flow/custom-function) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
Thanks for the follow-up, @Ariz. I'll get back to you soon.
a
@AI Evy ok i got it working. Now how do we test to transfer call for escalation since this feature is not for Test Agent Webcall?
a
### Answer I don't have specific information in the available sources about testing call transfer functionality when the Test Agent Webcall feature doesn't support it. However, I can suggest that you could try to answer generally if you'd like, but I'd recommend checking out these potentially useful sources: - [Warm Transfer vs Cold Transfer - The AI Advantage in Call Centers | Retell AI]() For more detailed guidance on testing call transfer functionality, you may want to: - Visit [Documentation]() - Ask questions on [Discord]() Would you like me to provide a general answer based on my knowledge instead?
message has been deleted
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy im testing the Call Transfer node and Ive added an actual Phone number based on australia. Somehow it is not working. In the logs it says "tool_call_id: transfer_call_72b1fd {"status":"Transfer destination is not supported.. Please inform the customer that the transfer did not go through and offer to try again or assist them directly."}
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
tn-never-rings/496) If you're using Retell native numbers and Australia isn't in the supported countries list, you may need to set up custom telephony with a provider that supports Australian destinations [(4) ]() .
### Answer The error "Transfer destination is not supported" indicates that international calling to Australia is not enabled for your current setup. Native Retell numbers now support international calls to 14 countries [(1) ]() , but you need to verify if Australia is included in that list and if you're using a native Retell number. Key requirements for international transfers: 1. **Number format**: Ensure your Australian phone number is in E.164 format (e.g.,
+61
followed by the number without spaces or special characters) [(2) ]() [(3) ]() 2. **Telephony provider support**: If you're using custom telephony via SIP trunking, your telephony provider must support international calling and transfers to Australia [(4) ]() [(5) ]() 3. **Transfer type compatibility**: The telephony provider must support caller ID override for the transfer type you're using (warm or cold transfer) [(2) ]() [(3) ]() Troubleshooting steps: - Check if you're using a Retell native number or custom telephony - If using custom telephony, verify your SIP trunk configuration supports international transfers [(4) ]() - Check your telephony provider's logs for specific error codes - Confirm your provider has permissions enabled for international outbound calls [(5) ](
​ To learn more, see the sources I considered: [[1] Platform Changelogs | Retell AI](https://www.retellai.com/changelog) [[2] Call Transfer Node](https://docs.retellai.com/build/conversation-flow/call-transfer-node) [[3] Transfer call](https://docs.retellai.com/build/single-multi-prompt/transfer-call) [[4] Custom Telephony Overview](https://docs.retellai.com/deploy/custom-telephony) [[5] (URGENT) - Call transfer tool executes but no outbound call is placed (PSTN never rings)](https://community.retellai.com/t/urgent-call-transfer-tool-executes-but-no-outbound-call-is-placed-pstn-never-rings/496) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy the Call transfer worked for me, however I enabled it to be Warm transfer but as the receiving call i didnt receive any additional details, and also how would that work how do i get the additional info?
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
### Answer Great to hear the transfer is working! For warm transfers, the additional context is delivered through specific features you need to configure. How Warm Transfer Context Works: When you enable warm transfer, you can configure two types of messages to deliver context: [(1) ]() [(2) ]() 1. **Whisper Message**: This is a private message spoken only to the transfer target (the person receiving the call) before connecting them to the caller. The caller cannot hear this message. 2. **Three-Way Message**: This message is heard by both the transfer target and the original caller once the connection is established, creating transparency. To Configure These Messages: In your Call Transfer Node settings, you'll find fields for: [(1) ]() - **Whisper Message**: Use this input to brief the live agent about the reason for transfer, so the customer doesn't have to repeat themselves - **Three-Way Message**: Enables AI agents to communicate information to both caller and live agent during the handoff You can use dynamic variables in these messages (like
{{customer_name}}
or
{{order_id}}
) to provide specific context about the call. [(3) ]() Additional Warm Transfer Settings: - **Human Detection**: The AI confirms a human has answered before completing the transfer [(1) ]() [(2) ]() - **Auto-greet**: When enabled, the agent immediately says "Hello" when the transfer target picks up, encouraging a response [(1) ](
.retellai.com/build/conversation-flow/call-transfer-node) - **On-Hold Music**: Choose what the caller hears while waiting during transfer The whisper message is how you deliver the additional details to the receiving agent - make sure you've populated this field in your Call Transfer Node configuration with the context you want to share.
​ 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) [[3] 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.
a
@AI Evy for the caller's phone number, is a node to extract from conversation still needed or is there any built-in/default variable that can be used?
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
​ To learn more, see the sources I considered: [[1] Dynamic Variables](https://docs.retellai.com/build/dynamic-variables) ​
### Answer No extraction node is needed! Retell AI provides a built-in default system variable for the caller's phone number. [(1) ]() Use
{{user_number}}
- This variable automatically contains the user's phone number (from_number for inbound calls, to_number for outbound calls) . You can use this variable directly in: - Prompts - Begin messages - Tool configurations - Call handling features - Webhook URLs Additionally, there's also
{{agent_number}}
which contains the agent's phone number (to_number for inbound, from_number for outbound) . These system variables work out of the box - no configuration required.
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy can a test agent, test chat be able to call an api endpint?
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
### Answer Yes, test chat agents can call API endpoints through function calling, just like voice agents. [(1) ]() When you configure custom functions for your agent, those functions will execute during test chat sessions and make actual API calls to your endpoints. The function calling mechanism works the same way - you define functions with parameters, and when the LLM decides to call them during the chat test, Retell sends the function call and your backend processes it, calls your live API, and returns the data back to the agent. [(2) ]() The agent can then use the actual data returned from your API in its chat responses during testing. [(1) ]() Make sure your custom function is properly configured with: - The correct HTTP method (GET, POST, PUT, PATCH, or DELETE) [(3) ]() - Proper endpoint URL with any dynamic variables using
{{variable_name}}
syntax [(4) ]() - Required headers and query parameters [(3) ]() - "Wait for Result" enabled if you need the agent to wait for the API response before continuing
​ To learn more, see the sources I considered: [[1] Function Calling Overview](https://docs.retellai.com/build/single-multi-prompt/function-calling) [[2] Integrate Function Calling](https://docs.retellai.com/integrate-llm/integrate-function-calling) [[3] Platform Changelogs | Retell AI](https://www.retellai.com/changelog) [[4] 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.
a
@AI Evy run tests using test agent chat, on a function node that sends post method to our api endpoint returns this:tool_call_id: tool_call_55a80c Axios Error: error code: ERR_BAD_REQUEST, error message: Request failed with status code 400 response status: 400 response data: [{"url":"1","statusCode":400,"statusMessage":"2","message":"2","stack":"3","data":"4"},"/api/send-call-summary","Invalid request body","",["5"],{"code":"6","expected":"7","received":"8","path":"9","message":"10"},"invalid_type","string","undefined",["11"],"Required","phone"]
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
​ To learn more, see the sources I considered: [[1] Integrate any system with custom function](https://docs.retellai.com/build/single-multi-prompt/custom-function) [[2] Custom Function](https://docs.retellai.com/build/conversation-flow/custom-function) [[3] Custom Function Error 400](https://discord.com/channels/1186424376300679209/1308150652978987129) ​
3. Dynamic variable not substituted If you're using
{{user_number}}
or another dynamic variable for the phone field, verify: - The variable uses double curly braces syntax
{{variable_name}}
[(1) ]() - For variables other than system variables, they were extracted before this function call - The variable name matches exactly (case-sensitive) 4. Check "Payload: args only" setting [(1) ]() [(2) ]() When "Payload: args only" is enabled, the JSON body contains only your function's arguments at the top level (no
name
,
call
, or
args
wrapper) . If your endpoint expects this flat structure, enable this setting. If it expects the full Retell format, disable it. Next steps: 1. Review your parameter schema and ensure it's valid JSON schema (not actual JSON) [(3) ]() 2. Verify all required fields are defined in the schema [(1) ]() [(2) ]() 3. Check your call logs to see what data is actually being sent to your endpoint [(1) ]() 4. Test your endpoint independently with the exact payload format Retell sends [(1) ]() [(2) ]()
### Answer The error "Invalid request body" with status code 400 indicates your API endpoint is receiving incorrectly formatted data from Retell. The error specifically shows that a required
phone
field is missing (received "undefined" instead of expected "string") . [(1) ]() [(2) ]() Common causes for this error: 1. Incorrect parameter schema [(3) ]() The parameters section in your custom function expects a JSON schema, not the actual JSON. You need to define the "shape" of your request body using JSON schema format. Use a tool like to convert your desired JSON body into the proper JSON schema format, then paste that schema into the parameters field. 2. Missing required fields Your API expects a
phone
field but it's not being included in the request. Ensure your parameter schema includes all required fields with proper types: [(1) ]() [(2) ]()
Copy code
json
{
  "type": "object",
  "required": ["phone"],
  "properties": {
    "phone": {
      "type": "string",
      "description": "User phone number"
    }
  }
}
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy tested again using test agent chat, this is a sample payload posted to our api endpoint, somehow the actual caller phone number is not being posted. is it because i am using a test agent? will it reflect the actual phone number value if its an actual call? tool_call_id: tool_call_c071f1 { "name": "ariz", "reason": "to get an estimate fee for a job", "phone": "{{user_number}}", "email": "ariz@picup.com.au" }
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
### Answer Yes, the issue is because you're using test agent chat. The
{{user_number}}
variable is not being substituted because it's a phone-specific system variable that only works during actual phone calls. [(1) ]() According to the documentation,
{{user_number}}
is listed under "Phone Call Variables" - these variables are only available for phone calls, not for chat sessions. During chat testing, phone-related system variables like
{{user_number}}
and
{{agent_number}}
remain as literal strings (with the curly braces) because there's no phone number context in a chat session. Yes, it will reflect the actual phone number value during a real call. When you make an actual phone call (inbound or outbound) , the
{{user_number}}
variable will automatically populate with the caller's phone number. To test this functionality: 1. Use Test Audio or Web Call features instead of Test Chat - these simulate actual voice calls and should populate phone-related variables 2. Make a real phone call to verify the variable substitution works in production Alternative for chat testing: If you need to test the function during chat sessions, you could temporarily: - Set a default value for a custom variable (not
{{user_number}}
) at the agent level - Or manually provide test values in the testing variables section during chat testing The
{{user_number}}
system variable specifically requires a phone call context to work properly.
​ 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.
a
@AI Evy SUBAGENT VS CONVERSATION NODE
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
### Answer Key Differences Between Subagent Node and Conversation Node: Conversation Node is used for dialogue with users without tool calling during the conversation. [(1) ]() If you need the agent to talk without executing functions, use a Conversation Node. Subagent Node is used for dialogue with users while allowing tool calling during the conversation. [(2) ]() Use it when the agent should decide whether and when to use a tool/function based on conversation context. Main Comparison: - **Conversation Node**: Dialogue only, no tools - **Subagent Node**: Dialogue + tools available during conversation Important Deprecation Notice: [(3) ]() The
tools
and
tool_ids
fields on conversation nodes are deprecated as of 04/18/2026 in favor of the new subagent node type. The conversation node type itself is not deprecated—it continues to work for nodes that don't use tools. After 04/18/2026, existing conversation nodes with tools will be automatically migrated to
type: "subagent"
. When to Use Each: - Use Conversation Node when you only need dialogue without tool calling [(1) ]() - Use Subagent Node when the agent should decide whether and when to call a tool/function based on what the user says [(2) ]() Subagent Node Features: - Multiple tools/functions can be added to a single subagent node - The agent can continue talking while a tool/function executes - Tool/function results are available to the LLM for generating follow-up responses - Only supports
Prompt
instr
uctions (not
Static Sentence
)
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy how do i plainly assign a value to a variable ( not extracted from conversation)
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
### Answer You can assign values to dynamic variables in several ways without extracting them from conversation: 1. Agent-Level Default Dynamic Variables [(1) ]() Configure default values at the agent level that serve as fallbacks. These are used when specific variables aren't included in the call request. 2. For Outbound Calls When using the Create Phone Call API, set your variables in the
retell_llm_dynamic_variables
field. All values must be strings:
Copy code
json
{
  "user_name": "John Smith",
  "product_name": "Premium Plan",
  "account_status": "active"
}
3. For Inbound Calls Supply dynamic variables in the Inbound Call Webhook. 4. Using the Update Call API [(2) ]() You can update the call and override dynamic variables during an active call using the Update Call API endpoint. Important Notes: - All values in
retell_llm_dynamic_variables
must be strings - numbers, booleans, or other data types are not supported [(1) ]() - Spaces around the variable name will be trimmed when evaluating the variable - Default variables set at the agent level only apply when specific variables aren't included in the call request These methods let you assign static or programmatic values to variables without needing to extract them from the conversation.
​ To learn more, see the sources I considered: [[1] Dynamic Variables](https://docs.retellai.com/build/dynamic-variables) [[2] 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.
a
@AI Evy is it possible to extract values and assign to a variable from a function that calls an API endpoint? how
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
### Answer Yes, you can extract values from an API response and save them as dynamic variables. Here's how: Set Response Variables in Your Custom Function [(1) ]() [(2) ]() When configuring your custom function, you can extract values from the API response and save them as dynamic variables for use later in the conversation. Steps to Configure: 1. In your custom function settings, locate the "Set response variables" section 2. Define which values to extract using JSON path notation (dot notation) 3. Specify a variable name for each extracted value Example: If your API returns this response body:
Copy code
json
{
 "properties": {
 "user": {
 "name": "John Doe",
 "age": 26
 }
 }
}
[(1) ]() , [(2) ]() You can extract values like: [(1) ]() [(2) ]() - Variable name:
user_name
→ JSON path:
properties.user.name
- Variable name:
user_age
→ JSON path:
properties.user.age
Then reference these later using
{{user_name}}
or
{{user_age}}
. [(1) ]() Important Notes: - The function result is capped at 15,000 characters to prevent overloading the LLM context window [(1) ]() [(2) ]() - If you're extracting from an array response, use array indexing. For example, if
patient
is an array, use
patient[0].providerNo
to get the first item's provider number [(3) ]() - Response variables work with all HTTP methods (GET, POST, PUT, PATCH, DELETE) [(1) ]() [(2) ]() This feature allows you to pull data from external APIs and make it available throughout your conversation flow without requiring the user to provide that information verbally.
​ To learn more, see the sources I considered: [[1] Integrate any system with custom function](https://docs.retellai.com/build/single-multi-prompt/custom-function) [[2] Custom Function](https://docs.retellai.com/build/conversation-flow/custom-function) [[3] Custom Function API call response not being saved as dynamic variable](https://discord.com/channels/1186424376300679209/1444715331372322917) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy the response would look like this, how can i extract? { "coordinates": [ [ 153.0299526, -27.4690095 ], [ 153.0263476, -27.4681999 ], [ 153.025835, -27.4748377 ] ] }
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
### Answer To extract values from your nested array response, use array indexing in the JSON path notation when setting response variables in your custom function. [(1) ]() For your coordinates array structure:
Copy code
json
{
    "coordinates": [
        [153.0299526, -27.4690095],
        [153.0263476, -27.4681999],
        [153.025835, -27.4748377]
    ]
}
Configure response variables like this: - Variable name:
first_longitude
→ JSON path:
coordinates[0][0]
- Variable name:
first_latitude
→ JSON path:
coordinates[0][1]
- Variable name:
second_longitude
→ JSON path:
coordinates[1][0]
- Variable name:
second_latitude
→ JSON path:
coordinates[1][1]
This extracts specific values from the nested arrays. You can then reference them as
{{first_longitude}}
,
{{first_latitude}}
, etc. throughout your conversation flow. [(1) ]() [(2) ]() Path syntax for arrays: [(3) ]() -
coordinates[0]
extracts the first coordinate pair array -
coordinates[0][0]
extracts the longitude from the first pair -
coordinates[0][1]
extracts the latitude from the first pair If you need to extract all coordinates or process them dynamically, you might need to use a Code Node instead, which gives you full JavaScript access to manipulate the response.
​ To learn more, see the sources I considered: [[1] Custom Function](https://docs.retellai.com/build/conversation-flow/custom-function) [[2] Dynamic Variables](https://docs.retellai.com/build/dynamic-variables) [[3] Code Node](https://docs.retellai.com/build/conversation-flow/code-node) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy can there be cases if the caller's phone number is not shown or hidden? how to detect in the flow?
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
### Answer Yes, there can be cases where the caller's phone number is hidden or unavailable (caller ID blocked, VoIP calls, privacy settings, etc.) . To detect this in your conversation flow: Use the
{{user_number}}
system variable with a conditional check. The
{{user_number}}
variable contains the user's phone number for phone calls. [(1) ]() Detection Method: In your Conversation Flow, you can check if the variable exists using equations: - Equation:
{{user_number}} exists
- Result: Returns
True
if the variable is defined (even an empty string is considered having a value) Handling Missing Phone Numbers: When a dynamic variable has no assigned value, it remains in its raw form with the curly braces intact. For example: - If
user_number
is not provided:
"{{user_number}}"
- If
user_number
is available: the actual phone number Best Practice for Your Flow: You can add conditional logic in your prompts: "If {{user_number}} appears with curly braces, the caller's number is hidden or unavailable. Otherwise, use the phone number." Alternatively, use a transition condition in your flow to branch based on whether
{{user_number}} exists
, directing callers with hidden numbers to a different path (e.g., asking them to provide their number verbally) .
​ 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.
a
@AI Evy there's been issues where your agent gets the email address misspelled, how do we address this in nodes/prompts? making sure the value received is correctly spelled
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
alue at the agent level for testing, but always validate during actual calls. The key is having the agent repeat the email back phonetically for user confirmation before saving it.
### Answer To address email misspelling issues, use an Extract Dynamic Variable Node to capture the email address with specific validation techniques: [(1) ]() [(2) ]() 1. Configure the Extract Dynamic Variable Node: [(1) ]() When creating your email variable: - **Variable Name**:
user_email
- **Description**: Be very specific: "The user's email address. Ask the user to spell it out letter by letter, including the domain (e.g., g-m-a-i-l dot com) . Confirm by repeating the full email back to the user for verification." - **Variable Type**: Select
Text
2. Add Verification in Your Prompt: [(2) ]() Use defensive prompting with the dynamic variable to handle validation: "After collecting the email address {{user_email}}, always repeat it back to the caller character by character and ask them to confirm it's correct. If {{user_email}} appears with curly braces, the email hasn't been captured yet." 3. Use Conversation Flow Transitions: [(1) ]() Create a verification loop: - After the Extract Dynamic Variable Node, add a Conversation Node that reads back the email - Add a transition condition checking if the user confirms it's correct - If incorrect, loop back to re-extract the email 4. Prompt the Agent to Spell It Out: In your node instructions, explicitly tell the agent: "Ask the user to spell their email address slowly, letter by letter, including the @ symbol and domain extension. Then repeat the entire email back for confirmation before proceeding." Best Practice: [(2) ]() Set a default v
​ To learn more, see the sources I considered: [[1] Extract Dynamic Variable Node](https://docs.retellai.com/build/conversation-flow/extract-dv-node) [[2] 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.
Thanks for the follow-up, @Ariz. I'll get back to you soon.
a
@AI Evy we have a conversation node followed by extract variable node. in the conversation node: "Ask for the name, email address, Booking ID, current booking date/time, new booking date and timeslot" but sometimes callers are unable to provide the booking ID, but its important to provide the name, email and booking date. how can you improve the prompt?
a
​ To learn more, see the sources I considered: [[1] Dynamic Variables](https://docs.retellai.com/build/dynamic-variables) [[2] Extract Dynamic Variable Node](https://docs.retellai.com/build/conversation-flow/extract-dv-node) [[3] Step 3: Add transition conditions](https://docs.retellai.com/build/conversation-flow/transition-condition) ​
This allows you to route callers differently based on whether they provided the ID - perhaps calling an API to look up their booking by name and date instead.
### Answer To improve your prompt for handling optional vs. required information, restructure it to prioritize the essential fields and gracefully handle missing data: Improved Conversation Node Prompt: "Ask for the caller's name, email address, and current booking date/time - these are required. Also ask for their Booking ID if they have it available, and their new preferred booking date and timeslot. If the caller doesn't have their Booking ID, reassure them that's okay and continue collecting the other information. Make it clear that the Booking ID is helpful but not mandatory." Why This Works: 1. Prioritizes required fields - Name, email, and booking date are presented first as essential [(1) ]() 2. Makes optional fields explicit - The Booking ID is clearly marked as "if available" 3. Reduces caller anxiety - Reassures callers who don't have their ID 4. Maintains conversation flow - Doesn't block progress when optional data is missing Additional Strategy - Split the Extraction: Consider using multiple Extract Dynamic Variable Nodes instead of one: [(2) ]() - **First Extract Node**: Capture only the required fields (name, email, current booking date) - **Second Extract Node**: Attempt to capture optional fields (Booking ID, new date/timeslot) This ensures you always get the critical information before moving forward. Handle Missing Booking ID in Transitions: After extraction, use an equation-based transition condition to check if the Booking ID exists: [(3) ]()
Copy code
{{booking_id}} exists
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy also following up on the above, the conversation node has knowledge base attached for the available timeslots per service, is it automatically injected into context? or is there any adjustments needed in the prompt?
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
### Answer Yes, when a knowledge base is linked to your agent, the relevant information is automatically retrieved and injected into the LLM context - no manual prompt adjustments are required. [(1) ]() How It Works: When a knowledge base is linked to an agent, the agent automatically retrieves information from it before responding. During the call, when the agent is about to respond, it uses the transcript so far (prompt is not included) to find the most relevant chunks from the knowledge base and feeds them to the LLM as context. For Node-Level Knowledge Base: [(2) ]() You can configure knowledge base at both the agent level and at individual node levels (Conversation Node or Subagent Node) . Node-level knowledge base is combined with agent-level knowledge base to provide more accurate context for specific topics. Retrieved knowledge base content is appended to the LLM prompt under the header ## Related Knowledge Base Contexts. [(1) ]() No Prompt Changes Needed: There's no need to change your prompt to use the knowledge base - it's used automatically when added to an agent. Optional: Restrict Responses to KB Only: If you want to ensure the agent only answers using knowledge base information, you can add this to your prompt:
Copy code
Only answer using the information in ## Related Knowledge Base Contexts.
If ## Related Knowledge Base Contexts is missing or does not contain relevant information, respond:
"There is no related information in knowledge base."
For your use case with timeslot availability, the knowledge base should automatically inject the relevant timeslot information when the conversation reaches that node, allowing the agent to reference available times without you needing to modify the prompt.
​ To learn more, see the sources I considered: [[1] Knowledge Base](https://docs.retellai.com/build/knowledge-base) [[2] Subagent Node](https://docs.retellai.com/build/conversation-flow/subagent-node) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy in a conversation node followed by extract variable node, how to make sure the required variables are extracted before moving on?
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
​ To learn more, see the sources I considered: [[1] Step 3: Add transition conditions](https://docs.retellai.com/build/conversation-flow/transition-condition) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
### Answer To ensure required variables are extracted before moving on from an Extract Dynamic Variable Node, use equation-based transition conditions that check for variable existence: [(1) ]() Add Transition Conditions to Check Variables: After your Extract Dynamic Variable Node, add transition conditions using the
exists
operator:
Copy code
{{variable_name}} exists
This returns
True
if the variable is defined and has a value (even an empty string is considered having a value) . For Multiple Required Variables: You can create transition conditions that require ALL variables to be present by using multiple equations with the "ALL" logic:
Copy code
{{user_name}} exists
{{user_email}} exists
{{booking_date}} exists
Then change the condition from "ANY" to "ALL" to force all equations to be true. Best Practice - Create Two Transition Paths: 1. Success path (when all required variables exist) : Transition to the next node in your flow 2. Retry path (when variables are missing) : Loop back to the Conversation Node to re-ask for the missing information Note on Transition Timing: The transition usually happens after the user speaks. When testing in the dashboard (both audio and text) , you can see what node is highlighted to find the current node and observe when the transition happens. This approach ensures your flow only proceeds when all critical data has been successfully extracted.
a
@AI Evy somehow in the flow the agent is offering to email a quote request, even though i havent any node or function with that capability yet
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
### Answer The agent is likely hallucinating or improvising capabilities that don't exist in your flow. To prevent this, you need to explicitly constrain the agent's behavior through **prompt engineering**: [(1) ]() Solution: Add Explicit Constraints to Your Prompts In your Conversation Node or Global Prompt, add clear boundaries about what the agent can and cannot do:
Copy code
## Capabilities
You can help users with [list your actual capabilities].

## Important Limitations
- You CANNOT send emails or email quotes
- You CANNOT process payments
- Do NOT offer to email anything to users
- If users request email functionality, politely explain: "I'm unable to send emails at this time. However, I can [alternative action you DO support]."
Best Practice for Tool Instructions: Define clear triggers for when tools should be called. Since you don't have an email function, explicitly state when NOT to offer email:
Copy code
## Tool Usage Instructions
- Do NOT mention emailing quotes or any email functionality
- Only offer capabilities that have corresponding functions configured
- If asked about emailing, redirect to available alternatives
Why This Happens: LLMs can be overly helpful and suggest actions they think would be useful, even if those capabilities don't exist. Without explicit constraints, the agent may improvise features based on common customer service patterns it learned during training. Additional Strategy: Review your Knowledge Base content (if attached to the node) to ensure it doesn't mention email capabilities that might be prompting the agent to offer this service.
​ To learn more, see the sources I considered: [[1] Prompt Engineering Guide](https://docs.retellai.com/build/prompt-engineering-guide) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy we are using a logic split node to check if the call occurs during operating hours 8am to 5pm brisbane time, how can i set this up, there nothing to be set timezone in settings
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
### Answer To set up a Logic Split Node to check operating hours (8am-5pm Brisbane time) , use equation-based transition conditions with the
{{current_time}}
dynamic variable: [(1) ]() [(2) ]() Configure Your Logic Split Node: Add equation conditions like this: [(2) ]()
Copy code
{{current_time}} >= 8 AND {{current_time}} < 17
This checks if the current time is between 8am (08:00) and 5pm (17:00) . Important Timezone Consideration: Based on the available documentation, there's no explicit timezone configuration setting mentioned for the
{{current_time}}
variable. The sources show equation examples using
{{current_time}}
but don't specify how timezone is handled:
Copy code
{{current_time}} > 9 AND {{current_time}} < 18
Recommended Approach: Since timezone settings aren't documented in the available sources, you may need to: 1. Test what timezone
{{current_time}}
uses by default 2. If it doesn't match Brisbane time (AEST/AEDT) , consider using a Custom Function or Code Node to get the current Brisbane time and store it as a dynamic variable, then use that variable in your Logic Split Node equation Setting Up the Logic Split: 1. Add your equation condition checking the time range [(1) ]() [(2) ]() 2. Set the destination node for when the condition is true (during operating hours) [(1) ]() 3. Set the else destination for when the condition is false (outside operating hours) - this is required as the Logic Split Node always needs a default path The transition happens immediately when the agent enters the Logic Split Node. I don't have information about timezone configuration in the available sources. You might want to reach out to support for clarification on how
{{current_time}}
handles timezones, or consider implementing a custom solution to handle Brisbane time specifically.
​ To learn more, see the sources I considered: [[1] Logic Split Node](https://docs.retellai.com/build/conversation-flow/logic-split-node) [[2] Step 3: Add transition conditions](https://docs.retellai.com/build/conversation-flow/transition-condition) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy there are lots of voice options to choose, but theres not australian accent. what can you advice
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
​ To learn more, see the sources I considered: [[1] TTS provider comparison](https://docs.retellai.com/build/tts-provider-comparison) [[2] Platform voices](https://docs.retellai.com/build/platform-voices) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
### Answer For Australian accents, ElevenLabs is your best option among the TTS providers available in Retell AI. [(1) ]() According to the TTS provider comparison, ElevenLabs has the best support for niche accent needs, specifically including Australian English. This makes it the recommended choice when you need an Australian accent for your voice agent. Provider Recommendations for Accents: - **ElevenLabs**: Best for niche accents like Australian English - **Cartesia**: May have weaker localization for certain accents - **MiniMax**: Great for Asian languages but not specifically highlighted for Australian accents You can select ElevenLabs voices directly in the voice selector in your agent settings, where you can preview each voice before selecting. [(2) ]() If you're using a platform voice, fallback is handled automatically and you don't need to configure TTS fallback separately. However, if you choose a non-platform ElevenLabs voice, you'll need to configure TTS fallback manually. **
a
@AI Evy how to route calls to human agents first, then fall back to the Retell AI agent after 20 seconds if no one answers
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
​ To learn more, see the sources I considered: [[1] Call Transfer Node](https://docs.retellai.com/build/conversation-flow/call-transfer-node) [[2] How AI Voice Agents Are Perfecting the Warm Transfer: Bridging the Gap Between AI and Human Agents | Retell AI](https://www.retellai.com/blog/how-ai-voice-agents-are-perfecting-the-warm-transfer) [[3] Custom Telephony Overview](https://docs.retellai.com/deploy/custom-telephony) ​
### Answer I don't have information in the available sources about routing calls to human agents first with a fallback to the Retell AI agent after a timeout period. The documentation I have access to covers how Retell AI agents can transfer calls TO human agents, but not the reverse scenario you're describing. [(1) ]() [(2) ]() What the sources DO cover: The Call Transfer Node allows your Retell AI agent to transfer calls to human agents with configurable dial timeout settings. [(1) ]() You can set how long the destination should ring before the transfer fails, and this applies to cold transfer, warm transfer, and agentic warm transfer. What you might need: Your use case (human agents first → AI fallback) would typically require configuration at your telephony provider level rather than within Retell AI itself. This would involve: 1. Setting up call routing rules in your SIP trunk or telephony provider (like Twilio, Telnyx, or Vonage) [(3) ]() 2. Configuring a 20-second ring timeout for human agents 3. Using SIP routing to dial the Retell SIP URI when no human answers When using custom telephony with Retell, you would dial calls to the SIP URI format:
sip:{call_id}@sip.retellai.com
I recommend reaching out to Retell support or checking their community for specific guidance on implementing this reverse-escalation pattern, as it's not covered in the documentation I have access to.
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy we have a conversation node followed by an extract variable node for retrieving a booking ID that has a format like "MQ4GOW0M" during one of our test calls, the ai agent has trouble identifying the G and hear it as Z or V, the description in the extract booking ID variable is "Extract order or booking ID from the conversation. Confirm by repeating and spelling out slowly and surely the ID back to the user for verification." how can this be improved and avoid this kind of issue
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
### Answer To address the phonetic confusion with letters like G being heard as Z or V, improve your Extract Dynamic Variable Node description with phonetic clarification instructions: [(1) ]() [(2) ]() Improved Variable Description: "Extract the booking ID from the conversation. The booking ID is an 8-character alphanumeric code (example format: MQ4GOW0M) . Ask the user to spell it out using the NATO phonetic alphabet or letter-by-letter very slowly. Pay special attention to letters that sound similar: G (as in Golf) , Z (as in Zulu) , V (as in Victor) . After capturing, repeat the ENTIRE booking ID back character by character using phonetic clarification (e.g., 'M as in Mike, Q as in Quebec') and ask the user to confirm it's 100% correct." [(2) ]() Additional Strategies: 1. Split into Two Nodes: - **Conversation Node**: Explicitly instruct the agent to ask for phonetic spelling: "Please ask the caller to spell their booking ID slowly, letter by letter. For clarity, ask them to use words like 'G as in Golf' or 'Z as in Zebra' for each letter." - **Extract Variable Node**: Then capture and verify with the improved description above 2. Add Boosted Keywords (if available in your ASR settings) : Add the specific booking ID format characters as custom vocabulary to bias speech recognition toward correct transcription of alphanumeric codes. [(3) ]() 3. Create a Verification Loop: [(2) ]() After the Extract Variable Node, add a Conversation Node that: - Reads back the captured booking ID phonetically - Asks "Is that correct?" - Use
a transition condition to loop back if the user says no 4. Use Equation-Based Validation: Add a transition condition after extraction to check the format matches your expected pattern (8 alphanumeric characters) , and loop back if it doesn't match. Example Prompt for Conversation Node: "Ask the caller to spell their booking ID very slowly, one character at a time. Encourage them to use clarifying words like 'G as in Golf' or 'M as in Mike' for each letter. This is critical for accuracy." [(4) ]() The key is combining explicit phonetic instructions in both the conversation prompt AND the variable description to reduce ASR errors with similar-sounding letters. [(1) ]() [(2) ]()
​ To learn more, see the sources I considered: [[1] Extract Dynamic Variables](https://docs.retellai.com/build/single-multi-prompt/extract-dv) [[2] Extract Dynamic Variable Node](https://docs.retellai.com/build/conversation-flow/extract-dv-node) [[3] Dynamic Variables](https://docs.retellai.com/build/dynamic-variables) [[4] Prompt Engineering Guide](https://docs.retellai.com/build/prompt-engineering-guide) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy in extract variables node, can you give a good example of transition besides the else?
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
### Answer For Extract Dynamic Variable Nodes, here are effective transition examples beyond the else path: [(1) ]() [(2) ]() 1. Check if Variable Was Successfully Extracted: Use equation conditions to verify the variable exists before proceeding: [(1) ]()
Copy code
{{user_name}} exists
{{user_email}} exists
{{booking_id}} exists
This ensures the extraction was successful before moving to the next node. 2. Validate Variable Values with Equations: Create conditional branches based on extracted values:
Copy code
{{user_age}} > 18
{{user_location}} == "New York"
"New York, Los Angeles" CONTAINS {{user_location}}
3. Multiple Variables with ALL Logic: Require all critical variables to be extracted before transitioning:
Copy code
{{customer_name}} exists
{{customer_email}} exists
{{booking_date}} exists
Then change the condition from "ANY" to "ALL" to force all equations to be true. 4. Combine Existence Check with Value Validation:
Copy code
{{booking_id}} exists
{{booking_id}} != ""
Best Practice: Equation conditions are evaluated first (top to bottom) , and the flow travels on the first condition that evaluates to true. This makes them more reliable than prompt conditions for checking whether variables were successfully extracted. [(3) ]() If no transition condition is met, the agent will transition to the else destination node. [(1) ]() [(2) ]()
​ To learn more, see the sources I considered: [[1] Step 3: Add transition conditions](https://docs.retellai.com/build/conversation-flow/transition-condition) [[2] Extract Dynamic Variable Node](https://docs.retellai.com/build/conversation-flow/extract-dv-node) [[3] extract variable node transition](https://discord.com/channels/1186424376300679209/1393706083108786357) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy and then where would the else transition go?
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
### Answer The else transition should typically route to a retry or error-handling path when variable extraction fails. [(1) ]() [(2) ]() Common Else Destination Strategies: 1. Loop Back to Conversation Node (Retry) : Route the else path back to the preceding Conversation Node to re-ask for the missing information. This creates a retry loop when extraction fails. 2. Route to Error Handling Node: Create a dedicated Conversation Node that handles extraction failures: - Apologizes for the confusion - Re-explains what information is needed - Asks the user to provide the information again more clearly 3. Route to Alternative Flow: If certain variables are optional, the else path could skip to a different part of your flow that doesn't require that data. [(2) ]() Example Flow Structure:
Copy code
Conversation Node (ask for info)
    ↓
Extract Variable Node
    ├─ Transition: {{variable}} exists → Next Step Node
    └─ Else → Back to Conversation Node (retry)
Best Practice: The else destination is required for Extract Variable Nodes - you must specify where to go when extraction conditions aren't met. [(1) ]() Most commonly, this creates a validation loop that ensures critical data is captured before proceeding. [(2) ]() If you're checking multiple variables with "ALL" logic and any variable is missing, the else path activates, allowing you to handle incomplete extractions gracefully.
​ To learn more, see the sources I considered: [[1] Extract Dynamic Variable Node](https://docs.retellai.com/build/conversation-flow/extract-dv-node) [[2] Step 3: Add transition conditions](https://docs.retellai.com/build/conversation-flow/transition-condition) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy for a conversation node with prompt "Ask the type of items (Moving boxes, furnitures, mattresses, etc). If mattresses is mentioned, ask how many mattresses. " whats a good transition prompt or equation or always/skip?
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
### Answer For your Conversation Node that asks about item types and mattress quantities, here's the recommended transition approach: [(1) ]() Best Practice: Use Prompt-Based Transitions Since you're gathering conversational information (not pre-set dynamic variables) , prompt conditions work better than equations here: Recommended Transition Conditions: 1. Condition 1 (Mattresses mentioned) : - Prompt:
User mentioned mattresses AND provided the number of mattresses
- Destination: Next node in your flow (e.g., Extract Variable Node or next question) 2. Condition 2 (Other items only) : - Prompt:
User mentioned item types but NOT mattresses
- Destination: Next node (skip mattress quantity question) 3. Else Destination: - Route back to the same Conversation Node to re-ask if the user didn't provide item types Why Not Use "Always" or "Skip": - **Always**: Would transition immediately without waiting for user response - not appropriate here since you need the user to answer - **Skip Response**: Would skip the agent speaking this node's content - you want the agent to actually ask the question [(2) ]() Alternative Approach - Split Into Two Nodes: For better control, consider splitting this into: 1. **Node 1**: Ask about item types - Transition condition:
User mentioned mattresses
→ Go to mattress quantity node - Else: Skip to next topic 2. **Node 2**: Ask mattress quantity (only reached if mattresses mentioned) - Transition:
User provided number
→ Continue flow - Else: Loop back to re-ask Equation Conditions Won't Work Here because you don't have pre-existing dynamic variables for item types yet - the information is being gathered during this conversation. [(1) ](htt
ps://docs.retellai.com/build/conversation-flow/transition-condition) The transition happens after the user speaks in Conversation Nodes, so your conditions will be evaluated based on what the user says in response to your item-type question. [(1) ]() [(3) ]()
​ To learn more, see the sources I considered: [[1] Step 3: Add transition conditions](https://docs.retellai.com/build/conversation-flow/transition-condition) [[2] Node Overview](https://docs.retellai.com/build/conversation-flow/node) [[3] Issues with transitions - getting stuck on Conversation and Logic Split Nodes using dynamic variable](https://discord.com/channels/1186424376300679209/1437030319541719172) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy for an extract variable where the variable is not really required, what can be placed into the transitions? can i just use else since it cant be removed?
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
### Answer For an optional Extract Variable Node, you can create a transition that proceeds regardless of whether the variable was extracted: [(1) ]() [(2) ]() Recommended Approach: Create two transition paths: 1. Condition 1 (Variable extracted) : - Equation:
{{variable_name}} exists
- Destination: Next node in your flow 2. Condition 2 (Variable not extracted - also proceed) : - Equation:
{{variable_name}} does not exist
- Destination: Same next node in your flow Both conditions route to the same destination, effectively making the variable optional while still having explicit transition logic. [(1) ]() Alternative - Simpler Approach: Since you mentioned the else can't be removed, you can use: 1. Single transition condition: - Prompt:
User provided any response or information
- Destination: Next node 2. Else destination: - Route to the same next node This way, whether the variable is extracted or not, the flow continues forward. [(1) ]() [(2) ]() Why This Works: The else destination is required for Extract Variable Nodes. [(2) ]() By routing both your explicit condition AND the else path to the same destination node, you effectively make the extraction optional while satisfying the requirement to define an else path. [(1) ]() The transition typically happens after the user speaks, so the node will attempt extraction and then proce
ed regardless of success.
​ To learn more, see the sources I considered: [[1] Step 3: Add transition conditions](https://docs.retellai.com/build/conversation-flow/transition-condition) [[2] Extract Dynamic Variable Node](https://docs.retellai.com/build/conversation-flow/extract-dv-node) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy what if i just use else only
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
### Answer Yes, you can use just the else transition for an optional Extract Variable Node. [(1) ]() [(2) ]() Since the else destination is required and cannot be removed, [(1) ]() you can simply route the else path directly to your next node. This means: - If the variable is successfully extracted → the else path still proceeds to the next node - If the variable is NOT extracted → the else path proceeds to the next node The flow continues forward regardless of extraction success, making the variable effectively optional. Important consideration from community experience: Some users have reported that Extract Variable Nodes without explicit transition conditions can sometimes cause issues. One user noted that "if I don't put anything in transition, the var is extracted (dynamic tool call runs successfully) , but of course doesn't move on." [(3) ]() Recommended safer approach: Add one simple transition condition to ensure reliable behavior: - Transition condition: Always evaluate to true (e.g.,
1 == 1
or a prompt like "User has responded") - Destination: Your next node - Else destination: Same next node This ensures the extraction attempt completes before transitioning, while still making the variable optional since both paths lead forward. [(1) ]() [(2) ]()
​ To learn more, see the sources I considered: [[1] Extract Dynamic Variable Node](https://docs.retellai.com/build/conversation-flow/extract-dv-node) [[2] Extract Dynamic Variables](https://docs.retellai.com/build/single-multi-prompt/extract-dv) [[3] extract variable node transition](https://discord.com/channels/1186424376300679209/1393706083108786357) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy we have an api endpoint that retell calls and then get a response that have the estimate/quotation of hauling jobs. this is the current prompt "Tell caller that you done computing the estimate and give the details about it. Once details have been provided, ask if the caller wants to proceed with the booking or not." . how can it be improved? also there will be cases that the address give is only by suburb and not a specific street address, so it is imperative to let the caller know that the estimate is around that price and the final price still depends on the exact address. also tell caller that there's also an option to get quotation via website in picup.com.au
a
Thanks for the follow-up, @Ariz. I'll get back to you soon.
### Answer To improve your prompt for presenting the hauling estimate, apply sectional prompt structure and explicit conditional handling: [(1) ]() Improved Prompt:
Copy code
///## Task Instructions
1. Inform the caller you've calculated their hauling estimate
2. Present the estimate details clearly:
   - Total estimated cost
   - Key items included
   - Any relevant conditions

3. Address precision based on address specificity:
   - If the caller provided only a suburb (not a specific street address) :
     → Clearly state: "This is an approximate estimate based on the suburb. The final price will depend on your exact street address."
   - If a specific street address was provided:
     → State: "This estimate is based on your provided address."

4. Offer alternative options:
   - Mention: "You can also get a detailed quotation through our website at picup.com.au"

5. Ask if the caller wants to proceed with the booking

///## Response Guidelines
Be clear about estimate vs final pricing
Acknowledge any limitations in the estimate accuracy
Present the website option naturally, not as a deflection
Why This Structure Works: Breaking the prompt into sectional components makes it easier for the LLM to follow specific logic paths and handle conditional scenarios reliably. Handling Address Specificity with Dynamic Variables: You can use dynamic variables to track address precision: [(2) ]()
Copy code
{{address_type}}
Then reference it in your prompt:
Copy code
If {{address_type}} is "suburb_only", emphasize that the estimate is approximate and final pricing requires a specific street address.
Alternative Approach - Split Into Multiple Nodes: For more complex scenarios with multiple conditional paths, consider using Conversation Flow with separate nodes: [(3) ]() 1. Node 1: Present estimate 2. Logic Split Node: Check if
{{address_type}}
is specific or suburb-only 3. Node 2a: Handle suburb-only disclaimer 4. Node 2b: Handle specific address confirmation 5. Node 3: Ask about booking + mention website option This provides more fine-grained control over the conversation flow compared to handling everything in a single prompt.
​ To learn more, see the sources I considered: [[1] Prompt Engineering Guide](https://docs.retellai.com/build/prompt-engineering-guide) [[2] Dynamic Variables](https://docs.retellai.com/build/dynamic-variables) [[3] Retell AI’s Advanced Conversation Flow | Retell AI](https://www.retellai.com/blog/unlocking-complex-interactions-with-retell-ais-conversation-flow) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.