You import a bank statement. The system creates journal entries. Everything looks correct.
The next day, someone updates a posting rule. You re-import the same statement to fix a minor issue.
The journal entries are different.
This is what happens when accounting systems aren't deterministic. And it's more common than you think.
What Determinism Means in Accounting
A deterministic system produces the same output given the same input—every time, without exception.
For accounting software, this means: - Import the same transaction twice → same journal entry - Replay a month of activity → identical results - Run a report today and tomorrow → same numbers (for the same period) - Retry a failed operation → no duplicates, no differences
This sounds obvious. It's not how most systems work.
The Replay Problem
Modern accounting systems process transactions through layers of logic:
- Import parsing: Interpret the raw data
- Rule matching: Determine which posting rules apply
- Account mapping: Select the correct accounts
- Entry creation: Generate the journal entry
- Validation: Check for errors or warnings
At each layer, there's potential for non-determinism:
Mutable Configuration
If posting rules can change, yesterday's import uses yesterday's rules. Today's re-import uses today's rules. Different rules = different output.
Missing Snapshots
When you query "which rule created this entry?", can you see the exact version of that rule at the time of creation? Or just the current version?
Time-Sensitive Logic
Rules that depend on "current date" produce different results on different days. A transaction from December processed in December behaves differently if re-processed in January.
External Dependencies
If the system calls external services (exchange rates, vendor APIs), those responses may change. Same input + different external state = different output.
Why "It Usually Works" Isn't Good Enough
In most software, occasional inconsistency is acceptable. A recommendation algorithm doesn't need perfect reproducibility.
Accounting is different.
Audit Requirements
When auditors examine your books, they expect: - The ability to reconstruct how any entry was created - Consistent results when recalculating - Explainable differences (and there shouldn't be unexplainable ones)
Non-deterministic systems fail audits. "The system might produce different results if we ran it again" is not an acceptable explanation.
Legal Liability
Board members have fiduciary duties. Financial records must be reliable. "The numbers change depending on when you run the report" exposes the organization—and individual board members—to liability.
Reconciliation Nightmares
When bank statements don't match the ledger, you investigate. If the ledger itself isn't stable, investigation becomes impossible. Was the discrepancy in the source data, or did the system produce different output?
Trust Erosion
Once users learn the system isn't reliable, they stop trusting it. They maintain shadow spreadsheets. They double-check everything manually. The software becomes overhead, not infrastructure.
The Components of Determinism
Building a deterministic accounting system requires:
1. Immutable Rule Snapshots
When a posting rule creates a journal entry, capture the exact rule configuration at that moment:
| Field | Value |
|---|---|
| Rule ID | payment_received_rule |
| Version | 14 |
| Created At | 2024-03-15 14:32:00 |
| Debit Account | 1000-Cash |
| Credit Account | 1200-AR |
| Logic Hash | a8f3c9d2... |
This snapshot is preserved forever. The current rule can change; the historical snapshot cannot.
2. Idempotency Keys
Every external input gets a unique key: - Bank import: statement_id + line_number - Payment: payment_processor_id + transaction_id - Manual entry: user_id + timestamp + sequence
If the system receives the same idempotency key twice, it returns the original result—never creates a duplicate.
3. Temporal Validity
Configuration has effective dates: - Rule version 14 was effective 2024-01-01 to 2024-03-14 - Rule version 15 became effective 2024-03-15
When processing a transaction from February, the system uses the February version of the rule—even if you process it in April.
4. No External State Dependencies
Critical calculations don't depend on external services that might change: - Exchange rates captured at transaction time, not lookup time - Vendor data snapshot when the transaction is created - All inputs stored, not re-fetched
5. Deterministic Tie-Breaking
When multiple rules could match, the selection is deterministic: - Priority numbers (rule 1 before rule 2) - Alphabetical by ID (for equal priority) - Never random, never "first match wins" without defined order
What Non-Determinism Looks Like
You might have a non-deterministic system if:
Imports Produce Different Results
Re-importing the same bank statement creates different entries than the first time—even without any deliberate changes.
Historical Reports Change
A report for "January 2024" shows different numbers today than it did last month.
Duplicate Transactions Appear
Clicking "Submit" twice creates two entries instead of one. Webhook retries cause duplicates. Imports create records that already exist.
"Recalculate" Changes Balances
Running a batch recalculation produces different totals than the original posting.
Same Transaction, Different Entry
The same invoice processed by two different users gets different account assignments.
The Retry Test
Here's a simple test of determinism:
- Export your current general ledger
- Delete all journal entries for last month
- Re-import/re-process all the source transactions
- Compare to the export
If the numbers match exactly, your system is likely deterministic.
If they don't match, you have a problem—and you might not have known it until now.
The Competitive Reality
Most accounting systems are not deterministic because:
It's harder to build. Capturing snapshots, managing versions, enforcing idempotency—this is complex infrastructure that doesn't show up in feature lists.
It's invisible when working. Users don't notice determinism. They only notice when things break.
Legacy architecture prevents it. Systems built with mutable state can't easily add immutability. It's an architectural decision that must be made early.
"It's close enough." Systems that work 99% of the time feel reliable. But that 1% causes audit failures, unexplained variances, and eroded trust.
Questions to Ask Your Software
- If I import the same bank statement twice, will I get identical journal entries?
- If a posting rule changes, does it affect historical transactions that already used the old rule?
- If a webhook or API call is retried, does it create duplicate entries?
- Can I see exactly which version of a rule created a specific journal entry?
- If I run a historical report today and again in a year, will the numbers match?
If any answer is "no" or "it depends," you're running a non-deterministic system. And non-deterministic accounting systems eventually produce books you can't defend.
Related Concepts
- What Is an Idempotency Key? - The mechanism that prevents duplicate processing
- What Is Posting Provenance? - Tracking exactly how entries were created
- Why Time Is the Hardest Problem in Accounting - Managing temporal correctness
How CommunityPay Enforces This
- Posting rule snapshots captured at time of entry
- Idempotency keys prevent duplicate transactions
- Configuration versioning ensures reproducibility
- Same input always produces same accounting output