play icon for videos
← Academy
SOPACT ACADEMY · CASE INTELLIGENCE · CHAPTER 7

7- How to Calculate SROI — Live, Sourced, and Honest

an SROI ratio and a cost-per-outcome computed live over the stores you already built — every line sourced, measured value kept visibly separate from benchmarked, attribution discounted, and the number recomputing as records land.

For: program leads, evaluators, and executive directors who have to put a return-on-investment number in front of a board or a funder — and defend it line by line.

Why: the usual SROI is a consultant spreadsheet — stale the day it lands, built on proxies nobody can source, with observed value and borrowed value blended into one figure a skeptic discounts on sight.

Outcome: an SROI ratio and a cost-per-outcome computed live over the stores you already built — every line sourced, measured value kept visibly separate from benchmarked, attribution discounted, and the number recomputing as records land.

This is Chapter 7 of the Case Intelligence series — the value layer. In the previous chapter you turned weekly mentor notes into an early-warning system, closing the evidence-collection arc: Chapters 3 through 6 built the intake baseline, the mid-program check, the exit wave, and the notes in between. This chapter is where that evidence becomes the two numbers a board actually asks for. For the running example — RiseWorks Foundation / Pathways 2027 (Train → Match → Place → Earn) — those numbers are SROI ≈ 2.44:1 and cost-per-outcome ≈ $20,076, computed over the funnel this series follows end to end: 80 enrolled → 62 completed → 58 credentialed → 108 matches (20 strong / 51 partial / 37 not-qualified) → 29 placed. The measured backbone under both is the wage pair the earlier chapters set up: median $9.96 → $25.11/hr from intake baseline to six-month follow-up.

As in every chapter, the steps are tagged [DIY] or [SENSE], and the line between them is drawn honestly. Building the value map and choosing defensible proxies is thinking work — you can do it in any AI chat window this week, and the first two steps hand you the prompts. Computing the ratio is different: a standalone prompt cannot compute over records it never receives, cannot join a wage in one store to a counterfactual answer in another, and cannot recompute anything when next month’s follow-up wave lands. The last two steps show what Sopact Sense produces over the joined stores — a per-record value ledger assembled on arrival, and a ratio that moves with the data.

Why most SROI numbers can’t be defended

SROI is one division: social value created ÷ investment. A ratio of 2.44:1 says every dollar invested produced about $2.44 of social value. The arithmetic has never been the problem. The problem is where the numbers come from — and in the standard process, they come from a one-off consulting engagement: someone exports your data, builds a spreadsheet of financial proxies, applies a page of assumptions, and hands back a deck. Three things go wrong, every time:

It is stale on delivery. The model reflects the cohort as of the export date. Six months later, more participants have hit their follow-up wave and more placements have cleared retention — the number is wrong, and nobody re-runs the spreadsheet, because re-running it costs another engagement.

The proxies are unsourced. “We valued improved wellbeing at $3,000 per participant.” Based on what? A proxy line that cannot point to a named source is an invitation to discount the whole ratio, and a skeptical funder accepts the invitation.

Measured and benchmarked value are blended. A wage gain you actually observed sits in the same total as a national-average “avoided cost” you looked up. Merged into one figure, the reader cannot tell what you proved from what you borrowed — so they trust neither.

The deeper cause is upstream of the spreadsheet. Traditional case-management systems — the Apricot-and-ETO category — hold each wave separately: intake in one module, the follow-up in a survey tool, placements in a tracker. Nothing joins, so someone must export and hand-assemble before any value math can start, and that export is why the number is always a snapshot. Sopact Sense removes the export: RiseWorks runs eight stores joined by reference keys — email, employer_name, requisition_id — so the intake wage and the follow-up wage are already the same person’s pair, and the counterfactual answer already sits on the exit record. Value lines are computed on arrival as records land, the Sopact Assistant computes the ratio over the stores whenever you ask, and when the next wave arrives, the ratio recomputes. Nobody rebuilds anything.

The three honesty rules, and the unit of outcome

Before any prompt, fix the rules that make the number defensible. RiseWorks runs three:

Every line names a source, or it is dropped. “Measured from my own stores” is a source. “The state public-assistance schedule” is a source. “It felt right” is not, and the line goes.

