Derived Metrics: letting VCs build their own metrics on top of existing data

A framework that lets investors define custom metrics, like Rule of 40 or Revenue per Employee, from simple arithmetic formulae, so they behave exactly like any other metric across the tool.

Metrics the company reports
ARR Growth Rate28.1%
Profit Margin14.2%
ARRGrowthRate[t]+ProfitMargin[t]
Metric the investor defines
Rule of 40
42.3%
Charts, rolls up, and benchmarks exactly like a native metric
The core idea: user-defined arithmetic over reported metrics, promoted to a first-class metric
Role
Product & Design
Company
PortfolioIQ (Synaptic)
Focus
0→1 feature, system design, edge-case UX
Surfaces
Customer tool + Admin UI
V1 shipped. Formula builder, arithmetic engine, edge-case handling
V2 shipped. Conditionals, granularity scoping, and org-wide bulk creation (GDMT) all live
Before you dive in

At a glance

Two phases of the same system, built for two different users. V1 let one investor write one formula on one company. V2 scaled that to an internal ops team standardizing metrics across 150+ companies.

V1 (Shipped)V2 (Shipped)
Who it's forExternal investor customersInternal PortfolioIQ ops teams (ingestion, finance, portfolio ops, admins)
Formula languageArithmetic only (+, −, ×, ÷), time refs t-2t+2+ Conditionals (IF/THEN/ELSE, EXISTS), granularity-scoped fallbacks, derived-to-derived chaining (depth 5)
Computation engineFlat evaluation, SUM-default roll-upDependency-graph execution, derived metrics participate in roll-ups, per-period failure diagnostics
Trust & edge casesOverflow / div-by-zero / unresolvable states, cycle detectionCycle detection extended to conditional branches (conservative by design)
RolloutOne formula, one company, one investorBulk creation (GDMT): an admin defines once, then it resolves org-wide across every company
Research3 independent signals: customer ask, internal usage research, competitive teardownStructured stakeholder design sessions, skipping fresh research on purpose since V1 had already validated the need
Before you dive in

Key product decisions

Four calls shaped this system more than any single screen, each taking on cost or risk on purpose.

DecisionTrade-off acceptedWhy it paid off
Structured metric references, not formula strings Heavier data model at V1, before V2's needs existed The highest-leverage call in the project. Remapping, derived-to-derived chaining, and GDMT resolution were all cheap later instead of redesigns
Block-based tokens over free text Less flexible than raw text; V2 had to extend the same token model Carried through both versions without a redesign
Text-based editing over a visual node canvas (V2) Rejected the more novel-looking solution every time it came up Scored across all 23 V2 stories, text won on all three axes: associates are power users, not casual dabblers
Bulk creation sequenced as its own phase Admins waited longer for V2's highest-leverage capability Shipped once conditionals and graph execution were proven, instead of compounding two kinds of risk at once
Part One
V1: from spreadsheet math to a native metric

1Why derived metrics needed to exist

Analysts and VCs don't just consume the metrics a company reports. They build their own on top of them: Rule of 40, Revenue per Employee, sector-specific ratios like RASM for airlines. PortfolioIQ had no way to let someone define one of these and have it behave like a native metric: chart it, roll it up, trust it. So that math happened in spreadsheets outside the tool, at the exact moment we should have been most useful.

Why it mattered: two signals made this a priority, not a nice-to-have. Greenoaks asked for it directly. Their team was already computing metrics like this outside PortfolioIQ. And internal usage research traced almost every analyst question back to the same root: how is this company actually performing? That question nearly always meant combining two or more raw metrics.

2Use cases & research validation

A customer ask and internal usage research both pointed the same way. The third signal was a competitive teardown, to check whether the market had already converged on a shared mental model, and how much interaction-design risk we were taking on.

