Data & Testing

IVR Navigation

Teach an agent to get through someone else's phone tree. Katexs agents can press keys, speak menu options, wait out hold music, and detect the moment a human picks up.


When you need it

Outbound calls to insurers, carriers, suppliers, and government lines almost always start with an automated menu. Without navigation the agent talks to a robot that is not listening. With it, the agent completes the menu and starts the real conversation.

  • Insurance verification โ€” Navigate to provider services, enter an NPI, reach a representative.
  • Order and shipment status โ€” Enter an order number in a supplier's automated system.
  • Utility and account servicing โ€” Authenticate with an account number before a human joins.

Two navigation modes

ModeHow it worksBest for
ScriptedYou define the key sequence and waits up front.Menus that never change; fastest and most reliable.
AdaptiveThe agent listens to each menu and chooses an option against a stated goal.Menus that change or vary by time of day.
HybridScripted first steps, adaptive after the last known-stable node.Long trees with a stable front and a variable tail.

Scripted navigation

yaml
ivr:
  mode: scripted
  steps:
    - wait_for: silence
      timeout_seconds: 12
    - press: "2"                 # provider services
    - wait_for: prompt
      match: "national provider identifier"
      timeout_seconds: 20
    - press: "1093871425#"
    - wait_for: prompt
      match: "member identification"
    - press: "{{member_id}}#"
    - wait_for: human
      timeout_seconds: 900
  on_timeout: end_call
  on_wrong_branch: restart_from_step: 1
  • press โ€” Sends DTMF tones. Use # to submit a variable-length entry and , for a half-second pause between digits.
  • wait_for: prompt โ€” Waits until the transcript matches your text, so timing shifts do not break the script.
  • wait_for: human โ€” Ends navigation the moment a live person is detected.
  • on_wrong_branch โ€” Fires when a matched prompt is never heard and an unexpected one is, letting you restart cleanly.
Prefer wait_for over fixed sleeps. Hold times vary by hour; a script built on timers will drift into pressing keys during a greeting.

Adaptive navigation

Give the agent the goal and the identifiers it may use, and let it interpret each menu. It transcribes options, picks the closest match, and enters data only from the fields you allow.

yaml
ivr:
  mode: adaptive
  goal: "Reach a live representative in provider services to verify benefits."
  allowed_inputs:
    npi: "1093871425"
    member_id: "{{member_id}}"
    date_of_birth: "{{dob}}"
  never_say: ["credit card", "social security number"]
  max_menu_depth: 6
  reprompt_on_unclear: true

Speech-driven menus

Many systems ask you to say the option instead of pressing it. Katexs speaks the option using a slower, over-articulated delivery tuned for machine recognition, and repeats once if the far end asks again. No configuration is needed beyond enabling speech input in the IVR block.

Hold and human detection

SignalInterpretationAgent behaviour
Music or repeating messageOn holdStays silent, keeps the line open, logs hold time
Live greeting detectedHuman answeredDelivers the opening line immediately
Voicemail beepMachineLeaves the configured message or hangs up
Prolonged silenceDropped or dead airEnds with end reason ivr_no_response

Debugging a tree

  1. 1

    Record a mapping call

    Place one call with mode set to observe. The agent presses nothing and captures the full menu transcript.

  2. 2

    Read the IVR timeline

    Call Logs shows every tone sent, every prompt matched, and how long each wait took.

  3. 3

    Script from the transcript

    Copy the exact prompt wording into wait_for matches โ€” partial phrases are more robust than full sentences.

  4. 4

    Re-run in Testing Lab

    Replay the recorded tree as a fixture so future changes are caught without dialling out.

Never place account numbers, member IDs, or dates of birth directly in a script. Pass them as variables and mark them sensitive so they are masked in transcripts and exports.