Measured value never blends with benchmarked value. A MEASURED line is one you observed in your own data — both numbers, same scale, same person, joined by ID. A BENCHMARKED line borrows an external figure. Both are legitimate; a mixture of the two presented as one number is not. Report the two shares side by side, always.

The ratio is post-discount. Some of the change you observe would have happened anyway — deadweight. The exit counterfactual question from Chapter 5 exists exactly for this: each participant’s value is multiplied by their own attribution factor before anything is summed. 2.44:1 is the number after that discount, not before.

One definition does quiet work throughout: the primary outcome unit is a durable placement — matched, placed, retained 90 days, in-field, at a living wage. Cost-per-outcome divides total program cost by durable placements, not by “people served.” That is why ≈ $20,076 is a defensible figure and “cost per participant” is a flattering one: the denominator is the outcome the theory of change promised, not the headcount that walked in.

Step 1 — Build the value map [DIY]

What you do. For each outcome in your theory of change, write one line: outcome → financial proxy → source, and mark the line MEASURED or BENCHMARKED. The proxy is the dollar figure that stands in for the outcome; the source is where that figure comes from. Feed your outcomes to any capable AI with Prompt 1 and it drafts the map — but you defend every line, because you will be the one saying the source out loud in a board meeting.

What you get. A value map — the complete list of lines that will sum to your social value, each with a proxy you can name and a source you can cite. Any line marked UNSOURCED gets fixed or cut before a ratio is computed.

Why it matters. The value map is the audit trail. When a funder asks “where did 2.44 come from?”, you point at the map, line by line. It is also where restraint pays: a map of three defensible lines beats a map of nine speculative ones, because one indefensible line taints the eight next to it.

Real example — RiseWorks. The map has exactly three lines:

Value map · RiseWorks Foundation / Pathways 2027
OutcomeFinancial proxySourceType
Living-wage employment Annual wage gain: ($25.11 − $9.96) × annual hours Measured — intake baseline + six-month follow-up, joined on email MEASURED
Reduced public dependency Avoided public assistance ≈ $4,800/yr Benchmarked — public-assistance schedule; applies only if assistance was received at intake AND the person is now employed BENCHMARKED
Added tax contribution ≈ 12% of wage gain Benchmarked — effective-rate estimate BENCHMARKED
Read it: the largest line is the measured one — observed in RiseWorks' own stores, per person, joined on email. The two borrowed lines say so, and one is conditional. Nothing unsourced survives to the ratio.

The largest line is the measured one, and that is by design. The wage gain comes straight from the pair the Chapter 3 baseline set up: baseline_hourly_wage at intake, the same question re-asked at six-month follow-up, joined on the participant’s email. Nobody looked that number up. And notice what is not on the map: no “improved wellbeing,” no line RiseWorks cannot source. Those outcomes are real; they are reported as measured confidence change (4.3 → 7.1 → 7.4), not converted into dollars nobody can defend.

Prompt 1: SROI Value Map Builder

PROMPT 1 — SROI VALUE MAP BUILDER   [DIY]
Use in: any capable AI (Claude, ChatGPT) while you design your value model.
Purpose: turn your outcomes into a sourced value map — one line per outcome,
each line MEASURED, BENCHMARKED, or flagged UNSOURCED.

------------------------------------------------------------
You are an SROI analyst building a value map. Your output must be
deterministic: the same input must give the same output every run.

TASK
For each outcome I list, produce exactly one value-map line:
outcome -> financial proxy -> source -> type.

RULES (apply mechanically, no exceptions)
1. ONE proxy per outcome. If two candidate proxies exist, output the more
  conservative one and note the rejected one in the Notes column.
