Blog
/
Product

Pull month-end expense exceptions in one chat turn

·
2
min read

Before month-end close, you already run the same check: which card charges still need a receipt, which lines have no category, and which amounts sit over policy. That list should look the same every close. In chat it usually does not.

What breaks

Ask the assistant once: "Find anything missing for expenses this month." One week it digs through Drive. Next week it invents a spreadsheet schema. The third week it forgets policy thresholds and returns a narrative instead of rows you can chase.

Finance teams already know missing receipts are a predictable close bottleneck — the failure mode is ad-hoc follow-up the week the report is due, not a mystery about what belongs on the list. The chat problem is the same shape: freeform prompts reinvent the queue.

Build one named tool

Encode the job as a small tool with fixed outputs. Every call returns the same fields, for example:

Point it at the sources you already use — card CSV export, expense folder, a sheet of open lines. Keep the tool narrow. It builds the exception pack. It does not rewrite policy or send chase emails unless you add that later on purpose.

How to verify it worked

Run it twice on the same snapshot. You should get the same rows and the same exception types. Change one fixture (drop a receipt, leave a category blank) and confirm that line flips. If the list drifts between identical runs, the tool is still improvising — tighten the inputs and the output schema until it stops.

When the pack is stable, host those tools on a server URL and call them from ChatGPT, Claude, or Cursor. The assistant asks for the month-end expense pack; the tool returns the fixed fields. That is the whole product surface for this job.

Close still needs humans. The win is that the chase list stops changing shape every time you open chat.