https://retellai.com/?utm_source=discord&utm_medium=seo logo
How do I configure the Press Digit Node
# ❓・ai-evy-support
c
@AI Evy How do I configure the Press Digit Node?
a
Thanks for tagging me @Ciaran. I'll look through relevant sources and get back to you shortly.
### Answer To configure the Press Digit Node in a conversation flow agent, follow these steps: [(1) ]() 1. Setup IVR Navigation Instructions Provide clear instructions so the agent knows whether and what digit to press. Include keywords or phrases to listen for, as well as which ones to avoid. Sample prompt:
Copy code
Your 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:
Copy code
You've reached the scheduling department.
Copy code
Menu repeated 3 times.
Copy code
You've reached the wrong department or company.
Copy code
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.
​ To learn more, see the sources I considered: [[1] Press Digit Node](https://docs.retellai.com/build/conversation-flow/press-digit-node) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
c
@AI Evy So I set the instructions to
Copy code
Thank 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?
a
Thanks for the follow-up, @Ciaran. I'll get back to you soon.
### Answer I see the issue — you've configured the Press Digit Node as if you're the IVR system, but the Press Digit Node is designed for your AI agent to navigate someone else's IVR menu [(1) ]() [(2) ]() . The Press Digit Node lets Retell agents navigate IVR menus by inferring and pressing the correct keypad digit silently during an outbound phone call [(1) ]() . 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 . What you need instead: Since you want callers to press digits on your IVR menu (not your agent pressing digits on another system) , you should use *User DTMF (keypad input detection) * to capture the digits the caller presses [(2) ]() . How to fix your setup: 1. Use a Conversation Node (not Press Digit Node) to speak your IVR menu greeting [(3) ]() 2. Enable User DTMF input capture to detect which digit the caller presses [(2) ]() 3. Set up transition conditions based on which digit was pressed (e.g., "user pressed 1", "user pressed 2", etc.) [(4) ]() The Press Digit Node is specifically for scenarios like: your agent calls an insurance provider, hears "Press 1 for members, press 2 for providers," and your agent needs to press 2 to reach the right department [(2) ]() . For capturing caller input on your o
wn menu, see the documentation on [Capture DTMF input from user] .
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
c
@AI Evy Created a Conversation Node but i'm not seeing the User DTMF Input Capture on the node settings?
a
Thanks for the follow-up, @Ciaran. I'll get back to you soon.
### Answer DTMF input capture is configured at the agent level in Call Settings, not on individual conversation nodes [(1) ]() . To enable DTMF input: 1. Go to your agent's Call Settings 2. Configure the DTMF options with these parameters : - **`user_dtmf_options.digit_limit`**: Maximum digits per turn (1–50) - **`user_dtmf_options.termination_key`**: Key that signals end of input (0-9, #, or *) - **`user_dtmf_options.timeout_ms`**: Wait time after last digit before timeout (1000–15000ms) DTMF input is captured by default once configured and factored into the agent's responses . You then set up transition conditions on your conversation node to route based on what digit the user pressed (e.g.,
{{user_dtmf_input}} == "1"
) [(2) ]() . For your IVR menu, you'd configure something like :
Copy code
"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 .
​ To learn more, see the sources I considered: [[1] Capture DTMF input from user](https://docs.retellai.com/build/user-dtmf) [[2] User dtmf input issue / IIssue with IVR Node Keypress Handling](https://discord.com/channels/1186424376300679209/1397608688734175293) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
c
@AI Evy How is user_dtmf_input set? I enabled 'User Keypad Input Detection', set the Digit Limit to 4 because there's only 4 options. In the Conversation cell, do I just do an transition equation where user_dtmf_input equals 1?
a
Thanks for the follow-up, @Ciaran. I'll get back to you soon.
### Answer You're almost there, but there's a small adjustment needed for your Digit Limit setting. Setting the Digit Limit: The Digit Limit should be set to 1 (not 4) , because you want to capture a single digit press per turn [(1) ]() . The digit limit represents the maximum number of digits captured in one input session, not the number of menu options . Setting up the transition: Yes, you can use an equation condition on your conversation node to check the pressed digit [(2) ]() . The format is:
Copy code
{{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:
Copy code
"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 .
​ To learn more, see the sources I considered: [[1] User dtmf input issue / IIssue with IVR Node Keypress Handling](https://discord.com/channels/1186424376300679209/1397608688734175293) [[2] 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.
c
@AI Evy So it said the conversation, I pressed 2 (I can see User Pressed keypad: 2), Then jumped to a global node?
a
Thanks for the follow-up, @Ciaran. I'll get back to you soon.
### Answer If the agent jumped to a global node instead of following your
{{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 glo
bal node should even be active during this part of the flow To verify: Check what condition your global node uses and whether it's matching when the user presses 2.
​ To learn more, see the sources I considered: [[1] Global Node](https://docs.retellai.com/build/conversation-flow/global-node) [[2] 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.
c
@AI Evy That's what I did? I just pressed 2 and it went to a global node about something else? I didn't say a thing. I just pressed 2. Maybe I just have to remove the global nodes from it all?
a
Thanks for the follow-up, @Ciaran. I'll get back to you soon.
### Answer If you're pressing 2 and the agent is jumping to an unrelated global node without you saying anything, this is unexpected behavior. Let me clarify what should be happening: Equation conditions should be evaluated BEFORE global nodes [(1) ]() According to the transition evaluation order, equation conditions (like
{{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) ]
() . Most likely issue: Your global node has a condition that's somehow matching when the digit is pressed. Review that condition and make it more specific so it doesn't trigger during your IVR menu .
​ To learn more, see the sources I considered: [[1] Transition conditions](https://docs.retellai.com/build/conversation-flow/transition-condition) [[2] Global Node](https://docs.retellai.com/build/conversation-flow/global-node) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
c
@AI Evy Do you have the ability to check calls based on call_ids?
a
Thanks for the follow-up, @Ciaran. I'll get back to you soon.
### Answer No, I don't have the ability to directly check or access your specific calls based on call_ids [(1) ]() . I'm an AI assistant that can only help you understand how to use Retell AI's features based on the documentation. However, you can retrieve call details using the call_id through the Get Call API . Here's how: Using the Get Call API: You can retrieve details of a specific call programmatically using the Get Call API endpoint :
Copy code
GET /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) ]()
​ To learn more, see the sources I considered: [[1] Get Call](https://docs.retellai.com/api-references/get-call) [[2] Consume the analysis data](https://docs.retellai.com/features/post-call-analysis-consumption) [[3] Discord message from @truthseeker28 on 2025-02-25](https://discord.com/channels/1186424376300679209/1186462578310910112/1343975428200857742) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
c
@AI Evy Implement a conversation cell, enabled user keypad, if user_dtmf_input = '2' then go to a new conversation node but then a global node is making me jump.. I've tried to use conductor but i'm not having any luck 1. Either the global nodes need to be taken out 2. Global nodes need tightening 3. Create a new agent that deals with the IVR and just forwards to the current agent What would you recommend?
a
Thanks for the follow-up, @Ciaran. I'll get back to you soon.
interruption sensitivity) so the system stops speaking when a digit is pressed [(4) ]() [(5) ]() . Avoid using "Skip Response" as this delays recognition until the end of playback [(5) ]() . Expected behavior: With equation conditions properly configured, they should be evaluated deterministically before any global node conditions are checked [(2) ]() . The first equation that evaluates true wins, and global nodes should only be evaluated if no equation matches . If tightening doesn't resolve it, check your call logs to see exactly which global node condition is matching and why.
### Answer Based on your situation, option 2 (tightening global nodes) is the recommended approach [(1) ]() [(2) ]() . Here's why and how to implement it: Why tighten global nodes instead of removing them: Global nodes serve important purposes (like handling objections or transfers) , so removing them entirely would lose that functionality [(1) ]() . Creating a separate IVR agent (option 3) adds unnecessary complexity when the issue is just transition priority [(2) ]() . How to fix your global node interference: 1. Verify equation condition placement Equation conditions are evaluated before prompt conditions and global nodes, top to bottom . Ensure your DTMF equations are: - Formatted exactly as:
{{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 (
​ To learn more, see the sources I considered: [[1] Nodes and edges](https://docs.retellai.com/build/conversation-flow/node) [[2] Transition conditions](https://docs.retellai.com/build/conversation-flow/transition-condition) [[3] Issue triggering Global Node for Call Transfer on Agent agent_b16d3cf4cc9e5ee7275202e27c](https://discord.com/channels/1186424376300679209/1454277235711414393) [[4] Conversation node](https://docs.retellai.com/build/conversation-flow/conversation-node) [[5] User dtmf input issue / IIssue with IVR Node Keypress Handling](https://discord.com/channels/1186424376300679209/1397608688734175293) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
c
@AI Evy So the IVR part is
Copy code
Thank 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
Copy code
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 :/
a
Thanks for the follow-up, @Ciaran. I'll get back to you soon.
### Answer I can see the issue now — your global node condition is actually too broad despite appearing specific. The problem is that the LLM is interpreting "calling on behalf of a patient" (your IVR option 3) as matching "sign up or register a family member, partner, spouse, or child." [(1) ]() The root cause: When you press 2, the agent hears your IVR menu which includes the phrase "if you are calling on behalf of a patient please press 3." The LLM evaluates all prompt conditions (including global nodes) together and determines that "calling on behalf of a patient" semantically matches "register a family member, partner, spouse, or child" — even though you only pressed 2. [(2) ]() How to fix this: 1. Make your equation condition MORE explicit Instead of just
{{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) ]()
Copy code
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 keypad
3. Add global node examples Add finetune examples to your global node showing when it should NOT jump: - Type: "Not jump to global node" - Example transcript showing someone pressing option 3 via DTMF - This teaches the LLM that keypad selections don't count as explicit verbal requests 4. Enable "Prevent Immediate Re-Trigger" On your global node, enable this setting and set it to 3-5 node steps to prevent it from firing during your IVR sequence. The key insight: Equation conditions are evaluated deterministically before prompt conditions, [(2) ]() but the LLM is still "seeing" the text of your IVR menu options when evaluating global nodes. The fix is to make your global node condition explicitly exclude keypad-based selections.
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] Global Node](https://docs.retellai.com/build/conversation-flow/global-node) [[2] Transition conditions](https://docs.retellai.com/build/conversation-flow/transition-condition) ​
c
@AI Evy https://docs.retellai.com/build/user-dtmf Is user_dtmf_input a variable? I dont see it on this page :S
a
Thanks for the follow-up, @Ciaran. I'll get back to you soon.
### Answer Regarding `{{user_dtmf_input}}`:
{{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:
Copy code
[User pressed digits: 1234#]
Two ways to use DTMF input: *Option 1: Extract it as a variable (recommended) * After the caller enters digits, the agent can use the Extract Dynamic Variable tool to store that input (for example, an account number or PIN) . Once saved, you can reuse it anywhere in the conversation using
{{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) ]() .
​ To learn more, see the sources I considered: [[1] Register Phone Call](https://docs.retellai.com/api-references/register-phone-call) [[2] User dtmf input issue / IIssue with IVR Node Keypress Handling](https://discord.com/channels/1186424376300679209/1397608688734175293) [[3] Extract variables from DTMF user input](https://discord.com/channels/1186424376300679209/1447333607839498312) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
Thanks for the follow-up, @Ciaran. I'll get back to you soon.
### Answer I cannot see the image you've attached, but I can verify the key configuration points for your DTMF routing setup based on the documentation: For your transition conditions: [(1) ]() Your equation conditions should be formatted exactly as:
Copy code
{{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) :
Copy code
"user_dtmf_options": {
  "digit_limit": 1,
  "termination_key": "",
  "timeout_ms": 2000
}
If your setup matches these requirements and you're still jumping to the global node, the issue is likely that your global node condition is still too broad or your equation conditions aren't positioned at the very top of the transition list. [(1) ]() [(3) ]()
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] Transition conditions](https://docs.retellai.com/build/conversation-flow/transition-condition) [[2] User dtmf input issue / IIssue with IVR Node Keypress Handling](https://discord.com/channels/1186424376300679209/1397608688734175293) [[3] Global Node](https://docs.retellai.com/build/conversation-flow/global-node) ​
c
@AI Evy You keep mentioning
Copy code
"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
Copy code
["agent_id", "agent_name", "channel", "user_modified_timestamp", "response_engine_type", "is_multi_prompt", "voice_id", "voice_name", "voice_avatar_url", "folder_id", "tags"]
a
Thanks for the follow-up, @Ciaran. I'll get back to you soon.
### Answer You're right to be confused — the
user_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:
Copy code
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:
Copy code
POST /create-agent
or
Copy code
PATCH /update-agent/{agent_id}
​ To learn more, see the sources I considered: [[1] Create Voice Agent](https://docs.retellai.com/api-references/create-agent) [[2] Create Draft Agent Version](https://docs.retellai.com/api-references/create-agent-version) ​
with the
user_dtmf_options
object in your request body [(1) ]() [(2) ]() . Via Dashboard: You can also configure these settings in your agent's Call Settings section in the Retell dashboard, under "User Keypad Input Detection" [(1) ]() .
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
c
@AI Evy Used the get-agent endpoint, "user_dtmf_options"=>{"digit_limit"=>1},
a
Thanks for the follow-up, @Ciaran. I'll get back to you soon.
### Answer Good — your
user_dtmf_options
is configured with
digit_limit: 1
, which means the agent will complete DTMF input immediately after capturing a single digit [(1) ]() [(2) ]() . What you have:
Copy code
json
"user_dtmf_options": {
  "digit_limit": 1
}
[(2) ]() [(1) ]() What's missing (optional parameters) : You can optionally add
termination_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.
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] Capture DTMF input from user](https://docs.retellai.com/build/user-dtmf) [[2] Create Draft Agent Version](https://docs.retellai.com/api-references/create-agent-version) [[3] Transition conditions](https://docs.retellai.com/build/conversation-flow/transition-condition) [[4] Global Node](https://docs.retellai.com/build/conversation-flow/global-node) ​
Thanks for the follow-up, @Ciaran. I'll get back to you soon.
c
@AI Evy The solution was that I had to change from equations for user_dmtf_input or whatever and use prompts (the caller press 2 on their keypad), and go to the new node...
a
### Answer Thank you for sharing what worked! Using prompt conditions instead of equation conditions for DTMF routing is a valid approach [(1) ]() . Here's what you discovered: Your working solution: - **Condition type**: Prompt (not Equation) - **Condition text**: "The caller pressed 2 on their keypad" (or similar natural language) - **Result**: Successfully transitions to the intended node Why this works: Prompt conditions are evaluated by the LLM against the conversation context, including the DTMF input that appears in the transcript . When the transcript shows "User pressed keypad: 2", the LLM can match that against your prompt condition . Trade-offs of this approach: While your solution works, there are some considerations: 1. **Evaluation order**: Prompt conditions are evaluated after equation conditions in the transition order . They're checked alongside global node conditions, and the LLM picks the single best match . 2. **Determinism**: Equation conditions like
{{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) ](
s.retellai.com/build/conversation-flow/global-node) - Add finetune examples showing when transitions should and shouldn't occur Your solution demonstrates that there are multiple valid approaches to DTMF routing in Retell — the key is finding what works reliably for your specific flow configuration.
​ To learn more, see the sources I considered: [[1] Transition conditions](https://docs.retellai.com/build/conversation-flow/transition-condition) [[2] Global Node](https://docs.retellai.com/build/conversation-flow/global-node) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.