2. Type is exactly one of three fixed labels:
  - MEASURED   — only when BOTH numbers behind the proxy exist in my own
    data inventory below, on the same scale, joinable per person by a
    persistent ID. If either number is missing from my inventory, the
    line is NOT MEASURED.
  - BENCHMARKED — only when you can name a specific external source type
    I could cite (e.g. "state public-assistance schedule", "published
    effective-tax-rate estimate"). Generic phrases ("studies show") do
    not qualify.
  - UNSOURCED  — when neither condition above is met. Never silently
    upgrade an UNSOURCED line; flag it for me to fix or cut.
3. If a proxy would double-count value already captured by another line
  (e.g. wage gain re-counted inside a "quality of life" dollar figure),
  mark the line DOUBLE-COUNT in Notes and recommend dropping it.
4. Conditional benchmarks must state their condition in the proxy text
  (e.g. "avoided assistance — applies only if assistance received at
  baseline AND employed at follow-up").
5. Do not invent sources, dollar figures, or outcomes I did not provide.
6. Keep proxies conservative: prefer under-claiming to over-claiming.

OUTPUT FORMAT
A table with exactly these columns:
Outcome | Financial proxy | Source | Type (MEASURED / BENCHMARKED / UNSOURCED) | Notes
Then one closing line: "UNSOURCED lines to fix or cut: N".

------------------------------------------------------------
MY OUTCOMES (from my theory of change):
<<< paste your outcomes here >>>

MY DATA INVENTORY (fields I actually collect, with scales and waves):
<<< paste your field list here — e.g. baseline_hourly_wage ($/hr, intake),
   followup_hourly_wage ($/hr, six-month follow-up), joined by email >>>
------------------------------------------------------------

WORKED REFERENCE (RiseWorks Foundation / Pathways 2027):
Living-wage employment  | wage gain ($25.11 − $9.96) × annual hours | own stores: intake + six-month follow-up, joined on email | MEASURED
Reduced public dependency | avoided assistance ≈ $4,800/yr, only if received at intake AND now employed | public-assistance schedule | BENCHMARKED
Added tax contribution  | ≈ 12% of wage gain | effective-rate estimate | BENCHMARKED

Step 2 — Choose conservative proxies and set the attribution discount [DIY]

What you do. Pressure-test the map. For any outcome with competing proxies, pick the most conservative, best-sourced one — the figure least likely to be challenged. Grade each line: HIGH if measured from your own stores, MEDIUM if it rests on a named external benchmark, LOW if the benchmark is generic — and treat LOW as a candidate for deletion. Then fix the attribution scale you will apply per participant, from the exit counterfactual: Entirely because of the program 1.0 · Mostly 0.8 · Somewhat 0.5 · Slightly 0.25 · Not at all 0.0.

What you get. A final model definition: one proxy per outcome with a one-sentence rationale, a confidence grade per line, and a fixed factor scale — decided before any computation runs.

Why it matters. Deadweight is where inflated SROI numbers hide. A participant whose wage tripled but who says the program made no difference contributes zero attributable value — no matter how good the wage pair looks. Applying that discount per person, from each person’s own answer, is what separates an honest ratio from a flattering one. And conservatism compounds trust: RiseWorks’ tax line uses an effective-rate estimate of about 12% rather than a marginal rate that would look better, and its avoided-assistance line credits ≈ $4,800/yr only where assistance was actually received at intake and the person is now employed — never as a flat per-head bonus.

Real example — RiseWorks. Because RiseWorks made the placements itself, placed participants skew high on attribution — most credit the program “mostly” or “entirely.” The discount is applied anyway, participant by participant, and the published ratio is the post-discount one. When a reviewer asks “did you account for people who would have found work anyway?”, the answer is yes, mechanically, from each participant’s own exit answer — not a hand-waved 10% haircut applied at the end.

Prompt 2: Conservative Proxy and Discount Picker

PROMPT 2 — CONSERVATIVE PROXY AND DISCOUNT PICKER   [DIY]
Use in: any capable AI (Claude, ChatGPT). You make the final call; this
pressure-tests the map and fixes the attribution scale before anything
is computed.
Purpose: one defensible proxy per outcome, a confidence grade per line,
and a fixed attribution-factor scale.

------------------------------------------------------------
You are a skeptical SROI reviewer. Your output must be deterministic:
the same input must give the same output every run.

TASK
Review the value map I paste below and return the final model definition.

RULES (apply mechanically, no exceptions)
1. For each outcome with competing proxies, keep the more conservative,
  better-sourced one. State the rationale in ONE sentence.
2. Grade every line with exactly one of three fixed confidence labels:
  - HIGH   — MEASURED from my own stores (both numbers, same scale,
    joined per person by a persistent ID).
  - MEDIUM — BENCHMARKED against a named, citable external source.
  - LOW    — benchmark is generic, unnamed, or not specific to my
    population. Recommendation for every LOW line: cut it, and report
    that outcome in its own units instead of dollars.
3. Never upgrade a grade because the line is large. Size is not evidence.
4. Confirm every conditional benchmark states its condition; if one does
  not, write the missing condition.
5. Output the attribution-factor scale exactly as given below — do not
  modify the factors or add categories:
  Entirely because of the program = 1.0
  Mostly = 0.8
  Somewhat = 0.5
  Slightly = 0.25
  Not at all = 0.0
  Rule: each participant's total value line is multiplied by their OWN
  factor (from the exit counterfactual answer) before any summing. The
  published ratio is the post-discount number.
6. Do not invent proxies, sources, or outcomes not present in my map.

OUTPUT FORMAT
Table: Outcome | Chosen proxy | Rationale (1 sentence) | Confidence (HIGH / MEDIUM / LOW) | Action (KEEP / FIX CONDITION / CUT)
Then the attribution scale block, verbatim.
Then one closing line: "Lines cut for LOW confidence: N".

------------------------------------------------------------
MY VALUE MAP (output of Prompt 1):
<<< paste your Prompt 1 output here >>>

MY EXIT COUNTERFACTUAL QUESTION (wording + answer options):
<<< paste it here >>>
------------------------------------------------------------

WORKED REFERENCE (RiseWorks): the tax line uses an effective-rate
estimate (~12%) rather than a marginal rate; the avoided-assistance line
(≈ $4,800/yr) is conditional on assistance received at intake AND
employment at follow-up; the wage-gain line is HIGH confidence because
$9.96 -> $25.11 is measured per person, joined on email. The published
2.44:1 is post-discount.

The raw material — one participant across the stores

Before the product steps, look at what the computation reads. Here is RW2-004, Javier Brooks, 23, IT & Cybersecurity track, Birmingham cohort 2024-Q3 — the participant whose intake record anchored Chapter 3 — as his fields sit in the joined stores today:

email — javier.brooks86@yahoo.com (the persistent ID every store joins on)

Intake (Chapter 3): baseline_hourly_wage — $12.69 (last job) · employment_status_at_intake — unemployed · receives_public_assistance — No · has_dependents — Yes · intake_goal_openended — “support my kids without working two jobs”

Exit (Chapter 5): counterfactual question — “How much of this change would have happened without the program?” — answered on the five-point scale that maps to the attribution factors

Placements: placement status · retained-90-days flag — the fields that decide whether his outcome counts as durable

Six-month follow-up: hourly wage, re-asked on the identical $/hr scale as intake

Every line of the value map has a home in these fields. The wage-gain line reads intake and follow-up. The avoided-assistance line reads receives_public_assistance — and for Javier it reads No, so that benchmarked line will contribute nothing for him, ever. That is the conditional benchmark behaving correctly: borrowed value accrues only where its condition is met in the data.

Step 3 — Assemble the value ledger on arrival [SENSE]

From here on, this is product output, not a prompt you run. A chat prompt can score the map you paste into it; it cannot watch a follow-up survey land on a Tuesday morning and compute that participant’s wage-gain line in the moment. In Sense, an Intelligent Cell sits on each field the value model reads — the follow-up wage, the exit counterfactual, the assistance flag — and computes its value line the moment that record arrives. An Intelligent Row assembles the lines into a per-participant value ledger. Here is Javier’s, as it stands mid-program:

INTELLIGENT ROW — Value Ledger · RW2-004 · Javier Brooks · IT & Cybersecurity · 2024-Q3 Birmingham

Output · Intelligent Row — Value Ledger · RW2-004 · Javier Brooks · IT & Cybersecurity · 2024-Q3 Birmingham
Value lineTypeReads fromStatus today
Wage gain MEASURED Intake $12.69/hr → six-month follow-up wage OPEN — baseline captured; completes when his follow-up lands
Avoided public assistance BENCHMARKED receives_public_assistance = No at intake DOES NOT APPLY — condition not met; contributes $0
Tax contribution BENCHMARKED ≈ 12% of wage gain OPEN — follows the wage line
Attribution factor Exit counterfactual OPEN — set when his exit wave lands
Read it: the OPEN rows are the honesty of the method made visible — no estimates padding the total. Lines complete when records land, and the DOES-NOT-APPLY row shows the conditional benchmark behaving correctly on a real record.

Read what the OPEN rows are doing: they are the honesty of the method made visible. Javier’s ledger is not padded with estimates to make the cohort total look finished — his lines complete when his records do. Across the cohort, ledgers close as waves land, which is why the pool-level pair — median $9.96 at intake to $25.11 at follow-up — is a set of reconciled per-person pairs, not two disconnected survey averages. And the DOES-NOT-APPLY row is the difference between a conditional benchmark and a flat per-head credit, auditable on every record.

This is also the adaptive loop applied to money. If RiseWorks revises a proxy — say the assistance schedule updates — every ledger in the store re-computes identically, first participant and last. A consultant spreadsheet revised mid-year applies the new assumption only to the rows someone remembers to touch.

Prompt 3 — Value Ledger on Arrival

PROMPT 3 — VALUE LEDGER ON ARRIVAL   [SENSE]
This is product configuration — it runs on arrival in Sopact Sense, not
in a chat window. A standalone prompt cannot do this: it never receives
the records, cannot join a wage in one store to a counterfactual in
another, and cannot recompute when the next wave lands.

WHERE IT SITS
Three Intelligent Cells, one per field the value model reads, plus one
Intelligent Row that assembles the ledger.

CELL 1 — on `followup_hourly_wage` (Six-Month Follow-up store)
Instruction: "When this field arrives, compute the MEASURED wage-gain
line for this participant: (follow-up wage − baseline_hourly_wage from
the Intake store, joined on email) × annual hours. Write the line value
and the two source fields to the ledger. If the baseline is missing,
write LINE BLOCKED — NO BASELINE instead of a value."

CELL 2 — on the exit counterfactual field (Exit/Completion store)
Instruction: "Map the answer to its attribution factor exactly:
Entirely 1.0 / Mostly 0.8 / Somewhat 0.5 / Slightly 0.25 / Not at all
0.0. Write the factor to the ledger. Never estimate a factor for a
missing answer — write OPEN."

CELL 3 — conditional benchmark (Intake + Six-Month Follow-up stores)
Instruction: "Apply the avoided-assistance line (≈ $4,800/yr,
BENCHMARKED) only if receives_public_assistance = Yes at intake AND
employment = employed at follow-up. If the condition fails, write
DOES NOT APPLY ($0). Apply the tax line (≈ 12% of wage gain,
BENCHMARKED) only after the wage-gain line has a value."

ROW — VALUE LEDGER (assembly spec)
Assemble per participant, joined on email:
 1. Each value line with its Type (MEASURED / BENCHMARKED), the fields
    it read, and its status (value / OPEN / DOES NOT APPLY / BLOCKED).
 2. The attribution factor (or OPEN).
 3. Ledger status: CLOSED when all lines and the factor are resolved;
    otherwise OPEN.
Measured and benchmarked lines are never summed into one figure at the
ledger level — they stay in separate columns all the way up.

SAMPLE RETURN (real record — RW2-004 · Javier Brooks · IT & Cyber,
2024-Q3 Birmingham, joined on javier.brooks86@yahoo.com):
 Wage gain          MEASURED      intake $12.69/hr -> follow-up: OPEN
                                  (completes when his follow-up lands)
 Avoided assistance BENCHMARKED   receives_public_assistance = No at
                                  intake -> DOES NOT APPLY ($0)
 Tax contribution   BENCHMARKED   follows the wage line -> OPEN
 Attribution factor —             exit counterfactual -> OPEN
 LEDGER STATUS: OPEN — recomputes the cohort ratio when it closes.

WHY ON ARRIVAL MATTERS
Ledgers close as records land, so the pool-level pair (median $9.96 at
intake -> $25.11 at follow-up) is a set of reconciled per-person pairs,
not two disconnected survey averages. If a proxy is revised, every
ledger in the store recomputes identically — first record and last.

Step 4 — Compute the ratio over the joined stores [SENSE]

The second thing no standalone prompt can do: divide a numerator spread across five stores by a denominator in a sixth, for 80 people at once, today and again next month. This is the Sopact Assistant (with the Claude MCP connection) working over the stores directly. Asked for the return picture, it returns four things:

The ratio, split before it is combined. Total attribution-adjusted social value over total investment — with the measured share and the benchmarked share reported separately, then combined: ≈ 2.44:1. A funder sees exactly how much of the ratio rests on the observed wage pair and how much on borrowed benchmarks, which is precisely what a blended number hides. The measured wage-gain line is the largest single contributor — cut the benchmarked lines entirely and there is still a return story built on observation.

Cost-per-outcome, with the honest denominator. Total program cost divided by durable placements comes to ≈ $20,076. Not cost per enrollee, not cost per completer: cost per instance of the outcome the theory of change promised.

The funnel, with the drop-off priced in. The Assistant shows where value concentrates and where it leaks:

Output · Sopact Assistant — the funnel, with the value consequence of each drop-off
StageCountWhat it means for the value math
Enrolled 80 The full investment base — every enrollee is in the denominator
Completed 62 18 did not complete; their costs count, and little value accrues — at follow-up, 45% of non-completers are employed vs 82% of completers
Credentialed 58 4 completed without a credential — the match engine has nothing to match
Match evaluations 108 20 strong / 51 partial / 37 not-qualified — matching effort, not yet value
Placed 29 Where the measured value concentrates — the wage pairs, the retention flags, the durable placements in the denominator of cost-per-outcome
Read it: SROI ≈ 2.44:1 (post-discount, measured and benchmarked shares reported separately) and cost-per-outcome ≈ $20,076 per durable placement are computed over this whole funnel — and the 29 credentialed-but-unplaced candidates between 58 and 29 are the demand-side problem Chapter 8 takes up.

The 29 credentialed-but-unplaced candidates in that gap between 58 and 29 are not an SROI footnote — they are the demand-side problem the next chapter takes up.

The audit, run against the model itself. Before publishing, the Assistant checks the model the way a skeptical reviewer would: any line with no named source, any value counted twice (a wage gain folded again into a “quality of life” line), any benchmarked line presented as measured, any line summed without its attribution discount. A model with a failing line does not ship.

And then it does the thing no deck can: it stays current. When the next follow-up wave lands, open ledgers close, the ratio recomputes, and the number in front of your board is the number your data supports today — not the number it supported at export time last spring.

Run it yourself: Prompt 4 — Live SROI over the Store

PROMPT 4 — LIVE SROI OVER THE STORE   [SENSE]
Run this in the Sopact Sense Assistant over your store. It works because
the Assistant (with the Claude MCP connection) reads the joined stores
directly — intake, exit, placements, six-month follow-up — so the
numerator and denominator come from reconciled records, not from an
export.

ASSISTANT PROMPT A — the ratio and the funnel
------------------------------------------------------------
Across the cohort, compute the live SROI:
1. Per participant, sum the value lines from the value ledger — keeping
  MEASURED and BENCHMARKED in separate columns — then multiply by that
  participant's attribution factor (from the exit counterfactual:
  Entirely 1.0 / Mostly 0.8 / Somewhat 0.5 / Slightly 0.25 /
  Not at all 0.0).
