A posting rule turns a business event into a journal entry. When an invoice is issued or a cheque bounces, the rules decide which accounts are debited and credited and for how much.
This is the piece of configuration that makes the ledger self-maintaining. It is also the piece where a mistake is replicated across every transaction until someone notices, so it repays care.
What a rule holds
| Field | Notes |
|---|---|
| Source | Which event it responds to. |
| Scope kind | Global or Tariff. |
| Scope ID | Which tariff, when scoped to one. |
| Description | What the rule does. |
| Valid from / Valid to | The period it applies. |
| Active | Whether it is in force. |
| Conditions | Which events it matches. |
| Lines | The debits and credits it produces. |
Sources
| Source | Event |
|---|---|
| Invoice | A customer invoice. |
| Vendor invoice | A supplier invoice. |
| Payment | A payment. |
| Cheque | A cheque event. |
| Custody payment — process | Custody cash advanced. |
| Custody payment — submit | Custody submitted. |
Custody appears twice because advancing the cash and submitting the reconciled spend are different accounting events. See Custody payment requests.
Scope
- Global rules apply to every event of their source.
- Tariff rules apply only to a specific tariff code — see Tax, tariff codes and configuration.
Start global and add tariff-scoped rules only where a specific charge genuinely posts differently. A forest of narrow rules is far harder to reason about than a few broad ones.
Conditions
Conditions decide whether a rule matches an event:
| Part | Meaning |
|---|---|
| Attribute key | Which field on the event to look at. |
| Operator | EQ NE IN NIN GT GTE LT LTE LIKE EXISTS |
| Value | What to compare against. |
| Quantifier | ANY, ALL or NONE — for attributes holding several values. |
The field schema screen documents which attributes are available per source. Consult it rather than guessing: a condition on a key that does not exist never matches, and the rule simply never fires — silently.
Lines
Each line produces one journal line:
| Field | Notes |
|---|---|
| Line number | Order within the entry. |
| Dr/Cr | Debit or credit. |
| GL account | The account, when fixed. |
| Custom function | How to derive the account, when it is not fixed. |
| Amount source | Where the amount comes from. |
| Dimensions from context | Which analysis attributes to carry through from the event. |
Amount sources
| Source | Amount |
|---|---|
| Line net | The net value. |
| Line VAT | The tax. |
| Line gross | Net plus tax. |
| Fixed | A constant. |
| Percent of net | A percentage of net. |
| Percent of gross | A percentage of gross. |
A typical invoice rule debits receivables with line gross, credits revenue with line net, and credits the tax account with line VAT. Those three together balance; any two of them do not.
Resolving the account dynamically
Rather than naming a fixed account, a line can resolve one from the event:
| Function | Resolves to |
|---|---|
| Extract from bank account | The GL account linked to the bank account. |
| Extract from client | The customer's account. |
| Extract from vendor | The vendor's account. |
| Extract from treasury account | The treasury location's account. |
| GL account | A directly specified account. |
This is what keeps the rule set small. One payment rule serves every bank, because the account comes from whichever bank was used — see The chart of accounts for how those links are set.
Validity dates
Valid from and valid to let a rule change on a date without deleting the old one. When a VAT rate or an account mapping changes, close the old rule with a valid to and create the successor from the following day.
Never edit a rule that has already posted. Historic entries were produced by what the rule said at the time, and editing it destroys the ability to explain them.
Testing a new rule
- Check the field schema for the attribute keys you are using.
- Confirm the lines balance for a representative event.
- Set validity from a future date, then post a test transaction and inspect the resulting journal lines — each shows the rule that produced it.
- Check dimensions carried through, or your analysis will have a hole exactly where the new rule fires.
When an expected journal does not appear
Work down this list:
- Is the rule active?
- Is the event date within valid from / valid to?
- Does the source match the event?
- Do the conditions match — particularly attribute keys and quantifiers?
- Is the scope narrower than you think — a tariff rule where a global one was intended?
- If the rule fired but the entry is wrong, look at the amount source first. It is the commonest error, and net-versus-gross is the commonest form of it.
Last updated 15 September 2026