# Test a Workflow (/docs/workflows/test-a-workflow-with-a-browser-call)

> For the complete documentation index, see [llms.txt](https://docs.tandemcx.ai/llms.txt). Any page on this site can be fetched as Markdown by appending `.md` to its URL.

**Test** runs the workflow you have open, as it was last saved, without routing a phone number
to it or publishing it first. You can place a voice call from your browser, start a run with
variables you choose, or send the workflow a first SMS or chat message. While the test runs, the
canvas shows the path it takes and a run panel shows what each node did.

## Start a test

Select **Automations → Workflows** in the left navigation and open a workflow. **Test** sits in
the top right of the editor, next to **Publish**. On a narrow window it shrinks to an icon;
hover over it to see the name.

The test runs the version open in the editor, as it was last saved, whether that version is a
draft or published. Unsaved changes are handled before the test starts:

- **A draft with unsaved changes** is saved in place when you click **Test**.
- **A published version with unsaved changes** can't be saved in place. The editor says so and
  opens **Save as New Draft**. Save the draft, then click **Test** again to test it.

The **Test version** dialog then asks which kind of test to run:

| Kind       | What it takes                                        | What it does                                          |
| ---------- | ---------------------------------------------------- | ----------------------------------------------------- |
| Voice Call | Nothing                                              | Places a call from your browser into the workflow     |
| Run        | Starting variables, optional                         | Starts the workflow with those variables              |
| SMS        | A **First Message**, and optional starting variables | Starts the workflow as if that text had arrived       |
| Chat       | A **First Message**, and optional starting variables | Starts the workflow as if a visitor sent that message |

The **Voice Call** kind runs on the same telephony path as a phone call, so Play Message,
Capture DTMF, speech capture, and the AI Voice Agent node behave as they do for a caller.

For the other kinds, **Add Variable** adds a **Name** and **Value** pair under **Starting
Variables**. Values are passed as text, a row with no name is ignored, and two rows can't share a
name (`Each variable needs a unique name.`).

Choose **Start Call** or **Start Run**, and grant microphone permission if your browser asks. If
a run can't start, the dialog shows **Couldn't start the test run** with the reason, and the
canvas stays editable.

The dialog keeps the kind, variables, and message you started with, so clicking **Test** again
repeats the same test. **Cancel** clears them.

## Watch the path

While a test runs, the canvas is read-only in your browser. You can pan, zoom, and click nodes,
but not move, add, connect, or delete them, and undo, redo, and save are off. The editor header
shows **Test run in progress** and the version under test.

As the run moves:

- Once the first node runs, the nodes the run hasn't reached are dimmed.
- Each edge the run took is drawn thicker and animated. The other edges fade.
- The node running or waiting right now pulses.
- Each visited node carries a badge with its step number. A node visited more than three times
  shows its first three steps and a `+n` count for the rest.

**Exit Test** in the header leaves the test and unlocks the canvas. Exiting during a voice test
hangs up the call. A Run, SMS, or Chat test carries on to its end on the server after you exit;
the editor stops showing it.

## The run panel

The **Test Run** panel opens on the right when the test starts. The **Run Panel** switch in the
header hides and shows it.

The top of the panel says where the run is:

| Status                                      | Meaning                                                         |
| ------------------------------------------- | --------------------------------------------------------------- |
| Starting…                                   | No node has run yet                                             |
| Running                                     | The workflow is running                                         |
| Waiting for the next message at _node name_ | An SMS or chat test reached a node that waits for a reply       |
| Ended                                       | The workflow finished                                           |
| Ended with an error                         | The workflow stopped on an error                                |
| Caller disconnected                         | The workflow ended with a disconnect                            |
| Call ended                                  | A voice test call ended before the workflow recorded its finish |

Below that, **Nodes** lists every step in order with the node's name and its state: **Running**,
**Waiting**, **Done**, or **Error**. Once the run has ended, **Response** shows the payload a
Response node returned, or `No Response node ran.` **Variables** shows the variables as the run
last recorded them.

Click a step, or a visited node on the canvas, to open that node's detail. **All Nodes**, a click
on an empty part of the canvas, or Escape goes back to the list. The detail shows:

- **Visit** — for a node the run reached more than once, which visit to show.
- **Result** — the **Exit** the node took, the **Next Node**, and the **Duration**. A node that
  took its fallback exit shows **Took the fallback exit**.
- **Message** — for Send SMS and Send Chat Message nodes, the message the node sent or would have
  sent.
- **Response** — the node's own response data.
- **Variables After This Node** — the variables once the node finished, with the names it
  changed listed under **Changed**.

Some values are hidden:

- A private variable's value is masked with `*` wherever it appears in the panel, including
  inside other values.
- When **Redact Data in Logging** is on for the workflow or for a node, that node's response,
  message, and variables show `[REDACTED]`.
- When a node's recorded data is over 64 KB, its values show **Too large to display** with the
  size.

## During a call

A voice test shows the call at the top of the **Test Run** panel, above the node list, so you
can watch the path on the canvas while you talk. The **Call** bar shows the time elapsed against
the five minute limit, and its arrow hides the call controls while keeping **Hang Up** in reach.
Turning off the **Run Panel** switch hides the call controls too, but the call keeps going;
**Exit Test** hangs it up.

- **Keypad** — the digits 0 to 9, `*`, and `#`. A press is sent to the call as a key press, so a
  Capture DTMF node or a menu reads it as it would from a phone. The digits you've sent show above
  the keypad. The keys are disabled until the call connects.
- **Mute** — stops sending your microphone.
- **Hang Up** — ends the call.

When the call ends, the panel says why and links to **View call details**:

| Message                                                  | What happened                                          |
| -------------------------------------------------------- | ------------------------------------------------------ |
| The workflow ended the call.                             | The call's channel closed, for example at a disconnect |
| Call ended.                                              | You hung up                                            |
| Ended after the 5 minute test call limit.                | The call hit the time limit                            |
| The call ended at transfer node "…". Nothing was dialed. | The workflow reached a transfer node                   |

The path and the run panel stay on the canvas after the call ends, until you click **Exit
Test**.

## Text messages aren't sent

A Send SMS node in a test doesn't send a text. It records the message it would have sent (the
**To**, **From**, and **Body**) under **Message** in the node's detail, then takes the exit a sent
message would. With **Wait for Reply** on, it waits as it would after a real send. This holds for
every kind of test, voice test calls included, and for subroutines the workflow calls.

