EP Finance
EP Finance is the book. It holds your accounts, records every transaction as a balanced double entry, and reports on the result. The rest of the finance family sits on top of it.
This page documents EP Finance 0.6.0.
Published by ElmsPark Studio.
Requirements
Section titled “Requirements”- PageMotor 0.9b or later
Nothing else. EP Finance is the base of the family; the other finance plugins require it, not the other way round.
What it gives you
Section titled “What it gives you”| Accounts | Your chart of accounts, in four classes: asset, liability, revenue and expense |
| Categories | What a line was for, kept separate from which account it moved through |
| Transactions | Every entry is a group of two or more splits that must balance to zero |
| Registers | Per-account listings with a running balance |
| Profit and loss | Built on the category tree, with drill-down to the transactions behind any figure |
| Cash flow | Money in and out over a period |
| Seeded charts | Sensible starting charts for the UK, Ireland and the United States |
| Nightly audit | Re-checks the whole book and reports anything inconsistent |
Money is never a decimal
Section titled “Money is never a decimal”Every amount is held as a whole number of pence or cents. Nothing is stored as a fraction, so nothing drifts by a penny after a few hundred additions. This is the single most important decision in the plugin and everything else is built on it.
One door in, and what it enforces
Section titled “One door in, and what it enforces”Every write goes through one gateway. Nothing writes to the book around the side, including the other finance plugins. That gateway refuses anything that would leave the book inconsistent:
- A transaction must balance. Splits sum to exactly zero, or it is refused. A single-legged entry is rejected by name as an orphan.
- Transfers pair up. Money moving between two of your own accounts is recorded as two matching legs.
- The same thing cannot post twice. Anything arriving from another plugin carries an identifier from its source, so a repeated import, a re-run sweep or a retried webhook is a no-op rather than a duplicate.
- A reconciled line cannot be quietly edited. Once a split is matched to a closed bank statement it is immutable until you deliberately unlock that statement.
The nightly audit re-checks all of this across the whole book and tells you if anything has slipped.
Working in more than one currency
Section titled “Working in more than one currency”Optional, and off unless you turn it on.
A transaction entered in a foreign currency carries the exchange rate you gave it and converts once, at the moment it is posted. Reports are in your book currency, a bank account’s own register is in that bank’s currency, and the difference that appears when a foreign invoice finally settles is recorded as a realised gain or loss.
A rate is never guessed. If you have not supplied one, the plugin asks rather than inventing a number.
Closing a period
Section titled “Closing a period”Once you have filed a return, close the book up to that date. Set Book closed up to and including on the settings screen and anything dated on or before it is refused: it cannot be posted, edited or deleted. Leave it empty and nothing is locked, which is how a book behaves until you choose otherwise.
The date is inclusive, the way an accountant reads it. Closing at 31 August closes the 31st itself, not just everything before it.
Why this matters more than it sounds
Section titled “Why this matters more than it sounds”Before this existed, the only thing the book protected was a transaction reconciled against a closed bank statement. Most postings never go through that path, so a manual journal entry or an invoice posting stayed editable forever, including after a VAT return had been filed on it. The return could be computed today and the figures underneath it changed next month, with no error and no trace.
The override password
Section titled “The override password”Optional. Set one and somebody who knows it can still post into a closed period when there is a genuine reason to. Leave it unset and the closed period cannot be written to at all, by anyone, until you move the date. Removing it later is one click.
It is stored as a one-way hash, so it cannot be recovered, only replaced, and it is set with its own button rather than a settings box so it never travels through a saved form.
What it does not do
Section titled “What it does not do”It does not stop you resetting the whole book, which is a deliberate exclusion: that is a factory reset with its own confirmation, and guarding it would make a book that has ever been closed impossible to reset.
Routine work is unaffected. Anything already posted stays recognised as already posted, so re-running an import or a sweep over a closed month is the same harmless no-op it has always been.
The change history
Section titled “The change history”Every change made to the book through EP Finance is recorded: what changed, who changed it, when, and what the value was before. It appears on the Audit tab, under the consistency check.
It answers a different question from the audit above it
Section titled “It answers a different question from the audit above it”These two are easy to confuse and they are not the same thing.
The consistency audit asks whether the book adds up right now. The change history asks how it got to be this way. A book can be perfectly consistent and still have had a figure quietly changed after a return was filed on it, which is exactly the case where the audit tells you nothing useful and the history tells you everything.
What it catches that a total does not
Section titled “What it catches that a total does not”The obvious ones are amounts. The useful ones are the changes that move a figure without touching an amount at all:
- Moving a transaction to a different category, which shifts money between profit and loss lines
- Renaming or reclassifying an account
- Unlocking a bank statement, which makes its reconciled lines editable again
Each of those leaves the arithmetic intact and changes what your reports say.
Attribution
Section titled “Attribution”Every entry names a person, or names system where there was no person, for a scheduled job or an automatic posting. It is never left blank, so an entry with no name would itself be a sign something was wrong rather than routine.
What it does not claim
Section titled “What it does not claim”It records changes made through EP Finance. Somebody with direct database access editing a table by hand is outside what any plugin can see, and this does not pretend otherwise. Part of that gap is covered separately: the plugin installs database-level guards that refuse a direct change to a reconciled transaction, where your host permits them.
Nothing is deleted automatically. There is no retention period, because you cannot tell a clean history from a pruned one. Trimming old entries is possible and is always your decision.
Document stamps
Section titled “Document stamps”EP Finance keeps a fingerprint of every accountant pack and invoice the suite produces, and stamps the document with a pointer back to it. That lets you check later whether a document’s contents are exactly what was recorded at the time.
It is not a signature. It says nothing about who produced a document, only whether the contents have changed since. Anyone with database access could write a matching record. It protects against accident, drift and quiet edits, not against a determined party, and the documents themselves say so rather than implying more.
Stamps are never overwritten. Regenerating a document adds a new one, so the record shows when the figures moved.
The rest of the family
Section titled “The rest of the family”EP Finance holds the book. These add to it, and each needs it:
- EP Finance Invoicing issues quotes and invoices and posts the result
- EP Finance Importer brings in bank statements and reconciles them
- EP Finance Receipts captures expense receipts and matches them to bank lines
- EP Finance Sources posts orders, bookings, ticket sales and instructor pay automatically
- EP Finance Autopilot suggests categories for anything unmatched, and you approve
- Tax packs for the UK, Ireland and the United States prepare the figures for your return
Changelog
Section titled “Changelog”- Choose cash or accrual for income tax. Setup has a new “Income tax accounting method” setting. It decides how your Schedule C (EP Finance Tax US) or SA103 (EP Finance Tax UK) figures are worked out. On the cash basis an invoice counts as income when it is paid. On accrual it counts on the date you issue it.
- New books start on the cash basis.
- Books you already have keep the figures they have always had (accrual) until you choose. Until then the Setup and Tax tabs show a note asking you to choose.
- Update EP Finance Invoicing, Tax US and Tax UK at the same time.
- Click a figure in your profit and loss to see what makes it up. On the Reports tab, every category figure in the profit and loss is now a link. Click it and the transactions behind that figure open underneath, with their total; click it again to close them. A category’s figure includes its subcategories, and so does the list.
- If you run the profit and loss for one segment, the list shows only that segment’s transactions, so it always adds up to the figure you clicked.
- Income now shows as a positive amount in the transaction list, the same way the profit and loss shows it.
- Settings language menu. The language menu in this plugin’s settings now lists only the languages it is actually translated into, plus English, so you can no longer pick a language that changes nothing.
- Your books can now record VAT. If you are VAT registered in the UK or Ireland, set your registration date under Setup, VAT registration. From that date, sales and purchases go into your books with the VAT on its own line, so the VAT return can read it. Before this, nothing put VAT on its own line: a VAT return worked out from real sales showed no VAT on sales or purchases, and counted the VAT inside your sales figure.
- Covered: Stripe and site sales (EP Finance Sources 0.3.25), invoices (EP Finance Invoicing 0.2.15), bank imports with a VAT rule (EP Finance Importer 0.1.19) and the New transaction form, which now has a VAT menu. Nothing dated before your registration date gets VAT.
- Entries already in your books are not changed. If you were VAT registered before this update, the UK and Irish VAT returns now name the sales recorded since your registration date that carry no VAT, so you can correct them before you file.
- While a UK or Irish book is not set as VAT registered, the New transaction form and the Tax tab say that VAT is not being recorded.
- If you switch VAT registration on while your tax pack has no VAT scheme chosen, the VAT registration block says no VAT return is worked out until you choose one.
- Update EP Finance Sources, Invoicing, Importer and the tax packs at the same time.
0.7.14
Section titled “0.7.14”- VAT returns leave out VAT on receipts marked “not VAT evidence”. A purchase whose only receipt has no VAT number (EP Finance Receipts flags it “not VAT evidence”) no longer counts towards the VAT you can reclaim in the UK and Irish tax packs. The return names those purchases so you can add back any that genuinely need no VAT invoice, after checking with your accountant.
- Purchases with no receipt at all are counted as before.
0.7.13
Section titled “0.7.13”- Tax calendar deadlines now end on the right day. On a server whose clock is ahead of UTC (the UK and Ireland in summer, or New Zealand), a deadline in the downloaded calendar file could end on the same day it started, which calendar files do not allow. Each deadline now covers its whole day, whatever the server’s time zone. If you imported the calendar before, download it again and re-import it. The events keep their identifiers, so your calendar app updates them rather than adding copies.
- The accountant pack’s receipts list now covers only the pack’s period.
receipts-manifest.csvlisted every receipt in your books, from any year, and said each one was “attached to a reconciled transaction” whether it was or not. It now lists the receipts on transactions dated in the period, gives each transaction’s date, and says “reconciled” only when that transaction is matched to a bank statement line. - The receipts list shows whether each receipt counts as VAT evidence. A new “VAT evidence” column reads Yes or No from EP Finance Receipts, and “Not recorded” for a file attached some other way. A US pack has no such column. The VAT figures do not change, so check the receipts marked No before you claim input VAT on them.
- The pack’s document stamp line uses plain characters. The cover now reads “Document stamp #12 - sha256:… - recorded …”. The ”·” it used before printed as ”??” in some places.
- A pack is no longer refused because its stamp could not be saved. On a server where database errors stop the page, a pack whose stamp record could not be written failed with an error, for example on a book set up before EP Finance 0.6.0 kept stamps. It is now built without the stamp line, as intended.
- These fixes are shared with the UK, Ireland and US tax packs, and the stamp part with EP Finance Invoicing. Update them together.
0.7.12
Section titled “0.7.12”- The New transaction form now works on a phone. Each line of a transaction used to keep all its boxes on one row, so on a phone the account and category menus shrank to bare arrows you could not read, and the page scrolled sideways (more so with multi-currency on). Each line now shows two boxes a row: account and category, then amount and currency, then rate.
- The override password label wraps on a narrow screen instead of pushing the page wider.
0.7.11
Section titled “0.7.11”- You can now edit a transaction’s description. In an account’s register, each description has an Edit link. Change the text, then press Save (or Enter); Cancel (or Escape) leaves it as it was. The change is recorded in the change history.
- A transaction inside a closed period asks for your override password right there in the row. A locked transaction tells you it cannot be changed.
- On a phone, the change history, the accounts table and the register no longer make the whole page scroll sideways; each scrolls on its own.
0.7.10
Section titled “0.7.10”- An open bank statement’s details can now be corrected. Its label, opening and closing balances and dates can be changed while it is open. A closed statement cannot be changed until you unlock it. Every change is recorded in the audit trail. EP Finance Importer uses this to repair statements that older versions imported with the wrong balances.
- A transaction’s description can now be changed. The same rules apply as for other edits: not on a locked transaction, and not inside a closed period without the override password. Every change is recorded in the audit trail.
- Personal data can be erased from a transaction’s description. When someone asks for their data to be erased, EP Finance Invoicing can now remove their name from the transaction an invoice made in your books, including from the audit trail’s copies. The audit trail records that an erasure happened, without the name. Amounts, accounts and dates are never changed, so this works even inside a closed period.
- A bank statement can now be deleted, so EP Finance Importer can undo an import. An open statement can be removed together with its lines. Transactions that were matched to it are kept, just unmatched. A closed statement cannot be deleted until you unlock it. Every deletion is recorded in the audit trail.
- The override password now works from the Transactions form. When your book has a closing date and an override password, the Transactions form shows an override box. Type the password there to post an entry dated inside the closed period. Before, the Settings screen said the password let you do this, but nothing on screen could send it, so the entry was always refused. The box is emptied after every post and the password is never stored.
- A transaction date must be a real date written as YYYY-MM-DD. A date such as 2026/08/01 or 2026-02-30 is now refused with a clear message. A date written with slashes could slip past the closing date into a closed period.
- Very long text no longer stops a save. A description, name, memo or statement label longer than its field now keeps as much as fits (whole characters, including accented ones) instead of failing with an error on stricter database servers. An external reference longer than 191 characters is refused, because cutting it could make two different references look the same.
- Amounts too large for the books are refused. An amount of 10 trillion or more (in any currency) is refused with “That amount is larger than the books can hold”. Before, a figure of around 20 digits was quietly recorded as a zero-value transaction.
- Search treats % and _ as ordinary characters. Searching for “50%” finds “50% off” and no longer also matches “500 widgets”.
- Matching and unmatching a bank statement line now appear in the change history, for both the statement line and the transaction line, like every other change to the book.
- With multi-currency on, the balance hint on the Transactions form now uses the rate you enter for a foreign-currency line. Before, the rate was ignored, so the hint was off for any foreign line.
- Running the book audit no longer adds another copy of the change history to the page each time you press it (nor does loading the demo book).
- Deleting a transaction now frees its bank statement line. If the transaction had been matched to a line on an open statement, that line goes back to unmatched, so you can match it to the right entry. Any file attached to the deleted transaction is unlinked too. The book audit now also spots a statement line that still claims a transaction which no longer exists, which earlier versions could leave behind.
- “Replace all data with demo book” is much harder to press by mistake. It is refused while a closing date is set. If the book holds accounts, categories, transactions or statements that the demo did not create, you now have to type the word REPLACE before anything is deleted. An empty book, or one holding only the demo, loads as before.
- Seeding a starter chart twice no longer doubles it. Accounts and categories already in your book are kept and not added again, and the message says how many were already there. Seeding a second jurisdiction fills in its tax mapping on the categories the two charts share. New accounts from a chart now use your book currency, not the chart’s.
- A category can no longer be put on the bank, cash or card line of a new transaction. It belongs on the line for where the money was spent or who paid you. Put on the bank line, the profit and loss added it up the wrong way round, so a £50 fuel bill raised your profit by £50. Entries already in the book are not changed.
- Foreign-currency accounts show their balance in their own currency. A euro account in a sterling book now shows € on the Accounts list, in the cash flow report and in search results, not £. The cash flow CSV gains a Currency column at the end.
- Segments now work in the Transactions form and the profit and loss. When your book has segments, the Transactions form lets you choose one, and choosing a segment on the Reports tab filters the profit and loss (and its CSV export) to it. The report heading says which segment you are looking at. Before, the choice was ignored and whole-book figures were shown.
- The book currency is fixed once the book has a transaction. Changing it afterwards would relabel every past amount without converting anything. The setting now says so, and a Save that tries to change it keeps the old currency (the rest of the Save still goes through).
- An account’s opening balance, type and currency are protected by the closing date. If the account was already in use on or before the closing date, these can no longer be changed without the override password, because that would change figures in the closed period. Renaming it is still fine, and an account opened after the closing date can still be corrected.
- New “Main bank account” setting. Under Book setup you can now say which account is your main bank account: the one your money is paid into and your bank statements come from.
- The other finance plugins use it. EP Finance Invoicing records invoice payments on it, EP Finance Sources records Stripe payouts on it, and EP Finance Importer offers it first when you import a statement. So each payment is matched to its bank line instead of being counted twice, and you no longer have to set the same account in several places.
- A plugin can still use a different account. If one names its own account in its settings, it keeps using that one.
- Nothing changes until you choose. The setting starts empty, and each plugin carries on as before. Changing it affects new entries only.
- If the chosen account is deleted or made inactive, each plugin goes back to its own default.
- A closing date typed in the wrong format no longer locks your whole book. The Settings screen only accepts a closing date written as YYYY-MM-DD, and shows “No closing date is set” for anything else, such as 31/08/2026. The books themselves, however, still used what was typed, and treated every date as closed. Every new transaction, import, invoice and automatic posting was then refused. The books now read the closing date the same way the Settings screen does.
- A matched transaction on a closed statement can no longer be quietly unlocked by matching it again. Once a statement is closed, the transactions matched to it cannot be edited until you unlock the statement. Matching one of those transactions to a line on a different, open statement used to lift that protection without any unlock being recorded. That move is now refused. So is matching a line on a closed statement, and matching a line or transaction that is already matched. Unmatch it first.
- The download no longer includes an internal notes file. Earlier versions carried a
CLAUDE.mdfile of developer notes in the plugin folder. Neither the plugin nor PageMotor ever read it, so nothing about how the plugin works changes. If an earlier version leftep-finance/CLAUDE.mdon your site, it is harmless and safe to delete.
- Fixes a doubled cache-busting tag on its admin script. On PageMotor 0.11 and later the page asked for the file with two version tags on the end of its address (
?v=…?v=…), because the core had started adding its own tag and the plugin was still adding one too. The file loaded correctly, so nothing was visibly broken; the address was just malformed and every cache saw a longer key than it needed. The plugin now leaves the tag to the core on 0.11 and later, and still adds its own on older cores, where nothing else would. - No change to what that script does.
- Works with PageMotor 0.11.3 and stays compatible with earlier releases. PageMotor 0.11.3 changed how a plugin declares its API and MCP actions, and a plugin that still uses the old declaration has every one of its actions silently dropped from the registry on that version. This release declares its actions in the shape the running PageMotor expects, so an AI connected over API or MCP keeps every action whether the site is on 0.11.3 or on an earlier release.
- Actions are now grouped into families, so a connected AI that looks up one action is shown its siblings.
- You can now slice the book a second way, independently of accounts and categories. A segment is a shop location, a fund, a programme, a project. Tag transactions with one and you can see a profit and loss for just that part of the business.
- This is what lets two locations share one chart of accounts. Without it, telling them apart means duplicating every asset, expense and income account, which then breaks every other report that assumes a single flat chart.
- Set it once per transaction, or per line where they differ. Rent split across two shops is one transaction with a different segment on each line.
- Nothing changes for a book that does not use it. Segments are entirely optional, every existing transaction stays unsegmented, and an unsegmented book’s reports are exactly what they were.
- A by-segment summary on the Reports tab shows income, expenses and net for each one, with anything not yet classified listed separately at the bottom. That last row is the honest one: if most of the book sits there, a by-segment view is still a partial picture and you can see that at a glance.
- The profit and loss can be filtered to one segment, or to just the unclassified lines so you can find what still needs tagging.
- Segments are deactivated, never deleted. Historic transactions still refer to them, and removing one would quietly turn a filed segmented report into an unsegmented one.
- Re-tagging a transaction is recorded in the change history like any other edit, because it moves money between reports without altering a single amount.
Released 9 September 2026.
- Documents can now be checked against what was recorded when they were produced. EP Finance keeps a fingerprint of every accountant pack and invoice the suite generates, and the document carries a pointer back to it.
- It is not a signature, and says so on the document. It tells you whether contents have changed, not who produced them.
- Regenerating a document records a new stamp rather than replacing the old one, so the history shows when figures moved between generations.
- This is the shared foundation the tax packs and EP Finance Invoicing use.
Released 9 September 2026.
- Fixes the Change history panel, which did not appear in 0.5.0. Two faults, both in the display only: the panel was skipped on any book where the consistency check had never been run, and its refresh failed with an internal error.
- Nothing was lost. The history recorded correctly throughout 0.5.0. Every change made under it is in the log and visible now.
Released 9 September 2026.
- The book now keeps a change history: who changed what, when, and what it was before. It appears under the existing consistency check on the Audit tab.
- This answers a different question from the nightly audit. The audit says whether the book adds up now. The history says how it got that way. A book can be consistent and still have had a figure quietly changed after a return was filed on it.
- Every change is attributed to a person, or explicitly to “system”. Never blank, so an unattributed entry would itself be a signal.
- It catches the changes that move a figure without touching an amount: recategorising a transaction, reclassifying an account, and unlocking a statement so its reconciled lines become editable again.
- A reset of the whole book is recorded, and the history survives it.
- Nothing is deleted automatically and there is no retention period, because you cannot tell a clean history from a pruned one.
Released 9 September 2026.
- You can now close the book at a date, so a filed figure cannot change behind your back. Anything dated on or before the closing date is refused: it cannot be posted, edited or deleted. Leave the setting empty and nothing is locked.
- The date is inclusive, the way an accountant reads it: closing at 31 August closes the 31st itself.
- An optional override password, if you want one, stored as a one-way hash and set through its own button rather than a settings box. Leave it unset and the closed period cannot be written to at all until you move the date.
- Routine re-imports and sweeps are unaffected. Anything already posted stays recognised as already posted, so re-running an import over a closed month is the same harmless no-op it has always been.
Released 1 September 2026.
- Four of this plugin’s actions used to appear as their own entries in the tool list of any connected AI client. That surface is reserved for PageMotor itself, so those entries have been removed.
- Nothing became unreachable and nothing else changed. Every action still works exactly as before through PageMotor’s own dispatch, with identical responses. Only a caller that had been invoking one of those names directly is affected, and it should dispatch through PageMotor instead.
Released 6 August 2026.
- Hardening: if the plugin’s bundled shared file is ever missing or damaged, the plugin now stands down quietly instead of taking the site down with it. No change when everything is healthy.