First, audit the tree.
Almost every IVR has dead branches. Press-7-for-something-that-no-longer-exists. Press-2-then-press-2-then-press-1. Before migrating, we walk every path with a stopwatch and a notebook. The output is a tree diagram; the tree usually shrinks by 30–40% before we touch anything else.
Tree to intent map.
Every remaining branch becomes an intent in the agent playbook. The customer no longer presses a number; they say what they want. We map intents 1:1 onto your remaining branches so the existing back-end routing keeps working unchanged on day one.
# menu tree → intent map (excerpt) menu_branch: "1.billing": "intent:billing.balance" "1.billing.dispute": "intent:billing.dispute" "2.support.technical": "intent:support.tech" "3.sales": "intent:sales.new" "3.sales.upgrade": "intent:sales.upgrade"
Parallel for two weeks.
Both systems live, sharing traffic 50/50 by caller cohort. Two weeks. Same routing, same back-ends. We watch CSAT, average handle time, and abandonment rate per system. The agent has to win on all three before we cut over.
Cutover gate
- Agent CSAT ≥ IVR baseline + 2pts
- Agent AHT ≤ IVR AHT
- Abandonment ≤ IVR baseline
- Wrong-routing rate ≤ 3%
- Two-week stability with no major incident
Cutover and freeze.
On cutover day we route 100% of traffic to the agent. The IVR stays warm in standby for 30 days, with a single-keystroke rollback. We do not configure anything else for 30 days — code freeze on the playbook, on the routing rules, on the integrations. Stability comes first.
Rollback, in one click.
If anything goes sideways during the 30-day freeze, we re-route to the IVR in under five seconds. The standby tree is untouched. The agent goes back to staging, with full call recordings in hand for the post-mortem. Rollback has been triggered exactly twice in the last two years; both rolled forward inside 48 hours after a fix.