Call Flows
Heedify supports inbound voice call routing via a visual designer with IVR (configurable digit count and timeout), separate transfer-to-user, transfer-to-queue and transfer-to-phone nodes, day/time/regex/variable checks, holidays and open hours, post-call surveys (numerical, yes/no, rating) and workflow event triggers, integrated with Microsoft Teams resource accounts, Teams Phone and Azure Blob recording (with optional transcription). A call flow is the visual routing tree applied to inbound voice calls on a Microsoft Teams resource account. It defines what plays, what branches, and where the call lands — from greeting to queue, IVR, transfer or disconnect — and pairs that with holidays, open hours, recording, post-call survey and workflow triggers.
Creating a call flow
- Open Call Flows from the sidebar.
- Click +Add.
- On the Resources tab, pick the Teams resource account (Graph search), then fill in the metadata.
- Walk the other tabs to add greetings, hours, routing, recording, survey and workflow triggers.
- Click Save.
Set up the Teams resource account (Unify model)
In the Unify model the Teams resource account is created and linked to Heedify’s Azure Communication Services (ACS) resource with PowerShell, before you bind it on the Resources tab. Run the commands in Teams PowerShell.
Connect to Teams PowerShell:
Connect-MicrosoftTeams
Create the resource account (use the Unify application id 13dc7c3d-b71b-4568-a68e-ac31df943617):
New-CsOnlineApplicationInstance -UserPrincipalName "acme_desk@acme.com" -DisplayName "ACME Desk" -ApplicationId 13dc7c3d-b71b-4568-a68e-ac31df943617
In the Microsoft 365 admin center assign a Microsoft Teams Phone Resource Account licence (free) to the new account.
Associate the ACS resource that matches your region — it must correspond to the region of the agents handling this flow:
| Region | AcsResourceId |
|---|---|
| Europe (EU) | 3e7944ef-8a11-4125-8f92-8ff40adf1272 |
| America (AMER) | 6bfbd5b3-013b-443f-ac56-75d75d730dd6 |
| Asia-Pacific (APAC) | 261317e9-8295-4b2f-8541-4f22e00fe879 |
Set-CsOnlineApplicationInstance -Identity "acme_desk@acme.com" -ApplicationId 13dc7c3d-b71b-4568-a68e-ac31df943617 -AcsResourceId <AcsResourceId-for-your-region>
Assign a phone number — for Microsoft Calling Plans:
Set-CsPhoneNumberAssignment -Identity "acme_desk@acme.com" -PhoneNumber "+33189385357" -PhoneNumberType CallingPlan
…or for Direct Routing:
Set-CsPhoneNumberAssignment -Identity "acme_desk@acme.com" -PhoneNumber "+33189385357" -PhoneNumberType DirectRouting
Then create the call flow and, on the Resources tab, select the Teams Phone Extensibility option for the Unify model.
The application id, ACS resource and phone number are configured once per resource account. After that, manage the flow entirely in the portal.
Resources
The Resources tab binds the call flow to a Teams resource account and sets tenant-level metadata. The resource account itself is selected with a Microsoft Graph search — type a name, pick the account in the dropdown (you do not type the GUID by hand).
| Field | Description |
|---|---|
| Resource | The Teams resource account (Graph search). Required at creation; locked afterwards. |
| Time Zone | IANA time zone used for Holidays and Open Hours. Default Europe/Paris. |
| Language | Default language for generated audio. Default en-US. |
| Data Location | Where the call data is stored. |
| Entity | Entity the call flow belongs to. Required and locked after creation. |
| Region | Service region (for example EU). Locked after creation. |
| Teams Phone Extensibility | Toggle (isTPE) for resource accounts that publish through Teams Phone Extensibility. Locked after creation. |
Greeting
Up to four greeting messages can be enabled, each with its own audio (uploaded file or text-to-speech) and language:
| Message | Purpose |
|---|---|
| Welcome Message | The standard hello played at call start. Enabled by default. |
| Emergency Message | One-shot announcement (for example, a service outage). |
| Flash Message | Short notice played in addition to the welcome. |
| Custom Message | A free-purpose extra message. |
Each message can be toggled on/off independently. The welcome message is the only one enabled by default. Enabled messages are played in this order — Emergency → Welcome → Flash → Custom — and disabled messages are skipped.
Holidays & Open Hours
This tab is split into two collapsible sections.
Holidays
| Field | Description |
|---|---|
| Holiday message | Audio played to callers during a holiday or weekend day. |
| Holidays (days off) | List of date ranges. Click + to add a range; each row carries Start date and End date in dd/mm/yyyy. |
| Weekend | Multi-select of weekdays that are always treated as days off. Default Saturday + Sunday. |
| Holidays fallback | The action when the call lands during a holiday — Disconnect, Transfer to user, Transfer to phone or Queue. |
Open Hours
| Field | Description |
|---|---|
| Out of business hours message | Audio played outside open hours. |
| Per-day schedule | Each weekday is a collapsible section. Inside, add one or more time ranges (Start time + End time). A day with no range is closed. |
| Open hours fallback | The action when the call lands outside open hours — Disconnect, Transfer to user, Transfer to phone or Queue. |
Routing (visual designer)
The Routing tab is the drag-and-drop tree. The left palette groups nodes into three categories.
General
| Node | Purpose |
|---|---|
| Greeting Message | Plays a greeting audio. Only one greeting node is allowed per flow. |
| Holidays | Branches into the holiday calendar. Only one allowed per flow. |
| Open Hours | Branches on the weekly schedule. Only one allowed per flow. |
| Survey | Triggers the post-call survey on this branch. |
Routing
| Node | Purpose |
|---|---|
| IVR | Plays a prompt and reads DTMF digits to branch (see below). |
| Transfer to User | Transfer the call to a specific Teams user. |
| Queue (Transfer to Queue) | Hand the call to a Heedify queue. |
| Transfer to Phone | Transfer to a PSTN phone number. |
| Disconnect | End the call. |
| Prompt | Play an audio message (TTS or file). |
| Check Variable | Branch on a formula evaluated against the call’s variables — If matched routes one way, If not matched another. |
| Check Days | Branch based on the current day. |
| Check Time | Branch based on the current time. |
| Check Regex | Branch based on a regex match against an input (typically caller number). |
Trigger (workflow events)
These nodes attach a workflow to a lifecycle event:
| Node | Fires when |
|---|---|
| Agent Connected | An agent picks up the call. |
| Customer Abandoned | The caller hangs up before being answered. |
| Call Connected | The call reaches Heedify. |
| Call Ended | The call terminates. |
| Agent Declined | The alerted agent declined the offer. |
Drag a node from the palette onto the canvas, then click the node to open its edit panel.
IVR node fields
An IVR node plays a menu prompt and reads the caller’s DTMF digits, then routes each digit to its own action. Use it for self-service menus such as “press 1 for sales, 2 for support”.
| Field | Description |
|---|---|
| IVR name | Display name for the node. |
| Wait until customer enters # | When on, the IVR waits for the # last tone instead of timing out automatically (lastTone). |
| Expected digits number | How many digits to collect. Default 1. |
| Message | The prompt audio (TTS or file). |
| IVR dial map | A table of key → action. For each row pick the digit, the action (Queue, Transfer to user, Transfer to phone, Disconnect, Routing) and the target. |
The full node also stores a timeout (seconds to wait for input) and the options map (digit → next node).
Routing steps and chaining
Click Add New Routing to create a named routing step (no spaces in the name). Start is the flow’s entry point. Any node action can be set to Routing to jump to another step, so you can build multi-step trees — for example Start → Check Days → Check Time → Queue.
Branch actions
The Check nodes branch into If matched / If not matched. For each branch — and for an IVR digit or a Prompt’s next step — you pick an action:
| Action | Goes to |
|---|---|
| Queue | a Heedify queue |
| Transfer to user | a Microsoft Teams user (Graph search) |
| Transfer to phone | a PSTN phone number |
| Disconnect | ends the call |
| Routing | another routing step (chaining) |
Check Variable
A Check Variable node evaluates a formula against the call’s variables and branches on the result. Use it to route on data captured or fetched during the call — for example, send a VIP customer to a dedicated queue.
| Field | Description |
|---|---|
| Formula | A free-text expression evaluated against the call’s variables. |
| If matched / If not matched | The branch action when the formula is true / false. |
Check Time
A Check Time node compares the call’s current time against a time range. Use it to route differently inside vs outside a window — for example a lunch-break or after-hours path, without touching the Open Hours schedule.
| Field | Description |
|---|---|
| Start time / End time | A time range in HH:mm (24-hour). |
| If matched / If not matched | The branch when the call time is inside / outside the range. |
Honours the flow’s Time Zone.
Check Days
A Check Days node checks whether the current day is one of the selected weekdays. Use it to branch weekdays vs weekend, or to single out specific days.
| Field | Description |
|---|---|
| Select days | One or more weekdays (Monday–Sunday). |
| If matched / If not matched | The branch when the current day is / isn’t selected. |
Check Regex
A Check Regex node tests an input — usually the caller’s number — against a regular expression. Use it to branch by number pattern, for example route French numbers (^\+33…) one way and everything else another.
| Field | Description |
|---|---|
| RegExp pattern | A regular expression matched against the input (typically the caller number), e.g. ^\+33\d{9}$. |
| Test value / Test | Type a sample value and click Test to preview Matched / Not matched. |
| If matched / If not matched | The branch on the regex result. |
Prompt
A Prompt node plays an audio message and then moves on to a single next action — it does not collect any caller input. Use it for announcements before routing onward (unlike IVR, which reads digits).
| Field | Description |
|---|---|
| Prompt name | Display name for the node. |
| Message | The audio to play (text-to-speech or uploaded file). |
| Next step | The action after the audio — Queue, Transfer to user/phone, Disconnect or Routing. |
Recording
| Field | Description |
|---|---|
| Enable recording | Master switch (callRecordingEnabled). When on, calls passing through this flow are recorded. |
| Enable Transcription | Separate switch (AudioTranscribe). When on, recordings are transcribed automatically. Only visible when recording is on. |
| Recording readers | The list of users granted playback access (callRecordingReaders[]). Add a user via Graph search; remove with the trash icon. |
Survey
The Survey tab configures a post-call questionnaire. Enable it with Activate the survey, then build the question set.
| Field | Description |
|---|---|
| Activate the survey | Master switch. |
| Timeout | Seconds to wait for the caller’s input on a question. |
| Questions | Ordered list. Each question has a name, a Type, a Question text, an Order and an Announcement audio. |
| Goodbye message | Audio played at the end of the survey. |
Available question types (code key in parentheses):
- Yes or No (
YES_OR_NO) — DTMF question with ayesDigitsetting that picks which digit (default1) is interpreted as “yes”. - Rating (
RATING) — Single-digit rating, typically 1-5. - Numerical (
NUMERICAL) — Free numeric input.
Workflows
The workflow events surfaced in the routing palette (Agent Connected, Customer Abandoned, Call Connected, Call Ended, Agent Declined) attach a workflow to a lifecycle event for this flow. Build the workflows themselves under Customer data > Workflows. Workflows fire asynchronously and may call external webhooks.
Editing and deleting
Open a call flow from the list to edit. The Entity, Region and Teams Phone Extensibility are locked after creation.
Deleting a call flow releases its Teams resource account.
FAQ
What is the maximum digit count a Heedify IVR can collect?
The IVR node’s Expected digits number field defines how many DTMF digits are collected (default 1). Turning Wait until customer enters # on switches the IVR from a fixed digit count to a lastTone trigger so the caller signals end of input.
How do I route to different paths based on time of day in Heedify?
Use the Check Time node in the Routing tab to branch on the current time, or attach an Open Hours node to apply the per-day schedule defined in the Holidays & Open Hours tab. Both honour the call flow’s IANA Time Zone.
Where do I add the workflow that fires when a Heedify caller abandons?
Drag a Customer Abandoned trigger node onto the routing canvas and attach a workflow built under Customer data > Workflows. The workflow fires asynchronously when the caller hangs up before being answered.
Are Heedify call recordings transcribed automatically?
Only when Enable Transcription is on. It is a separate switch from Enable recording and is only visible when recording is on. Transcription runs on the recorded audio stored in the call flow’s Data Location.
Can a Heedify call flow play different greetings to different callers?
Up to four greeting messages are configurable per flow: Welcome Message, Emergency Message, Flash Message and Custom Message. Each has its own audio (text-to-speech or uploaded file) and language, and each toggles independently.
Works with: Microsoft Teams, Teams Phone, Microsoft Graph (resource account search), Teams Phone Extensibility, Azure Blob recording, Workflows, Queues.