How to Set Up an IVR Menu
A working "press 1 for sales, 2 for support" menu, built one step at a time.
By the end of this walkthrough you'll have a phone number that answers, plays "press 1 for sales, 2 for support", and sends each choice to an agent. It takes four screens: Recordings, IVR, Campaigns Management and the DID forwarding page. Allow about twenty minutes the first time.
Prefer to watch? Tutorial 3: The IVR designer and inbound routing. The screens show the ICTContact name because ICTCRM runs on it.
What you need before you start
- At least one working trunk under Administration > Gateways, and a DID assigned to your account. The administrator assigns DIDs from Administration > Client Management, using the row operation Assign / Remove DIDs.
- One or two agent extensions under Administration > Agents / Extensions. Agents log in with the extension number and its password, then answer in the browser phone. They don't need a softphone.
- Your menu prompt as an audio file, or the text of it.
Step 1: upload the prompt
Go to Contact Center > Messages > Recordings and click New Recording.
- Fill in Recording Name (letters and digits, we use names like welcome_menu) and Description.
- Set Recording Source. Pick Recording File to upload a file, or Text to have the server speak the text you type into Text to Recording.
- For a file, choose it in File Name. Whatever you upload is converted to the format Asterisk plays (wav). The converter accepts the usual formats (wav, mp3, gsm, ogg, flac and many more).
- Click Save. Back in the list, the play icon lets you listen to the converted file. Do that now. It's the quickest way to catch a bad upload.
Record a plain menu prompt with no music under the voice. Say the key after the department ("for sales, press 1") so callers hear the number last.
Step 2: draw the menu
Go to Contact Center > Messages > IVR and click New IVR. Give it an IVR Name, then build on the canvas. The IVR Designer Guide describes every node. Here's the short version.
- Drag Call Answer from the toolbox onto the canvas and link Call Started to it. To make a link, drag the small square on the right edge of a node and drop it on the next node.
- Drag Options Menu onto the canvas. Click it, then click the pencil. In the dialog, set Menu Message to your prompt, Repeat Message to 2 and Wait for keypress to 10 (seconds). Leave Menu type on Normal menu. Click Apply. Link Call Answer (Start) to the menu.
- Drag two Call Transfer nodes onto the canvas. In each dialog, pick the extension in Transfer. Link output 1 of the menu to the first one and output 2 to the second.
- Drag a Call Hangup node and link the menu's timeout and 0 outputs to it. Link the busy, noanswer, congestion and failed outputs of both transfers to it too. Anything you leave unlinked just drops the call silently.
- Click Save (top bar).
Step 3: wrap it in an inbound campaign
An IVR never answers a number by itself. On this build a DID forwards to a campaign, and the campaign runs the IVR. Here's how to set that up:
- Go to Contact Center > Campaigns Management, click Add new and choose the IVR Campaign card.
- Basic Configuration: enter a Name. Dialing Mode is fixed to Broadcasting for this type. The Caller ID settings here only matter for outbound calls.
- Contact step: pick any Contact Group. An empty one is fine, because the campaign dials whatever's in it and then waits. Set Contact List Closure to Wait Inbound. The description on the screen spells it out: "Process contact if there is any, then wait for incoming requests".
- IVR Campaign Configuration: in Select IVR, pick the one you just saved.
- Last step ("Advacne Configuration" as labelled on screen): Max. Concurrent Channels is the only setting that matters for inbound. Set it to the number of simultaneous callers you want to accept. Max. Retries, Suggested dialing order, Max. Call Duration in seconds and Max.ring time in seconds are for the outbound side.
- Click Save, then click the Start Campaign icon in the Operations column. An inbound campaign goes active straight away. There's no daemon to wait for.
Step 4: point the DID at the campaign
Open the DID list (did.php). It isn't in the sidebar on the current build, so type the address or ask your administrator to do this step.
- Click the Forward DID icon on your number.
- In DID Forwarding, set Usage to Forward to Campaign and Campaign to the campaign from step 3.
- Click Save.
The dropdown only lists campaigns that are active, scheduled, stopped or pending. If yours is missing, start the campaign first.
You won't find a "forward to IVR" choice on this form. The options are Forward to Extension and Forward to Campaign. The campaign is what links the number to the IVR.
Step 5: test it
Call the DID from a mobile. You should hear the prompt within a second of the call connecting. Press 1 and watch the agent's panel ring. Then call again and press nothing. After 10 seconds the prompt repeats twice and the call drops, which is exactly what you drew.
Keep Contact Center > Reports > CDR open while you test. Every inbound call shows up there with Status and Response. If a call never reached the IVR, it'll be missing entirely, and that tells you the problem is on the trunk or DID side.
When it does not work
Call connects, no audio at all. Nine times out of ten it's the recording. Open Recordings and press play on the prompt. If it's silent or garbled, re-upload a plain wav (8 kHz, mono). Then open the IVR, click the Options Menu node and check that Menu Message still points at that recording. A deleted recording leaves the field empty. If you used a Play text-to-speech node, the server needs a speech engine installed and selected (Festival on a default install). That's a server setting, so ask your administrator.
Audio plays but key presses do nothing. The DTMF mode on the trunk doesn't match what the carrier sends. Trunks are created with dtmf_mode rfc4733 (the usual RTP event tones). If your carrier sends tones in the audio or in SIP INFO, fix it like this:
- Go to Administration > Gateways and click Edit Trunk.
- Under Trunk Configuration, add one line to the Settings box:
dtmfmode=inband,dtmfmode=infoordtmfmode=auto. - Click Save. The trunk configuration is regenerated on save.
Also check that Wait for keypress on the menu node isn't too short. 10 seconds is a sensible floor.
One way audio (the caller hears nothing, or you hear nothing). This is NAT. Trunk endpoints are created with rtp_symmetric, force_rport and rewrite_contact already switched on, and that covers a carrier behind NAT. If the ICTCRM server itself sits behind NAT, the administrator has to set external_media_address and external_signaling_address on the UDP transport in pjsip.conf (the lines are there but commented out). They also need to open UDP 10000 to 20000 on the firewall. The web portal has no screen for this.
Caller hears the prompt but the transfer fails. Look at which output fired. busy or noanswer means the agent extension didn't pick up. The agent must be logged in and Ready in the agent panel. congestion or failed usually means the extension no longer exists, or was deleted and recreated. Reopen the Call Transfer dialog and pick it again.
The menu repeats forever. Repeat Message counts per attempt. With it on 3 and Invalid Message set, a caller mashing keys hears the prompt four times. Lower it to 1 or 2.
Frequently asked questions
How deep can I nest menus? There's no hard limit. Each Options Menu branches on keys 1 to 9 and 0 (keys * and # aren't offered). For more choices, chain another Options Menu behind a key. Keep it to two levels, though. Callers give up after that.
Can I play a different message after hours? Yes, with the Time Condition node. Set From and To (HH:MM) and tick the working days. Then link the within output to the menu and the outside output to a Play Audio with a closed message. It uses the timezone of your user account.
Can callers say what they want instead of pressing keys? Not with Options Menu, which is keypad only. Speech is handled by the AI Voice Agent node. It hands the call to an AI persona that listens, talks back and can transfer to an agent or queue. See the AI Voice Agent Guide.
Can one IVR serve several numbers? Yes. Forward each DID to the same Wait Inbound campaign.
Can I use the same IVR for outbound? Yes. Create a second IVR Campaign with Contact List Closure on Conclude Campaign and a real contact group. The flow runs from Call Started when the contact answers.
Does the IVR know who is calling? On an outbound campaign call, the contact tokens ([contact:first_name] and so on) are filled from the contact record, so Say nodes can read them out. On an inbound call there's no contact, so those tokens are empty.
Stuck on something this guide does not cover? Open a support ticket or browse the other guides.
Try the live demoSee pricing