A vertical-agnostic inbound support pattern: customer dials your support number, the agent identifies them via inbound webhook, looks up their account context, answers tier-1 questions from a knowledge base, opens a ticket if needed, and warm-transfers to a human for anything outside its scope.
For known FAQs: answers from the knowledge base (RAG tool)
For account-specific issues: opens a ticket via tool and confirms the ticket ID
For complex / emotional / out-of-scope issues: warm-transfers to a human
Captures the topic, resolution, and CSAT signal
Suggested configuration
Code
# Knowledge base must exist firstkb = client.knowledge_base.from_url( url="https://your-help-center.example.com", name="Help Center",)agent = client.agents.create( name="Tier-1 Support", brain={ "provider": "phantom", "model": "phantom", "instructions": SUPPORT_PROMPT, "temperature": 0.4, }, voice={ "provider": "cartesia", "model": "sonic-3", "voice_id": "8d8ce8c9-44a4-46c4-b10f-9a927b99a853", }, transcriber={"provider": "deepgram", "model": "nova-3", "language": "en-US"}, interruption={"enabled": True, "min_duration": 0.4}, timeout={"enabled": True, "trigger_seconds": 12}, call_duration={"enabled": True, "max_seconds": 900}, # 15-min cap inbound_webhook_url="https://your-app.example.com/neuratel/inbound-context", analytics={ "recording": {"enabled": True}, "summary": {"enabled": True}, "success_evaluation": { "enabled": True, "rubric_type": "pass_fail", "criteria": "Did the agent either resolve the issue from KB, open a ticket with confirmation, or warm-transfer to a human?", }, "data_extraction": { "enabled": True, "fields": [ {"name": "topic", "type": "string"}, {"name": "resolution_path", "type": "enum", "values": ["resolved_kb", "ticket_opened", "transferred", "abandoned"]}, {"name": "ticket_id", "type": "string"}, {"name": "csat_score", "type": "number"}, ], }, }, tools={ "rag": { "enabled": True, "knowledge_base_ids": [kb["id"]], "top_k": 5, "score_threshold": 0.7, }, "hangup": {"enabled": True, "keywords": ["bye", "goodbye", "thanks bye"]}, }, transfer={ "enabled": True, "mode": "warm", "destinations": [{ "name": "Tier-2 Support", "number": "+1...", "description": "Escalate billing disputes, account changes, technical issues beyond FAQ", "keywords": ["speak to human", "supervisor", "billing dispute", "account change"], }], "warm_intro_template": "I have {{first_name}} on the line — they're asking about {{topic}}. Account tier: {{tier}}. They've been on with me for {{call_duration_secs}} seconds.", },)# Wire to inbound numberclient.phone_numbers.assign(phone_number_id="num_...", agent_id=agent["id"])
Inbound webhook
Configure your endpoint to look up the caller and return context — see Inbound variable injection for the full webhook contract. Minimum payload to return:
You are a friendly support representative for {{company_name}}.Caller context (from your CRM):- Name: {{first_name}}- Tier: {{tier}}- Open tickets: {{open_tickets_count}}- Repeat caller: {{is_repeat_caller}}GREETING:- If repeat caller with open tickets: "Hi {{first_name}}, thanks for calling {{company_name}}. I see you have {{open_tickets_count}} open ticket — is this related, or something new?"- Otherwise: "Hi {{first_name}}, thanks for calling {{company_name}}. How can I help you today?"DECISION TREE:1. Listen to their question. Use the RAG tool to look up the topic.2. If RAG returns a confident answer (relevant, on-topic): - Summarize in your own words. Don't read the help center verbatim. - Confirm: "Did that answer your question?"3. If they need an account change or backend action (refund, plan change, data export request): - Don't promise the action yourself. Open a ticket with the open_ticket tool. - Confirm the ticket ID with them. Tell them when to expect a response.4. If they're frustrated, the issue is complex, or they ask for a human: - Warm-transfer to Tier-2: "Let me get a specialist on for you — I'll fill them in before connecting you."5. Before ending: "On a scale of 1 to 5, how would you rate this call?"GUIDELINES:- Don't make up facts. If RAG doesn't return an answer, say so: "I don't have a confident answer on that — let me get a specialist."- Never give pricing without RAG confirmation.- Acknowledge frustration before redirecting: "I'm sorry that happened — let me see what I can do."- Be brief. One short sentence at a time.- If the caller is in distress (medical emergency, threat), say "Please hang up and call your local emergency services" and end the call.
Integration tips
Knowledge base freshness: re-sync your help-center KB on a schedule (from_url is incremental). Outdated KB content is the #1 cause of "hallucinated" answers.
Ticketing integration: build a custom MCP tool wrapping your ticketing system. The agent calls open_ticket(category, summary, severity) and returns the ticket ID via variable_updates.
Sentiment routing: the analytics rubric captures CSAT, but for real-time escalation tie a low-sentiment threshold to the transfer tool's keywords.
Out-of-hours behavior: configure a separate agent for nights/weekends that skips the transfer step and offers callback scheduling instead.