expense-reconciliation · git:20261104.4860813 · 2026-11-04 · sha256 01503b629b288e97

expense-reconciliation git:20261104.4860813A

Immutable. This exact content never changes and is served at /api/v1/blob/01503b629b288e97.

---
name: expense-reconciliation
description: Reconciles submitted expense claims against the receipts and statements sitting in the mailbox, lists what is missing or unmatched, and drafts the chaser to each claimant. Use when the user asks to reconcile expenses, check expense claims, find missing receipts, chase expense documentation, or prepare the expense pack before a close.
---

# Expense Reconciliation

Finds the gap between what was claimed and what was evidenced, before someone else does.

## Inputs
- Mailbox, through **Email**, for receipts, card statements and claim confirmations
- A claims export the user supplies, through **Excel**
- `references/config.md` for the period, the materiality threshold and the policy rules to check

## Procedure
1. **Load the claims export.** If none is supplied, say so and stop: reconciliation without the
   claim side is not reconciliation, it is a receipt hunt. Offer that instead.
2. **Gather evidence** from the mailbox over the period: receipts, invoices, card statements.
3. **Match** each claim to evidence on amount, date within the config tolerance, and merchant.
   Record the match confidence as exact, probable or none.
4. **Classify every row**: `Matched`, `Amount differs`, `No receipt`, `Receipt with no claim`,
   `Possible duplicate`.
5. **Check policy** only against the rules written in config. Never invent a policy rule.
6. **Write** `/Documents/Cowork/output/expense-recon-<period>.xlsx`, unmatched rows first.
7. **Draft one chaser per claimant** covering all their gaps in a single message, not one per row.

## Output
| Claim ref | Claimant | Date | Amount | Merchant | Evidence | Match | Status | Policy flag | Source |

Then: counts by status, total value unmatched, claimants to chase, drafts prepared.

## Definition of done
Every claim carries a status, every unmatched row says why, and every claimant with a gap has one
drafted message.

**A clean reconciliation is the best outcome.** If everything matches, say that in one line with
the totals. Do not manufacture a policy flag to show effort.

## When there is no data
- No claims export: stop and say what is needed.
- Mailbox evidence missing for a period: state the window actually covered. Never present a
  partial period as complete.
- A statement is a PDF you cannot parse: list it as unread evidence rather than ignoring it.

## Boundaries
- **Draft, never send.** Chasers are drafts.
- Never approve, reject or adjust a claim. Never state a reimbursable amount as final.
- The expense system and the finance ledger are the source of truth. This reads mail.
- Never share a claimant's detail with anyone but the user and that claimant.

## Self-check
- Does every unmatched row name the missing evidence?
- Is every policy flag traceable to a rule in config?
- One chaser per claimant, not one per row?
- If it all matched, did I say so plainly?