2. SROI ratio = total attribution-adjusted social value ÷ total
  investment (program cost fields, Exit/Completion store). Report the
  MEASURED share and the BENCHMARKED share separately, then combined.
3. Cost-per-outcome = total program cost ÷ durable placements, where a
  durable placement = matched + placed + retained 90 days, in-field,
  at a living wage. Never divide by people served.
4. Show the funnel with the value consequence of each drop-off.
5. Note which ledgers are still OPEN and what closing them would change.
------------------------------------------------------------

ASSISTANT PROMPT B — the model audit
------------------------------------------------------------
Audit the SROI model before I publish it. Flag:
1. Any proxy line with no named source (UNSOURCED).
2. Any value counted twice across lines.
3. Any BENCHMARKED line presented as if it were MEASURED.
4. Any participant value summed without its attribution discount.
For each flag: quote the line, name the problem, state the fix.
Verdict: PASS only if zero flags; otherwise NEEDS WORK with the list.
------------------------------------------------------------

WHAT IT RETURNS (RiseWorks Foundation / Pathways 2027, real numbers):
 SROI               ≈ 2.44 : 1  (post-discount; measured share and
                    benchmarked share reported separately, then
                    combined — the measured wage-gain line is the
                    largest single contributor)
 Cost-per-outcome   ≈ $20,076 per durable placement
 Measured backbone  median wage $9.96 -> $25.11/hr (intake ->
                    six-month follow-up, joined per person on email)
 Funnel             80 enrolled -> 62 completed -> 58 credentialed ->
                    108 match evaluations (20 strong / 51 partial /
                    37 not-qualified) -> 29 placed
 Drop-off evidence  82% of completers employed at follow-up vs 45% of
                    non-completers
 And it recomputes: when the next follow-up wave lands, open ledgers
 close and the ratio updates — nobody rebuilds a spreadsheet.

