NAV, koers and fees
The engine that works out what everything is worth
This is the part a spreadsheet does with thousands of copied formulas and no way to check them. In FundFlow it is one calculation, running in the database, in exact decimal arithmetic, over inputs you can point at.
No credit card. Nothing is charged until your first 30 days are over.
What the calculation actually does
The same order every month, per series, per participant. Nothing is rounded until it has to be.
Gross return at fund level
Closing assets minus opening assets minus the net flows, over opening assets. Deposits confirmed for the month enter at the start of it, which is the convention a monthly NAV cycle uses.
Value after return, per holding
Each participant's opening value grows by the gross return before any fee comes off, so the fee is charged on the gain rather than on the gain plus itself.
Management fee
The series rate divided by twelve, on the value at the start of the month. Set in basis points on the series, not restated anywhere else.
Performance fee above the high-water mark
Charged on whatever is left above the participant's mark after the management fee, at the series rate. If the mark has not been cleared, there is no fee.
New high-water mark
The higher of the old mark and the closing value, stored per unit on the holding and carried into next month.
Koers per series
The sum of closing values over the units outstanding. New units are issued at that price, which is what makes the next month's entry price defensible.

Why it runs in the database
Exact decimal, not binary floating point
A spreadsheet total of 99,994.26 becomes 99,994.26000000001 and the residue compounds down the column. Postgres NUMERIC has no such artefact, and TypeScript in this product never does money arithmetic at all: it formats.
One implementation, not thousands of copies
The waterfall exists once and is applied identically to every participant and series. There is no row where somebody dragged the formula one cell too far.
Deterministic and safe to re-run
The calculation derives everything from stored inputs and fully replaces its own output. Running it again on an open month with the same inputs cannot produce a different answer.
Tested against a real book
The engine has a database-level test suite including golden-master comparisons: fixed inputs whose expected outputs were checked against a real fund's own figures, to the cent.
Stale results are marked, not kept
Change a balance after computing and the period is flagged as needing recomputation rather than quietly showing yesterday's answer.
Every figure keeps its inputs
Which is what lets any number on any screen open an explanation with its formula, its actual inputs and its period.
What this is really about
Almost every dispute in fund administration is a disagreement about arithmetic, and almost every one of those comes from the order the arithmetic was done in rather than from the rates. Charging a performance fee before the management fee, or on a gain that includes the fee itself, or against a high-water mark held at fund level instead of per holder, each produces a number that looks right and is not. None of those mistakes announces itself.
The waterfall here exists once, runs in the database, and is applied identically to every series and every participant. Money arithmetic is exact decimal rather than binary floating point, so a total does not accumulate a residue down a column. The calculation derives everything from stored inputs and fully replaces its own output, which is what makes it safe to re-run: the same inputs give the same answer, to the cent, every time.
Questions about this
Why does it matter that the maths runs in the database?
Two reasons. Postgres NUMERIC is exact decimal, so a total of 99,994.26 stays 99,994.26 rather than becoming 99,994.26000000001 and compounding down the column. And the waterfall exists as one implementation rather than as thousands of copied cells, so there is no row where somebody dragged a formula one cell too far. TypeScript in this product never does money arithmetic at all, it formats.
Can I see how a particular figure was arrived at?
Yes, for any computed figure on any screen. Each one keeps its inputs and its formula, so you can open it and see the actual numbers that went in and the period they belong to. That is also what makes the engine testable: it ships with a database-level test suite including golden-master comparisons against a real fund's own figures.
The rest of the product
Every part of FundFlow works on the same monthly cycle. These are the neighbouring pieces.
Check it against your own month
Anchor a fund at the last month you closed by hand, close the next one in both, and compare. That is the only test that matters.
In your first session
- Create a fund and set each series up with its real management and performance rates.
- Anchor an opening position with each participant's units and their current high-water mark.
- Close a month here and by hand, then compare the koers, both fee lines and every new mark.
No credit card. Nothing is charged until your first 30 days are over.