Skip to content
← Back to blogLatch Journal

Approval Design in Practice: One Refund, End to End

A single AI-recommended customer refund moves through a two-person review gate, from recommendation to execution record, on real screens inside Latch.

See how it worksApproval Workflows →

The first post, approval design for high-risk operations, argued that a human in the loop lets an AI handle a high-risk action such as a refund. The AI proposes. A person commits. The irreversible step runs from the approved request behind a durable two-person review.

This post shows that model on real screens. It follows one refund end to end in Latch: an AI-recommended account credit for a duplicate charge, paused for independent review before any money moves. The credit and the refund run through the same plugin. The walkthrough follows the credit through approval and a contested refund through rejection. The screenshots are the real screens an operator and a reviewer see.

Start with the action. Issuing a credit is one registered plugin action. The AI cannot do it alone. The action has an owner, an authentication mode, a health check and diagnostics. All are visible before any approval prompt exists.

Latch plugin registry showing the approval-risk-gate-demo plugin as a single named integration with HMAC-SHA256 auth, a health indicator, and diagnostics

The plugin registry. Credit issuance is one explicit integration, with its own auth mode, health status and diagnostics. An action that is not named cannot be controlled.

The risk tier is enforcement, not documentation. The credit and refund actions require two-person review (also called maker-checker). The actions have a 24-hour approval expiry and per-action overrides. The tier is a property of the action, configured once.

Latch plugin gates configuration for the approval-risk-gate-demo plugin, showing a two-person review gate with per-action overrides and a 24-hour approval expiry

Risk tiers are enforcement, not documentation. The tier belongs to the action, not a wiki label, and it decides the enforcement mode.

One Credit Moves through the Gate

Once the action is named and tiered, the review is no longer a pop-up. It becomes a sequence inside the case: requested, approved by a different person, executed from the approved request. The case record holds the request, the reviewer, what they saw, what ran, and what the downstream system returned. Four cases show every control state: a refund awaiting approval, an approved credit ready to resume, a refund rejected for incomplete evidence, and a rejection that itself had to clear a review.

Latch task queue showing four refund-story cases in In Progress, Assigned, and On Hold states

Approval as a queue of work. The gate lives on the case, not in a separate inbox the operator must monitor.

The AI recommends. It does not act. The support agent proposes a concrete, scoped credit and routes it through the review. The operator sees the recommendation in the case activity. A drafted customer response sits next to it. The operator decides what happens next.

Latch case detail with the AI recommendation panel proposing a gated account credit, shown as a request in the activity feed rather than an executed action

The AI recommends. The operator decides. The proposed credit is concrete. It enters the case as a request, not a completed transaction.

A reviewer's decision is only as good as the information in front of them. The preview makes the financial impact and reference identifiers impossible to miss.

Latch Confirm Account Credit dialog showing a credit amount of 842.10 dollars, reference identifiers REF-2026-1842 and INV-2026-1184, a reason field, and a verify-before-proceeding warning

The action preview is a reviewable artefact. The amount, reference identifiers and human-readable reason are front and centre. The prompt is explicit: verify the duplicate-charge evidence before proceeding.

The control lives where the work lives. It sits on the case, with the requester and current state attached. A reviewer never leaves the record to act.

Latch case activity feed showing a pending Request Account Credit approval card with the action, requester, and state

The approval card in context. It shows action identity, current state, requester and a clear review path inside the case timeline.

Before approving, the reviewer sees the exact stored request that will execute, field by field. Not a rendering. Not a summary. The canonical payload, with the guarantee that this is exactly what will run. Most products skip this moment.

Latch review dialog listing the stored request payload field by field: amount, caseId, reason, currency, evidence, customer impact, and customer account identifier, with the note that this payload is exactly what will be approved or run

The exact stored payload, including evidence and the customer account it touches, requested by a named operator. The dialog states the rule directly: the payload shown here is the exact request that will be approved or run.

If the preview shows one thing and the runtime sends another, every other control is theatre. Matching the reviewed action to the executed action is a design goal, not an accident. The review dialog and the execution record are the two halves of that guarantee.

Durable Approval Survives the Wait; a Rejection Is an Action Too

Approval is durable and decoupled from execution. Once approved, the action is tied to the case version and the stored request. It can run later from the exact approved payload, even after the original session is gone.

Latch case titled approved goodwill credit ready for durable resume, with the approval recorded in the activity timeline

Approval is durable and separate from execution. The approved action stays tied to the case version and stored request, ready to resume.

Not every request should be approved. A rejection is a first-class state, not a dead end in an email thread. The control records why the action was rejected and keeps the full trail visible. A reviewer weeks later can reconstruct the decision without archaeology.

Latch case titled refund rejected because evidence was incomplete, with the rejection reason and audit trail in the activity feed

Rejection done right. The gate records why the action was rejected and keeps the full trail visible.

Role separation cuts both ways. Rejecting a contested refund is a consequential decision. The denial itself needs a second reviewer. An analyst flags the rejection as a risk decision. Voiding the refund still requires a two-person review before the case treats the rejection as final.

Latch case titled AI flags refund rejection as escalation risk, with an escalation note and a two-person reject and void approval in the activity feed

The AI flags the rejection as a risk decision. Voiding the refund still requires a second reviewer. A denial is an action.

Latch activity trail showing the rejection and void action approved by a second reviewer before the case treats rejection as a controlled outcome

The same case, lower in the trail. The void was approved by a second reviewer. Requester and approver are distinct. The timeline records both.

The Execution Record Is the Proof an Auditor Can Reconstruct

An approval is only as defensible as the evidence it leaves. The audit trail is separate from operational traces. Traces are high-volume and short-lived. Audit evidence is attributable and long-lived. Every entry is reconstructible: who decided, when, why, what they saw, what executed, and what the downstream system returned.

Latch plugin execution debugger showing a successful Issue Account Credit execution with executor identity, timestamp, the upstream POST request, headers, the JSON payload, and a byte-counted raw request snapshot

Execution evidence after an approved action runs: status, who ran it, the exact upstream request, the JSON payload and a byte-counted raw snapshot. This turns an approval into an inspectable control.

Six months from now an auditor asks two questions: what did the approver see, and what actually ran. The review dialog answers the first. The execution record answers the second. Together they survive 'how do you know'.

That is the model on one case. The third post covers durable approvals, policy as code, and building gated actions: durability and revalidation, role separation as policy, building plugin actions, and problems that do not yet have clean answers.

Continue exploring
Next product pathApproval WorkflowsSee how sensitive actions run with reviewer checkpoints, policy checks, and execution history.Related pathFinance ControlsExplore four-eyes control, exception handling, and controlled recovery paths for finance teams.Related pathProduct OverviewSee how unified triage, approvals, audit trails, and plugins connect.
Related reads
Approval Design: Durability, Policy, and PluginsThe configuration underneath an approval gate - durable resume and revalidation, role separation as policy, building gated actions, and the problems still open.Construction Draw Approvals: From Payment Request to Audit EvidenceSee a construction draw move through maker-checker review, payment release, audit evidence, grouped approval reporting, and PDF or Excel export in Latch.Four-Eyes Principle, Maker-Checker, and Segregation of Duties: What Actually DiffersFour-eyes, maker-checker, dual control, and segregation of duties are related but distinct. What changes in workflow design for each.
Ready to move beyond reading?

See the same workflow running end to end.

The walkthrough follows one ticket from intake through triage, an approval gate, plugin execution, and the audit record it leaves behind. It runs on the model you choose, inside your own boundary.

Talk to usSee the platform →