Why Your Publisher Program Needs Double-Entry Accounting
The spreadsheet always starts innocent. One tab, one publisher, a column for the conversion, a column for the commission, a running total at the bottom. It works beautifully — right up until the month a publisher disputes a payout, a lead gets cancelled after you already paid on it, and your finance lead asks a question that should be simple: "As of today, exactly how much do we owe our publishers?" You open the sheet. The total at the bottom is a number. But you cannot prove it is the right number, because there is no record of how it got there. Someone edited a cell three weeks ago. A formula silently broke when a row was inserted. The payout tab and the accrual tab disagree by an amount nobody can explain.
That gap — between a number you can see and a number you can defend — is where publisher programs quietly bleed money and trust. This article is about closing it with the oldest, most boring, most reliable financial technology ever invented: double-entry accounting.
The failure modes of single-ledger commission tracking
Tracking commissions in a spreadsheet, or in a homegrown "one row per payout" table, isn't wrong because spreadsheets are bad. It's wrong because a single running list has no built-in notion of balance. Every real financial event in a publisher program has two sides, and a single ledger only ever records one of them.
Consider what actually happens across a commission's life:
- A conversion is approved. You now owe a publisher money, but you haven't paid it. That is a liability that exists on your books before any cash moves.
- A payout runs. Cash leaves your account, and the liability you were carrying shrinks by the same amount.
- A lead is later cancelled or charged back. The commission you accrued was never really earned, and it has to come back off the books — cleanly, without deleting the fact that it once existed.
- A publisher disputes a deduction. Money has to sit in limbo, neither payable nor written off, until the dispute resolves.
A single-column running total can represent none of these states honestly. It collapses "owed but unpaid," "paid," "reversed," and "on hold" into one flat number. So when the number is wrong, you cannot ask which side is wrong. You cannot separate an accrual problem from a cash problem from a dispute problem. And because rows are editable and deletable, you cannot even trust that yesterday's number was ever right. The most dangerous property of a spreadsheet ledger is that it forgets — it overwrites history every time someone fixes a typo.
At small scale you paper over this with diligence. At real scale — thousands of conversions, dozens of publishers, disputes and clawbacks arriving daily — diligence is not a control. You need the math to enforce itself.
What a real double-entry ledger enforces
Double-entry accounting has one non-negotiable rule: every transaction is recorded as a set of lines, and the debits must equal the credits. Nothing gets posted otherwise. In TrackingMD, this lives in the LedgerService, and it is the only door into the books. When it posts an entry, it first sums the debit lines and the credit lines, and if they don't match to the cent, it refuses — throwing an unbalanced-entry error rather than writing a lopsided record. There is no code path that quietly saves an imbalanced entry "to fix later."
Each posting produces one journal entry (the event: what happened, when, and what it references) and two or more journal lines (the money: which account, how much, debit or credit). Every organization gets a small, purpose-built chart of accounts seeded automatically:
| Code | Account | Type |
|---|---|---|
| 1000 | Cash / Bank | Asset |
| 2100 | Commissions Payable | Liability |
| 2200 | Dispute Hold | Liability |
| 5000 | Commission Expense | Expense |
| 5100 | Dispute Loss | Expense |
Now the lifecycle maps onto real, separable movements. When a commission is approved, the system debits Commission Expense and credits Commissions Payable — you have recognized the cost and the obligation in one balanced stroke, before a cent of cash moves. When the payout runs, it debits Commissions Payable and credits Cash — the obligation drains and the cash leaves, in lockstep. The "how much do we owe" question your finance lead asked is now just the balance of account 2100. It is always defensible, because every dollar in it arrived through a balanced entry tied to a specific commission.
Immutability: the books never lie about the past
Here is the property spreadsheets can never give you. In TrackingMD, journal entries and journal lines are immutable. The models physically reject updates and deletes — attempt either and they throw an immutable-record exception. A posted entry is a permanent fact.
So how do you undo something? The same way real accountants have for centuries: you don't erase, you reverse. When a lead is cancelled after its commission was accrued, the ledger doesn't hunt down the old row and change it. It finds the original Commission Earned entry and posts a brand-new Commission Reversal entry with the debits and credits swapped. Both entries live on the books forever. The net effect on your balances is zero, but the history is complete: anyone auditing the account can see the commission was earned, then see exactly when and why it was reversed. Nothing is hidden, because nothing can be.
This is what turns a ledger into an audit trail instead of a snapshot. Your books don't just tell you where you stand today; they tell you every step of how you got here, and no one — not an admin, not a bad migration, not a fat-fingered edit — can rewrite it.
Disputes, without the guesswork
Disputes are where single-ledger tracking falls apart completely, because the money is genuinely in an in-between state. TrackingMD models it directly. When a dispute opens, the amount moves out of Commissions Payable and into Dispute Hold — a debit to 2100, a credit to 2200 — so it is neither payable nor lost while the case is open. When the dispute resolves, that hold is always drained by debiting 2200, and only the credit side varies with the outcome: an approved dispute releases the money back to payable, a rejected one writes it off to Dispute Loss, and a partial resolution splits it precisely — the kept portion back to payable, the disallowed portion to loss, computed so the two legs drain the hold to the exact cent. Every possible ending is a balanced entry. The money can never leak into an undefined state.
The trial balance: proof, on demand
All of this converges on one report that a spreadsheet can never honestly produce: the trial balance. The ledger can, for any organization and any date range, total every account's debits and credits and check that the grand totals match. That single boolean — balanced or not — is a live proof that your entire book of commission accounting is internally consistent. If it is balanced, every event since the beginning netted correctly. If it isn't, you have a concrete, findable defect, not a vague suspicion.
This is not theoretical plumbing. When TrackingMD needed to backfill accrual entries for historical commissions that were paid before the ledger existed — the payout side was on the books but the earning side never was, quietly driving payable balances negative — the backfill command posted the missing entries idempotently and then verified the trial balance per organization, refusing to call the job clean unless the books came out balanced. The system checks its own work with the same arithmetic it uses to guard every entry.
The clarity dividend
Industry studies of finance operations consistently find that a large share of reconciliation effort goes not to fixing errors but to locating them — proving where a discrepancy lives. A real double-entry ledger dissolves most of that work, because the structure makes discrepancies self-locating. Accruals, payouts, reversals, and disputes each land in their own account, every entry balances by construction, and history is immutable. "How much do we owe, and can you prove it?" stops being a fire drill and becomes a report.
Spreadsheets gave your program a number. A ledger gives it the truth behind the number — and as your publisher program grows from dozens of conversions to hundreds of thousands, that difference stops being an accounting nicety and becomes the thing that lets you pay confidently, dispute fairly, and close every month knowing the books will always, provably, balance.
See it in your own program
Start your free 7-day trial and put these ideas to work — no credit card required.
Start free trial