Approvals are where most Airtable operations bases quietly fall apart. A single Approved? checkbox works until someone asks who ticked it, when, on what version of the number, and what happens when that person is on holiday. This tutorial builds a proper approval workflow in Airtable: a status machine instead of a checkbox, multi-step sign-off with thresholds, escalation on delay, and an append-only audit trail you can hand to a finance lead or an auditor.
We will use purchase requests as the example, but the same shape fits contract sign-off, content approval, expense claims, discount requests, and change requests.
What you need
- A base with an
Approvalstable (we will call records "requests"). - A
Peopletable holding approvers, with anEmailfield and aManagerself-link. - Editor permission and the ability to create automations and interfaces.
Step 1: model the request
Fields on Approvals:
Request ID: autonumber or formula, so humans can quote it.Requester: link toPeople.Amount: currency.Category: single select.Justification: long text.Status: single select —Draft,Submitted,Manager review,Finance review,Approved,Rejected,Withdrawn.Current approver: link toPeople.Submitted at,Decided at: date with time.Decision note: long text.
Two rules make this robust. First, the status options are the only states the record may be in; no free text. Second, Current approver is a real link, not a name typed in, so automations and interface filters can use it and so you can roll up "open approvals per person".
Step 2: decide the routing rules before you build anything
Write the policy down in one paragraph and get it agreed. For example:
Requests under £1,000 need the requester's manager only. £1,000–£10,000 need manager then finance. Over £10,000 need manager, finance, and a director. Anything in category
Softwarealso needs IT regardless of amount.
Now encode the threshold in a formula field, Required steps:
IF(
{Amount} >= 10000, "Manager,Finance,Director",
IF({Amount} >= 1000, "Manager,Finance", "Manager")
)
Keeping the policy in one formula field rather than scattered across five automation conditions is the difference between a workflow you can change in a minute and one you have to reverse-engineer next year. When finance moves the threshold, you edit one formula.
Step 3: submission
Give requesters an Interface Designer form or a record-review page filtered to their own drafts, not the raw grid. The submit action sets Status to Submitted; everything after that is automation.
Automation 1 — Route on submit:
- Trigger: When record matches conditions —
StatusisSubmitted. - Action: Find records in
Peoplewhere the requester's manager matches, or read the requester'sManagerlink directly via a lookup fieldRequester manager. - Action: Update record — set
Current approverto the manager,StatustoManager review,Submitted atto now. - Action: Send email (or Slack/Teams message) to the approver with the request details and a link to the approval interface.
Add a lookup field Requester manager on Approvals so the automation does not need a search step. Lookups are free and instant; find-record steps are neither.
Step 4: the decision, without giving everyone edit rights on the grid
Approvers should not be browsing the table. Build one Interface Designer page, My approvals, with a record list filtered to Current approver is current user, and buttons for Approve and Reject that write to a helper field, Decision, a single select with Approve / Reject, plus Decision note.
That filter — "current user" — is what makes a single interface page work for thirty approvers. Combine it with interface-level permissions so approvers cannot open the underlying base. If your plan does not offer the granularity you need, see our notes on client portals and external interfaces for the sharing model.
Automation 2 — Advance the chain:
- Trigger: When record updated — watch the
Decisionfield. - Condition:
DecisionisReject→ setStatustoRejected,Decided atnow, clearCurrent approver, notify the requester. Stop. - Condition:
DecisionisApprove→ work out the next step fromRequired stepsand the currentStatus:Manager reviewandRequired stepscontainsFinance→ setStatustoFinance review,Current approverto the finance approver.Finance reviewandRequired stepscontainsDirector→ setStatustoDirector review.- Otherwise →
StatusisApproved,Decided atnow, clearCurrent approver.
- Final action in every branch: clear
Decisionso the field is ready for the next approver, and write an audit row (next step).
Clearing the helper field is easy to forget and causes the classic bug where the second approver sees the first approver's decision already filled in.
Step 5: the audit trail
Revision history exists, but it is not an audit trail: it is hard to filter, it is not reportable, and on lower plans it ages out. Build an explicit Approval events table:
Request: link toApprovals.Event: single select —Submitted,Approved,Rejected,Escalated,Reassigned,Withdrawn.Actor: link toPeople.From status,To status: single line text.Amount at decision: currency, copied at write time.Note: long text.Timestamp: created time.
Every automation branch creates one row here and never updates one. Append-only is the whole point: if a row can be edited, it proves nothing. Copying Amount at decision matters too — if someone edits the amount after approval, the trail still shows what was actually approved, and a rollup comparing the current Amount against the last approved amount gives you a "changed after approval" flag worth alerting on.
Step 6: escalation and cover
Approvals stall. Two automations fix most of it.
Reminder and escalation — a scheduled automation running each weekday morning:
- Find records where
Statusends inreviewandSubmitted atis more than 2 days ago andEscalatedis unchecked. - Send a reminder to
Current approver; if the wait is more than 5 days, setCurrent approverto that person's manager, tickEscalated, and write anEscalatedaudit row.
Delegation — an Out of office until date on People, and a routing step that checks it before assigning. If the chosen approver is away, assign their manager or a named delegate and log a Reassigned event. Without this, one holiday backs the whole queue up.
Use a Days waiting formula (DATETIME_DIFF(NOW(), {Submitted at}, 'days')) for the views, and remember NOW() refreshes periodically rather than instantly — fine for daily SLA work, not for anything needing second-level precision.
Step 7: reporting that finance will actually ask for
Three views and one dashboard cover the usual questions:
Open approvals by approver— grouped byCurrent approver, sorted byDays waitingdescending. This is the bottleneck report.Approved this month— filtered onStatusisApprovedandDecided atis within this month, summed byAmountand grouped byCategory.Cycle time— a formulaDATETIME_DIFF({Decided at}, {Submitted at}, 'hours'), averaged per approver and per step.
Cycle time per step is the number that changes behaviour. It usually shows that one step — often the one nobody agreed was necessary — accounts for most of the delay, which is the evidence you need to remove it.
Common mistakes
A checkbox instead of a status. Checkboxes cannot express "waiting on finance", cannot be escalated, and cannot be reported on.
Approver names typed as text. You lose per-person rollups, current-user filters, and delegation.
Automations that fire on every field change. Trigger on the specific field or on "record matches conditions" with a tight condition, or your approval chain will advance because someone fixed a typo in the justification. Our guide to automations that fail silently covers the monitoring side.
Letting approved records stay editable. Lock them down with a view that approvers use and an automation that flags post-approval edits to Amount or Category.
Treating Airtable as the system of record for regulated sign-off without checking the requirement. If your auditors need immutable, independently timestamped logs and enforced segregation of duties, confirm what Airtable's plan-level controls and admin audit logs give you before you commit. See Airtable security and compliance for how we scope that.
Where to go next
Once the chain works for one process, generalise it: the same status machine, event table, and escalation pattern handle contract sign-off and change requests with nothing more than different fields on the request table. Keep the policy in one formula, the history in an append-only table, and the humans in an interface rather than the grid.
BaseBrainers builds approval and operations workflows on Airtable, including the governance and audit design around them — see Airtable for business operations or get in touch with the process you are trying to tame.