Standard Metrics ships a calculated-metrics builder with the same primitives we converged on independently (operators, time offsets, metric operands) and uses Rule of 40 as its own canonical example, the same metric Greenoaks asked for. Two unrelated sources landing on the same example told us it's the default use case, not an edge case. It goes further with CASE logic, which we left out of v1 on purpose.
Chronograph ships a similar custom-metric flow, plus a "Track this metric for all my portfolio companies" toggle, basically a one-click version of what became our V2 bulk-creation system (GDMT), which shipped later with a more explicit admin flow. Its formula input is just a plain text box, though, with no block-based safety or autocomplete. That's where our design carries more rigor.
Chronograph competitor reference: custom metric creation modal, metric selection, formula creation page, and company metrics list grouped by category
Chronograph: custom metric modal, formula creation page with the "track for all companies" toggle, and category-grouped metrics list

Concrete use cases we validated against, spanning sector-specific and cross-sector needs, so the design targeted a general arithmetic engine rather than a handful of hardcoded formulas.

Use caseWho needs itFormula
Rule of 40SaaS investors judging growth vs. profitabilityARRGrowthRate[t] + ProfitMargin[t]
PEPM (per employee/month)HRMS investors benchmarking unit economicsRevenue[t] / Headcount[t] / 12
RASM (revenue/seat mile)Airline investors comparing efficiencyRevenue[t] / AvailableSeatMiles[t]
Revenue per employeeCross-portfolio efficiency comparisonsRevenue[t] / Headcount[t]
Custom growth indexFirms with proprietary scoring models(ARRGrowthRate[t]*0.6) + (HeadcountGrowth[t]*0.4)

One story, building analyses on custom metrics, was explicitly descoped for v1. I designed the data model so that door stays open, without paying its cost now.

3What made it hard: designing the formula builder

The riskiest part of this feature wasn't the math. It was making formula entry feel safe for a non-technical, deadline-driven user. Free-text input invites typos and silent errors, so the design leans on constrained, block-based input instead.

Derived Metrics creation panel in its empty state: metric name, formula field with a granularity selector, unit dropdown, and optional description
Where it starts: the empty creation panel, opened over the company's live metrics table
Derived Metrics panel with the inline metric search dropdown open, showing matching metrics like ARPU, ARR, CARR, and GDR while building a Rule of 40 formula
Inline metric search open mid-formula, matching on partial input while building Rule of 40
Every token is a block
Operators, brackets, numbers, and metric references are each inserted and deleted as a single unit. One backspace removes one whole block, which prevents the "half-edited metric name" state common in free-text formula fields.
Metric search is inline
Typing 2+ characters opens a dropdown across local and global metric names, each showing its full parent path, so ARR Growth Rate and Headcount Growth Rate are distinguishable before committing.
Time indexing is first-class
Metrics reference at t-2 … t+2, making period-over-period formulas expressible in the same system as static ratios.
Tokens are color-coded by type
Keywords, metrics, derived metrics, operators, time refs, and numbers each get a distinct color. A formula reads as shape before a user parses a word of it, the same reason code editors syntax-highlight.
Formula builder controls: time reference picker, granularity dropdown, currency selector, and color-coded token legend
Time reference picker, per-formula granularity scoping, currency selection, and the token color legend
Simple valuation   = ARR[t] * 4
Rule of 40         = ARRGrowthRate[t] + ProfitMargin[t]
Design principle: a derived metric should be indistinguishable from a native one everywhere except where the difference is genuinely useful, like on its detail page, where seeing the formula and its live substitutions builds trust in the number.

4The part I owned: edge cases and computational trust

Once users chain formulae on top of formulae, the real design work stops being about the happy path. I owned the states below, and closing them was a gating item before engineering could build.

#

Overflow

Value exceeds ±10 trillion
÷0

Division by zero

Denominator resolves to 0

Unresolvable

Input metric missing or deleted

Each state gets its own compact cell plus an explanatory tooltip, so a user scanning a table full of derived metrics can tell "genuinely zero" apart from "broken" apart from "too large to be meaningful," at a glance.

Cyclic dependency prevention

