Menus are the bread and butter of Interactive Voice Response (IVR) systems. All too often, unfortunately, they are also the bane of callers’ existence when they urge you, for the umpteenth time, to “listen closely, as choices have changed“, and then list a litany of “press or say this to get there” entries.
Does it really need to be this way? Do we really need to play off ease of development, hard-coded trees of static branching, against ease of use – against the caller’s desire to quickly achieve what they are calling in for? Resoundingly: No!
In this article I’ll look at a variety of capabilities offered by Voxeo’s VoiceObjects platform to create personalized menus that enhance application efficiency as well as caller satisfaction – and to do it in a way that is easy to develop and easy to maintain. It is a lengthy post because of all the features at your disposal – but the read is worth the while, if I may say so, and your callers will thank you later for better applications.
Occurrence Levels
No menu is an island, entire of itself. Rather, they are typically the main branching point that routes you to where you want to go, which implies that callers often return to a given menu once they have finished a certain task. There’s a reason it’s often called the “main menu”.
So to begin with, it’s a sign of common courtesy to recognize the caller’s “been there, done that” and not to play the same menu prompt over and over again. Instead, consider an approach like this:

The first time the caller gets to the main menu (“Occurrence >= 1″), play a full description of where you are, what the available options are, and how to activate them. Whether this is done in the Menu object’s Welcome Message as shown above, or by using the individual Menu Item Outputs depends on the specific use case; we’ll see more examples below.

Thereafter, whenever the caller returns to the main menu (“Occurrence >= 2″), only indicate that you’re back. Details can be provided either only on demand (e.g. following a No Input or No Match event), or, as shown here, after a significant pause that allows callers to barge in if they know what to do and automatically assists them if they simply wait in indecision.
(Note that I’m using textual prompts here so you can read them in the screenshots; in a real application you would of course use recorded audios!)
Occurrence-dependent prompts can, of course, be combined with random prompting. For each separate occurrence level, you simply provide multiple prompts expressing the same message in different wording. VoiceObjects Server then automatically randomizes them, exhausting all available variations before repeating itself. For all the details, refer to the section on the Output object in the VoiceObjects Object Reference (PDF).
Layers
Occurrence levels as discussed in the previous section work the same for all callers. But often it is desirable to tune menus to the specific needs of groups of callers, or even individual callers. Regarding the prompting we dealt with above, you may want to play longer prompts to callers who are new to the application, while playing shorter prompts to experienced callers who have used the system many times before.
Regarding the set of menu items, premium customers may have access to options that are not available to regular customers. Personal preferences set in the application or perhaps on a corresponding web portal may influence which choices are available .
As an example, let’s assume that we have categorized our customers as indicated by the Layer object shown to the right: 
Standard customers, Premium customers, and Diamond customers.
Diamond customers are the most profitable ones, and we want to give them the option of speaking to a representative whenever they like, while Standard and Premium customers are encouraged to use the most cost-efficient self-service solution.
Using this Layer object definition, we can then create a Menu object that provides menu choices for Billing and Tech Support to all callers, while the choice of speaking to a representative is only available to Diamond customers:

Likewise, assume that we want to introduce a loyalty program that is available to all but Standard customers. A menu choice to manage your points could be added as shown here:

In these examples, we’re using statically assigned DTMF keys to access the menu choices – but it does not need to be this way.
Auto-Numbering
Despite the bad press they sometimes get, DTMF-based menus are still used very frequently – and make a lot of sense for many types of applications. The reliability of rapidly selecting among a few clear options by pressing a button often outweighs the theoretical elegance of an open-ended “How may I help you?” approach that runs into speech recognition glitches and leaves callers baffled, or stranded.
When menu options are dynamic, the question comes up how to assign DTMF digits to them. Static assignments like the ones we used above are, of course, possible, but can lead to confusion when re-ordering menu choices since callers usually expect DTMF digits to come in order.
VoiceObjects offers the ability to auto-number menu options, in two flavors: continuous and discontinuous (the default is not to use auto-numbering).

