Ciaran
07/31/2026, 12:36 PMAI Evy
07/31/2026, 12:36 PMAI Evy
07/31/2026, 12:37 PMYour goal is to reach the scheduling or appointments department.
Preferred navigation keywords:
• Scheduling
• Appointments
• New patients
• Front desk
Avoid:
• Billing
• Referrals
• Medical records
• Clinical departments
If you are unsure which IVR option is correct:
Choose the option most closely related to scheduling or appointments.
2. Configure Detection Delay
Some IVR systems speak slowly, so to make sure the agent does not make any decision prematurely, you can set a delay on pauses to make sure the whole IVR menu is captured. We recommend setting this to 1 second.
3. Configure Transitions
Transitions occur when the IVR system finishes speaking. When writing your transitions, ensure you cover both successful navigation and potential failure scenarios or edge cases. Example transition conditions:
You've reached the scheduling department.
Menu repeated 3 times.
You've reached the wrong department or company.
You've reached an after-hours or voicemail message.
How It Works
When in this node, the agent will not speak. Instead, it evaluates whether it should press a digit and determines which specific digit to press. The node evaluates whether to press a digit each time the user (IVR system) finishes speaking.AI Evy
07/31/2026, 12:37 PMAI Evy
07/31/2026, 12:37 PMCiaran
07/31/2026, 12:39 PMThank you for calling COMPANY_NAME.
Please choose from the following options:
if you are an existing patient please press 1
if you are calling from a GP surgery or pharmacy please press 2
if you are calling on behalf of a patient please press 3
for anything else please press 4
And the transitions is 'prompt: the call is from a patient', go to here etc.
But i'm calling it, now is being said and I press 2 and its not going anywhere?AI Evy
07/31/2026, 12:39 PMAI Evy
07/31/2026, 12:40 PMAI Evy
07/31/2026, 12:40 PMAI Evy
07/31/2026, 12:40 PMAI Evy
07/31/2026, 12:40 PMCiaran
07/31/2026, 12:42 PMAI Evy
07/31/2026, 12:42 PMAI Evy
07/31/2026, 12:42 PM{{user_dtmf_input}} == "1") [(2) ]() .
For your IVR menu, you'd configure something like :
"user_dtmf_options": {
"digit_limit": 1,
"termination_key": "",
"timeout_ms": 2000
}
This ensures any single digit is read immediately and triggers a transition without needing a termination key .AI Evy
07/31/2026, 12:42 PMAI Evy
07/31/2026, 12:43 PMCiaran
07/31/2026, 12:46 PMAI Evy
07/31/2026, 12:46 PMAI Evy
07/31/2026, 12:47 PM{{user_dtmf_input}} == "1"
, [(1) ]()
Complete setup for your 4-option menu:
Create four separate transition conditions on your conversation node [(2) ]() :
- {{user_dtmf_input}} == "1" → transition to existing patient flow
- {{user_dtmf_input}} == "2" → transition to GP/pharmacy flow
- {{user_dtmf_input}} == "3" → transition to calling on behalf flow
- {{user_dtmf_input}} == "4" → transition to anything else flow
Recommended DTMF configuration:
"user_dtmf_options": {
"digit_limit": 1,
"termination_key": "",
"timeout_ms": 2000
}
[(1) ]()
This ensures any single digit is read immediately and triggers a transition without needing a termination key .
Important note about interruption:
Make sure your conversation node is configured to allow barge-in (interruption) . This allows the system to stop speaking when a digit is pressed . Avoid using "Skip Response" as this delays recognition until the end of playback .AI Evy
07/31/2026, 12:47 PMAI Evy
07/31/2026, 12:47 PMCiaran
07/31/2026, 12:50 PMAI Evy
07/31/2026, 12:50 PMAI Evy
07/31/2026, 12:50 PM{{user_dtmf_input}} == "2" transition, this indicates your global node's condition is being triggered and taking priority over your regular transition conditions [(1) ]() [(2) ]() .
Why this happens:
Global nodes can be transitioned to from anywhere in the conversation flow [(1) ]() . When transitions are evaluated, prompt conditions (including global node entry conditions) are evaluated together by the LLM, and it picks the single best match [(2) ]() .
Evaluation order is:
1. Always edge (if present)
2. Equation conditions (evaluated top to bottom)
3. Prompt conditions + global node conditions (evaluated together)
4. Else edge
5. Stay in current node
How to fix this:
*Option 1: Use equation conditions for DTMF (recommended) *
Since you're checking DTMF input, use equation conditions instead of prompt conditions for your digit routing . Equation conditions are evaluated before prompt conditions and global nodes, so they'll take priority:
- {{user_dtmf_input}} == "2" → your intended destination
This ensures the digit press is handled deterministically before the LLM evaluates any global node conditions .
Option 2: Adjust your global node
Check your global node's condition and consider:
- Making the condition more specific so it doesn't match during your IVR menu
- Enabling Prevent Immediate Re-Trigger to pause the global node for a specified number of node steps after it's been triggered [(1) ]()
- Reviewing whether the gloAI Evy
07/31/2026, 12:50 PMAI Evy
07/31/2026, 12:50 PMAI Evy
07/31/2026, 12:50 PMCiaran
07/31/2026, 12:52 PMAI Evy
07/31/2026, 12:52 PMAI Evy
07/31/2026, 12:52 PM{{user_dtmf_input}} == "2") are evaluated deterministically before any prompt conditions or global node conditions . This means your DTMF equation should take priority.
Global nodes only check after user turns [(2) ]()
Global nodes are only evaluated after a user turn . Since you're only pressing a digit and not speaking, the global node shouldn't be triggering unless there's something in its condition that's matching the DTMF input.
Troubleshooting steps:
1. Verify your equation condition format - Make sure it's exactly: {{user_dtmf_input}} == "2" [(1) ]()
2. Check your global node's condition - Look at what condition your global node uses. If it's checking for something that could match during this interaction, that's your issue [(2) ]()
3. Reorder your transitions - Equation conditions are evaluated top to bottom, and the first one that evaluates true wins [(1) ]() . Make sure your DTMF equations are at the top of your transition list.
4. Temporarily disable global nodes - Yes, temporarily removing global nodes is a valid troubleshooting step to confirm they're the issue. If the flow works correctly without them, you know the global node condition needs adjustment [(2) ]AI Evy
07/31/2026, 12:52 PMAI Evy
07/31/2026, 12:52 PMCiaran
07/31/2026, 1:04 PMAI Evy
07/31/2026, 1:04 PMAI Evy
07/31/2026, 1:05 PMGET /v2/get-call/{call_id}
This API returns comprehensive call information including transcript, recording URLs, call analysis, latency metrics, and more .
Alternative ways to check calls:
1. **Dashboard**: View call details directly in the Call History tab of your Retell AI dashboard [(2) ]() [(3) ]()
2. **Webhooks**: Set up webhooks to receive call data automatically after calls end (using the call_analyzed event type)
If you're experiencing issues with your DTMF flow and want to debug a specific call, you should:
- Check the call in your dashboard's Call History
- Use the Get Call API with your call_id to retrieve the full call details and transcript
- Review the public log URL that's included in the call response for detailed debugging information [(1) ]()AI Evy
07/31/2026, 1:05 PMAI Evy
07/31/2026, 1:05 PMCiaran
07/31/2026, 1:25 PMAI Evy
07/31/2026, 1:25 PMAI Evy
07/31/2026, 1:26 PMAI Evy
07/31/2026, 1:26 PM{{user_dtmf_input}} == "2"
- Placed at the top of your transition list
- Using equation type (not prompt type)
2. Tighten your global node conditions
Make your global node conditions more specific so they don't match during DTMF input [(1) ]() . For example, if your global node handles transfer requests, ensure the condition explicitly checks for spoken phrases, not just any user input [(3) ]() .
3. Use "Prevent Immediate Re-Trigger"
Enable this setting on your global nodes to pause them for a specified number of node steps after they've been triggered [(1) ]() . This prevents them from firing repeatedly during your IVR flow.
4. Verify barge-in is enabled
Make sure your conversation node allows barge-in (AI Evy
07/31/2026, 1:26 PMAI Evy
07/31/2026, 1:26 PMCiaran
07/31/2026, 1:29 PMThank you for calling COMPANY_NAME.
Please choose from the following options:
if you are an existing patient please press 1
if you are calling from a GP surgery or pharmacy please press 2
if you are calling on behalf of a patient please press 3
for anything else please press 4
Press 2
Doesn't jump to the next and jumps to a global node with the value
The caller explicitly says, in their own words, that they want to sign up or register a family member, partner, spouse, or child for an account — not merely because they selected an IVR option, or because they are calling from a GP surgery or pharmacy
I feel like I cant be more explicit :/AI Evy
07/31/2026, 1:29 PMAI Evy
07/31/2026, 1:30 PM{{user_dtmf_input}} == "2", add additional context to ensure it takes priority:
- Create your equation condition as: {{user_dtmf_input}} == "2"
- Drag it to the very top of your transition list
- Verify it's set as "Equation" type (not "Prompt")
2. Rewrite your global node condition to exclude DTMF scenarios
Change your global node condition to: [(1) ]()
The caller explicitly SAYS OUT LOUD, in their own words through speech (not keypad press) , that they want to sign up or register a family member, partner, spouse, or child for an account — this does NOT include selecting IVR options via keypadAI Evy
07/31/2026, 1:30 PMAI Evy
07/31/2026, 1:30 PMAI Evy
07/31/2026, 1:30 PMCiaran
07/31/2026, 1:39 PMAI Evy
07/31/2026, 1:39 PMAI Evy
07/31/2026, 1:40 PM{{user_dtmf_input}} is not explicitly documented as a variable in the official documentation page you referenced [(1) ]() . However, based on Discord community discussions, it appears to be used in practice for DTMF routing [(2) ]() [(3) ]() .
How DTMF input actually works:
According to the sources, DTMF input is captured automatically and added to the call transcript by default [(3) ]() . You'll see it appear in transcripts like:
[User pressed digits: 1234#]AI Evy
07/31/2026, 1:40 PM{{variable_name}} .
Option 2: Reference the automatically captured input
The agent can reference the DTMF value directly from the transcript when generating a response, without any extra setup .
For transition conditions:
The format {{user_dtmf_input}} == "2" is mentioned in Discord discussions as a working pattern for equation-based transitions [(2) ]() , but this specific variable name isn't documented in the official docs.
My recommendation: Since the official documentation doesn't explicitly define {{user_dtmf_input}}, I suggest reaching out to Retell support to confirm the correct variable syntax for your transition conditions, or use the Extract Dynamic Variable approach which is officially documented [(3) ]() .AI Evy
07/31/2026, 1:40 PMAI Evy
07/31/2026, 1:40 PMCiaran
07/31/2026, 1:49 PMAI Evy
07/31/2026, 1:49 PMAI Evy
07/31/2026, 1:50 PM{{user_dtmf_input}} == "2"
Critical requirements:
1. Condition type must be "Equation" (not "Prompt")
2. Equation conditions must be at the TOP of your transition list - they are evaluated top to bottom, and the first one that evaluates true wins
3. All four DTMF options should use equation conditions:
- {{user_dtmf_input}} == "1"
- {{user_dtmf_input}} == "2"
- {{user_dtmf_input}} == "3"
- {{user_dtmf_input}} == "4"
Evaluation order matters:
Transitions are checked in this order:
1. Always edge (if present)
2. Equation conditions (evaluated deterministically before any prompt condition)
3. Prompt conditions + global node conditions (evaluated together)
4. Else edge
5. Stay in current node
For your conversation node settings: [(2) ]()
- Allow barge-in/interruption should be enabled so the system stops speaking when a digit is pressed
- Do NOT use "Skip Response" as this delays recognition until the end of playback
For your DTMF settings (at agent level) :
"user_dtmf_options": {
"digit_limit": 1,
"termination_key": "",
"timeout_ms": 2000
}AI Evy
07/31/2026, 1:50 PMAI Evy
07/31/2026, 1:50 PMCiaran
07/31/2026, 1:54 PM"user_dtmf_options": {
"digit_limit": 1,
"termination_key": "",
"timeout_ms": 2000
}
But I cant set that... I've used the API to get all my agents but these are the keys from the JSON
["agent_id", "agent_name", "channel", "user_modified_timestamp", "response_engine_type", "is_multi_prompt", "voice_id", "voice_name", "voice_avatar_url", "folder_id", "tags"]AI Evy
07/31/2026, 1:54 PMAI Evy
07/31/2026, 1:54 PMuser_dtmf_options configuration is not returned by the List Agents endpoint [(1) ]() . That endpoint only returns a summary with basic fields like agent_id, agent_name, voice_id, etc.
To set or view user_dtmf_options, you need to use **different API endpoints**:
To configure DTMF options:
Use the Create Agent or Update Agent endpoints [(1) ]() [(2) ]() . The user_dtmf_options object is part of the request body:
json
{
"user_dtmf_options": {
"digit_limit": 1,
"termination_key": "",
"timeout_ms": 2000
}
}
[(1) ]()
To view current DTMF settings:
Use the Get Agent endpoint (not List Agents) with your specific agent_id [(2) ]() . This returns the full agent configuration including user_dtmf_options .
Available parameters: [(1) ]()
- **`digit_limit`**: Maximum number of digits to capture per turn (range: 0.5 to 50)
- **`termination_key`**: Key that signals end of input (#, *, or 0-9)
- **`timeout_ms`**: Wait time after last digit before timeout (range: 1000-15000ms)
To configure via API:
POST /create-agent
or
PATCH /update-agent/{agent_id}AI Evy
07/31/2026, 1:54 PMAI Evy
07/31/2026, 1:54 PMCiaran
07/31/2026, 2:04 PMAI Evy
07/31/2026, 2:04 PMAI Evy
07/31/2026, 2:04 PMtermination_key and timeout_ms to further control DTMF completion [(1) ]() [(2) ]() :
- **`termination_key`**: A single key (#, *, or 0-9) that signals end of input [(1) ]()
- **`timeout_ms`**: Time in milliseconds to wait after the last digit before timing out (range: 1000-15000)
Your current setup should work because with digit_limit: 1, the agent completes input immediately after one digit is pressed . Whichever completion condition is met first wins .
Since you're still jumping to the global node, the issue is NOT your DTMF settings — it's the transition condition evaluation order or your global node condition being too broad [(3) ]() [(4) ]() .
Next debugging steps:
1. Verify your equation condition syntax — confirm it's exactly {{user_dtmf_input}} == "2" and positioned at the very top of your transition list [(3) ]()
2. Check your global node condition — ensure it explicitly excludes keypad-based selections [(4) ]()
3. Test with global nodes temporarily disabled to confirm they're the source of the issue
The DTMF capture itself is working (you can see "User Pressed keypad: 2" in the transcript) [(1) ]() — the problem is the transition logic afterward.AI Evy
07/31/2026, 2:04 PMAI Evy
07/31/2026, 2:04 PMAI Evy
07/31/2026, 2:18 PMCiaran
07/31/2026, 2:18 PMAI Evy
07/31/2026, 2:18 PM{{user_dtmf_input}} == "2" are evaluated deterministically before any prompt condition . Prompt conditions rely on LLM interpretation, which can be less predictable .
3. **Global node interference**: Since prompt conditions and global nodes are evaluated together , you may still encounter the global node issue if its condition is semantically similar to your DTMF prompt [(2) ]() .
To make your solution more robust:
- Make each prompt condition very specific: "The caller pressed digit 2 on their keypad to indicate they are calling from a GP surgery or pharmacy" [(1) ]()
- Tighten your global node conditions to explicitly exclude keypad selections [(2) ](AI Evy
07/31/2026, 2:18 PMAI Evy
07/31/2026, 2:18 PMAI Evy
07/31/2026, 2:18 PM