WHY A CHAT PROMPT CAN'T DO THIS
A standalone prompt sees only what you paste. It has no store, no other
records, no other waves — so it cannot join 80 wage pairs on email,
cannot read 80 counterfactual answers, and cannot recompute anything
next month. The Assistant works over the stores, so the number in front
of your board is the number your data supports today.

Common mistakes (and what to do instead)

Blending measured and benchmarked value into one figure. The moment an observed wage gain and a looked-up avoided cost merge into a single number, the reader can no longer tell proof from borrowing — and discounts both. Keep the two columns separate all the way into the report.

Publishing the gross ratio. An SROI with no deadweight discount claims every observed change as yours. Multiply each participant’s value by their own attribution factor and publish the post-discount number. It will be smaller. It will also be believed.

Dividing cost by people served. Cost per enrollee is a flattering denominator because enrollment is the one number a program fully controls. Divide by the durable outcome instead, and accept the larger, honest figure.

Keeping an unsourced line because it is big. The $3,000-wellbeing line adds to the numerator and subtracts from the credibility of every line around it. If you cannot name the source in a meeting, cut the line and report that outcome in its own units.

Treating SROI as an annual event. A ratio computed once a year from a hand-built export is stale for eleven months and un-auditable for twelve. If the waves are joined by a persistent ID, the ratio is a query, not a project — run it whenever a funder asks.

