Data Analysis

OKR Sheet for FP&A: Wire It Into Your Model

Marc SeanMay 9, 20267 min read

This article covers four things: the full column layout with real KRs wired up, how to pull actuals from the P&L automatically, how to score churn and burn rate without getting nonsense results, and how to log target resets without destroying the audit trail.

Why Most OKR Sheets Break for Finance

The template that circulates in strategy decks has three columns: Objective, Key Result, Progress. Progress is manually typed. That works for a 10-person team tracking headcount goals. It falls apart the moment you need to reconcile it with an $18.4M ARR target already tracked in five other tabs.

There are 2 failure modes that actually matter for finance:

Manually entered actuals. Someone fills in "87%" in the Attainment column from a dashboard screenshot. By the next board meeting the number is stale and doesn't tie to anything. Finance can't sign off on it.

Flat attainment math. =Actual/Target produces nonsense for KRs where lower is better — churn, burn rate, days sales outstanding. Google's published OKR guidance (re:Work, last updated 2024) flags this as one of the most common scoring errors teams make when moving from qualitative to quantitative KRs. A churn rate that improved from 2.1% to 1.8% against a 1.8% target shows 100% attainment with the right formula and 117% with the wrong one.

OKR Sheet Layout: The Full KR Table

This is the tab structure that works. Five KRs covering the metrics that appear in a typical board pack — revenue, headcount, churn, burn rate, and pipeline. Every Actual is formula-driven except where noted.

#ObjectiveKey ResultOwnerDirectionTargetQ2 ActualAttainmentStatus
1Grow revenueARR at quarter-closeAE TeamHigher$18.4M$16.2M88.0%🟡
2Scale team efficientlyEngineers hired in H1PeopleHigher12975.0%🔴
3Improve retentionMonthly gross churn rateCSLower1.8%2.0%88.9%🟡
4Control burnMonthly net burnFinanceLower$1.20M$1.35M87.5%🟡
5Build pipelineQualified pipeline at EoQSalesHigher$9.6M$11.2M116.7%†🟢

†Capped at 150% per scoring policy.

The Direction column is the switch that controls which attainment formula fires. For KRs 1, 2, and 5 (Higher is better), attainment is =Actual/Target. For KRs 3 and 4 (Lower is better), attainment is =(2*Target - Actual)/Target. One conditional in the Attainment column handles both:

=IF(D2="Lower", MAX((2*E2-F2)/E2, 0), MIN(F2/E2, 1.5))

The MIN(..., 1.5) caps upside at 150%. The MAX(..., 0) floors catastrophic misses at zero so you don't get negative attainment scores. John Doerr's Measure What Matters (Portfolio/Penguin, 2018) recommends the 150% cap as standard — consistent 100% attainment is a signal the target was too easy, not a reason to let scores run to 200%.

Status is conditional formatting on the Attainment column: red below 0.70, yellow 0.70–0.99, green at 1.00 and above. Google's re:Work guidance uses 0.7 as the lower threshold, and it holds in practice.

The Attainment Calculation Most Templates Get Wrong

The standard formula =Actual/Target only works when higher numbers are better. Run it on a churn rate that missed by 20 basis points and you get 111% — implying outperformance when you actually underperformed.

The fix for lower-is-better KRs:

=(2*Target - Actual) / Target

With real numbers. Target churn: 1.8%. Actual churn: 2.0%.

=(2 * 0.018 - 0.020) / 0.018
= 0.016 / 0.018
= 88.9%

That's the right answer: you missed by 11 basis points, so attainment should be below 100%. At exactly 1.8%, attainment is 100%. At 1.6% (beat by 20bps), attainment is 111%. Same math applies to burn rate — KR 4 targets $1.20M monthly net burn, actual came in at $1.35M: =(2*1.20-1.35)/1.20 = 87.5%. Correctly below par.

Wiring the OKR Sheet to Your Financial Model

