# Menu

> The Menu node plays a prompt and routes the caller by the key they press, with a timeout branch.

Source: https://edesy.in/docs/ivr/nodes/menu

The Menu node plays a prompt such as "Press 1 for Sales, 2 for Support" and routes the caller by the key they press. Each keypad option (0-9, `*` or `#`) gets a label and its own exit, plus a timeout exit for callers who press nothing. A wrong key replays the menu. The chosen label is available as `{{menu_choice}}`.

## Settings

| Field | Required | Notes |
|---|---|---|
| Prompt | No | Spoken prompt. Supports `{{var.name}}` tokens. TTS preview available |
| Timeout (seconds) | No | 1 to 30. Default 5 |
| Max digits | No | 1 to 10. Default 1 |
| Keypad options | Yes | Key (`0`-`9`, `*`, `#`) and a label, e.g. `1` = Sales |

## Exits

| Exit | When |
|---|---|
| One per key | The caller pressed that key |
| timeout | The caller pressed nothing before the timeout |

## Behaviour

- **Wrong key:** "Sorry, that's not a valid option." and the menu repeats.
- **No input, with a timeout exit:** the call follows the timeout exit.
- **No input, without a timeout exit:** the menu repeats up to two more times, then the caller hears "We didn't receive any input. Goodbye." and the call ends.
- The keys pressed are saved on the call as the DTMF path, shown in [Call Logs](https://edesy.in/docs/ivr/logs/call-logs).

## Tokens set by a menu

| Token | Value |
|---|---|
| `{{digits}}` | The key just pressed, e.g. `2` |
| `{{menu_choice}}` | The option's label, e.g. `Support` |

## Flow checks

- "Menu has no keypad options." (error)
- "Menu option ... isn't connected to a next step." (warning)
