# Monthly Bookkeeping Skill

**Turn a month of scattered invoices into one accountant-ready folder. In one command.**

A Claude Code skill by Benjamen Mateev.

Bookkeeping prep is the same painful ritual every month: download the credit-card statement, hunt down every receipt, chase the ones that only exist in email, rename everything, and hope your accountant doesn't send it back. This skill treats it as what it actually is — a reconciliation problem. Every euro that left an account needs a document, every document needs a home, and everything in between gets tracked in a ledger you can audit.

---

## Install

1. Download `monthly-bookkeeping.skill` and unpack it into your Claude Code skills folder:

   ```
   ~/.claude/skills/monthly-bookkeeping/
   ```

2. That's it. Claude Code picks it up automatically. No dependencies to install upfront — the skill uses `pdftotext` and PyMuPDF and will tell you if either is missing.

Works in English and German. Say "Monatsabschluss für Juni" or "close the books for June" — same result.

## Setup — a 5-minute interview, once

The first time you trigger the skill, Claude interviews you instead of guessing:

- **Entities** — one company or several; each gets its own config and output, never mixed
- **Folders** — where new invoices land, where your monthly folders live
- **Cards & accounts** — which credit cards are business (and their FX fees), your bank's CSV format
- **Email** — which mailbox receives invoices and how Claude can search it
- **Invoicing tool** — Lexoffice, SevDesk, FastBill, Stripe, or none
- **Accountant requirements** — how they want the files delivered

Your answers go into a personal `CONFIG.md`. Credentials never do — the config only stores pointers to where keys live, outside the skill folder.

The config gets smarter over time. Correct Claude once ("that €14.99 charge is always Notion, invoice comes by email") and it's a known pattern from then on. Month two is faster than month one.

## How it works: ledger-first

Say **"do my bookkeeping for June"**. Claude runs four stages and builds a fresh output folder — your originals are never touched:

```
Bookkeeping_2026-06/
├── ledger.csv                                       ← the audit trail
├── 2026-06-30 - Amex - 2.847,12 - RECONCILED.pdf    ← statement bundle per card
├── Bank invoices/                                   ← individual files
├── Customer invoices/                               ← individual files
├── RECONCILIATION.md                                ← what matched, what's open, why
└── OPEN_ITEMS.json                                  ← carried into next month
```

**1. Ingest.** Every payment source — card statements, bank CSV exports — is normalized into one transaction ledger. Refunds, card fees, and private-card charges are classified out immediately, so they never pollute the missing list. Unresolved items from last month are loaded back in for a fresh attempt.

**2. Resolve.** For each transaction, Claude walks a source cascade: inbox folder → month folder → previous month → email. Matching is done by reasoning, not string comparison — "AMZN Mktp DE" is Amazon, a $100 charge billed as €94.80 is a currency conversion plus card fee, a €45 Amazon charge can be two invoices of €20 and €25. Every match carries a confidence level (`exact` / `derived` / `open`), and a duplicate guard makes sure no receipt gets claimed twice. When Claude isn't confident, the item stays open and goes to you — it never attaches a receipt it can't defend.

**3. Assemble.** Each credit-card statement becomes one RECONCILED bundle: statement first, then every receipt in statement order — the format accountants actually ask for. Bank and customer receipts stay individual files, because accountants book them to different ledgers and a merged PDF makes that impossible. Outgoing invoices are pulled straight from your invoicing tool's API.

**4. Report & carry forward.** `RECONCILIATION.md` lists every open item with a reason. `OPEN_ITEMS.json` carries them into next month's run automatically — late-arriving invoices are the norm, and the system is built around that. A documented gap is fine. A silent one is not.

## The rules it never breaks

- Originals are copied, never moved or modified
- Only credit-card statements get bundled; bank and customer invoices stay individual files
- Every transaction ends in an explicit state — matched, no-receipt-expected, or open with a reason
- Credentials live outside the skill, always

## Does it actually work?

Tested against a synthetic month full of deliberate traps: foreign-currency charges, a refund that must be skipped, a private card on the same account, receipts hiding in the previous month, a same-amount decoy invoice, and two genuinely missing receipts. The skill passed 100% of assertions. The same model without the skill: 90% — it flagged a refund as a missing receipt. That edge-case discipline is exactly what the skill encodes.

---

Questions or a setup the skill doesn't handle yet? The whole thing is markdown — open `SKILL.md` and adapt it.
