sahal shamas
01/04/2026, 9:42 AMAI Evy
01/04/2026, 9:42 AMAI Evy
01/04/2026, 9:43 AMAI Evy
01/04/2026, 9:43 AMprice_mentioned = "true" immediately after the agent provides pricing) . [(1) ]()
2. Add a Logic Split or transition condition in subsequent nodes that checks the variable. For example, use an equation condition like {{price_mentioned}} == "true" to skip repeating that content.
3. Ensure the variable is treated as a dynamic variable so it persists and is accessible across different branches of your flow.
The key is to track state with variables and use Equation Conditions in Transition Logic to control which nodes execute based on what's already been said.AI Evy
01/04/2026, 9:43 AMsahal shamas
01/04/2026, 9:48 AMAI Evy
01/04/2026, 9:48 AMAI Evy
01/04/2026, 9:48 AMAI Evy
01/04/2026, 9:48 AMAI Evy
01/04/2026, 9:48 AMsahal shamas
01/04/2026, 10:01 AMAI Evy
01/04/2026, 10:01 AMAI Evy
01/04/2026, 10:01 AMUser said something about booking a meeting
- User declines the invitation
- User responds to question of their age
- Equation conditions — hardcoded mathematical/logical checks using dynamic variables:
{{user_age}} > 18
{{user_location}} == "New York"
{{name}} exists
Once you share your node details, I can suggest appropriate transition conditions for each.AI Evy
01/04/2026, 10:01 AMAI Evy
01/04/2026, 10:01 AMsahal shamas
01/04/2026, 10:02 AMAI Evy
01/04/2026, 10:02 AMAI Evy
01/04/2026, 10:02 AMUser agrees to or shows interest in the $30 per week option without marketing
Transition 2: User chooses $60/week full package
User agrees to or shows interest in the $60 per week option with everything included
Transition 3: User still declines/has more objections
User declines both options or raises another objection
Transition 4: User asks for more information
User asks questions about what's included or wants clarification about the services
Tips for writing effective transition conditions:
- Write conditions to be clear and cover all possible cases to ensure smooth transitions
- If what the user says doesn't match any condition and can't be handled by a global node, the agent will stay in the current node
- Consider using a global node for general objection handling that can be triggered from multiple points in your flow
You may also want to add a fallback condition like:
User responds to the pricing options in any way
This ensures the agent doesn't get stuck if the user gives an unexpected response.AI Evy
01/04/2026, 10:02 AMAI Evy
01/04/2026, 10:02 AMsahal shamas
01/04/2026, 10:08 AMAI Evy
01/04/2026, 10:08 AMAI Evy
01/04/2026, 10:09 AMGlobal Node checkbox in the node settings. Any node type can be a global node.
[(2) ]()
You'll need to set a condition for when the global node should be transitioned to. For example, you can set a condition like When user indicates this is not a good time to talk — any time in the call when the user says something matching that condition and the agent is performing a transition, the global node will be triggered.
Important limitation: Once a conversation transitions into a Global Node, there is currently no way to return to the original node it was called from — this is an architectural limitation.
[(3) ]()
### Connecting Nodes
Nodes are connected via edges that define transition conditions between them. Each edge specifies a destination_node_id to determine where conversations progress based on user interactions.
[(1) ]()
Feel free to share your node details in smaller chunks and I can help you configure the transitions and global node settings.AI Evy
01/04/2026, 10:09 AMAI Evy
01/04/2026, 10:09 AMsahal shamas
01/04/2026, 2:55 PMAI Evy
01/04/2026, 2:55 PMAI Evy
01/04/2026, 2:55 PMAI Evy
01/04/2026, 2:55 PMAI Evy
01/04/2026, 2:55 PMAI Evy
01/04/2026, 2:55 PMsahal shamas
01/04/2026, 3:10 PMAI Evy
01/04/2026, 3:10 PMAI Evy
01/04/2026, 3:10 PMAI Evy
01/04/2026, 3:10 PMAI Evy
01/04/2026, 3:10 PMsahal shamas
01/04/2026, 3:12 PMAI Evy
01/04/2026, 3:12 PMAI Evy
01/04/2026, 3:13 PMAI Evy
01/04/2026, 3:13 PMAI Evy
01/04/2026, 3:13 PMAI Evy
01/04/2026, 6:11 PMsahal shamas
01/04/2026, 6:11 PMAI Evy
01/04/2026, 6:12 PMAI Evy
01/04/2026, 6:12 PMUser agrees to discuss with their partner or family, or shows openness to the team effort idea
Transition 2: User declines or says they make decisions alone
User declines to involve others or states they are the sole decision maker
Transition 3: User shows interest in the value proposition
User responds positively to the revenue/table turnover benefits mentioned
Transition 4: User raises another objection or concern
User raises a new objection or expresses hesitation about the proposal
Transition 5: User asks for more information
User asks questions about how the system works or wants clarification
Tip: To ensure smooth transitions, cover all possible cases in your conditions. If what the user says doesn't match any condition and can't be handled by a global node, the agent will stay in the current node.AI Evy
01/04/2026, 6:12 PMsahal shamas
01/04/2026, 6:50 PMAI Evy
01/04/2026, 6:50 PMAI Evy
01/04/2026, 6:50 PMWhen user indicates they are interested. [(1) ]()
However, more specific conditions are recommended to ensure reliable transitions. The documentation suggests writing conditions that are clear and cover specific cases.
Examples of clearer prompt conditions:
- User said something about booking a meeting
- User declines the invitation
- User responds to question of their age
Why more specific is better:
- A vague condition like "when the user is interested" may be harder for the LLM to evaluate consistently
- The agent may struggle to distinguish between mild curiosity vs. genuine buying interest
- If no transition condition is met, the agent will stay in the current node
Recommendation: Try something more specific like:
- User agrees to proceed or shows clear buying interest
- User asks about next steps or how to sign up
- User responds positively to the proposal
If you've observed incorrect transitions, you can prompt engineer the conditions or add transition finetune examples to improve accuracy.AI Evy
01/04/2026, 6:51 PMAI Evy
01/04/2026, 6:51 PMsahal shamas
01/08/2026, 9:36 AMAI Evy
01/08/2026, 9:36 AMAI Evy
01/08/2026, 9:36 AMoutbound_agent_id parameter. [(1) ]()
Option 1: When creating a new phone number
javascript
import Retell from 'retell-sdk';
const client = new Retell({
apiKey: 'YOUR_RETELL_API_KEY',
}) ;
const phoneNumberResponse = await client.phoneNumber.create({
area_code: 415,
outbound_agent_id: 'oBeDLoLOeuAbiuaMFXRtDOLriTJ5tSxD',
}) ;
[(2) ]()
Option 2: Update an existing phone number
javascript
import Retell from 'retell-sdk';
const client = new Retell({
apiKey: 'YOUR_RETELL_API_KEY',
}) ;
const phoneNumberResponse = await client.phoneNumber.update('+14157774444', {
outbound_agent_id: 'oBeDLoLOeuAbiuaMFXRtDOLriTJ5tSxD',
}) ;
[(3) ]()
Replace oBeDLoLOeuAbiuaMFXRtDOLriTJ5tSxD with your new agent's ID.
Key parameters: [(1) ]()
- `outbound_agent_id`: The agent that will be used when making calls from this number
- `inbound_agent_id`: The agent for incoming calls (set separately if needed)
You can use different agents for inbound vs outbound, or configure outbound only by leaving inbound_agent_id unset.AI Evy
01/08/2026, 9:36 AMAI Evy
01/08/2026, 9:36 AMAI Evy
01/08/2026, 10:09 AMAI Evy
01/08/2026, 10:09 AMAI Evy
01/08/2026, 10:09 AMAI Evy
01/08/2026, 10:09 AMsahal shamas
01/08/2026, 10:09 AMsahal shamas
01/08/2026, 10:10 AMAI Evy
01/08/2026, 10:10 AMAI Evy
01/08/2026, 10:10 AMAI Evy
01/08/2026, 10:10 AMAI Evy
01/08/2026, 10:10 AMsahal shamas
01/08/2026, 10:12 AMAI Evy
01/08/2026, 10:12 AMAI Evy
01/08/2026, 10:12 AMinvalid_destination | Destination phone number is invalid or malformed |
| dial_no_answer | Number dialed did not answer |
| dial_busy | Number dialed is busy |
For your 639 contacts:
- 11 Invalid Destination — These phone numbers are likely malformed, unreachable, or not in valid E.164 format
- 18 Dial No Answer — Recipients didn't answer (this is normal behavior)
- 1 Dial Busy — The line was busy
Troubleshooting steps:
1. Check your contact list format — Ensure all phone numbers are in E.164 format (e.g., +14157774444)
[(2) ]()
2. Review invalid numbers — The 11 invalid destination errors suggest those numbers need to be corrected or removed from your list
3. Check call history logs — Go to your Retell Dashboard → Call History → click on failed calls to view the detailed log and SIP error codes
[(1) ]()
4. Dial no answer is expected — 18 out of 639 not answering is normal for outbound campaigns
The majority of your calls (609 out of 639) appear to have connected or had expected outcomes. The 11 invalid destinations are the main issue to address by validating those phone numbers in your contact list.AI Evy
01/08/2026, 10:12 AMAI Evy
01/08/2026, 10:12 AMsahal shamas
01/08/2026, 10:14 AMAI Evy
01/08/2026, 10:14 AMAI Evy
01/08/2026, 10:15 AMconcurrency_limit_reached error [(1) ]()
2. No valid payment — Calls fail with no_valid_payment if there's a billing issue
3. Batch dialer still processing — Large batches may take time to complete all calls
4. Numbers marked as spam — If your outbound number experiences high volume without warmup or has low pickup rates, it may get blocked by carriers [(2) ]()
To diagnose:
1. Check your Call History in the Retell Dashboard for the remaining calls' status and disconnection reasons
2. Look for any concurrency_limit_reached or no_valid_payment errors [(1) ]()
3. Verify your batch dialer status to see if calls are queued or completed
Can you share:
- What does the batch dialer status show for the remaining numbers?
- Are there any other error types showing in your call history?
- What's your current concurrency limit?
This will help identify why the rest of the numbers aren't being dialed.AI Evy
01/08/2026, 10:15 AMAI Evy
01/08/2026, 10:15 AMAI Evy
01/08/2026, 11:11 AMsahal shamas
01/08/2026, 11:11 AMAI Evy
01/08/2026, 11:11 AMAI Evy
01/08/2026, 11:11 AMknowledge_base_ids parameter:
javascript
import Retell from 'retell-sdk';
const client = new Retell({
apiKey: 'YOUR_RETELL_API_KEY',
}) ;
const conversationFlowResponse = await client.conversationFlow.create({
model_choice: { model: 'gpt-4.1', type: 'cascading' },
nodes: [
{
id: 'start',
instruction: { text: 'Greet the customer and ask how you can help them.', type: 'prompt' },
type: 'conversation',
},
],
start_speaker: 'agent',
knowledge_base_ids: ['kb_001', 'kb_002'],
}) ;
[(2) ]()
Node-Level Knowledge Base:
For Conversation Flow agents, you can also configure knowledge base at the Conversation Node level: [(3) ]()
1. Open the agent editor
2. Click the Conversation Node you want to configure
3. Select and add the knowledge base items for that specific node
Node-level knowledge base will be combined with agent global knowledge base to provide more accurate context for a specific topic.
KB Configuration Options:
You can also set kb_config to control retrieval: [(2) ]()
- `top_k`: Max number of chunks to retrieve (1-10, default: 3)
- `filter_score`: Similarity threshold (default: 0.6)AI Evy
01/08/2026, 11:11 AMsahal shamas
01/08/2026, 11:20 AMAI Evy
01/08/2026, 11:20 AMAI Evy
01/08/2026, 11:20 AM## Related Knowledge Base Contexts
- This works for both global (agent-level) and node-level knowledge bases
To control behavior for questions outside your nodes:
If you want the agent to only answer from the knowledge base and not make up answers, you can add this to your prompt:
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."AI Evy
01/08/2026, 11:20 AMAI Evy
01/08/2026, 11:20 AMsahal shamas
01/23/2026, 8:30 PMsahal shamas
01/23/2026, 8:31 PMAI Evy
01/23/2026, 8:31 PMAI Evy
01/23/2026, 8:31 PMuser_declined, it means the recipients explicitly declined/rejected the incoming call. [(1) ]() [(2) ]()
What user_declined means:
- The callee manually declined the call (e.g., pressed the decline button on their phone) [(1) ]()
- SIP status code 603 (GLOBAL_DECLINE) indicates the user rejected the call [(3) ]()
Possible causes:
1. Caller ID appears suspicious — Recipients may be declining because they don't recognize the number or it appears as spam [(1) ]()
2. Number marked as spam — If your outbound number has high call volume without warmup or low pickup rates, carriers may flag it, causing recipients to see spam warnings and decline
3. Calling the same numbers repeatedly — One Discord user experiencing similar issues was asked if they were dialing the same number for all calls [(3) ]()
Troubleshooting steps:
1. Check call history logs — Review the detailed log for SIP error codes and messages [(1) ]()
2. Verify your caller ID — Ensure your outbound number has a legitimate caller ID display
3. Consider number verification — Register your number with Retell's spam remediation feature (verified phone number) to prevent spam flagging
4. Warm up new numbers — Slowly add outbound traffic to new numbers before high-volume campaigns
5. Increase pickup rate — Review best practices at [Increase Pickup Rate](httpAI Evy
01/23/2026, 8:31 PMAI Evy
01/23/2026, 8:31 PMAI Evy
01/23/2026, 8:31 PMAI Evy
01/23/2026, 8:33 PMAI Evy
01/23/2026, 8:33 PMuser_declined, is there something else you'd like help with?
Feel free to ask about:
- Batch call troubleshooting
- Knowledge base setup for Conversation Flow agents
- Node transitions and configuration
- Phone number setup for outbound calls
- Any other Retell AI questionsAI Evy
01/23/2026, 8:33 PMAI Evy
01/23/2026, 8:33 PMsahal shamas
01/23/2026, 8:34 PMsahal shamas
01/23/2026, 8:35 PMsahal shamas
01/23/2026, 8:36 PMAI Evy
01/23/2026, 8:36 PMAI Evy
01/23/2026, 8:36 PMphone number (with a space) , and for the e164 validation override, it should be ignore e164 validation. [(1) ]()
Your current headers:
- phone number ✓ (appears correct)
- ignore e164 ❌ (should be ignore e164 validation)
Required CSV format per documentation:
- Header row must include a phone number column
- If you want to ignore e164 validation, add a column named ignore e164 validation with value true
- The ignore e164 validation option only applies when using custom telephony, not Retell Telephony
For dynamic variables:
- Add additional columns in the CSV with custom data for each recipient
- A column header like restaurant_name can be referenced as {{restaurant_name}} in your agent prompt
Suggested fix:
Change your column header from ignore e164 to ignore e164 validation and ensure the value is true (not false, since false is the default behavior anyway) .
Also verify you're using custom telephony if you need to bypass e164 validation—this feature does not apply when using Retell Telephony.AI Evy
01/23/2026, 8:36 PMAI Evy
01/23/2026, 8:36 PMAI Evy
01/23/2026, 8:37 PMsahal shamas
01/23/2026, 8:37 PMAI Evy
01/23/2026, 8:37 PMuser_declined disconnection reason is not related to your CSV file format. It specifically means the recipients explicitly declined/rejected the incoming call.
[(1) ]()
user_declined represents cases where the user explicitly declined the call—for example, pressing the decline button on their phone.
Your CSV format issue is separate. The column header problem (ignore e164 vs ignore e164 validation) could cause validation errors or invalid_destination errors, but it would not cause user_declined results.
Why you're seeing `user_declined`:
The recipients are actively rejecting your calls. This typically happens when:
, [(2) ]()
- Your caller ID appears suspicious or unfamiliar to recipients
- Your number has been flagged as "Spam Likely" by carriers
- High call frequency without number warmup triggers spam filters
- Low engagement rates signal spam behavior to carriers
To address the user_declined issue:
1. Register your number as verified to prevent spam flagging
[(3) ]()
2. Warm up new numbers before high-volume campaigns—slowly add outbound traffic
[(1) ]()
3. Consider branded caller ID so recipients recognize your business name
[(4) ]()
4. Limit call frequency and spread calls over time
[(2) ]()
The CSV column header fix is still recommended for proper validation, but it won't resolve the user_declined issue—that requires addressing your caller ID reputation.AI Evy
01/23/2026, 8:37 PMAI Evy
01/23/2026, 8:37 PMAI Evy
01/24/2026, 8:16 PMsahal shamas
01/24/2026, 8:16 PMAI Evy
01/24/2026, 8:16 PMuser_declined issues and improve your batch call success rate:
## 1. Fix Your Number's Spam Reputation
When a number experiences high outbound call volume spike without any warmup, and/or has a low pickup rate, it might be marked as spam by carriers.
[(1) ]()
To remedy this:
- Purchase a new number and warm it up before pouring all traffic to it (slowly add outbound traffic to it)
- Register the number with spam remediation — read more at [verified phone number]()
- Increase the pickup rate — read more at [Increase Pickup Rate]()
## 2. Consider Branded Caller ID
Platforms that support branded caller IDs and verified phone numbers help ensure calls are delivered, trusted, and picked up.
[(2) ]()
This displays your business name instead of just a phone number, increasing trust and reducing declines.
## 3. Fix Your CSV Format
For your batch calls, ensure your CSV follows the correct format:
[(3) ]()
- Header row must include a phone number column
- For dynamic variables, add additional columns with custom data for each recipient (e.g., a column header first_name can be referenced as {{first_name}})
- If bypassing e164 validation, name the column ignore e164 validation (not ignore e164) with value true — this only applies when using custom telephony
## 4. Warm Up Your Numbers Gradually
Don't pour all traffic to a new number immediately. Slowly increase outbound volume over time to build carrier trust.
[(1) ]()
## 5. Verify YoAI Evy
01/24/2026, 8:16 PMuser_declined issue is primarily a caller ID reputation problem. Focus on number verification, branded caller ID, and gradual warmup to improve pickup rates.AI Evy
01/24/2026, 8:16 PMAI Evy
01/24/2026, 8:16 PMsahal shamas
01/24/2026, 8:21 PMAI Evy
01/24/2026, 8:21 PMAI Evy
01/24/2026, 8:21 PMAI Evy
01/24/2026, 8:21 PMuser_declined results.AI Evy
01/24/2026, 8:21 PM