Work Log - 2026-08-09
π― Focus for Today¶
Complete the August reconciliation cycle β post expenses to OpenCollective, verify the books balance, and capture the automation requirements discovered during the manual process.
β What Got Done¶
OpenCollective production update. Eight bank-paid expenses from JulyβAugust are now recorded on the public OpenCollective page. These are real-world expenses: event tickets (Kawaiicon, GEN Unconference, CreativeHQ), SaaS subscriptions (1Password, Anomaly AI, AWS, Namecheap), and Software Freedom Day 2026 swag. Each was created as an INVOICE expense and marked as paid via manual payout β the money left our ANZ bank account directly, so no funds moved through OC.
Books balanced to the penny. Every dollar is accounted for across three systems:
flowchart TD
subgraph OC["OpenCollective"]
HOST["Host balance"]
PROJ["Project balances"]
INC["Interest (addFunds)"]
end
subgraph BC["Beancount (system of record)"]
ANZ["ANZ bank accounts"]
RULES["Classification rules<br/>entity + project metadata"]
end
subgraph STRIPE["Stripe"]
TRANSIT["Funds in transit<br/>(not yet at ANZ)"]
end
OC <-->|"reconcile"| BC
BC <-->|"match payouts"| STRIPE
ANZ -->|"Akahu import"| RULES
The $1.25 net call account interest was posted to OC so all income is reported on the platform.
First live Stripe donation. A $20 contribution was made through the production OpenCollective page β the first real donation flowing through the Stripe pipeline. This money has not yet settled to our ANZ account, giving us a live test of the three-way reconciliation RAMP is designed for: OC shows funds that Beancount can't see yet because they're still in Stripe.
Beancount importer extended. The Akahu import script now supports two features needed for automated OC reconciliation:
- Rule metadata β classification rules can carry
{ entity, project }attribution that maps every bank transaction to its OC destination (SMUNZ host, OpsDev.nz collective, SFD 2026 project, etc.) - Override mechanism β per-transaction overrides keyed by bank transaction
ID can carry
oc_expense_idlink-backs that survive import regeneration
CI pipeline fixed. The ledger repo's bean-check pipeline was failing
because it depended on a git submodule for the oc-opsdevnz package. Switched
to the published PyPI package β the CI now resolves dependencies like any
normal Python project. Version bumped to 0.0.7.
Staging validated. The staging OC environment was corrected to match production before any expenses were created, including a Stripe balance difference that was caught in staging first. This "stage, verify, then produce" discipline prevented drift on the live site.
π§ Notes & Reflections¶
The manual process of creating 8 expenses via the OC web UI took roughly 80
clicks. This is the requirements document for RAMP Phase 1: the
oc-opsdevnz module already has example scripts wrapping createExpense,
processExpense, and expense list queries. Promoting those to CLI commands
(expenses create, expenses list, funds add) turns this into a
one-command-per-expense workflow.
The end-to-end automation path is: expense gets posted to OC via CLI (returning its OC expense ID), the ID gets written into the Beancount rules file as a link-back, and the importer regenerates the ledger with the traceability chain intact. Collecting the 8 IDs from this manual cycle is a one-time chore β the CLI will return IDs automatically on future runs.
The $20 Stripe donation is a live test of the three-way reconciliation pipeline. Right now OC shows $20 that ANZ doesn't β and shouldn't, because Stripe hasn't settled it yet. When the payout lands, we'll see it appear in both Beancount (via Akahu import) and OC (via Stripe settlement), and RAMP will match them.
Bank interest is a recurring pattern. Every month the Call account earns
a small amount of interest (with RWT withheld). The net amount needs an
addFunds on OC so the public balance stays accurate. This is the same
pattern Stripe payouts will follow β an automated funds add command that
detects Beancount income without an OC link-back and prompts for the OC
entry.
π Related¶
- ledger!25 β August reconciliation MR (importer metadata, new rules, CI fix)
- Issue #15 β RAMP August reconciliation and automation requirements
- OpenCollective β StartMeUp.NZ
oc-opsdevnzmodule β the automation bridge between Beancount and OC
β³ MaΓ±ana¶
- Collect OC expense IDs from the web UI and populate link-backs in the rules file so the Beancount β OC traceability chain is complete
- Track the $20 Stripe donation through settlement to ANZ β this is the live test of three-way reconciliation
- Update the reconciliation runbook with the manual steps we followed, so the next person (or the automation) knows the exact sequence
- Prioritise
expenses createandfunds addas the first RAMP CLI commands