For App Folio Investment Manager
Positions, distributions, and who was paid the wrong amount.
Fund administration reporting: what each investor committed, what they have contributed, what has been distributed back, and how the quarterly payout that was calculated compares with the one that actually went out.
How your data gets here
Your App Folio database, in a warehouse that is yours.
App Folio Investment Manager offers a SQL export for data warehousing. If your fund has it turned on, that is the whole integration — we take the export nightly, schema and data, and load it into a Postgres warehouse that belongs to your account. Not a handful of endpoints, not a subset somebody chose: the tables as App Folio holds them. If you do not have that export enabled, we cannot import you, and we would rather say that on this page than after a signature.
- im_positions
- im_contributions
- im_distributions
- im_distribution_items
- im_funds
- im_membership_classes
- im_contacts
- im_entities
- and the rest
Problems we have solved
The things that took real work.
Calculated is not what was paid
The distribution a position was owed for a quarter and the one that actually went out are two numbers, and the gap between them is the report. Per quarter, per position, who was under- or over-paid.
A position is not an investor
One investor can hold several positions across funds and classes, and the same person appears under more than one name. Rolling up to the investor is a rule about identity that has to be agreed once and applied everywhere.
The start date is a judgement
Subscription date, funding date, first capital call — a position can reasonably start on any of them, and which one it is changes every return figure. It is set explicitly rather than inherited from whichever column looked right.
Figures that only exist in a sheet
Some of what a fund needs reported is maintained by hand in a spreadsheet and always will be. It is imported on the same schedule as the platform data and reconciled against it, so the two cannot drift apart unnoticed.
Taking the wrong aggregate
Reading a running balance as a sum across periods instead of the value at a point in time overstates it, and the mistake is invisible because the number still looks plausible. We reconcile every figure against the source before a report ships.
Referral-sourced subsets
Positions introduced by a referral partner need the same reports cut to just those positions, and the totals still have to tie back to the whole. Same measures, different population, reconciled against each other.
Every one of these came out of work for a real business. We do not name them, and no figure anywhere on this site is theirs.
What happens next
Nothing here is out of the box, and that is the point.
For a CRM like Keap we ship a standard set of datasets, because a contact is a contact everywhere. Fund administration is not like that. When a position really starts, whether a commitment counts as closed, which share class a membership name means, which rate applies to it — those are decisions about how your fund is run. The schema does not assert any of them, so we do not pretend to read them off it.
So there are no App Folio datasets waiting for you on day one, and no shelf of pre-built reports. What there is, after the import, is every table you have in a warehouse we can work in — and then we sit down and model it with you. Each rule gets written down beside the data it governs, in words you would use in a meeting, and it stays there.
That written-down layer is what makes the data safe to ask questions of. Your assistant connects over MCP and reads the datasets, the rules and your own definitions together, so the answer it gives is the one your reports would give. See what that looks like.
- 1 Turn on the export App Folio provides the SQL export for data warehousing. Once it is enabled for your fund, the connection is credentials and nothing else.
- 2 We take it nightly Schema and data, loaded into your own warehouse. Sentinel dates are nulled, join keys indexed, and what changed is recorded rather than done silently.
- 3 We model it with you Your rules, argued out once and written beside the data: what starts a position, what closes a commitment, which class carries which rate.
- 4 Then ask it anything Reports that re-run and share with their parameters locked, and an assistant that reads the same rules before it answers.
A worked example
What “the distribution numbers are wrong” actually turned out to be.
A fund came to us with five distribution reports that had been running for years and that nobody left in the building could fully explain. They were not wrong at random. Every difference had a cause, and each cause was a decision somebody had made once and never written down.
A rate in a comment
The quarterly rates were typed straight into the query as decimals, with a comment beside them doing the explaining. Anyone reading the report saw a payout; nobody could see which rate produced it, or that two classes had been given different ones.
A silent exclusion
Share class was parsed out of a membership name. Anything unrecognised fell back to a catch-all code — and the report default quietly left that code out. Those positions were not flagged or zeroed. They were simply not on a report that looked complete.
One quarter that was not one quarter
The query returned every quarter up to the one you picked, and the single-quarter view a reader saw came from a filter in the presentation layer. Take the report at face value, and the totals you were reading were cumulative.
A second formula wearing the first one’s clothes
The “adjusted” version looked like the same calculation fed different inputs. It was not: a different rate over a different period, rounded differently. Two reports on the same position could disagree and both be doing what they were told.
A report that depended on a spreadsheet
Part of the adjustment came from a sheet maintained outside the platform that nothing imported. The report ran; the figure it needed came from a file on somebody’s machine.
A fund id in four places
One fund was hard-coded into the procedures and into the report title. Reusing any of it for a second fund meant finding all four — and the fund names were duplicated, so matching by name would have picked the wrong one.
Every one of those became a rule written beside the data, in a dataset built for this fund. Then each report was rebuilt and checked cell by cell against the exports the fund already trusted — thousands of figures, every page, totals included — until the difference was zero.
Two positions never reconciled, and finding out why is the part worth telling. The old system did the arithmetic in floating point; we do it in exact decimals. On a payout that lands on an exact half-cent the two disagree by a penny, always in the same direction.
We could show which one was right. That is the difference between a number you have and a number you can defend.
Illustrative
- Commitment
- $17,002.00
- Rate, per quarter
- 1.75%
- Exact result
- $297.535
A penny, on two positions out of hundreds. It is not the money. It is that nobody could say which figure was correct, and now the answer is written down.
Looking for property management?
This is App Folio Investment Manager. We have not built rent roll, delinquency or occupancy reporting, and would rather say so than let you find out after signing up. If that is what you need, tell us and we will be straight with you about what it would take.
Connect your AI agent today.
Connect your CRM and let the first import run. Then add ReportMojo to Claude Desktop, ask it about your business, and have it build the reports you need.