> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://fyno.io/docs/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://fyno.io/docs/_mcp/server.

# Voice Templates

> Create and manage voice templates for IVR, text-to-speech, and call connect workflows across supported voice providers, including testing, dynamic content, and approval workflows.

When you add the **Voice** channel to a template, the **Create your Voice Template** screen opens. First choose the **Type** of call, then configure it. Because Fyno works with many voice providers, some types also need setup in your provider's platform. See [Provider-specific setup](#provider-specific-setup).

| Type                              | What it does                                                                                        |
| --------------------------------- | --------------------------------------------------------------------------------------------------- |
| [IVR](#ivr)                       | Uses the IVR info configured on the provider's portal.                                              |
| [Call Connect](#call-connect)     | Connects your bridge number and the recipient, on each leg of the call. Also used for call masking. |
| [Text to Speech](#text-to-speech) | The typed text is spoken out when the call is connected.                                            |

## Create a voice template

#### IVR

### IVR

The IVR configured on your integration page is used to run the call.

![](/docs/_fern-img/29aa950fdc36948758a527f3f3650ddbb4fba28eb7eb49e6fe91a7a819ac532b.webp)

#### Select IVR

In **Type**, select **IVR**.

#### Add the metadata

In **Meta Data**, enter the metadata you want to share with the provider when this call is triggered, as JSON. Metadata values are used to create dynamic text and convert it to speech. Placeholders must be inside double quotes, in the format `"{{ }}"`. For example:

```json
{
  "name": "{{name}}",
  "greet1": "Thank you for being with us."
}
```

Click **View Docs** in the editor for more details.

#### Override the IVR/Flow/Bot ID (optional)

Expand **Additional Configuration** and select **Override IVR/Flow/Bot ID** to use a different IVR, flow or bot ID than the one configured in your integration.

#### Call Connect

### Call Connect

Call Connect, also known as a call bridge, connects two numbers. The first leg of the call is your bridge number, and the second leg is the recipient. No IVR or call flow is needed.

![](/docs/_fern-img/ddde1913cae18ebf69ab69110550b3de4a8b3ee06ed1120b3f2fd8df7401b689.webp)

#### Select Call Connect

In **Type**, select **Call Connect**.

#### Enter the From Phone Number

Enter the number used for the first leg of the call, usually a business, agent or customer care number. Use a static value, or a placeholder such as `{{from}}` to pick it from the payload.

> **Info**
>
> The second leg (To) of the call is picked up from the `to` payload values when you fire a notification event. This number is visible and searchable on the Sent Logs page.

Example request payload:

**`Voice Payload`**

```json title="Voice Payload"
{
  "event": "<EVENT_NAME>",
  "to": {
    "voice": "<customer phone number>"
  },
  "data": {
    "from": "<business, agent or customer care number>"
  }
}
```

#### Text to Speech

### Text to Speech

![](/docs/_fern-img/ae794c133965ad0641ac02d109eaa84d605e63022dd647970567fcaab16385bd.webp)

#### Select Text to Speech

In **Type**, select **Text to Speech**.

#### Enter the text

In **Text to Speech**, type the content you want read out. It is spoken when the call connects to the recipient. You can add placeholders.

> **Note**
>
> For Exotel, Text to Speech works through an IVR flow. The editor shows the URL to use, in the format `https://api.fyno.io/v1/<WORKSPACE_ID>/dynamic/text?textkey=text2speech`. See [Exotel setup](#provider-specific-setup).

## Provider-specific setup

Each provider processes voice data differently. Configure your provider as shown below.

#### Kaleyra

#### IVR

Metadata values are used in text-to-speech widgets to create dynamic text and convert it to speech. In Kaleyra Voice, use `{script:outbound:metadata-key-name}` to access a metadata value.

For example, to configure a menu with 2 options and 3 placeholders, `script:outbound:name`, `script:outbound:greet1` and `script:outbound:greet2`, set it up in Kaleyra as shown below.

![](/docs/_fern-img/581df2872f77ed53782a5d5933feba4f906f89b47723a8e31281a0ffa4cc1860.webp)

In Fyno, add the matching metadata as shown below.

![](/docs/_fern-img/726d3dab1300b851e252005822ba10b4d71d5016df55dde0f29a75d0d9c02f84.webp)

#### Call Connect

No IVR or call flow is needed. Configure the **From Phone Number** in Fyno and pass the recipient in the `to` object of the payload. See [Call Connect](#call-connect).

#### Text to Speech

Fyno prepares the dynamic content and passes it to Kaleyra using OBD (outbound dialing) calls. Type the content you want read out, and it is played on the OBD call. The content plays with a delay of 5 to 10 seconds, depending on its length.

#### Exotel

#### IVR

In Exotel, metadata values are used in text-to-speech widgets to create dynamic text. Configure the endpoint shown in the Fyno voice template to access the dynamic text for the call.

For example, if the metadata is `{ "Text2Play": "Dear Username, This is sample text to speech with dynamic content" }`, use this URL in the IVR text-to-speech greeting widget:

`https://api.fyno.io/v1/<WORKSPACE_ID>/dynamic/text?textkey=Text2Play`

To capture keypresses, use the **Passthru** widget in the Exotel platform while configuring the Fyno callback. Add the callback URL in each one to capture DTMF for every assigned keypress.

#### Call Connect

No IVR or call flow is needed. Configure the **From Phone Number** in Fyno and pass the recipient in the `to` object of the payload. See [Call Connect](#call-connect).

#### Text to Speech

Text to Speech is currently supported through IVR calls. Fyno prepares the dynamic content and makes it available at an endpoint.

To play the text over a call, create an IVR flow in Exotel. In the **Greetings** widget, configure this endpoint, which returns the dynamic text to play for the call:

`https://api.fyno.io/v1/<WORKSPACE_ID>/dynamic/text?textkey=text2speech`

## How to add dynamic content

You can add dynamic content to your templates using one of the four options below:

* [Placeholders](./template-dynamic-content#placeholders)
* [System Variables](./template-dynamic-content#system-variables)
* [Handlebars](./template-dynamic-content#handlebars)
* [Components](./template-dynamic-content#components)

## How to test a voice template

Use this feature to test a template thoroughly before including it in any Notification Event. This ensures early detection and resolution of any potential issues, for a seamless user experience.

Click **Run Test** at the top right of the template. The test pop-up opens.

![](/docs/_fern-img/cfafb2ce7bdc65fd9eb678675d2f12eac24cf0ddb33671289f9158f40dfe681d.webp)

Enter either the mobile number of the recipient, or a `distinct_id`. **Make sure to enter the distinct_id of a Test User profile.**

Select a voice integration that is already configured in Fyno.

Click **Test** to place the call to the recipient with the selected integration. You see the success or failure message along with a link to the Sent Logs.

## Save and go live

Click **Save** to save the template as a **Test** version. You can save different versions of the template this way. Use **Go Live** when you are ready to move your template to the **Live** version.

> **Note**
>
> If your workspace has a maker-checker workflow enabled for template management, **Go Live** needs an additional approval step. Choose from your designated approvers, who review and authorize the template changes. See [Approval flow](./approval-flow) for the steps.