Workflows
Last updated: March 2026
Automate business processes with a visual node-based workflow builder. Workflows react to data changes, execute multi-step logic, generate documents, send emails, and integrate with external services - all without writing code.
On this page
What Are Workflows
Workflows are automated sequences of actions that run in response to data events or manual triggers. Each workflow belongs to a specific Entity and operates on its entries. When a trigger fires - for example, a new contact is created or an order is updated - the workflow engine walks through a directed graph of nodes, executing each step in order.
The workflow builder uses a visual canvas powered by React Flow. You drag nodes onto the canvas, connect them with edges, and configure each node through a side panel. The result is a clear, readable map of your business logic that anyone on the team can understand and maintain.
Workflows support branching with conditional logic, looping over lists, querying and mutating data across entities, generating PDF documents from templates, sending emails, and making HTTP requests to external APIs. Every execution is logged with per-node timing and input/output snapshots, giving you full visibility into what happened and why.
Each workflow has an active/inactive toggle. Deactivate a workflow to pause it without deleting its configuration - useful during testing or when you need to temporarily stop automation.
Building a Workflow
Creating a workflow involves choosing a trigger, adding nodes to the canvas, connecting them with edges, and configuring each node. Follow these steps to build your first workflow.
Create a new workflow
Navigate to Designer > Entities, select the entity you want to automate, and open the Workflows tab. Click "New Workflow" and give it a descriptive name (e.g., "Send welcome email on contact creation").
Choose a trigger
Every workflow starts with a Trigger node. Select the trigger type that determines when the workflow runs: BEFORE_CREATE, AFTER_CREATE, BEFORE_UPDATE, AFTER_UPDATE, BEFORE_DELETE, AFTER_DELETE, or MANUAL. You can optionally scope the trigger to a specific application using the triggerAppContext setting.
Add nodes to the canvas
Right-click the canvas or use the toolbar to open the node palette. Nodes are organized by category: Control Flow, Data Manipulation, Entity Operations, Generation, External, and Utility. Drag nodes onto the canvas to add them.
Connect nodes with edges
Drag from an output handle on one node to an input handle on another to create a connection. Edges define the execution order. For conditional nodes like If Condition, you get separate output handles for the "true" and "false" branches. Edges are deletable - click an edge and press Delete to remove it.
Configure each node
Click a node to open its configuration panel. Each node type has specific settings - for example, Set Field requires a field name and value expression, while Send Email requires a template selection and recipient. Use the expression input to reference dynamic values from earlier nodes or the trigger entry.
Set workflow options
Open the workflow settings to configure stopOnError (halt the workflow if any node fails) and timeout (maximum execution time in milliseconds). Set the workflow order to control execution priority when multiple workflows share the same trigger.
Activate the workflow
Toggle the workflow to "Active" to enable it. Inactive workflows are saved but will not fire on trigger events. You can test the workflow with sample data before activating it in production.
Use the code editor view (toggle in the toolbar) to inspect or edit the raw workflow definition as JSON. This is useful for copying workflows between entities or making bulk edits to node configurations.
Triggers Reference
The trigger determines when a workflow executes. "Before" triggers run synchronously before the database operation commits, allowing you to validate or transform data before it is saved. "After" triggers run asynchronously after the operation has completed, making them ideal for side effects like sending notifications or syncing external systems. Manual triggers run only when explicitly invoked by a user or API call.
You can further narrow when a trigger fires by setting a triggerAppContext. When configured, the workflow only executes if the data operation originated from the specified application, letting you apply different automation rules depending on where the action took place.
| Trigger | Timing | Use Cases |
|---|---|---|
| BEFORE_CREATE | Before a new entry is saved | Validate required fields, auto-fill defaults, enforce naming conventions, generate sequential codes |
| BEFORE_UPDATE | Before an existing entry is saved | Validate transitions (e.g., status changes), prevent unauthorized field edits, compute derived values |
| AFTER_CREATE | After a new entry is committed | Send welcome emails, create related entries, notify team channels, sync to external CRM |
| AFTER_UPDATE | After an existing entry is committed | Trigger follow-up tasks, update dashboards, send change notifications, recalculate aggregates |
| BEFORE_DELETE | Before an entry is removed | Check for dependent records, archive data before deletion, enforce delete restrictions |
| AFTER_DELETE | After an entry is removed | Clean up related data, notify stakeholders, update counters, sync deletion to external systems |
| MANUAL | On-demand via user action or API | Bulk operations, data migration, on-demand report generation, ad-hoc email campaigns |
BEFORE triggers block the save operation until the workflow completes. Keep them fast and focused on validation or transformation. Long-running work like HTTP requests or PDF generation should use AFTER triggers instead.
Node Types Reference
Nodes are the building blocks of a workflow. Each node performs a specific action and passes its output to the next connected node. Nodes are organized into six categories based on their function.
| Category | Node | Description |
|---|---|---|
| Control Flow | Trigger | The starting point of every workflow. Defines the event that initiates execution and provides the entry data to downstream nodes. |
| Control Flow | If Condition | Evaluates a condition and branches execution into "true" and "false" paths. Supports compound conditions with AND/OR logic and a full set of comparison operators. |
| Control Flow | Stop | Halts workflow execution immediately. Use after a failed validation in a BEFORE trigger to prevent the save, or to exit early from a branch. |
| Control Flow | Loop | Iterates over a list (e.g., query results or a multi-select field) and executes connected nodes once per item. The current item is available as a variable inside the loop body. |
| Data Manipulation | Set Field | Sets a single field value on the current entry or a variable. Accepts static values or dynamic expressions referencing other fields and node outputs. |
| Data Manipulation | Calculate | Evaluates a mathematical or string expression and stores the result in a variable. Supports arithmetic operators, string concatenation, and built-in functions. |
| Data Manipulation | Transform | Modifies multiple fields on the current entry in a single step. Useful for bulk transformations like normalizing data formats or computing several derived fields at once. |
| Entity Operations | Create Entry | Creates a new entry in any entity. Map fields using static values or expressions. Returns the created entry so subsequent nodes can reference its ID and fields. |
| Entity Operations | Update Entry | Updates an existing entry in any entity by ID. Specify which fields to change using expressions. Only the provided fields are modified; others are left untouched. |
| Entity Operations | Query Entries | Retrieves entries from any entity using filter conditions. Returns a list of matching entries that can be passed to a Loop node or used in expressions. |
| Entity Operations | Delete Entry | Deletes an entry from any entity by ID. Use with caution - combine with a Query node and conditions to target the correct records. |
| Generation | Generate PDF | Generates a PDF document from a pre-configured PDF template. The template receives the current entry data and any additional variables you provide. The generated file is attached to the entry or stored in the media library. |
| Generation | Send Email | Sends an email using an email template. Supports two modes: SEND (delivers the email immediately and automatically) and REVIEW (creates a draft in the mail inbox for manual review before sending). Recipients, subject, and body are populated from the template with dynamic data substitution. |
| External | HTTP Request | Makes an HTTP request to an external API. Configure the method (GET, POST, PUT, PATCH, DELETE), URL, headers, and body. The response is available to downstream nodes for further processing. |
| Utility | Log | Writes a debug message to the execution log. Accepts an expression so you can log variable values, entry fields, or node outputs. Useful during development and troubleshooting. |
Nodes can be rearranged freely on the canvas - their position is visual only. Execution order is determined entirely by edge connections, starting from the Trigger node.
Conditions & Branching
The If Condition node is the primary tool for branching logic. It evaluates one or more conditions against entry fields, variables, or node outputs and routes execution down the "true" or "false" path accordingly.
Each condition consists of three parts: a left operand (the field or expression to evaluate), an operator, and a right operand (the comparison value). Multiple conditions can be combined using AND logic (all conditions must be true) or OR logic (at least one condition must be true).
You can nest branching by chaining multiple If Condition nodes in sequence, creating complex decision trees. For example, you might first check if a deal status changed to "Won", then branch again based on the deal value to apply different follow-up workflows.
| Operator | Description | Example |
|---|---|---|
| equals | Exact match (case-sensitive) | status equals "active" |
| not_equals | Not an exact match | role not_equals "admin" |
| contains | String includes substring | email contains "@company.com" |
| not_contains | String does not include substring | name not_contains "test" |
| starts_with | String begins with value | code starts_with "INV-" |
| ends_with | String ends with value | filename ends_with ".pdf" |
| greater_than | Numeric greater than | amount greater_than 1000 |
| greater_than_or_equal | Numeric greater than or equal | quantity greater_than_or_equal 1 |
| less_than | Numeric less than | discount less_than 50 |
| less_than_or_equal | Numeric less than or equal | age less_than_or_equal 65 |
| in | Value is in a list | country in ["FR","DE","ES"] |
| not_in | Value is not in a list | status not_in ["archived","deleted"] |
| exists | Field has a non-null value | assignee exists |
| not_exists | Field is null or undefined | completedAt not_exists |
| is_empty | Field is empty string or empty array | tags is_empty |
| is_not_empty | Field has content | description is_not_empty |
Use the "exists" and "not_exists" operators to guard against null values before performing comparisons. This prevents unexpected behavior when optional fields are not set.
Testing & Debugging
Webooto provides several tools to help you test workflows before they run in production and debug issues when they arise.
The test workflow feature lets you run a workflow with sample data without triggering it from an actual data event. You provide a mock entry payload, and the engine executes the full node graph, reporting the result of each step. This is the safest way to verify your logic before activating a workflow.
The debug overlay displays execution trace information directly on the canvas. After a test run or a real execution, each node shows its status (success, failure, or skipped), execution time, and a summary of its input and output data. This visual feedback makes it easy to identify exactly where a workflow diverged from your expectations.
For advanced users, the code editor view shows the raw workflow definition. You can inspect node configurations, expression syntax, and edge connections in a structured format. This is particularly helpful when troubleshooting complex expressions or when you need to compare two workflow versions.
Open the test runner
In the workflow builder toolbar, click the "Test" button. A panel opens where you can provide sample entry data in JSON format or select an existing entry from the entity.
Run the test
Click "Run" to execute the workflow with your sample data. The engine processes each node in order and collects execution traces. The canvas updates in real time to show progress.
Review the debug overlay
After execution, each node on the canvas displays a status badge. Click any node to see its detailed trace: input data, output data, execution duration, and any error messages. Green indicates success, red indicates failure, and gray indicates the node was skipped.
Fix and re-run
If a node failed, update its configuration and run the test again. You do not need to deactivate or save the workflow between test runs - the test runner always uses the current canvas state.
Test executions are recorded in the execution history just like real runs, but they are tagged as "test" so you can distinguish them from production executions.
Execution History & Analytics
Every workflow execution is recorded with a comprehensive trace. The execution history gives you a chronological log of all runs for a workflow, including the trigger event, the entry that was processed, the overall result, and detailed per-node traces.
Each execution record includes per-node information: the status of each node (success, failure, or skipped), its execution time in milliseconds, and snapshots of the input and output data at that step. This level of detail lets you reconstruct exactly what happened during any run, making root-cause analysis straightforward.
The analytics dashboard provides aggregate statistics across all executions of a workflow. At a glance, you can see the total number of executions, the count of successes and failures, the overall success rate, the average execution time, and the number of executions in the last 24 hours. Use these metrics to identify unreliable workflows, spot performance regressions, and track automation ROI.
When a workflow execution fails, you can replay it directly from the execution log. The replay feature re-runs the workflow using the original trigger data and entry state, which is invaluable for transient errors like temporary API outages or rate-limit hits.
| Metric | Description |
|---|---|
| Total executions | The cumulative number of times the workflow has run since creation. |
| Success count | The number of executions that completed all nodes without errors. |
| Failure count | The number of executions where at least one node encountered an error. |
| Success rate | The percentage of executions that completed successfully (successes / total). |
| Avg execution time | The mean duration across all executions, measured in milliseconds. |
| Recent 24h count | The number of executions that occurred in the last 24 hours. |
Set up a monitoring workflow that queries the execution stats of your critical workflows and sends an alert email when the success rate drops below a threshold.
Related documentation
Entities & Data
Learn how to define entities, fields, and relations - the data model that workflows operate on.
AI Agents
Combine workflows with AI agents for intelligent automation that adapts to context.
PDF Templates
Design PDF templates used by the Generate PDF workflow node to produce documents automatically.
Applications
Scope workflows to specific applications using triggerAppContext for context-aware automation.