---
title: "Dock for Accounting: expense categorization with policy enforcement"
excerpt: "Expense categorization is the workflow where agent autonomy is highest and where bad data leaks straight into the GL. Dock is the workspace where the agent's coding decision lives with the policy verdict and the human review, while Ramp, Brex, and Concur stay the source of truth for the actual receipts."
author: mei
category: Use Cases
date: "2026-05-30"
---

Expense categorization is the busiest line in the GL and the one with the least supervision. A marketing team back from a conference drops 200 receipts into Ramp on a Monday, and somebody has to decide which are travel, which are meals, which are client entertainment at 50 percent, and which broke per-diem. High-volume, low-signal work. Exactly the work an agent is good at, and exactly the audit hot zone where letting the agent run unsupervised is not the answer.

The architectural rule: Ramp, Brex, and SAP Concur stay the source of truth for the receipt, merchant, amount, cardholder, and MCC. Dock holds the agent's output. The suggested GL code, the policy verdict, the reconstructed attendee list, the reviewer's decision. Every Dock row carries a pointer back to the platform of record, a `ramp_tx_id` or `concur_report_id` or `brex_expense_id`, so the agent reads fresh from the platform API every time. The consent gate fires the GL update back to Ramp or Concur only after the verdict comes back clean and a human reviewer approves. Read freely, write through a gate. See [the dangerous-ops contract](/blog/dangerous-ops-contract) for why the writeback gate matters.

One table shape does the work:

| Receipt | Merchant | Amount | Agent code | Policy verdict | Reviewer | Decision | Audit |
|---------|----------|--------|------------|----------------|----------|----------|-------|
| RMP-88421 | Delta Air Lines | $612.40 | 6210 Travel-Air | Pass | Priya | Approve | trace |
| RMP-88422 | Carbone NYC | $1,840.00 | 6310 Meals-Client (50%) | Flag: 4 attendees missing | Priya | Send back | trace |
| RMP-88423 | Hilton Midtown | $2,210.00 | 6220 Travel-Lodging | Pass | Priya | Approve | trace |

The worked flow. Marketing flies to a conference. Cards swipe, Ramp ingests, the agent picks up each transaction on a webhook, reads merchant and MCC, drafts a GL code, then runs the policy pack. The policy pack is the company's actual expense policy expressed as rules the agent can check: per-diem caps, attendee-list requirements over $75, alcohol percentages for client meals, the rule that lodging over $400 in tier-2 cities needs VP sign-off. Verdicts land next to the agent's code. Clean rows queue for one-click batch approve. Flagged rows surface to Priya with the rule that fired and a draft Slack message to the cardholder asking for the missing attendee list. When Priya approves, the consent gate fires the GL update back to Ramp and the trace lands in the audit column. See [agent audit and compliance](/blog/agent-audit-and-compliance) for what lives in that trace.

Why this matters. Expense is where bad data leaks fastest into the close, and where the IRS, the auditor, and your CFO all care about the same row for different reasons. Tax-deductibility flags get coded wrong and you overstate deductions. Attendee lists go missing and a 50 percent client meal ends up at 100 percent until your audit sample catches it nine months later. Per-diem violations pile up because nobody had time to flag them live. Putting the agent's draft, the verdict, and the reviewer's decision in one row, with the receipt still living in Ramp, gives you the speed of automation and the paper trail of manual review. The [Brex transactions API](https://developer.brex.com/openapi/transactions_api/) and equivalent Ramp endpoints make the read side cheap, and [GBTA research](https://www.gbta.org/research/) ranks expense and compliance among the top operational pain points for travel managers. The hard part was never ingestion. It was the verdict layer.

Pair this with [AP invoice routing](/blog/accounting-ap-invoice-routing), [Ramp and Brex for AP](/blog/dock-ramp-brex-ap), and the broader [Dock for Accounting](/blog/dock-for-accounting) and [month-end close](/blog/ai-for-bookkeeping-and-month-end-close) playbooks.

[Talk to us about your expense policy pack.](/contact)

## FAQ

**What if the reviewer disagrees with the policy verdict and wants to override?**
Override is a first-class action. The reviewer flips the decision, picks an override reason from the company's list, and the trace records both the original verdict and the override. Controllers get a weekly digest of overrides so the policy pack itself can be tuned.

**How does attendee reconstruction work for client meals?**
The agent reads calendar context for the cardholder around the transaction time and drafts an attendee list. The Dock row shows the draft with a confidence score. If confidence is low, or the meal is over the $75 IRS substantiation threshold, the row routes back to the cardholder for confirmation before the GL update fires.

**What about multi-currency transactions?**
Ramp, Brex, and Concur all return the original currency and the booked USD. Dock stores both, and the policy pack runs against the USD amount with the FX rate and conversion date pinned in the trace. Reviewers see both numbers in the row.

**Can the agent flag tax-deductibility issues, not just policy issues?**
Yes. The policy pack carries a tax layer: meals-and-entertainment splits, the 100 percent versus 50 percent rules, owner-employee thresholds, sales tax handling. Flags surface in the same verdict column so the reviewer sees policy and tax concerns side by side before approving the writeback.
