What this workflow does
- Approval request form (n8n Form Trigger) collects requester email, request type, vendor or customer, amount, cost center, justification and an optional quote link.
- Validate and route (Code) checks required fields, looks up the cost center’s manager, adds finance above
FINANCE_THRESHOLD, and blocks self-approval by sending the requester’s own request to finance instead. - Summarize with Claude (HTTP Request) returns strict JSON: a summary of at most three lines, a completeness flag and a list of missing information.
- Parse summary (Code) handles refusals and API errors and decides whether the request is ready, needs information or is an exception.
- Route request (Switch) sends ready requests to approval, incomplete ones back to the requester, and failures to Slack.
- Manager approval (Slack, send and wait) DMs the manager with Approve and Reject buttons and waits up to 48 hours.
- Manager approved? and Needs finance? (If) decide whether Finance approval runs as a second step.
- Record decision (Code) works out the final status (approved, rejected, expired or needs info) from whichever steps ran.
- Notify requester (Gmail) and Audit log (Google Sheets) send the outcome and write one row per request.
- Post approval exception (Slack) catches anything the workflow could not process.
Before you import
- A current n8n version with a public URL so the form and Slack buttons can reach it.
- A Slack app with a bot token that can send direct messages, an Anthropic API key, Gmail for notifications and a Google Sheet for the log.
Setup
- Import the JSON and connect the Anthropic, Slack, Gmail and Google Sheets credentials.
- In Validate and route, fill
COST_CENTERSwith each manager’s email and Slack member ID, setFINANCEandFINANCE_THRESHOLD. - Make the Cost center dropdown in the form match the
COST_CENTERSkeys exactly. - Replace
REPLACE_WITH_SHEET_IDandREPLACE_WITH_SLACK_EXCEPTIONS_CHANNEL_ID. - Add an
Approvals logtab with headers: request_id, submitted_at, requester_email, request_type, vendor, amount, cost_center, summary, approver_role, manager_decision, finance_decision, status, decided_at. - Activate the workflow and share the form’s production URL.
Test it
Submit four requests: a small purchase, one above the finance threshold, one with a one-word justification, and one where the requester is a manager. Approve, reject and ignore the Slack messages in turn (shorten the wait time while testing). Check the emails and the log rows.
Make it production-ready
- Get the approval matrix signed off by finance before go-live, and move it to a sheet or table that finance can edit.
- Switch the Slack response type to a custom form if rejections must include a reason.
- Add reminders and delegates before the 48-hour expiry, using a business-hours calendar.
- Map Slack users to an employee directory synced from your HR system so org changes do not break routing.
- Make the audit log append-only and add an n8n error workflow.
Read the full guide on automating internal approvals for matrix design and security, or talk to Lumeor about Teams, Jotform or Airtable versions.