# Vendor workflows & approvals

Every vendor's bills follow a workflow you can see as a chart. Workflows are rows that are never edited in place: they move proposed → active → superseded (or declined), and a bill keeps the workflow version it arrived under, so changing a workflow never changes a bill already on its way.

## Step types

| Step | What it does |
| --- | --- |
| `approve` | Named people (or anyone) sign off; one of them or all of them. Can apply only above an amount. |
| `hold` | Wait a number of days after the previous step. |
| `wait_for` | Wait for something outside Payvy, e.g. `customer_funded` once your customer has paid for the job. |
| `pay` | Pay automatically, or wait for a person to release it. |

## Who can change a workflow

Agents can **propose** workflows; only a person can accept or decline one. That boundary is enforced by the server — person-only commands refuse agent keys, and agents don't even see those tools in `tools/list`. See [Agents & authority](https://docs.payvy.com/guide/agents-and-authority/).

## Where a bill stands

A bill's status is **derived, never stored**: evaluating its workflow over its approvals, signals and release gives its standing every time, and commands check that evaluated status before acting. Timed holds and external signals survive an agent disconnecting or a shift change — the work resumes from the record, not from anyone's memory.

## Example shapes

- **Standard approval** — invoice received → approved by a named person → released by you.
- **Wait for customer funding** — approved → held until a connected system verifies the customer paid → ready for release.
- **Approval + timed hold** — approved → 7-day hold completes → ready for release.

Try these in the [sample workflow on payvy.com](https://payvy.com/#demo) (design preview, sample data).

:::note[Planned]
The visual workflow builder in the web app is still being built. Today, workflows are managed through the API, MCP and CLI.
:::