How to build a multi-level IVR with nested menus
Chain phone menus into a layered IVR so callers can drill from a main menu into focused sub-menus.
A single menu with ten options is hard to follow. A better design is a layered tree: a short main menu that hands off to focused sub-menus. In VICIdial, each layer is its own Call menu, and you chain them together to build a multi-level IVR (interactive voice response).
The building block: the CALLMENU route
Nesting works because one menu option can route to another menu. When you set an option's route to CALLMENU, the route value is the Menu ID of the menu you want next. So pressing 2 on your main menu can drop the caller into a billing sub-menu, which then offers its own choices.
Each menu has its own greeting, its own timeout, and its own options. The caller presses a key, the system reads the DTMF tone, and either acts on it or chains deeper. Build each layer separately, then link them with CALLMENU routes once they all exist.
A worked example
flowchart TD
A[Main menu] -->|1 Sales| B[Sales ingroup]
A -->|2 Support| C[Support sub menu]
A -->|3 Billing| D[Billing sub menu]
C -->|1 New ticket| E[Support ingroup]
C -->|2 Status| F[Status sub menu]
D -->|1 Pay bill| G[Billing ingroup]In this tree the main menu only offers three broad choices. Sales goes straight to a queue, while support and billing each open a sub-menu with their own narrower options. Most paths eventually end at an Ingroup where a live Agent picks up, which is the goal of any inbound tree.
Keep each layer short
- Aim for three or four options per menu so callers can hold them in their head.
- Give every menu a TIMEOUT and INVALID route so a silent or fumbling caller is never stranded.
- Avoid going more than two or three layers deep; people get lost in long trees.
- Offer a way back, such as a key that returns to the main menu via CALLMENU.
Test the whole tree, not just the happy path
Once your menus are linked, call in and walk every branch yourself. Press the keys a real caller would, but also press the wrong ones, and try going silent to confirm each menu's timeout and invalid handling do something sensible at every level. A nested tree multiplies the number of ways a caller can get stuck, so a dead-end three layers down is easy to miss if you only test the obvious route.
Pay special attention to the timeout and invalid options on every sub-menu, not just the main one. It is common to set them carefully on the top level and then forget them on the deeper menus, which leaves a caller who hesitates two layers in with nowhere to go. A copied menu inherits these settings, so duplicating a well-built menu is a fast way to keep the deeper layers consistent.
Where the calls end up
Every branch of your tree should land somewhere sensible, usually a queue. For the full inbound picture, read our inbound call handling guide. To build the queues at the leaves of your tree, follow creating an inbound group to take calls.
If you would rather design the tree than install software, our managed VICIdial hosting spins up a ready box in under a minute.
Frequently asked
- Set a menu option's route to CALLMENU and put the target Menu ID in the route value.
- Two or three layers at most. Long trees frustrate callers and increase the chance they hang up.
› How do I link one menu to another?
› How deep should an IVR go?
About VICIfast LLC
VICIfast LLC operates a managed VICIdial hosting + BYOI service for outbound and inbound call centers. We run the dialers, the carriers, the recordings pipeline, and the compliance plumbing so operators don’t have to.
Citing this article
VICIfast Engineering. “How to build a multi-level IVR with nested menus”. VICIfast LLC, June 21, 2026. Retrieved from https://vicifast.com/blog/build-vicidial-multi-level-ivr
Have questions?
Related posts
You might be interested in
VICIfast newsletter
Liked this? Get the next one in your inbox.
We ship the kind of stuff you just read — concrete, numbers-first, no drip. One email when a new post goes live. Unsubscribe in one click.
Comments
No comments yet — be the first.