play icon for videos
← Academy
SOPACT ACADEMY · CASE INTELLIGENCE · ANALYZE

Calculate SROI — Live, Sourced, and Honest

An SROI ratio and cost-per-outcome computed live over the stores you already built — every line sourced, measured value kept separate from borrowed, and the number recomputing as records land.

<aside class="ci-wizard" aria-label="Case Intelligence series navigator"> <div class="ci-wiz-eyebrow">The Case Intelligence Series</div> <div class="ci-wiz-sub">13 chapters · foundation + two tracks</div> <div class="ci-progress"><span style="width:69%"></span></div> <div class="ci-progress-label">You're here — Chapter 9 of 13</div> <div class="ci-group">Foundation</div> <ol class="ci-steps"> <li class="ci-step is-done"> <a href="/academy/what-is-case-intelligence" target="_blank" rel="noopener"> <span class="ci-num">1</span> <span class="ci-step-body"><span class="ci-step-title">What Is Case Intelligence?</span></span> </a> </li> <li class="ci-step is-done"> <a href="/academy/how-to-build-a-theory-of-change" target="_blank" rel="noopener"> <span class="ci-num">2</span> <span class="ci-step-body"><span class="ci-step-title">How to Build a Theory of Change That Survives Funder Questions</span></span> </a> </li> <li class="ci-step is-done"> <a href="/academy/theory-of-change-to-data-collection-workflow" target="_blank" rel="noopener"> <span class="ci-num">3</span> <span class="ci-step-body"><span class="ci-step-title">How to Turn a Theory of Change into a Data-Collection Workflow</span></span> </a> </li> </ol> <div class="ci-group">Nonprofit Track</div> <ol class="ci-steps"> <li class="ci-step is-done"> <a href="/academy/review-applications-without-reviewer-bias" target="_blank" rel="noopener"> <span class="ci-num">4</span> <span class="ci-step-body"><span class="ci-step-title">How to Review Applications Without Reviewer Bias</span></span> </a> </li> <li class="ci-step is-done"> <a href="/academy/intake-form-usable-baseline" target="_blank" rel="noopener"> <span class="ci-num">5</span> <span class="ci-step-body"><span class="ci-step-title">How to Design an Intake Form That Captures a Usable Baseline</span></span> </a> </li> <li class="ci-step is-done"> <a href="/academy/spot-at-risk-participants-mid-program" target="_blank" rel="noopener"> <span class="ci-num">6</span> <span class="ci-step-body"><span class="ci-step-title">How to Spot At-Risk Participants Mid-Program</span></span> </a> </li> <li class="ci-step is-done"> <a href="/academy/measure-change-at-exit" target="_blank" rel="noopener"> <span class="ci-num">7</span> <span class="ci-step-body"><span class="ci-step-title">How to Measure Change at Exit (Not Just Completion)</span></span> </a> </li> <li class="ci-step is-done"> <a href="/academy/mentor-notes-early-warning" target="_blank" rel="noopener"> <span class="ci-num">8</span> <span class="ci-step-body"><span class="ci-step-title">How to Catch At-Risk Participants Early with Mentor Notes</span></span> </a> </li> <li class="ci-step is-active" aria-current="step"> <span class="ci-num">9</span> <span class="ci-step-body"><span class="ci-step-title">How to Calculate SROI — Live, Sourced, and Honest</span><span class="ci-step-meta">You're here</span></span> </li> <li class="ci-step "> <a href="/academy/cohort-to-funder-impact-report" target="_blank" rel="noopener"> <span class="ci-num ci-num-range">12a</span> <span class="ci-step-body"><span class="ci-step-title">How to Turn a Cohort into a Funder Impact Report</span></span> </a> </li> </ol> <div class="ci-group">Social Enterprise Track</div> <ol class="ci-steps"> <li class="ci-step "> <a href="/academy/job-description-requirements-checklist" target="_blank" rel="noopener"> <span class="ci-num ci-num-range">10</span> <span class="ci-step-body"><span class="ci-step-title">How to Turn a Job Description into a Requirements Checklist</span></span> </a> </li> <li class="ci-step "> <a href="/academy/score-candidate-role-matches-without-bias" target="_blank" rel="noopener"> <span class="ci-num ci-num-range">11</span> <span class="ci-step-body"><span class="ci-step-title">How to Score Candidate–Role Matches Without Bias</span></span> </a> </li> <li class="ci-step "> <a href="/academy/cohort-to-investor-impact-report" target="_blank" rel="noopener"> <span class="ci-num ci-num-range">12b</span> <span class="ci-step-body"><span class="ci-step-title">How to Turn a Cohort into a Social-Enterprise Investor Report</span></span> </a> </li> </ol> <a class="ci-next" href="/academy/cohort-to-funder-impact-report" target="_blank" rel="noopener">Continue to Chapter 12a &nbsp;→</a> </aside> <style> .ci-wizard{--ink:#48416A;--body:#3D3A33;--muted:#76716A;--surface:#F7F6FD;--surface2:#EFEAFB;--line:#E4DFF2;--line2:#DCCEF4;--accent:#8D8AE8; position:sticky;top:24px;box-sizing:border-box;font-family:'Inter',system-ui,sans-serif;color:var(--body); background:var(--surface);border:1px solid var(--line);border-radius:14px;padding:22px 20px;} .ci-wizard *{box-sizing:border-box;} .ci-wiz-eyebrow{font-family:'Inter',Georgia,serif;font-size:18px;font-weight:600;color:var(--ink);line-height:1.25;} .ci-wiz-sub{font-size:12.5px;color:var(--muted);margin-top:3px;} .ci-progress{height:5px;border-radius:999px;background:var(--surface2);margin:14px 0 7px;overflow:hidden;} .ci-progress span{display:block;height:100%;background:var(--accent);border-radius:999px;} .ci-progress-label{font-size:12px;color:var(--muted);} .ci-group{font-size:11px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin:18px 0 8px;padding-top:14px;border-top:1px solid var(--line);} .ci-group:first-of-type{border-top:0;} .ci-steps{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px;} .ci-step a,.ci-step{display:flex;gap:12px;align-items:flex-start;text-decoration:none;color:inherit;} .ci-step a{padding:8px;margin:-8px;border-radius:10px;transition:background .15s;width:100%;} .ci-step a:hover{background:var(--surface2);} .ci-step{padding:8px 0;} .ci-num{flex:0 0 auto;width:26px;height:26px;border-radius:50%;display:grid;place-items:center;font-size:12.5px;font-weight:600;color:var(--muted);background:var(--surface2);border:1px solid var(--line2);} .ci-num-range{width:auto;min-width:26px;padding:0 9px;border-radius:999px;font-size:11.5px;height:26px;} .ci-step-title{display:block;font-size:14px;font-weight:500;color:var(--ink);line-height:1.35;} .ci-step-meta{display:block;font-size:11.5px;color:var(--muted);margin-top:2px;} .ci-step.is-active .ci-num{background:var(--accent);border-color:var(--accent);color:#fff;box-shadow:0 0 0 4px rgba(201,100,66,.15);} .ci-step.is-active .ci-step-title{font-weight:600;} .ci-step.is-active .ci-step-meta{color:var(--accent);font-weight:600;} .ci-step.is-done .ci-num{background:var(--ink);border-color:var(--ink);color:#fff;} .ci-next{display:flex;align-items:center;justify-content:center;margin-top:20px;background:var(--ink);color:#fff;text-decoration:none;font-size:14px;font-weight:600;padding:12px 16px;border-radius:11px;transition:transform .15s,background .15s;} .ci-next:hover{background:var(--accent);transform:translateY(-1px);} </style>

For: program leads, evaluators, and executive directors — at nonprofits and social enterprises alike — 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 the value you measured and the value you borrowed 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 per person, and the number recomputing as records land.

What a live SROI gives you that a spreadsheet never will:

  • Intelligent Cell sources every line of value — each outcome claim in the ratio traced to the record and the participant quote behind it, measured value kept visibly separate from borrowed proxies.
  • Intelligent Row carries attribution per person — one row per participant holding their outcome, their counterfactual discount, and their contribution to the ratio — so the number is an aggregation, not an assertion.
  • Pressure-test the ratio in plain English — ask the Sopact assistant "what happens to SROI if we drop the wage proxy?" or "which outcome contributes the most value?" across every wave and store at once — from Sense, or from Claude or ChatGPT via MCP.
  • The number tells you when it moves — as records land, the ratio recomputes; when a proxy goes stale or new evidence weakens a value line, Intelligent Cell flags it automatically before a skeptic does.

This is Chapter 9 of the Case Intelligence series. In Chapter 8 you turned weekly notes into an early-warning system — the last piece of the evidence arc that began at intake. This chapter is where all that evidence becomes the two numbers a board actually asks for: the return ratio and the cost per outcome. Whether your participants are trainees, students, founders, or grantees, the method is identical.

As always, the first two steps are [DIY] — the value map and the discount rule are thinking work for any AI chat window. The last two are [SENSE] — because a ratio spread across five stores is a many-record fact, and a chat window can't join records it never received or recompute them when next month's wave lands.

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 provenance is. In the standard process, 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.

The number is stale on delivery: it reflects the cohort as of the export date, 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? And measured value blends with borrowed value: a wage gain you observed sits in the same total as a national-average avoided cost you looked up, so the reader can't tell what you proved from what you borrowed and trusts neither.

The deeper cause is upstream. When intake lives in one module, the follow-up in a survey tool, and placements in a tracker, nothing joins — so the value math starts with a hand-built export, and an export is always a snapshot. When every wave lands on the same persistent ID, the ratio becomes a query, not a project.

One definition does quiet work throughout: the outcome unit is a durable placement — matched, placed, retained 90 days, in-field, at a living wage. Cost-per-outcome divides total cost by that, not by "people served." That is why ≈ $20,076 per durable placement is a defensible figure and cost-per-participant is a flattering one.

Step 1 — Build the value map [DIY]

For each outcome in your theory of change, write one line: outcome → financial proxy → source, marked MEASURED or BENCHMARKED. A MEASURED line is one you observed in your own data — both numbers, same scale, same person, joined by ID, like a median wage pair of $9.96 → $25.11 an hour from intake to six-month follow-up. A BENCHMARKED line borrows a named external figure, like avoided public assistance of about $4,800 a year. Both are legitimate; an unsourced line is not, and it goes.

Here are the outcomes from my theory of change, and the fields I actually collect, with their scales and waves: [paste both].

Build my SROI value map: one line per outcome — outcome, financial proxy, source — marked MEASURED only if both numbers behind the proxy exist in my own fields on the same scale, joinable per person by ID, and BENCHMARKED only if you can name a specific source I could cite in a meeting. If neither holds, mark the line UNSOURCED so I can fix or cut it — never invent a source or a dollar figure. Prefer the conservative proxy, state any condition a benchmark depends on, and flag any line that double-counts value already claimed by another.

Restraint pays here: a map of three defensible lines beats nine speculative ones, because one indefensible line taints the eight beside it. And notice what stays off the map — no dollarized "wellbeing." A confidence gain of 4.3 → 7.4 is real evidence; report it in its own units rather than converting it into money nobody can defend.

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

Deadweight is where inflated SROI hides: some of the change you observe would have happened anyway. A participant whose wage tripled but who says the program made no difference contributes zero attributable value — no matter how good the pair looks. The counterfactual question your exit survey asked in Chapter 7 exists exactly for this.

Here is my value map, and the counterfactual question my exit survey asks, with its answer options: [paste both].

Review this like a skeptical funder. Where an outcome has competing proxies, keep the more conservative, better-sourced one and give the reason in one sentence. Grade every line HIGH (measured from my own data), MEDIUM (named external benchmark), or LOW (generic benchmark) — recommend cutting the LOW lines and reporting those outcomes in their own units instead of dollars. Then confirm the attribution scale I'll apply per person from their own exit answer: entirely because of the program 1.0, mostly 0.8, somewhat 0.5, slightly 0.25, not at all 0.0. The ratio I publish is the post-discount one.

Conservatism compounds trust. A tax line at an effective rate of about 12% beats the marginal rate that would look better; an avoided-assistance line credits $4,800 only where assistance was actually received at intake and the person is now employed — never as a flat per-head bonus. When a reviewer asks "did you account for people who would have found work anyway?", the answer is yes, mechanically, from each person's own answer — not a hand-waved 10% haircut at the end.

Step 3 — The value ledger, assembled on arrival [SENSE]

From here on, this is what the product does — not a prompt you run. Take one participant: intake wage $12.69 an hour, no public assistance at intake, follow-up wave not yet due. The moment each record arrives, the value line that reads it computes — and every line that can't compute yet says OPEN instead of being padded with an estimate:

One participant's value ledger · assembled on arrival
Value lineTypeReads fromStatus today
Wage gainMEASUREDIntake $12.69/hr → six-month follow-up wageOPEN — completes when the follow-up lands
Avoided public assistanceBENCHMARKEDAssistance flag = No at intakeDOES NOT APPLY — condition not met; contributes $0
Tax contributionBENCHMARKED≈ 12% of wage gainOPEN — follows the wage line
Attribution factorExit counterfactual answerOPEN — set when the exit wave lands
Read it: no estimates padding the total — lines complete when records land, and the borrowed line contributes nothing where its condition fails.

The OPEN rows are the honesty of the method made visible, and the DOES-NOT-APPLY row is a conditional benchmark behaving correctly on a real record — borrowed value accrues only where its condition is met in the data. Revise a proxy mid-year and every ledger in the store recomputes identically, first record and last. A chat window could score one pasted ledger; it can't watch a follow-up land on a Tuesday morning and close the wage line for eighty people joined on ID.

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 the whole cohort, today and again next month. In Sense you ask in plain language:

  • "Compute the live SROI, measured and benchmarked reported separately" — the split a blended number hides; post-discount it comes to ≈ 2.44:1, with the measured wage line the largest single contributor.
  • "What is the cost per durable placement?" — ≈ $20,076 against the outcome the theory of change promised, not the headcount that walked in.
  • "Show the funnel with the value consequence of each drop-off" — where value concentrates, and where it leaks.
  • "Audit the model before I publish it" — unsourced lines, double-counted value, benchmarks posing as measurements, any value summed without its discount. A model with a failing line does not ship.
The cohort funnel · what each drop-off costs
StageCountWhat it means for the value math
Enrolled80The full investment base — every enrollee is in the denominator
Completed6218 costs count, little value accrues — 45% of non-completers employed at follow-up vs 82% of completers
Credentialed584 completed without a credential — nothing for the match engine to match
Match evaluations10820 STRONG 51 PARTIAL 37 NOT QUALIFIED — effort, not yet value
Placed29Where measured value concentrates — the wage pairs and the durable placements in the denominator
Read it: SROI ≈ 2.44:1 post-discount and ≈ $20,076 per durable placement are computed over this whole funnel — and recompute as records land.

The 29 credentialed-but-unplaced people sitting between 58 and 29 are not an SROI footnote — they are the demand-side problem the next chapter takes up. And the ratio stays current: when the next follow-up wave lands, open ledgers close 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.

Common mistakes

Blending measured and benchmarked value into one figure. The moment an observed wage gain and a looked-up avoided cost merge, 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. A ratio with no deadweight discount claims every observed change as yours. Publish the post-discount number. It will be smaller. It will also be believed.

Dividing cost by people served. Enrollment is the one number a program fully controls, which is what makes it a flattering denominator. Divide by the durable outcome 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 can't name the source out loud in a meeting, cut the line and report the 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 share a persistent ID, 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 — the ratio with its measured and borrowed shares visible, and the cost per durable placement — both recomputing as records land.

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 can't write the line, you've found the gap a year before the report would have.

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 can't 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, the repair starts here.

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 credentialed-but-unplaced meet the employer requisitions that explain why.

Ready to try it for yourself?

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

Try it in Case Intelligence →