The Actual column is where most OKR sheets fail. It should never be a manually entered number.

For revenue KRs, the Actual cell pulls directly from the P&L using a date-bounded SUMIFS:

=SUMIFS('P&L'!C:C,'P&L'!A:A,"Revenue",'P&L'!B:B,">="&Assumptions!$B$3,'P&L'!B:B,"<="&Assumptions!$B$4)

Assumptions!$B$3 and $B$4 are your quarter start and end dates — the same cells driving every other time-bound formula in the model. Reforecast Q2 end date in one cell, and OKR actuals refresh with everything else.

For gross margin targets (say, 67.5%), the Actual cell pulls the ratio directly:

=SUMIFS('P&L'!C:C,'P&L'!A:A,"Gross Profit",'P&L'!B:B,">="&Assumptions!$B$3,'P&L'!B:B,"<="&Assumptions!$B$4)/SUMIFS('P&L'!C:C,'P&L'!A:A,"Revenue",'P&L'!B:B,">="&Assumptions!$B$3,'P&L'!B:B,"<="&Assumptions!$B$4)

For headcount KRs, pull from the Headcount tab:

=COUNTIFS('Headcount'!D:D,"Engineering",'Headcount'!E:E,"<="&Assumptions!$B$4,'Headcount'!F:F,"Active")

For pipeline, SUMIFS against the CRM export tab filtered by stage and date. The pattern is identical across all 5 KRs: anchor the date range in Assumptions, reference the source tab, never type a number.

Resetting OKR Sheet Targets Mid-Quarter Without Losing the Audit Trail

Targets change. A Series B closes and the $19.2M ARR target gets reset to $18.4M because the pipeline shifted. If you overwrite the target, you lose the history and the board asks why attainment jumped from 73% to 88% between updates.

The pattern that works: a target history log, either on the OKR tab itself or a companion OKR History tab.

KR #Revision DatePrevious TargetNew TargetReasonRevised By
12026-02-14$19.2M$18.4MPipeline revision post-Series BCFO
32026-03-012.0%1.8%CS capacity added in FebruaryVP CS

The live target on the main OKR tab then references the most recent row for each KR:

=MAXIFS('OKR History'!D:D,'OKR History'!A:A,A2)

This pulls the highest (most recent) target value for that KR without hardcoding anything. For a restated attainment against the original target:

=F2 / MINIFS('OKR History'!C:C,'OKR History'!A:A,A2)

The ARR KR came in at $16.2M. Against the revised $18.4M target, attainment is 88.0%. Against the original $19.2M, restated attainment is 84.4%. Both numbers belong in the board pack — one shows current performance, the other shows how far you moved the goalposts.

Handling Non-Financial KRs

NPS, product velocity, customer health scores — these don't live in the P&L. As of May 2026, there's no clean automated pull for most of these without an integration project.

The practical approach: a Raw Data helper tab with a structured input area. Each non-financial KR gets a labeled row with data validation constraining inputs to expected formats. The Actual cell on the OKR tab references it:

=IFERROR(INDEX('Raw Data'!B:B,MATCH(A2,'Raw Data'!A:A,0)),0)

For KRs that do have an upstream source — qualified pipeline from HubSpot, MRR from Stripe, NPS from a survey tool — ModelMonkey can write a refreshable table into the Raw Data tab directly. Type "pull qualified pipeline from HubSpot for Q2 2026" and it creates a table the SUMIFS in KR 5 can reference. That closes the last manual-entry gap without a custom integration.

An OKR sheet that ties into the financial model needs five things: formula-driven actuals with no manual entry, a Direction column that switches the attainment formula for lower-is-better KRs, date ranges anchored in a shared Assumptions tab, a target history log for mid-quarter resets, and a Raw Data helper tab for non-financial KRs. Built this way, attainment numbers in the board pack reconcile to the P&L without a separate step.


Frequently Asked Questions