Workflows
Automate a repeatable process with steps that call out, wait, re-check your data, and ask a person to decide.
A Workflow runs a process you repeat: a new lead comes in, Busabase scores it, tells your CRM, waits a day, checks the lead again, and asks your sales lead to approve the handover. You draw the steps once, and each run goes through them on the server. Nobody has to keep a tab open.

Build a workflow
Create it
Press + in the sidebar and choose Workflow. If it isn't listed, open More types.
Add steps and connect them
Add steps with + in the workflow's toolbar, then drag from one step to the next. Select a step to set it up under Configure.
Save
Press Save. Runs always use the last saved version, so starting a run is blocked while you have unsaved changes.
What each step does
| Step | What it does | Connections out |
|---|---|---|
| Trigger | Where a run starts. It reads the record the run is about, if there is one. | One |
| Function | Runs a saved webhook rule whose action is Run function. Its return value stays on the step. | success |
| Webhook | Sends one HTTP request with the run's data as a JSON body (GET sends no body). The response becomes the step's output. | success |
| Condition | Checks an expression and takes one of two paths. | true, false |
| Wait | Pauses the run for minutes, hours, or days. The pause survives restarts and deployments. | elapsed |
| Action | Reads the record again, or updates, creates, or deletes one. See Change records. | success |
| Approval | Pauses until someone approves or rejects. | approved, rejected |
| End | Finishes the run with an outcome. | None |
A connection's Outcome decides when it is followed. A run never visits the same step twice, and it stops with an error after 64 steps.
Use earlier results in a condition
A condition can read the step right before it as input, and any earlier step through its reference. Select a step and Use this step in formulas as shows what to write, with a button to copy it:
input.status == 200 && steps.score.score >= 80&& and || stop as soon as the answer is known, and a value that is missing counts as null, so input.body && input.body.ok is safe. Use brackets for names that are not plain words: fields["follow-up"], items[0].
Does a Wait see the latest data?
Only if you ask it to. Every finished step keeps a snapshot of what it saw, so steps.trigger still shows the record as it was when the run began. To work with current values, put an Action step set to Read the record again after the Wait. It reloads the record, and the next step sees it as input.record.
Change records
An Action step can change your data. Choose what it does from the list:
| Action | What it does | Settings |
|---|---|---|
| Update a record | Sets fields on a record. | Record (optional), Fields to set |
| Create a record | Adds a record to a Base. Later steps get its id as createdRecordId on this step. | Base, Fields to set |
| Delete a record | Moves a record to its Base's trash, where it can be restored. | Record (optional) |

Record is the run's own record when left empty. It can also be a record ID, or a formula such as =steps.add.createdRecordId to change the record an earlier step created.
Fields to set is a JSON object:
{ "status": "qualified", "score": "=steps.score.score" }- Use a field's name or slug as the key. Plain values are stored as written.
- A text value that starts with
=is a formula over earlier steps. Start with==to store text that itself begins with=. - A formula that finds nothing fails the step, so a typo never blanks a field or changes the wrong record.
What else to expect:
- The step acts as the person the run acts as, with their access to that Base. If they can edit it, the change applies right away. If they can only propose changes, it goes to the Inbox for review, nothing changes yet, and the step fails and names the change request. With On error set to Continue, the run goes on.
- A change a step applies starts no workflow, including workflows listening to another Base. So a workflow that updates the record it listens to cannot loop, and workflows cannot set each other off. Changes a person makes, or approves later, start workflows as usual.
- If a run deletes its own record, later steps carry on without one, except Read the record again, which fails.
Start a run
By hand. Open the Runs tab, or press the run button in the toolbar. You can pass a Record ID for the trigger to read, and Payload JSON for any extra data. Then press Start run.
When a record changes. Under Configure:
- Select the Trigger and choose When a record is created or When a record is updated.
- Pick a Base to limit it to, or leave it on all Bases.
- Set Execution mode to Event, then save.
Each matching change queues one run, and the scheduler starts it. Event runs act as the person who last saved the workflow in Event mode. If that person leaves the space, those runs fail and say why.
Other event names are labels only. They do not start runs by themselves. There is no time-based trigger yet.
Follow a run
The Runs tab lists the newest runs of this workflow, and Load older runs goes further back. Select a run to see each step in the order it ran, with what it saw and returned. The canvas marks the same steps as done, paused, or failed.
| Status | Meaning |
|---|---|
| Queued | Waiting to start or continue. It moves on its own, usually within a minute. |
| Running | Executing a step right now. |
| Waiting | Paused on a Wait. Continue now skips the rest of the time. |
| Needs approval | Paused on an Approval. |
| Completed | Reached an End step. |
| Failed | Stopped with an error. The reason is shown on the run. |
| Cancelled | Someone stopped it. The run shows who. |
Finished runs are kept for 90 days, then deleted. Runs that have not finished are never deleted.
Approvals

