[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"documentation:page:\u002Fdocumentation\u002Fautomations\u002Fbuilding-workflows":3,"documentation:nav":288},{"id":4,"title":5,"body":6,"category":277,"description":278,"extension":279,"meta":280,"navigation":281,"order":282,"path":283,"seo":284,"stem":285,"updated":286,"__hash__":287},"documentation\u002Fdocumentation\u002Fautomations\u002Fbuilding-workflows.md","Building workflows",{"type":7,"value":8,"toc":269},"minimark",[9,14,31,46,49,53,64,89,113,117,124,135,145,149,160,167,211,253,260],[10,11,13],"h2",{"id":12},"structure-rules","Structure rules",[15,16,17,18,22,23,26,27,30],"p",{},"A workflow flows outward from ",[19,20,21],"strong",{},"exactly one trigger"," (which has no incoming connection) and must contain ",[19,24,25],{},"no cycle"," and ",[19,28,29],{},"no disconnected node",".",[15,32,33,34,26,38,41,42,45],{},"Each output — a condition's ",[35,36,37],"em",{},"True",[35,39,40],{},"False",", a chat message's choices, the single output of every other node — can feed ",[19,43,44],{},"any number of connections",". Only an exact duplicate (the same output connected twice to the same node) is refused.",[15,47,48],{},"The one ordering rule: nothing can point back into the trigger. Conditions and actions can otherwise connect in any order, including an action followed by a condition that tests what it produced.",[10,50,52],{"id":51},"branch-order","Branch order",[15,54,55,56,59,60,63],{},"When an output fans out to several branches, the branches run ",[19,57,58],{},"one after the other",", from ",[19,61,62],{},"top to bottom as their nodes are laid out on the canvas"," (at equal height, left to right). Move a branch's first node above its sibling to run that branch first.",[65,66,67,75,78],"ul",{},[68,69,70,71,74],"li",{},"A branch finishes ",[19,72,73],{},"completely"," before the next one starts.",[68,76,77],{},"Everything a branch produced is available to the branches that run after it.",[68,79,80,81,84,85,88],{},"Two branches may ",[19,82,83],{},"re-converge"," on a shared downstream node. It then runs ",[19,86,87],{},"once per branch"," that reaches it.",[90,91,92],"blockquote",{},[15,93,94,97,98,100,101,104,105,108,109,112],{},[19,95,96],{},"Example"," — a condition's ",[35,99,37],{}," output feeds both ",[19,102,103],{},"Assign to a user"," and a ",[19,106,107],{},"Discord notification"," sent to the ",[35,110,111],{},"assigned team members",". Recipients are resolved when the node runs, so placing the assignment above the notification is what makes the newly assigned member receive it.",[10,114,116],{"id":115},"drafts","Drafts",[15,118,119,120,123],{},"Your work is never lost to a validation error. When you save a workflow that isn't complete — no trigger yet, a node left unconfigured, no action, or any other structural problem — it is saved as a ",[19,121,122],{},"draft"," rather than rejected.",[15,125,126,127,130,131,134],{},"A draft keeps everything you built exactly as it is, shows a ",[19,128,129],{},"Draft"," badge in the list, and ",[19,132,133],{},"never runs",". The editor lists what's left to finish so you know how to publish it.",[15,136,137,140,141,144],{},[19,138,139],{},"Enabling"," a workflow (turning it on) requires a fully valid graph, and that check runs both in the editor and on the server: a draft cannot be enabled until it's complete. If you edit an ",[19,142,143],{},"enabled"," workflow in a way that makes it invalid, it drops back to a draft (and stops running) instead of staying live but broken — so a workflow that is on is always one that actually works.",[10,146,148],{"id":147},"automations-can-trigger-each-other","Automations can trigger each other",[15,150,151,152,155,156,159],{},"An action can set off other workflows: a message a workflow posts, or a status it changes, is an event just like any other, so a workflow that reacts to it will run. This lets you compose behavior across workflows — for example, ",[35,153,154],{},"On status changed → Post message",", then ",[35,157,158],{},"On chat message → …"," reacting to that message.",[15,161,162,163,166],{},"To keep a chain from running forever, everything set off by one original event runs as a single ",[19,164,165],{},"chain",", watched by three safeguards:",[168,169,170,183],"table",{},[171,172,173],"thead",{},[174,175,176,180],"tr",{},[177,178,179],"th",{},"Safeguard",[177,181,182],{},"Limit",[184,185,186,195,203],"tbody",{},[174,187,188,192],{},[189,190,191],"td",{},"Identical step repeated in a chain",[189,193,194],{},"Stopped the second time",[174,196,197,200],{},[189,198,199],{},"Actions in one chain",[189,201,202],{},"100",[174,204,205,208],{},[189,206,207],{},"Node steps in a single run",[189,209,210],{},"200",[65,212,213,239,246],{},[68,214,215,216,219,220,223,224,227,228,231,232,235,236,238],{},"A workflow runs ",[19,217,218],{},"at most once per identical step in a chain",". A step is the same when the ",[35,221,222],{},"same workflow"," reacts to the ",[35,225,226],{},"same kind of event with the same meaningful data"," and performs the ",[35,229,230],{},"same actions",". If a chain would repeat that exact step (the classic A → B → A loop), it is stopped instead. A workflow reacting to genuinely ",[19,233,234],{},"different"," data — for example the ticket moving to a ",[35,237,234],{}," status later in the chain — is a legitimate new step and still runs.",[68,240,241,242,245],{},"A chain can run ",[19,243,244],{},"at most 100 actions"," in total. This also bounds a chain whose data keeps changing every step (which the repeat check cannot catch): it is stopped when it reaches the limit.",[68,247,248,249,252],{},"A single run can execute ",[19,250,251],{},"at most 200 node steps",". Branching out and re-converging multiplies the paths through a workflow, so one run's total work is capped too.",[15,254,255,256,259],{},"A stopped step is recorded in the run history as ",[19,257,258],{},"Loop stopped",", with the reason, so you can spot and fix a workflow that loops. Nothing is lost: the steps that ran before the safeguard tripped still took effect.",[15,261,262,263,268],{},"One case still does not start a chain: a ",[264,265,267],"a",{"href":266},"\u002Fdocumentation\u002Fautomations\u002Ftriggers#status-changed","closure requested from the portal"," never triggers workflows, so nothing an automation does can be set off by it.",{"title":270,"searchDepth":271,"depth":271,"links":272},"",2,[273,274,275,276],{"id":12,"depth":271,"text":13},{"id":51,"depth":271,"text":52},{"id":115,"depth":271,"text":116},{"id":147,"depth":271,"text":148},"automations","The rules a workflow graph must follow, the order branches run in, how drafts keep unfinished work, and what happens when automations trigger each other.","md",{},true,6,"\u002Fdocumentation\u002Fautomations\u002Fbuilding-workflows",{"title":5,"description":278},"documentation\u002Fautomations\u002Fbuilding-workflows","2026-08-31","AhAQ0E73N0XwlrTP_bE4uasTu7qG4G3WXvej7gSxPBc",[289,293,296,301,305,308,312,316,320,324,328,331,334,337,340,343,347,350,354,357,360,363,367,370,373,377,380,381],{"title":290,"path":291,"category":292,"order":292},"Customer portal","\u002Fdocumentation\u002Fportal\u002Foverview",null,{"title":294,"path":295,"category":292,"order":292},"Ticket lifecycle","\u002Fdocumentation\u002Ftickets\u002Flifecycle",{"title":297,"path":298,"category":299,"order":300},"Account & security","\u002Fdocumentation\u002Faccount\u002Fsecurity","account",1,{"title":302,"path":303,"category":304,"order":300},"AI assistant","\u002Fdocumentation\u002Fai\u002Fassistant","ai",{"title":306,"path":307,"category":277,"order":300},"Automation workflows","\u002Fdocumentation\u002Fautomations\u002Foverview",{"title":309,"path":310,"category":311,"order":300},"CSAT surveys","\u002Fdocumentation\u002Fcsat","csat",{"title":313,"path":314,"category":315,"order":300},"Getting started","\u002Fdocumentation\u002Fgetting-started","getting-started",{"title":317,"path":318,"category":319,"order":300},"Tebex integration","\u002Fdocumentation\u002Fintegrations\u002Ftebex","integrations",{"title":321,"path":322,"category":323,"order":300},"Roles & permissions","\u002Fdocumentation\u002Fteam\u002Froles-permissions","team",{"title":325,"path":326,"category":327,"order":300},"Ticket statuses","\u002Fdocumentation\u002Ftickets\u002Fstatuses","tickets",{"title":329,"path":330,"category":299,"order":271},"Notifications","\u002Fdocumentation\u002Faccount\u002Fnotifications",{"title":332,"path":333,"category":304,"order":271},"AI knowledge base","\u002Fdocumentation\u002Fai\u002Fknowledge",{"title":335,"path":336,"category":277,"order":271},"Triggers","\u002Fdocumentation\u002Fautomations\u002Ftriggers",{"title":338,"path":339,"category":319,"order":271},"Discord integration","\u002Fdocumentation\u002Fintegrations\u002Fdiscord",{"title":341,"path":342,"category":315,"order":271},"Plans & limits","\u002Fdocumentation\u002Fplans-limits",{"title":344,"path":345,"category":346,"order":271},"Portal customization","\u002Fdocumentation\u002Fportal\u002Fbranding","portal",{"title":348,"path":349,"category":323,"order":271},"Members & invitations","\u002Fdocumentation\u002Fteam\u002Fmembers-invitations",{"title":351,"path":352,"category":304,"order":353},"Writing AI-ready documentation","\u002Fdocumentation\u002Fai\u002Fwriting-ai-ready-docs",3,{"title":355,"path":356,"category":277,"order":353},"Conditions","\u002Fdocumentation\u002Fautomations\u002Fconditions",{"title":358,"path":359,"category":319,"order":353},"GitHub integration","\u002Fdocumentation\u002Fintegrations\u002Fgithub",{"title":361,"path":362,"category":327,"order":353},"Messages & conversation","\u002Fdocumentation\u002Ftickets\u002Fmessages",{"title":364,"path":365,"category":277,"order":366},"Actions","\u002Fdocumentation\u002Fautomations\u002Factions",4,{"title":368,"path":369,"category":319,"order":366},"Tebex keys & security","\u002Fdocumentation\u002Fintegrations\u002Ftebex-keys",{"title":371,"path":372,"category":327,"order":366},"Configuring the ticket form","\u002Fdocumentation\u002Ftickets\u002Fconfiguration",{"title":374,"path":375,"category":277,"order":376},"Placeholders","\u002Fdocumentation\u002Fautomations\u002Fplaceholders",5,{"title":378,"path":379,"category":319,"order":376},"Self-hosted Tebex Bridge","\u002Fdocumentation\u002Fintegrations\u002Ftebex-bridge",{"title":5,"path":283,"category":277,"order":282},{"title":382,"path":383,"category":277,"order":384},"Runs and quota","\u002Fdocumentation\u002Fautomations\u002Fruns-and-quota",7]