50+portfolio companies on one reporting cycle
2stages between a submitted number and a reported one
1action to queue a draft for every company

The engagement

A venture capital fund managing more than fifty portfolio companies, with four requirements: a centralised repository of information, a single source of truth, standardised and error-free one-page company updates for LPs, and a grip on capitalisation-table information across the portfolio.

Read those in order and you can see the dependency. You cannot standardise the update until you have a single source of truth. You cannot have a single source of truth while the numbers live in fifty inboxes.

What the quarter used to look like

An analyst emails fifty founders. Thirty reply within a fortnight, each with a slightly different workbook. Some report monthly, some quarterly. Column headers vary. One company sends a PDF. Two send nothing, and the analyst has to work out which two by reading their own sent folder.

Then the numbers get copied into a master file. Then the one-pagers get written, fifty times, by someone reading the master file and rephrasing it. Then someone senior reads all fifty and finds three that contradict the valuation on record.

Every manual copy between a founder's spreadsheet and an LP's PDF is a place where a number can change without anyone deciding to change it.

Step one — collection happens at the source

The fund enables self-reporting for a period. Each company gets an email with a direct link to its own upload page for that exact period. No login. The link is valid for 15 days and the expiry date is written into the email, so "my link doesn't work" resolves itself.

Companies can nominate a designated KPI contact — tag a user Kpi and only those people get reminders, rather than everyone with an account. The portco user can Save Draft as often as they like without notifying the fund, then Submit Report when it's final, at which point the fund team is emailed and the report locks.

Two things stop bad files at the door:

  • Structure is checked in the browser. If date column headers are missing or invalid, both Save Draft and Submit are disabled with the error shown — the file gets fixed before it is ever submitted, not after an analyst opens it.
  • Nobody who has already submitted gets chased. Bulk sends skip companies that have submitted, and the automated reminder job only re-contacts companies still sitting at Link Sent or Draft Saved. Reviewed reports drop out of all future cycles.

And companies don't need the original email at all — Pending KPI Requests shows every outstanding request from every fund they report to, in one place.

Step two — nothing counts until it is approved

This is the "single source of truth" requirement, and it is a two-stage design rather than a policy.

Submitted KPIs land staged. Staged data does not appear in dashboards, performance tables or growth calculations. A fund admin opens the submitted report, clicks through to the grid view with staged values highlighted, and either approves individual figures or approves the lot. Identical values are skipped rather than duplicated; changed values are flagged for review.

Approval is also what triggers computation: quarterly, YTD and annual totals are recalculated automatically — from monthly actuals, or from quarterly actuals if that is all a company reports, but never both, so nothing is double-counted.

StageStatusVisible in dashboards?
Request sentLink Sent
Company saves progressDraft SavedNo
Company submitsSubmitted (staged)No
Fund admin approvesApprovedYes — and totals recompute
Fund admin marks reviewedReviewedYes — and reminders stop
the gap between "a founder sent a number" and "we reported a number"

Step three — chasing is a job for software

The Portfolio Company Agent runs against every company in the portfolio and checks three things for the most recently completed period: has the company submitted its KPIs, are the required documents on file, and has a valuation been recorded. Missing KPIs and missing valuations are blocking findings.

If anything is outstanding and reminders are on, it emails the company one consolidated reminder listing exactly what is missing — never more than once a day, no matter how often the agent runs. It only operates inside a window you set: by default it starts checking 15 days after a period ends and stops at 60, because chasing a company on day 2 of a quarter annoys them and chasing on day 200 is pointless.

Every check is a rule against your own data. The agent makes no AI calls at all, needs no AI key, and costs nothing per run.

Step four — the draft writes itself, your analyst edits it

The report type is configured once: a name like "Quarterly LP Update", a set of sections, and an output template that fixes which sections appear, in what order, and how the KPI table is laid out. Sections can be written by hand or proposed by AI from the report name, then tightened — the instructions you give each section are what steer the narrative, so specific beats elegant.

A Word style document carries the firm's fonts, heading colours and table styles into every export. One report can hold several templates: a short LP summary and a longer internal version, or a clone with the sections reordered.