The exception is an AI Voice Agent's tools. During a voice test call, both of these **do** send
a real text:

- A Send SMS node in a workflow the agent runs as a tool. That workflow runs as a normal run.
- A Send SMS [node tool](/docs/agents/voice-agents/tools#add-a-node-tool) on the agent. The
  agent sends it directly, outside any workflow.

A Send Chat Message node's message shows under **Message** the same way.

## SMS and chat tests stop at the first wait

An SMS or Chat test sends the workflow one message, the **First Message**. When the workflow
reaches a node that waits for the next message, such as Send SMS with **Wait for Reply** on, the
status shows **Waiting for the next message at** that node. Sending a follow-up message from the
editor isn't supported yet.

If the waiting node has a timeout, the run takes its no-reply exit when the timeout passes, and
the canvas follows it if you are still in the test.

## Transfers dial nothing

A test call never places a transfer.

- A **Transfer to External** or **Transfer to Queue** node ends the test call when it is reached.
  The end message names the node, and the call details list the transfer as **Test call ended at
  transfer** with the node's name and the kind of transfer. The end message waits up to about 30
  seconds for that record; if it has not arrived, the panel shows **The workflow ended the
  call.** instead.
- An **AI Voice Agent** node's own transfer tool is refused, and nothing is dialed. The agent is
  told `This is a test call, so the transfer was not placed.`
- A workflow the agent hands off to, and a subroutine the workflow calls, are part of the same
  test call. A transfer node reached there ends the call the same way.

To confirm the transfer destination itself answers, use a real call to a routed number.

## Billing

A voice test call is billed as call minutes, the same as a phone call into the workflow. It has no
number of its own, so on the Billing page's **Usage** tab its minutes show as **Local call, in**,
beside the workflow's **IVR** time. See [How a call is
billed](/docs/overview/billing#how-a-call-is-billed). If your organization has no call-minute
balance, the call ends before it connects and the panel shows
**Couldn't complete the call** with `Your organization's balance is too low to place a test call.`

## Call details

A voice test call is recorded as a conversation, and Call Logs lists it as **Browser test call**
in place of a caller's number. When it ends, **View call details** opens its page under
**Insights → Call Logs**, with the steps the workflow took. See [Call
Logs](/docs/workflows/insights-and-reporting#call-logs) for how to read it.

## Limits and defaults

| Limit                    | Value                                                          |
| ------------------------ | -------------------------------------------------------------- |
| Call length              | 5 minutes, then the call ends                                  |
| Concurrent calls         | One at a time per signed-in user, counting agent preview calls |
| Version tested           | The version open in the editor, as last saved                  |
| Transfers                | Never dialed; the call ends at a transfer node                 |
| Messages per SMS or chat | One, the **First Message**                                     |
| Records per run          | 2,000 records or 8 MB; the step list stops at either           |
| How long a run is kept   | One hour after its last update                                 |
| Subroutines              | The Subroutine node shows on the path; its nodes don't         |

The one-call limit is shared with **Call Agent** in the agent editor, so a [preview
call](/docs/agents/voice-agents/preview-calls) left running in another tab blocks a test call
until it ends or reaches its own five minute limit.

## Troubleshooting

**Permission needed.** The browser refused microphone access. Enable it for this site in your
browser's settings, then use **Try Again**.

**Couldn't complete the call.** The call failed to start. If the message is
`Failed to start a test call.`, one cause is another test call or agent preview call still running
under your account, for example in a tab you left open. End it, or wait for it to reach the five
minute limit, then try again. If the message says the balance is too low, see
[Billing](#billing).

**Your sign-in session expired.** Reload the page and start the call again.

**This test run is no longer available.** The run's record expired an hour after its last update,
or the run never started. The path clears from the canvas. Click **Exit Test** and start a new
test.

**Can't reach the test run. The path may be out of date.** The editor failed to read the run
three times in a row. It keeps trying, and the notice clears once a read succeeds.

## Next steps

<Cards>
    <Card
        title="Execution & Publishing"
        href="/docs/workflows/execution-and-publishing"
        description="Validate and publish the version once the test run looks right."
    />
    <Card
        title="Insights & Reporting"
        href="/docs/workflows/insights-and-reporting"
        description="Read a test call's details alongside your real calls."
    />
    <Card
        title="Preview Calls"
        href="/docs/agents/voice-agents/preview-calls"
        description="Test a voice agent on its own, including edits you haven't saved."
    />
</Cards>