Continuous auto-numbering takes all available menu choices (i.e. without those filtered out e.g. by Layer conditions as shown above) and numbers them consecutively from 1 to N. Discontinuous auto-numbering considers all possible menu choices, numbers them consecutively, and only then removes those filtered out by Layer conditions – thus there can be gaps in the resulting numbering.
Let’s look at a concrete example. The menu shown in the screenshots above has four choices: Billing, TechSupport, Representative, and RewardPoints – but not all of them are available to all callers.
Standard customers get only the first two choices, and these will be numbered 1 and 2 regardless of whether it is continuous od discontinuous.
Diamond customers, on the other end, get all four options, and these will always be numbered 1 – 2 – 3 – 4.
The interesting case are Premium customers, who have access to Billing, TechSupport, and RewardPoints. Continuous auto-numbering in this case will produce the choices 1-Billing, 2-TechSupport, 3-RewardPoints whereas discontinuous auto-numbering produces 1-Billing, 2-TechSupport, 4-RewardPoints because it retains 3 for the Representative choice, which is then filtered out because it only applied to Diamond customers.
Since the DTMF digit associated with a menu choice can thus change (RewardPoints can be 3 or 4 depending on the situation, as just described), how can we provide an appropriate prompt for the caller? In addition to selecting the auto-numbering type, you can also reference a Variable object that makes the automatically determined digit available to you.

This Variable object can then be used within the prompts for the menu choices, like so:

With this definition, and using continuous auto-numbering as set above, Diamond customers hear “To check your reward points, press 4″ while Premium customers hear “To check your reward points, press 3″. Standard customers do not hear this at all, because the entire menu choice is filtered out for them.
Dynamic Sorting
The order in which menu choices are presented clearly counts.
Somewhat counter-intuitively, perhaps, this is the case more so for applications called infrequently than for those used very regularly. Callers who use the same application over and over again (say phone banking or package tracking) typically memorize the usual options and trigger them right away without even listening to the choices. It is when you call an application only every few months or so (say to re-charge your prepaid mobile phone, or to check on a billing irregularity) that you need to explicitly watch out for the choice you need.
In this case, clearly, the sooner your desired choice comes up, the better. Different callers call for different reasons, though, so being able to present them with a custom-ordered list of choices is desirable. VoiceObjects lets you do this by way of dynamic sorting.
Dynamic sorting of menu choices works on the basis of the label defined for each choice. In the sample menu we’ve used above, these would be Billing, Representative, RewardPoints, and TechSupport:

To dynamically re-order the choices at call time, we only need to define the Sorting entry in the Options section – in the example above we use a Variable object “Dynamic ordering” since typically the ordering would come e.g. from preferences retrieved from the backend.
The content of the Variable object simply needs to be the comma-separated list of labels in the desired order. So “TechSupport,Billing,Representative,RewardPoints” would indicate that the first option the caller hears is Tech Support, the second is Billing, and so on.
As a free bonus, dynamic sorting also allows you to filter out individual menu choices. A label list of “Representative,RewardPoints,Billing” indicates not just that the caller hears the choice for a Representative first, Reward Points second, and Billing third, but also that the option of Tech Support is not played at all. This makes it possible to define a Menu object with a fairly long, comprehensive list of possible menu choices and then very easily, by providing the list of labels, select an appropriate sub-set of choices for the current caller and present them in the appropriate order.
Summary
We’ve learned a lot in this post – prompting based on how often we’ve visited a menu, dynamically enabling or disabling menu choices through the use of Layer objects, how to let VoiceObjects number dynamic menu choices automatically, and finally how to dynamically select and re-order menu choices from a list of available entries.
While I presented these different methods separately for the sake of clarity, they are of course typically used in combination. Looking back at the question I asked at the beginning of the article, they provide a very powerful set of tools to developers that enables them to simultaneously make their own life easier and to create a better experience for callers – both sides win, the way it should be!
You can find all the details on configuring the Menu object in the VoiceObjects Object Reference (PDF) on our Developer Portal. For general tips on how to build good applications for individual or multiple phone channels, also take a look at the Design Guide (PDF).
For questions and comments, reach out to me on Twitter at @voxeostefan!