Multi-Level and Batch Approvals: Approval For Each and Row-Level Decisions
What it is
Workflows's Approval For Each feature (also called batch approval) transforms a single Task node into a powerful bulk-decision screen. Instead of one person approving or rejecting the entire workflow in a single action, the assignee sees every row of a dataset — for example, every attendance record, expense line, or purchase request — and makes an individual decision (Approve, Reject, Hold) on each one.
When your process requires multiple levels of review on the same dataset — for example, a supervisor approves first, then a finance manager reviews the same rows — you chain Task nodes, and each level automatically sees only the rows that are ready for its turn. Each decision is recorded per row, and a complete audit trail is preserved in the Batch Decision Screen (see Batch Decision Screen).
Why it's useful / Key benefits
- Process hundreds of items in a single screen — no need to trigger a separate workflow instance per item. One task covers the entire dataset.
- Row-level accountability — each item in the table gets its own decision, comment, and timestamp. Auditors can see exactly which items were approved, rejected, or held, and by whom.
- Multi-level chains on the same data — level 1 approves first, level 2 sees only the rows that passed level 1, and so on. No manual coordination required between levels.
- Decisions are stored and queryable — the result of every batch decision is written to a structured table that downstream workflow steps can query, filter, or export.
- Full conversation thread — any comments the assignee leaves on a row are stored in a chat-like thread that subsequent approvers can read.
- Audit export in one click — the Batch Decision Screen lets any stakeholder export the full row-level decision log as a CSV file for compliance or reporting.
Before you start
- You need the workflow open in Edit mode in the Visual Designer. See Designing Task Steps for the basics of Task nodes.
- The data you want to approve row-by-row must be accessible — either as a query in your internal apps (Applications) or as the output of a previous Task node's batch approval.
- For query-based batch approval (the most common setup), you need to know which Applications workspace, application, page, and query name holds the data.
- For chaining multiple levels, the first level's Task node must already be configured with Approval For Each enabled before you set up the second level.
How to use it — step by step
Part A — Configure a Task node for batch (row-level) approval
-
Open the Task node properties (double-click the Task node on the canvas).
-
Click the Form tab, where the Approval For Each section appears.
-
Find the Approval For Each toggle and turn it on.
Prerequisites: Approval For Each is available only on Enterprise plans and only when the task's Category (also on the Form tab) is set to Approval. If you do not see the toggle, check both conditions.
-
Under Data Source, choose one of two modes:
- Query — the dataset comes from a live query in your internal apps (Applications). This is the right choice for the first approval level when you want to pull data from a database directly.
- Previous Tasks — the dataset comes from the decisions recorded by an earlier batch-approval Task node in the same workflow. Use this for levels 2 and above.
If you selected Query:
-
Click Select Workspace and choose the workspace that contains the data.
-
Click Select Application and choose the application within that workspace.
-
Click Select Page and choose the specific app page whose query you want to use.
-
Click Select Query and choose the query that returns the dataset (for example,
GetAttendanceLogsorGetExpenseLines).When you select the query, Workflows checks whether an approval table for this dataset already exists. If not, you are prompted to confirm creating one. Click Create Approval Table to proceed. A confirmation dialog shows the table name and the number of rows imported.
-
Set the Approval Level to 1 for the first level in the chain.
If you selected Previous Tasks:
- A list of earlier Task nodes in the same workflow that have batch approval enabled appears.
- Select the Task node(s) whose decisions you want this level to receive. You can select multiple task-action pairs (for example, "Level 1 Review — Approved" and "Level 1 Review — Partially Approved").
- Set the Approval Level to 2 (or the appropriate level number for this step in your chain).
- Click Save Task to save the configuration.
Part B — Connect the Task node's outgoing edges
- Back on the canvas, draw edges from the Task node to the next step in the workflow, one for each action outcome (for example, "Complete," "Reject").
- When the dialog asks which outcome each edge represents, select the appropriate action. These edges define where the workflow goes after the assignee submits their batch decisions.
Part C — Add a second approval level (multi-level chain)
- Add another Task node to the canvas after the first one.
- Open its properties, go to Advanced → Approval For Each, and turn it on.
- Set Data Source to Previous Tasks.
- Select the first Task node and the action(s) whose rows should flow forward (for example, select the "Approve" action from Level 1 — this means only rows that Level 1 approved will appear for Level 2).
- Set Approval Level to 2.
- Configure the title, assignee, and action buttons for Level 2 as needed (see Designing Task Steps).
- Click Save Task and connect the edges.
What the assignee sees at run time
When the workflow reaches a batch-approval Task node and the assignee opens the Workflow Task Manager, they see:
- A data table with one row per item in the dataset.
- For each row: all relevant data columns, plus action buttons (for example, Approve / Reject / Hold) at the row level.
- A comment field per row (optional or required depending on your action button configuration).
- After acting on all rows, a Submit button that sends all decisions at once.
The table is filterable and sortable so the assignee can focus on specific subsets (for example, only high-value rows). After submission, the workflow advances and the decisions are stored for the next level or for audit purposes.
Options & settings explained
| Setting | What it does |
|---|---|
| Approval For Each (toggle) | Switches this Task node from a single-decision task to a row-level batch-decision task. |
| Data Source — Query | Pulls the dataset from a live query in your internal apps. Used for the first approval level. |
| Data Source — Previous Tasks | Pulls the dataset from the decisions recorded by an earlier batch-approval Task node. Used for level 2+. |
| Select Workspace | (Query mode) The workspace in your internal apps that holds the data. |
| Select Application | (Query mode) The application within the workspace. |
| Select Page | (Query mode) The page within the application that contains the query. |
| Select Query | (Query mode) The named query that returns the rows to approve. |
| Approval Level | Sets the numeric level of this node in a multi-level chain (1, 2, 3, …). Controls which rows are visible at run time — level 2 only sees rows approved at level 1. |
| Selected Task Nodes | (Previous Tasks mode) The earlier Task nodes and specific actions whose output rows flow into this level. Multiple pairs can be selected. |
How row visibility works across levels
| Level | Rows shown to the assignee |
|---|---|
| Level 1 | All rows where status is pending (not yet acted on). |
| Level 2 | Only rows where level 1 is complete (approved or the specific action you configured) and level 2 is still pending. |
| Level N | Only rows where all preceding levels are complete and this level is still pending. |
This automatic filtering means each approver sees only what is relevant to their level — no configuration overhead per run.
Tips & best practices
- Name your Task nodes clearly in the designer. In a multi-level chain, labels like "Level 1 — Supervisor Approval" and "Level 2 — Finance Approval" make it much easier to select the right source node when configuring level 2+.
- Keep query data fresh. Approval For Each runs the query at the time the task is created. If the underlying data changes after the task is created, the assignee sees the snapshot from creation time. Design your process accordingly.
- Use "Requires Comment" on rejection actions. For compliance, you almost always want a comment when a row is rejected. Enable this on the Reject action button (see Designing Task Steps) so the assignee must type a reason.
- Limit the number of levels. Two or three levels is the practical maximum for most business processes. More levels compound delay — consider whether some levels can be combined or automated with an AI Agent node (see AI Agent Node).
- Review the Batch Decision Screen after each approval. After a level completes, open the Batch Decision Screen for that batch to verify the decisions look correct before the next level begins (see Batch Decision Screen).
- Export the CSV early for large datasets. The Export CSV button on the Batch Decision Screen produces a complete row-level audit export. Download it as soon as a level completes and store it for compliance.
Frequently asked questions
Q: Can I use a regular Task node and an Approval For Each Task node in the same workflow? Yes. Mix and match freely. Approval For Each is just a setting on individual Task nodes. Other Task nodes in the same workflow behave normally.
Q: What happens if level 1 rejects a row but level 2 is configured to receive "any" action from level 1? The behavior depends on which action(s) you selected when configuring the Previous Tasks source for level 2. If you selected only the "Approve" action from level 1, rejected rows do not flow to level 2. If you selected "All" or included "Reject," they do flow forward. Design your action selection carefully.
Q: Can the same person be the assignee at both level 1 and level 2? Yes, there is no restriction. However, this defeats the purpose of a multi-level review. Best practice is to assign different roles or individuals to different levels.
Q: The task shows zero rows. What is wrong? Common causes: (1) the query returned no data at the time the task was created — check whether the source table has records with pending status; (2) the level 2 node is looking at level 1 decisions but level 1 has not been submitted yet — the second level task should only be created after level 1 completes; (3) the wrong query or previous task was selected. Check Workflow Database for details (see Workflow Database).
Q: Can I add a fourth or fifth approval level? Yes. Add another Task node, set Data Source to Previous Tasks, select the appropriate level 3 node and action, and set Approval Level to 4. There is no hard limit on the number of levels.
Q: What happens to the batch data after all levels are complete? The decisions (action, comment, timestamp, user) for every row at every level are stored in the approval table in the workflow database. Downstream steps can query this table via a DB Query node, or you can export the full history from the Batch Decision Screen.