The Approver field decides who can approve or reject:
- Member emails, separated by commas: only those members and space admins can decide. They need read access to the workflow, but not edit access.
- No email (empty, or a name like "Sales lead"): anyone who can edit the workflow can decide. A name is just a label.
- Agents can't decide unless you turn on Let agents decide. See Let agents use workflows.
When a named approver who cannot edit the workflow decides, the run goes to Queued and the scheduler continues it with the access of the person who started it, so an approver's narrower access never changes what the later steps can do.
Workflow approvals live in the Runs tab and in notifications. They are separate from the Inbox, which is for Change Requests.
Cancel a run
Select a run that is Queued, Waiting, or Needs approval, then press Cancel run. A cancelled run cannot be continued, and steps that already ran are not undone.
A run that is executing a step cannot be cancelled until that step finishes, because a request already sent cannot be taken back.
If a bulk import queued more runs than you wanted, Cancel N queued runs at the top of the list stops all the queued ones at once. Runs that are executing a step or paused keep going.
Notifications
| When | Who hears about it |
|---|---|
| A run stops on an Approval that names people | Those people |
| A run stops on an Approval that names nobody | The person who started the run, and people subscribed to the workflow |
| A run fails | The person who started the run, and the workflow's creator |
You get an in-app notification and an email, and the link opens that run. Whoever is pressing the button at that moment is left out, because they can already see it. Bursts are rolled up: approvals into one message per workflow every 10 minutes, failures into one per hour. The open-source single-user app has no notifications, so check the Runs tab there.
Permissions
| To do this | You need |
|---|---|
| See runs and their step data | Read access to the workflow |
| Start, continue early, or cancel | Edit access to the workflow |
| Have a step update, create, or delete a record | What the person the run acts as may do in that Base: edit it directly, or propose a change |
| Approve or reject | Depends on the step, see Approvals |
Function and Webhook steps send data outside Busabase, and Action steps can change your data, which is why starting a run needs edit access. Anyone who can read the workflow can see each step's data, so don't put secrets in a payload.
Settings
Select nothing on the canvas (or scroll down under Configure) to change these for the whole workflow.
| Setting | What it does |
|---|---|
| Execution mode | Manual starts runs only by hand. Event also lets a record Trigger start them. |
| On error | Stop workflow fails the run when a Function or Webhook step fails. Continue records the error and follows the success path. |
| Concurrency | How many runs of this workflow can execute steps at the same time. Runs paused on a Wait or an Approval don't count. Extra runs queue and start when a slot frees up. With several servers, two starting at the same instant can briefly go one over. |
| Timeout (ms) | The longest a Function or Webhook step can take. A Webhook step never waits more than 30 seconds. |
Webhook steps send once and do not retry, because repeating a request is not always safe. Private and internal addresses are refused, including through redirects.
Let agents use workflows
Agents with an API key can use workflows through the REST API, MCP, and the CLI.
| Agents can | Needs |
|---|---|
| See runs and their step data | A key that can read the workflow |
| Start a run, or cancel one | A write-level key, and edit access to the workflow |
| Approve or reject | A step that allows it, see below |
Continuing a Wait early and cancelling everything queued stay in the app.
An approval is a person's decision by default. Select the step and turn on Let agents decide to allow an agent. Even then, the key must be write-level and its owner must meet the step's approver rule. The run records which key decided.
A run never outgrows the key that started it. It acts as the key's owner, limited by the key, and the run shows the key's name. Busabase checks the key again each time the run continues, so a run that is waiting stops with a clear error if you revoke the key or it expires, and it can't write if you lower the key's level.
Alerts about a run an agent started go to the key's owner too, because they aren't watching it happen.
Good to know
A run stays Queued for a long time. The workflow may be at its Concurrency, so the run is waiting for a slot. Otherwise check that the scheduler is running. It is built into self-hosted installs (configuration).
"The run was interrupted". The server stopped while a step was running. Busabase marks the run as failed instead of repeating the step, because a half-sent request must not silently run twice. Start it again.
"Could not continue as the person who started this run". That person has left the space or lost access to the workflow. Start a new run, or save the workflow in Event mode yourself so event runs act as you.
Approve and Reject don't appear. The step names other approvers, or you don't have edit access. The run tells you which rule applies.
The demo fails on Function and Webhook steps. The demo has no saved functions and sends no requests. Try those steps in your own space.
A formula fails on a step with a dash in its id. Write steps["step-a1b2c3d4"].status, not steps.step-a1b2c3d4.status. The step's Use this step in formulas as shows the right form.
See also: Node Types · Webhooks & Events · Change Requests