Derived metrics can reference other derived metrics, so the system needs a strict evaluation order and must actively reject formulas that would create a cycle. I treated this as a validation-time problem, not a runtime one: saving a formula runs a dependency check and blocks with a clear explanation, rather than saving it and failing silently at computation time.

A = B + 10
C = A - 2

// Editing A to reference C creates a cycle:
A = B + 10 - C     → rejected: A depends on C, which depends on A

Formula integrity under mapping changes

If B in A = B + C gets remapped to D during tagging, the formula must update to A = D + C automatically. Otherwise a derived metric silently points at the wrong data. This is the practical payoff of storing formula dependencies as structured references rather than strings: a remap becomes a reference update, not a find-and-replace.

5Where it shows up, and what changed

Derived metrics surface everywhere a native metric does: the all-metrics list, the metric detail page (sibling-metric context plus a live-substitution tooltip), and an equivalent Admin UI. Deliberately excluded from v1: the tagging tool and custom analyses, scoped out to ship faster with a data model built so neither is a rewrite later.

60%
Of customer firms have created at least one derived metric since launch
12–13
Derived metrics created per organization, on average
2
Most common formulas: Rule of 40 and Revenue Growth, matching the research prediction

60% adoption in one release with no marketing push means the feature reached past its original requester to become a default workflow. And 12–13 metrics per org means firms aren't creating one-off formulas and stopping, they're standardizing on a set, exactly the behavior the usage research predicted.

What these numbers don't show: how much spreadsheet work they actually replaced. I didn't build time-saved or spreadsheet-reduction instrumentation into v1 before shipping. Adoption proves people are using it, not that the underlying pain went away. That's the measurement gap I'd close first in a v1.1.

6What this taught me going into V2

The hardest part wasn't the formula UX. It was resisting scope creep toward "let users write any function," and constraining hard to arithmetic-only, block-based input instead. That constraint is what made the error states, cycle detection, and mapping-safety guarantees tractable in one release rather than an open-ended research project.

Part Two
V2: turning a formula field into a computation engine

1Why a V2: from "one investor, one formula" to an org-wide engine

V1 answered a narrow question well: can one investor define one arithmetic formula on one company? Usage exposed a harder problem underneath. The teams who ingest and standardize data across 150+ portfolio companies were hitting the same ceiling: one static formula, no conditionals, no per-granularity logic, no way to define a metric once and roll it out everywhere.

V2 is a three-pillar upgrade to the same system: a richer formula language (conditionals, granularity scoping, derived-to-derived chaining to depth 5), a more capable computation engine (roll-up participation, dependency-graph execution, granular error reporting), and a bulk creation system sequenced deliberately as a later phase, once the first two hardened. All three have since shipped.

2The problems V1 couldn't solve

Five internal personas, one recurring pattern: doing it in Excel because the tool can't. Grouped by who was affected rather than by feature area, since the same missing capability shows up as a different problem depending on who hits it.

PersonaPain pointRoot cause
Associates & Analysts
Data Ingestion
Track "which company reports what" in a side spreadsheet; wrong annualization on one granularity; Rule of 40 computed in Excel and re-uploadedNo conditional fallback (Revenue→ARR); one static formula per granularity
Finance Team
Middle Office
Fund/portfolio aggregates rebuilt by hand every reporting cycleDerived metrics sit outside the roll-up engine entirely
Portfolio Operations
KPI Tracking
Growth metrics and unit-economics ratios live in Excel with manual IF-guards; bespoke formula per company for Gross Margin %No conditional logic
Partners & Principals
Front Office
See composite benchmarks only in offline board decks, not dashboards; ad-hoc reconciliation requestsNo derived-to-derived chaining; inconsistent per-entity setup
Organization AdminsStandards live in wiki pages with no enforcement; updating a formula means touching every company; no visibility into who's behindNo way to define a metric once and resolve it everywhere

3Turning problems into a shortlist: the opportunity solution tree

