The Petty Cash Log That Doesn't Evaporate

Nobody steals petty cash. It evaporates.
Open the petty cash tin in most small businesses and you will find, in rough proportion: some cash, a rubber band, and four receipts that no longer say what they were for. The float was $300 at the start of the month. It is $118 now. Somewhere between those two numbers there was a run to the hardware store, a taxi, two coffee orders for a supplier meeting, and a parking ticket that somebody swears was reimbursed.
None of this is theft. That is exactly what makes it hard to fix. There is no moment where anything went obviously wrong — just a slow leak of small, legitimate, undocumented spending, and a balance that only gets checked when it runs out.
A petty cash log is the control that stops the leak. Not because it prevents spending, but because it forces every withdrawal to become a row: dated, categorised, attributed, and attached to its receipt while the receipt still exists. This is a walkthrough of how to build one that survives contact with a busy week — using the Petty Cash Log template in CashSheet Workbooks, though the structure holds wherever you build it.
What a petty cash log actually has to do
Every petty cash log answers four questions, and it has to answer all four or it answers none:
- What is the balance right now? Not at last count — now, after the withdrawal someone made an hour ago.
- Where did the money go? By category, in terms your bookkeeper can post against.
- Who took it? Not to assign blame; to have someone to ask.
- Where is the proof? The receipt, attached to the entry it belongs to, not in a drawer sorted by nothing.
The reason paper logs and generic spreadsheets fail is that they answer questions one to three and quietly skip the fourth — and the fourth is the one an auditor, an accountant, or a suspicious month-end actually cares about.
The structure: one row per movement
Start from the Petty Cash Log template and you get a worksheet with a row per cash movement and columns that already have types. That last part is what makes the difference, so it is worth being specific about which type does what.
| Column | Type | Why this type |
|---|---|---|
| Date | Date | Sortable and filterable as a real date. A text column that looks like dates will sort "10 Mar" before "2 Mar" and you will not notice until you are looking for something. |
| Description | Text | The primary column — it names the row. "Taxi to supplier", not "misc". |
| Category | Relation | Links to a Categories worksheet. More on why this beats free text below. |
| Paid to | Text | The vendor or person. |
| Taken by | User | A real person from your workspace, not a typed name. Pairs with @mentions when something needs chasing. |
| Amount out | Currency | Stored as exact integer cents, so the running total is exact at any size. |
| Amount in | Currency | Top-ups of the float. |
| Receipt | Attachment | The file lives on the row. Not in email, not in a shared folder named "receipts 2026". |
| Reconciled | Checkbox | A filter target. "Show me everything not yet reconciled" is one click. |
Values are validated on the way in — a currency column refuses text, a date column refuses "next Tuesday" — and that validation happens on the server, so it holds whether the value arrives by typing, by CSV import, or through the API. The full list of column types is in the help centre.
Why Category is a relation, not a text box
This is the single change that does the most work, and it is the one people skip.
If Category is free text, then within a month you have Office, office, Ofice, Office supplies, and Stationery — five categories that are one category. Every report you build on that column is wrong in a way that looks right. Grouping by category produces five bands. Summing by category produces five subtotals. Nothing errors; the numbers are just quietly meaningless.
A relation column fixes it at the source. Category points at rows in a separate Categories worksheet, so a category has to exist before it can be chosen. There is no way to invent Ofice by typing quickly.
Two more column types make that link earn its keep:
- A lookup pulls a field from the related row — the GL account code, say — straight onto the entry. Read-only, always current. Change the code on the Categories row and every entry reflects it, because the entry never held a copy.
- A rollup aggregates back the other way. On the Categories worksheet, a rollup that sums Amount out across all related entries turns your category list into a live spend-by-category report with no formula to maintain.
That is a real reporting layer built out of two column choices, and it is why "spreadsheet that works like a database" is a description rather than a slogan.
The balance that recalculates itself
Add a formula column, Running balance, and the log stops needing a separate "current float" note that someone forgets to update:
={Opening float} + SUM({Amount in}) - SUM({Amount out})
Formulas in Workbooks are written by column name rather than by cell reference, and they live on the column rather than in a cell. That distinction matters more than it sounds. In a normal spreadsheet, a formula is a value someone can type over — and someone always does, usually the person in a hurry at the end of a long day. A formula column cannot be typed over. The arithmetic is not available for editing, so it is not available for arguing about.
Money is stored as exact integer cents throughout: $1,234.56 is 123,456 cents, in storage, in the sum, and in the export. A log that is off by a cent is a log you cannot use to settle a dispute, and floating-point arithmetic will hand you that cent eventually.
Receipts belong to the row
The attachment column is the part that changes behaviour rather than just structure. Photograph the receipt at the counter, attach it to the entry, done — before it goes in a pocket and through the wash.
Attachments upload from the row's detail panel and live in private storage, streamed through authenticated requests rather than sitting on a public bucket link. At audit time, or at the far less dramatic moment when your accountant asks what the $84 on the 12th was, the answer is on the row, not in an archaeology project. Attachment storage counts against your plan's allowance — the plans and limits page has the numbers.
One habit worth building: make Receipt effectively mandatory by filtering for its absence. A saved view of "no receipt attached, taken more than three days ago" is a two-criterion filter, and it is the entire reconciliation process for most small businesses.
For the bookkeeper: what makes this postable
A petty cash log is only finished when it can be posted. Three things make that possible here.
Categories map to accounts. Because Category is a relation to a real worksheet, that worksheet can carry the account code as a field, and the lookup puts it on every entry. Export the sheet and the coding is already done.
The period is a filter, not a copy. "March, reconciled, over $50" is three filter criteria, applied server-side, saved as a view your colleagues can open too. Nobody duplicates the sheet to produce a period report, which means nobody has two versions of March.
Export is always available. Any worksheet exports to CSV with formula results included and currency written as conventional decimals, on every plan including the free one. It is your data; the ability to leave with it is not a paid feature.
Where this fits
The petty cash log is one of the three classic cash sheets, alongside the daily cash count and the cash book. If you want the wider picture of how they relate — and which one your business actually needs first — we wrote a plain explanation of all three.
What they share is a shape: a dated row per event, an expected figure, an actual figure, and arithmetic connecting the two that nobody can quietly overwrite. Petty cash is the version of that shape where the failure is slowest and the discovery is latest — which is precisely why it is worth structuring before you think you need to.
The Petty Cash Log template is built into every CashSheet workspace at app.cashsheet.com, and new workspaces currently start with three months of full access. Start with your current tin, this month, and see how far the balance is from what you thought it was.


