Troubleshooting
Most Studio problems fall into three buckets: the flow never started, the flow started but took the wrong path, or a block did not do what you expected. Work through them in that order.
Start here
- Is the flow Live? Draft and Paused flows never run on real events.
- Did you publish after your last edit? Editing changes the draft only.
- Is the conversation owned by a human? Studio skips conversations assigned to an agent.
- Run a Test Run. It walks the draft with sample data and reports how many blocks executed, which is the quickest way to tell a configuration problem from a trigger that never matched.
note
The Execution Log section in the right panel is marked Soon — per-block run history is not available yet. An empty log there is not evidence that a block failed to run.
The flow never runs
| Symptom | Likely cause | Fix |
|---|---|---|
| Nothing happens on a real message | The flow is still Draft, or the last edit was never published | Click Publish. |
| Nothing happens and the badge reads Paused | Someone paused the flow, or Teloring paused it because a dependency was deleted | Open ⚙ Flow Settings → Resume flow. If the flow card shows a warning badge, fix the block it names and publish instead. |
| Nothing happens, and the flow is live | The trigger's inbox filter does not include the inbox you tested from | Open the trigger and tick the right inbox — or untick everything to listen on all. |
| It worked, then stopped | An agent is assigned to the conversation | Studio stays out of conversations a human owns. Test with a fresh conversation. |
| It stopped for one specific customer | A previous run handed that conversation to a human | The handover sticks until the conversation is resolved or a flow runs End Session. Resolve it and try again. |
| The flow card shows a warning badge | A dependency was deleted — usually an analytics alert | Fix the block it names, then publish again. |
| A scheduled flow never fires | The schedule row's timezone, or the day/time, is not what you think | Check the row. Remember a Days interval on Recurring Schedule is capped at 24 hours. |
| A webhook returns an error | The request does not match the learned format | Turn Learn next request back on and send the new shape once. |
| Only one of several matching flows runs | It usually does not — all matching live flows run. But once one hands the conversation to a human, the rest are skipped | Check whether an earlier flow has Human intervention on. |
The flow runs but takes the wrong path
| Symptom | Likely cause | Fix |
|---|---|---|
| A condition never matches | The Value / variable field has braces around it | Write message.content, not {{message.content}}, in a condition operand. |
| A condition never matches, part two | Using equals on free text | Switch to contains. Real people type "sales please", not "sales". |
| A numeric comparison always fails | The value is not a number | greater than and friends only work on numbers. A non-numeric value never matches. |
| Two branches ran when you expected one | Match mode is All matching branches | Switch to First match only, and order the rules from most specific to most general. |
| Nothing after the condition ran | No rule matched and there is no ELSE branch | Add an ELSE branch. |
| The flow is stuck after a question | A post-wait condition matched nothing and there is no ELSE | The flow waits for the next message and re-evaluates. Add an ELSE branch or an End Session block. |
| A branch runs but does nothing | Its output port is not connected | Drag a connector from that port. |
| A block never runs | It has no incoming connection | The block shows This block is not connected to anything. Wire it in. |
| Two messages arrived at the same time despite a Wait | Wait only delays its own branch | Siblings run immediately by design. Put the Wait on the shared path if you want everything delayed. |
A variable is empty
| Symptom | Likely cause | Fix |
|---|---|---|
{{some.variable}} shows up literally in a message | The key does not exist at that point in the flow | Drag it from Available Variables instead of typing it. If it is not listed, the block that produces it is not upstream. |
{{contact.name}} is empty | The contact is brand new and has no name yet | Branch on contact.name with exists, or write a greeting that reads well without it. |
{{conversation.id}} is empty | The trigger has no conversation — schedule, webhook, analytics alert, agent status | Supply a conversation ID yourself, from the payload or a lookup. |
{{http.json.something}} is empty | Capture response is off, or the field is not in the response | Turn Capture response for next actions on, then send {{http.body}} to a Private Note to see exactly what came back. |
{{answers.my_field}} is empty | The form field's Field ID is not my_field | Field IDs are the variable names. Check the form. |
{{webhook.body.x}} is empty | The payload does not contain x, or the format was never learned | Use Learn next request and read the learned variable chips. |
{{var.something}} is empty | Saved variables are per flow | A var.* value saved by one flow is not visible to another. |
A block fails
| Block | Symptom | Fix |
|---|---|---|
| Reply Message | Nothing is sent | Check the conversation ID resolves, and that the channel can still send (an expired WhatsApp window, a disconnected inbox). |
| HTTP Request | Always fails | Studio only calls public addresses. Localhost, private networks, and internal hostnames are blocked. |
| HTTP Request | Red JSON box | The body is not valid JSON after variables are filled in. Watch for a missing comma or an unquoted string. |
| Send Email | Choose which email inbox sends this email | Pick an inbox, or switch Send from to the Teloring system sender. |
| Send Email | No inboxes in the dropdown | Connect an email inbox in My Ring, or use the system sender. |
| Send Email | Recipients rejected | Maximum 25 addresses across To, CC, and BCC. Check for a typo. |
| Code | Fails every time | The code must return a value. It also has no network access — use HTTP Request for that. |
| Customer Record | Select which object type this record belongs to | Choose an object type; the field list follows that choice. |
| Customer Record | Validation failed | A value does not fit the field's type. Check the object's field definitions. |
| Contact Update | A field is missing from the dropdown | Only fields defined in the contact Field Editor appear. Protected system fields cannot be written. |
| Agent Availability | Always Offline | With Specific agents selected and nobody ticked, the answer is always Offline — by design. Pick agents, or switch to Anyone in the account. |
| Agent Availability | An AI Agent is not counted | AI Agents never count as online; they hold no session. |
| Business Hours | Always Closed | Check the schedule's timezone and its weekly hours in Settings, and whether a holiday calendar is closing the day. |
Voice problems
| Symptom | Likely cause | Fix |
|---|---|---|
| Voice blocks are missing from the picker | The flow has no Incoming Call trigger | Only a flow that starts with Incoming Call is a voice flow. |
| Publishing is blocked | A messaging block is in a voice flow, or the reverse | Remove the block the warning badge names. |
| The prompt does not play | The file is not WAV | WAV only. 8 kHz mono PCM is the safe format. |
| Callers hear silence and the line drops | A path ends without a transfer or Hang Up | End every path with a closing prompt and Hang Up. |
| Pressing a key does nothing | That digit's port is not connected | Wire every digit, plus Timeout and Invalid. |
| Forward to Agent never connects | The agent is not signed in — there is no permanent phone registration | Pair it with Agent Availability, and always wire the Rejected output. |
| No recording was saved | Recording is off at the trigger | Recording is controlled only by Record this call on the Incoming Call trigger. |
| Test Run does not ring the phone | Test Run cannot place calls | Dial the number for real. |
Building with AI (Hermes)
| Symptom | Likely cause | Fix |
|---|---|---|
| Use AI to build is greyed out | The AI Studio switch is off for the account | An admin turns it on in AI World. |
| "This flow already has blocks. Create a new flow to build one with AI." | You opened the AI builder on a flow that already has a canvas | Hermes only builds into an empty flow, so it can never delete work somebody did by hand. Create a new flow. |
| Build my flow is refused, pointing at the editor | The canvas was edited by hand during the interview | Your edits win. Finish the flow in the editor, or start a new flow and a new interview. |
| The message box is disabled | The flow has been built — the conversation is closed by design | Edit the flow on the canvas, or create a new flow to run a new interview. |
| The conversation reopens instead of the canvas | The flow still shows ⚡ Continue with AI | That is the unfinished interview. Use the card's Edit button to reach the canvas instead. |
| Hermes picked the wrong inbox or team | It was told the wrong thing, or the resource did not exist yet | Open the block on the canvas and choose the right one. Create missing inboxes and teams before the interview. |
| A block Hermes made has a ⚠ badge | It needs something only you can supply — usually an uploaded WAV prompt or a WhatsApp template | Open the block and fill it in. The rail's Needs your attention list said so during the interview. |
| "Hermes didn't manage to answer that one. Send your message again." | The AI returned an answer Studio could not read. The turn was not saved, so nothing is out of step | Your message is put back in the box — press send again. |
| "That answer was too long for Hermes to finish." | A single reply exceeded what the AI can produce in one turn | Send the same thing in shorter pieces, or split it across two answers. |
| The interview stopped, saying it hit a limit | An interview is capped at 60 questions, and accounts have a short message throttle | Progress is saved. Wait a moment and continue, or finish the flow by hand in the editor. |
| I closed the tab and lost my place | You did not — every answer is saved | Reopen the flow from the Studio list and click the card. |
Things that surprise people
| Behavior | Why it works that way |
|---|---|
| Editing a live flow changes nothing until you publish | Draft and live are separate copies on purpose. |
| Deleting asks you to type the flow name | Deletion is permanent and takes the versions and saved variables with it, so it needs a deliberate confirmation. |
| Pausing is not the same as deleting | A paused flow keeps every block and can be resumed in one click. |
| An empty filter means "everything" | An Incoming Message trigger with no inboxes ticked listens on all of them. |
| An empty agent selection means "nobody" | On Agent Availability, an unfinished Specific agents block must not behave like anyone. |
| A Wait does not delay other branches | Only the branch the Wait sits on is paused. |
| A saved variable is not shared between flows | var.* is scoped per flow so two flows cannot overwrite each other. |
| Duplicating a block does not copy its connections | You almost never want the copy wired the same way. |
| Sticky notes never run | They are editor-only comments and are not part of the published flow. |
| Building an AI flow ends the conversation | Once the blocks are yours to edit, a rebuild would have to overwrite your changes. |
Getting more detail
| Where | What it tells you |
|---|---|
| Test Run | Whether the draft's shape is valid, without touching customers. |
| A temporary Private Note | Drop one into a branch with the variables you are unsure about — it is the quickest way to see what a block really produced. |
| Version history (Version bar) | What changed, when, and who changed it — and the button to roll back. |
| Audit Log (Settings) | Who published, paused, resumed, restored, or deleted a flow. |
Next
- Testing & publishing — a safe release routine.
- Flow recipes — known-good flows to compare against.