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
- Open Executions. This answers the biggest question first: did the flow run at all?
- No runs at all → the trigger never matched. Continue with The flow never runs.
- There are runs → open the newest one. The replay shows the path it took and the step panel shows exactly what each block was handed and returned. Continue with The flow runs but takes the wrong path.
- 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.
- Rehearse it. For a chatbot, the simulator reproduces the conversation in seconds without sending anything. For everything else, Test Run walks the draft once with sample data.
Read the run instead of guessing
Most of the tables below can be answered directly from a run. Handed to this block in the step panel shows every setting with its variables filled in, so an empty variable or a wrong branch is visible rather than inferred. See Executions.
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. |
| A Conversation Changed / Object change flow does not fire when another flow or the AI Agent made the change | By default these triggers ignore changes made by automations, so a flow cannot loop on itself | Open the trigger and switch on Also react to changes made by automations. Chains still stop after 5 flows deep. |
| 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 Assign AI / human agent 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
tip
Open the run in Executions, click the step, and read Handed to this block. It shows the template you wrote next to the value it became, which usually identifies the problem immediately.
| 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. |
| Add / Update a record | Choose an object | Choose the object; the field list follows that choice. A flow cannot be published without it. |
| Add / Update a record | Validation failed | A value does not fit the field's type, a required field is empty, or a linked record does not exist. Check the object's fields; skipped_fields names what was not saved. |
| Delete a record | in_use | Other records still link to this one. Remove the links first. |
| Contact Update | A field is missing from the dropdown | Only the fields of the Contacts object (see the object builder) 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. |
The simulator
| Symptom | Likely cause | Fix |
|---|---|---|
| 💬 Test this flow is not on the panel | The selected block is not an Incoming Message trigger | The simulator only starts from that trigger. Click it on the canvas first. |
| "Only the Incoming Message trigger can be tested this way for now." | The block you started from is a different trigger | Use Test Run for those, or add an Incoming Message trigger. |
| The bot replies differently than it did in production | You are talking to the draft, not the published version | That is intended. Publish, then compare with a real run in Executions. |
| The simulator asks about a branch instead of choosing one | The branch depends on a value the simulation did not fetch — a webhook, a saved variable, a Code block, a CRM lookup | Pick what the outside system would have answered. See When the simulator asks you a question. |
| Business Hours or Agent Availability always asks | They read live system state, which a rehearsal must not consult | Answer with the case you want to rehearse. This is how you test after-hours behaviour at midday. |
| A branch button says nothing connected | That output port has nothing wired to it | Wire it. In production the flow would stop there. |
| Nothing appears in Executions after a simulation | A dry run is not a run | By design — the simulator records nothing. Use Test Run if you want a recorded run. |
| "This simulation has expired. Start a new one." | 30 minutes of inactivity | Nothing was lost, because nothing was saved. Start again. |
| "The simulation stopped after a great many steps…" | The flow ran an unusual number of blocks in one turn | Look for a loop — two blocks pointing back at each other. |
| An email or webhook did not happen | Every outside action is skipped on purpose | The transcript names each one. To test real delivery, publish to a test inbox. |
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. |
| A simulation never appears in Executions | A rehearsal is not a run. Nothing is sent and nothing is recorded — that is the whole point of it. |
| A deleted block still shows in an old run | A run is replayed against a snapshot of the flow as it was, so the history stays readable after you rebuild. |
| Old runs disappear on their own | Each flow keeps the number of runs your plan allows, oldest out. A new run is never dropped to stay under the limit. |
| 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 |
|---|---|
| Executions | What actually happened on a real run: the path taken, every block's input and output, the branch chosen, the error, the timing. Start here. |
| The simulator | What your chatbot would say, reproduced in seconds, without sending anything. |
| Test Run | Whether the draft's shape is valid, without touching customers. |
| A temporary Private Note | Still useful for watching a value change across a long live flow, though the step panel in Executions now shows the same thing without editing the flow. |
| 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
- Executions — the run history, and how to read one run.
- Chatbot simulator — rehearse a conversation without sending it.
- Testing & publishing — a safe release routine.
- Flow recipes — known-good flows to compare against.