With five personas and a wide spread of problems, the risk was solving each complaint in isolation. Instead, every user story went through the same discipline: propose 2–3 candidate solutions, score each on feasibility, desirability, and viability, then map survivors back to a small set of outcomes the whole tree needed to serve: eliminate spreadsheet workarounds, make derived metrics trustworthy and debuggable, and scale standardization without per-company toil.

Candidate solution (US-007: referencing derived metrics)FeasibilityDesirabilityViabilityVerdict
Dependency graph visualizer with cycle warningsMediumHighHighChosen: makes dependencies transparent before save, builds trust
Treat derived metrics identically in autocompleteHighHighHighChosen: near-zero cost, reuses the existing metric picker
Visual node-based composable canvasLow (full new editing surface)MediumLowRejected: overlaps with the formula editor, high cost for marginal gain

Run across all 23 stories, this consistently favored text-based editing over visual canvases, and pushed bulk creation out into its own follow-on phase rather than folding it into the core editor.

4Three pillars, concretely

1. Formula language expansion

Conditional logic is the headline addition: IF...THEN...ELSE with an EXISTS check for gap-filling.

Revenue (normalized) = IF Revenue[t] EXISTS THEN Revenue[t] ELSE ARR[t]
A live conditional IF/THEN/ELSE formula shipped in the Derived Metrics panel
The shipped version: a real conditional formula, not a mockup
An ARR Growth YoY conditional formula beside the in-context help panel documenting operators, time references, and syntax examples
A bigger language needs teaching: syntax reference sits beside the editor, not in external docs

Granularity-scoped fallbacks solve the annualization problem directly. The same fallback chain now carries a different formula per granularity instead of one formula misapplied to all of them. And derived metrics can reference other derived metrics up to a dependency depth of 5, resolved via topological sort, for example Rule of 40 = RevenueGrowth[t] + EBITDAMargin[t], where both inputs are themselves derived.

Rule of 40 formula with a second alternate formula being added below it, each independently scoped by granularity
"Add Alternate Formula" in action: a second formula stacked under the same metric, each scoped to its own granularity

2. Computation engine enhancements

Derived metrics now participate in roll-ups, extending population priority from V1's two steps to three: reported value, rolled-up reported metric, then rolled-up derived value itself. Execution runs as a full dependency-graph traversal, and the three V1 failure states split into distinct, logged reasons per period instead of one blank cell. The "-" state matures into an actual diagnostic.

3. Bulk creation system Shipped

An admin defines a formula once at the org level (a Global Derived Metric Template, or GDMT), which resolves to every company's local mappings automatically, with a downloadable resolution report, auto-apply to new companies, and a per-company "reset to GDMT" action. This is the piece that turns "define a metric 150 times" into "define a metric once."

Guardrails

ConstraintReason
Max 5 formulae per fallback chain; max dependency depth of 5Bounds evaluation legibility and how far a topological sort has to go before failing gracefully
Bulk creation is admin-only and errors on an existing mappingIndividual creation stays open to all users; prevents a GDMT from silently overwriting a company's metric
Roll-up method appropriateness is the user's responsibilityThe system won't second-guess whether SUM vs. AVERAGE is semantically correct

5What I'd revisit before a V3

The biggest shift from V1 to V2 wasn't the formula language. It was who the user became. V1 was designed for one investor building one metric; V2 had to hold up for an operations team standardizing hundreds of metrics across a portfolio, where a silently-broken formula doesn't just confuse one person, it corrupts a fund-level number. That's why the guardrails exist as hard limits rather than warnings, and why cycle detection errs conservative even at the cost of occasionally rejecting a formula that would've worked fine.

What I'd do differently: two honest gaps, not two vindicated bets. I didn't instrument v1 to measure the actual problem it was meant to solve. I can show adoption, not spreadsheet-hours saved. And skipping fresh research for V2 was a calculated risk under time pressure that I've never gone back to validate with real post-launch signal; it's worked so far, but "hasn't broken yet" isn't the same as "was the right call." Both are the first things I'd fix before a V3.