Then generation. For one company it's a form on the company's page; for the portfolio it's Bulk Generate Drafts — pick a template, a date range, a KPI period and tag, tick the companies, and one draft is queued per company with a notification as each lands. A draft takes roughly 30–90 seconds.

Before you commit to a run, a live badge tells you how many KPI periods actually exist for the settings you have chosen — green for all found, amber for "3 of 6", red for none. Missing data is a thing you discover on the configure screen, not in the output.

⚙️ Under the hood: the parts that make review fast

Every section is graded. Each section tab carries a coloured dot — green for solid content, amber for suspiciously short, red for nothing generated. An analyst goes straight to the amber ones instead of reading fifty drafts end to end.

Fixes are inline. Click a KPI cell, type the correct figure, press Enter — a green Saved badge confirms it. Double-click a narrative to rewrite it. Edited text takes precedence over the AI output and is what the Word export uses.

Corrections survive regeneration. KPI corrections are stored separately from the raw KPI data, so re-running a section doesn't wipe them. And you can regenerate a single weak section without redoing the draft — it reuses the KPI data already fetched, and leaves every other section alone.

Approval is a lock, not a label. Approving a draft freezes editing and unlocks Export to Word. The exported file carries the cover, the KPI table with your corrections applied, and your edited narratives, styled by the style document — and it lands in the company's Documents folder as well as on the draft page. If something is wrong afterwards, Reopen for Editing puts it back in Review; the previously exported file isn't deleted.

AI that writes a report you cannot edit is a demo. AI that writes a first draft your analyst improves in four minutes is a reporting cycle.

And next quarter

Two things carry forward. The configure form pre-fills from that company's last draft — dates, periods, tag, chosen metrics — with a banner saying so. And an output template can queue drafts for every company automatically on a monthly or quarterly schedule, on a day you pick between 1 and 28 (28, because short months).

📊 The impact

Before: fifty inboxes and one master spreadsheet, with collection closing about four weeks after the quarter ended — thirty replies inside the first fortnight and the rest chased one at a time. Then fifty hand-written one-pagers at roughly 45 minutes each — about 37 analyst-hours — and a review pass whose main output was finding contradictions.

After: collection closes inside the 15-day link window, because companies submit into their own period and the consolidated reminder chases the stragglers without an analyst doing it. Nothing reaches a dashboard until a human approves it; totals recompute themselves on approval. Fifty drafts are queued in one action at 30–90 seconds each, and the analyst edits rather than writes — roughly 4 minutes per draft, about 3.5 hours for the portfolio. The LP update arrives as a styled Word document built from the approved numbers.

The requirement was "standardised, error-free". Standardisation came from the template. Error-free came from removing the copies. The 37 hours to 3.5 came from the analyst stopping being the person who types the numbers in.

On these figures. The workflow and platform behaviour described above are exactly as CapHive runs them. The before-and-after figures in this section are a modelled composite — built from the platform's own behaviour and the hand-run baseline typical of a portfolio of this size — not a measurement taken at a single named client.

What to take from this

  1. Collect at the source, into the period. A link that opens the right quarter for the right company removes an entire class of reconciliation.
  2. Put a gate between submitted and reported. Staged-then-approved is the cheapest single source of truth you will ever build.
  3. Validate the file before you accept it. A structural check in the browser costs nothing and saves an analyst opening it.
  4. Never chase a company twice in one day. One consolidated reminder listing everything missing beats three separate nags, and keeps founders responsive.
  5. Let AI draft, and make editing trivial. The value is in the ninety seconds you didn't spend on the first draft, not in pretending the first draft was final.

Where this goes next

Read how the same portfolio data is restated across currencies in multi-currency computations and reporting, or how the fund side of the ledger produces investor statements for 500+ LPs. To see it on your own portfolio, book a walkthrough.

Client name withheld, and the before-and-after figures in The impact are a modelled composite rather than a client-verified measurement — see the note there. The workflow, platform mechanics and behaviour described are exactly as CapHive runs them.