Humangent

n8n Approval Records: Know What Was Approved Before the Write

When n8n workflows write into important systems, approval records matter: owner, deadline, edits, escalation, decision, and resume time.

By Iiro Rahkonen on

TL;DR: An n8n approval record is the structured history of a human decision before a workflow writes into another system. It should capture the request, owner, deadline, reviewer, context shown, edits made, final decision, escalation path, and resume time. n8n execution history helps debug workflow runs; approval records explain the human decision.

Every n8n workflow that pauses for a human creates a decision your team may need to explain later. That matters most when the next step writes into Salesforce, HubSpot, billing, support, Slack, email, an ERP, or an internal database.

The review itself is only half the job. The record needs to answer:

  • Who owned the decision?
  • What was the deadline?
  • Who reviewed?
  • What changed before approval?
  • When did escalation or timeout trigger?
  • When did the workflow resume?

If that history lives across Slack threads, email replies, forms, webhooks, n8n execution logs, and someone's memory, your team has an audit problem before anyone calls it one.

Humangent is for this exact operator problem: the approval control layer for n8n workflows, where every request has a queue, owner, deadline, editable review step, decision record, escalation path, and audit trail before n8n writes downstream.

The practical operator shift

Routing a request is one step. Keeping the decision history is the operating requirement.

Operator teams need both:

  • A review inbox so pending requests have an owner.
  • Escalation rules so vacations and missed pings do not stall workflows.
  • A clear trail of reviewer actions and field edits so incident review is not guesswork.

That is the practical shift: the human step becomes a managed workflow event with an owner, a deadline, a decision, and a record before the write happens.

Execution logs and approval records are different

n8n executions are useful. They show whether a workflow ran, where it failed, and what data moved through each node. Keep them. You need them when a credential breaks, a webhook payload changes, or an API returns something weird at 02:13.

But execution history is not the same thing as an approval-side record. The approval record answers a different set of questions:

Question Execution history Approval record
Did the workflow run? Yes Usually no
Which node resumed the workflow? Yes Sometimes
Who owned the decision? Usually no Yes
What did the reviewer see? Maybe, if you logged it Yes
What did the reviewer change? Maybe, if passed through the node Yes
Why was it approved, rejected, or escalated? Usually no Yes
Could a lead reconstruct the decision later? Painfully Yes

That distinction matters because incident review does not start with "which node executed?" It starts with "why did this customer email go out?" or "who approved this field change before Salesforce was updated?"

Minimum approval record schema

For AI-assisted n8n workflows, the approval record should be boring and consistent. Fancy dashboards can come later. The table shape matters first.

Field Why it matters
request_id Stable ID for the approval request
workflow_id and execution_id Connects the decision back to n8n
request_type Email, CRM update, refund, invoice, purchase request
created_at and due_at Shows age, SLA, and timeout behavior
owner Person or team responsible for the request
assigned_reviewer Who was expected to decide
context_snapshot The facts, records, and AI output shown at review time
original_value What the automation proposed
edited_value What the reviewer changed before approval
decision Approved, edited, rejected, escalated, expired
decision_reason Optional, but valuable for pattern review
decided_by and decided_at The human action and timestamp
escalation_history Who was reassigned, when, and why
resume_payload What n8n received when the workflow continued
downstream_write The system and record touched after approval

The point is not compliance theater. The point is that the next person can answer the obvious question without opening five browser tabs and performing Slack archaeology.

Example approval record

Here is the level of specificity to aim for:

{
  "request_id": "apr_01hv9r9x8b7",
  "workflow_id": "crm-enrichment-review",
  "execution_id": "94231",
  "request_type": "crm_update",
  "created_at": "2026-04-22T09:14:00Z",
  "due_at": "2026-04-22T13:14:00Z",
  "owner": "revops",
  "assigned_reviewer": "alice@example.com",
  "context_snapshot": {
    "account": "Acme Analytics",
    "source_url": "https://example.com/acme",
    "current_stage": "Qualified",
    "proposed_stage": "Evaluation"
  },
  "original_value": {
    "summary": "Acme is evaluating a data warehouse migration.",
    "lifecycle_stage": "Evaluation"
  },
  "edited_value": {
    "summary": "Acme is researching a warehouse migration; no active evaluation confirmed.",
    "lifecycle_stage": "Qualified"
  },
  "decision": "edited_and_approved",
  "decision_reason": "Source showed research intent, not buying stage.",
  "decided_by": "alice@example.com",
  "decided_at": "2026-04-22T10:03:00Z",
  "downstream_write": "hubspot.company.12345"
}

That record is useful even if nobody ever says "audit." It explains the decision in the language the operator actually needs: source, proposed change, human correction, and downstream write.

Where to put the record

For one workflow, a database table, Airtable base, or even a disciplined Google Sheet can work. Write one row when the approval request is created and append a second event when the decision lands. Keep the execution ID in the row so the n8n run and the human decision can be joined later.

For several workflows, the record should move closer to the approval surface. If reviewers approve from Slack, Telegram, email, or an n8n-hosted form, every channel needs to write the same structured event. Otherwise each workflow invents its own version of "approved," and six months later nobody agrees which field means what.

This is the point where an approval control layer becomes useful. n8n still owns the automation. The approval layer owns the human decision state: queue, owner, deadline, escalation, editable review, decision, and resume payload.

What to avoid

Do not treat a Slack thread as the record. Slack is a notification channel. It is not a durable approval table.

Do not only log the final boolean. "Approved: true" tells you almost nothing. If the reviewer edited the CRM field, changed an email paragraph, or escalated because the owner was out, that context belongs in the record.

Do not let timeout behavior disappear. A request that expired, escalated, or auto-rejected is still a decision path. Silence is an outcome. Log it.

Boundary of this claim

This message is intentionally narrow:

  • This post is about decision history in current human-review operations.
  • Transaction-level export artifacts and compliance export packs are not covered.
  • Reviewer-performance scoring and model-drift feedback loops are not yet shipped.

For the deeper compliance version, read Audit Trails for n8n AI Agents. For the operational queue model, read n8n Approval Dashboard.

CTA

If your n8n approvals already need a record someone can defend later, join the Humangent waitlist. Early teams shape the approval control layer for n8n workflows now.

Related Humangent resources

Humangent is for teams using n8n that need approval routing, escalation, multi-level sign-off, editable review fields, and a decision record before a workflow writes into another system.

The core pattern is simple: n8n sends the request, the reviewer sees the context, the reviewer chooses or edits the decision, and n8n resumes from a callback with a record attached. That keeps approval logic out of fragile Slack threads and makes the human decision visible to the team that owns the outcome.

These guides cover where to place human checkpoints, how to handle timeouts, when to route to another reviewer, what to record for audit, and when n8n built-in approval options are enough. The goal is practical workflow control for teams past the prototype stage.

For simple one-reviewer workflows, n8n built-in approval options can be enough. The need for a separate approval control layer shows up when several workflows compete for the same reviewers, when a backup reviewer needs to take over on a deadline, or when the team lead needs to reconstruct the decision after the workflow has already written to another system.

Humangent centers on that team operating model: one reviewer account across workflows, configurable routing, and a decision trail that belongs to the approval process. No scattered execution logs and chat-message archaeology.