По факту, IVR - некий блок с параметрами. Есть описанные состояния.
Типа «Проговорить фразу А», на нажатие Х - выполнить какое-то действие ,например, переход на экстеншн. Или перейти на другой уровень IVR со своим набором действий.
И получается, что состояние автомата - это его действия, как проговаривание фразы, а выходы - просто действия.
Соответственно, составляется карта состояние - действие. И передается в сам блок.
Пример состояния X.
Проговорить фразу А
При нажатии на 1 - вызвать состояние Y
При нажатии на 2 - повесить трубку.
При нажатии на 0 - вызывать состояние Z
И получается, что имеется просто массив состояний с кучей перекрестных ссылок