Advanced Workflow Patterns
Common ways to combine FormWise nodes into branching, conditional, and concurrent workflows.
Advanced Workflow Patterns
Once you're comfortable with the workflow builder and the node types, the real power comes from combining nodes into patterns that solve specific problems. This page walks through the patterns we see most often.
Each pattern below describes:
- The goal you're trying to hit
- Which nodes you'll use
- How to wire them together
- A tip to keep things sane
Routing user intent to specialized agents
Goal - Different kinds of requests get handled by different Agent nodes. A customer who says "I want to upgrade" goes to a sales Agent node; someone who says "I'm locked out" goes to a support Agent node.
Nodes - Start -> Classify -> multiple Agent branches
How to wire it:
- Drop a Classify node after Start.
- Define the categories you want to route to (e.g.,
sales,support,other). - Each category becomes its own output branch on the Classify node.
- Connect each branch to its own Agent node with a tailored system prompt.
[Screenshot: Classify node with three branches connecting to three agents]
Tip - Keep your category set small (3-5). More categories make classification flakier, not better.
Conditional branching on a value
Goal - Route based on a specific, predictable condition - not on AI understanding. For example, premium customers see one flow; free customers see another.
Nodes - Start -> (any nodes that produce the value) -> If/Else -> branches
How to wire it:
- Make sure the variable you want to branch on exists (either a form answer from Start or a value produced by an earlier node).
- Ask the Ask Assistant to add an If/Else node (it is not in the + menu), then reference that variable in the condition (e.g.,
workflow.plan === "premium"). - Add nodes inside each branch. The workflow follows the first branch whose condition is true, and the default Else branch catches anything that didn't match.
Tip - Use Classify when the input is fuzzy ("the user sounded angry"). Use If/Else when the input is exact ("the variable equals premium").
Storing and reusing data across steps
Goal - A value produced early in the workflow needs to be used later, in a node that doesn't directly connect to where it came from.
Nodes - Set State for writing, variable references for reading
How to wire it:
- After the node that produces the value, ask the Ask Assistant to add a Set State node that writes the value into a named variable (e.g.,
customer_email). - In any downstream node's settings, reference that variable as
{{state.customer_email}}. - The value is now available anywhere later in the workflow.
See Variables and Data for the full mental model of how data flows.
Tip - Use clear variable names.
result_2will haunt you in three weeks.extracted_emailwill not.
Running steps concurrently
Goal - Two or more things can happen at the same time and they don't depend on each other. Run them in parallel and shave latency.
Nodes - Parallel (labeled Multi Run in the node picker) -> branches
How to wire it:
- Add a Multi Run node where the workflow needs to split.
- Add the nodes for each independent branch inside its branch lane. Add more branches in the node's settings if you need them.
- Add the next step after the Multi Run node. The workflow waits for every branch to finish before continuing, and later nodes can read each branch's outputs.
Classic uses:
- Generate a title, an outline, and an image prompt all at once.
- Call three different APIs at the same time.
- Run a "fact check" agent in parallel with the main answer agent.
Tip - Parallel only helps if branches don't depend on each other. If branch B needs branch A's output, you're not parallel - you're sequential.
Calling external services mid-workflow
Goal - The workflow needs data from (or wants to push data to) something outside FormWise - your CRM, a Sheets doc, a webhook into another system.
Nodes - Webhook, plus connected integrations like MCP servers or Composio for action catalogs.
How to wire it:
- For a one-off external call: use the Webhook node. Set the URL and pick what to include in the payload, or switch to Advanced to set the method, headers, and body yourself. Reference workflow variables with @.
- For an Agent node that should call an external service mid-conversation (e.g., "look up this user, then answer"): enable the right MCP server or Composio toolkit in the Agent node settings. The model decides when to call.
Tip - Webhook nodes run in the workflow. MCP/Composio tools run inside an Agent node when the model chooses to. Pick the one that matches who's making the decision.
Combining patterns
Real workflows combine several of the above:
Start
-> Classify (sales / support / other)
sales -> Agent (sales) -> Webhook (notify CRM)
support -> Multi Run
-> Agent (fetch order)
-> Agent (check warranty)
-> Agent (compose reply)
other -> Agent (general)Don't be afraid to build long, branching flows - they're easier to reason about than one giant Agent node doing everything.
Debugging a workflow
When a workflow doesn't behave the way you expected:
- Open Execution History and find the run. You'll see each node's inputs and outputs.
- Look at the first node that produced something surprising. That's usually where the issue is.
- For Agent nodes, check the system prompt and the actual variables passed in. Most issues are "the Agent node didn't see the variable I thought it did."
- For Classify nodes, look at the input - is it clear enough for the model to bucket it?
- Re-run the same input from the live preview on the Design tab to iterate quickly, and hover each node afterward to see its inputs and outputs. See Testing and Quality for setting up repeatable test cases.