What you have now

A value map where every line has a proxy, a named source, and a MEASURED or BENCHMARKED label. A fixed attribution scale applied per participant from their own exit answer. A per-record value ledger that assembles on arrival, shows its open lines honestly, and applies conditional benchmarks only where the condition is met. And over the joined stores, the two numbers that hold up in the room: SROI ≈ 2.44:1, measured share and benchmarked share visible, and cost-per-outcome ≈ $20,076 against durable placements — both recomputing as records land.

Why this works

Because the value map is an audit trail, every dollar of claimed value traces to a source someone can check. Because measured and benchmarked value never blend, the reader always knows what was observed — the $9.96 → $25.11 wage pair, joined per person — versus what was borrowed. Because attribution is discounted from each participant’s own counterfactual, deadweight is removed mechanically, not rhetorically. And because the computation runs over stores joined by a persistent ID, the ratio moves with the data instead of decaying in a deck. The skeptic’s one-liner: every line has a source, measured never mixes with borrowed, and the number recomputes itself when the data changes.

The one thing to do this week

Take your single most important outcome and write one line: outcome → financial proxy → source, marked MEASURED or BENCHMARKED. If measured, name the two fields and the ID that joins them; if benchmarked, name the document the figure comes from. One honest line is the seed of an SROI a funder trusts — and if you cannot write the line, you have found the gap a year before the report would have.

Video walkthrough (coming soon)

A screen-by-screen walkthrough — building the RiseWorks value map, watching a follow-up record close a value ledger on arrival, and asking the Assistant for the live 2.44:1 with its split — is in production. Check back on the Academy.

Who this is for

Program leads who have been quoted an SROI engagement and wondered what happens to the number in month seven. Evaluators who inherited a ratio they cannot trace. Executive directors who need one defensible return number for a board that includes at least one skeptic. If your current SROI lives in a slide and not in your data, this chapter is the repair.

Compute your live SROI in Sopact Sense — sopact.com/academy.

Next in the series: How to Turn a Job Description into a Requirements Checklist — the series crosses to the demand side, where the 29 credentialed-but-unplaced candidates meet the employer requisitions that explain why.

Related from the Academy

Ready to try it for yourself?

Open Sopact Sense, paste your program description, and put it to work.

Try in Sopact