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

Estimate Impact When the Data Is Thin

When grantee data is incomplete, Sopact Sense estimates portfolio value with benchmark proxies — but keeps measured value separate from benchmarked, marks the confidence of each line, and names what to collect next.

<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <style> @keyframes pulseDot{0%,100%{opacity:1}50%{opacity:.35}} *{box-sizing:border-box} body{margin:0;font-family:'Hanken Grotesk',-apple-system,BlinkMacSystemFont,sans-serif;background:#EEF2F9;padding:26px;display:flex;justify-content:center} .card{width:600px;max-width:100%;background:#FFFFFF;border:1px solid #E3E9F4;border-radius:20px;box-shadow:0 26px 64px -32px rgba(15,30,70,.34),0 2px 4px rgba(15,30,70,.05);overflow:hidden} .hdr{display:flex;align-items:center;gap:11px;padding:16px 20px;border-bottom:1px solid #EEF1F7;background:#F5F8FE} .hdr .ic{display:inline-flex;width:30px;height:30px;align-items:center;justify-content:center;border:2px solid #155DFC;border-radius:50%;color:#155DFC;font-size:15px;font-weight:800;flex-shrink:0} .hdr .t{min-width:0} .hdr .t .n{font-weight:800;font-size:14.5px;color:#0F172A;letter-spacing:-.2px} .hdr .t .s{font-size:12px;color:#64748B} .hdr .pill{margin-left:auto;display:inline-flex;align-items:center;gap:6px;font-size:11.5px;font-weight:700;color:#155DFC;background:#E6EEFF;padding:5px 10px;border-radius:20px;white-space:nowrap} .hdr .pill .d{width:6px;height:6px;border-radius:50%;background:#155DFC;animation:pulseDot 2s infinite} .tabs{display:flex;gap:0;padding:12px 16px 0;background:#F5F8FE} .tab{flex:1;display:flex;flex-direction:column;align-items:center;gap:5px;cursor:pointer;font-family:inherit;font-size:11.5px;font-weight:700;color:#64748B;background:transparent;border:none;border-bottom:2px solid transparent;padding:8px 4px 10px} .tab.on{font-weight:800;color:#155DFC;border-bottom-color:#155DFC} .tab .num{display:inline-flex;width:20px;height:20px;align-items:center;justify-content:center;border-radius:50%;font-size:11px;font-weight:800;color:#64748B;background:#EEF1F7} .tab.on .num{color:#fff;background:#155DFC} .divider{height:1px;background:#EEF1F7} .body{padding:20px} .eyebrow{font-size:10.5px;font-weight:800;letter-spacing:1.2px;text-transform:uppercase;color:#155DFC;margin-bottom:5px} .eyebrow.g{color:#15884F} .headline{font-family:'Inter',Georgia,serif;font-size:18.5px;font-weight:600;line-height:1.25;color:#0F172A;margin-bottom:12px} .lede{font-size:12.5px;line-height:1.55;color:#475569;margin:0 0 14px} .rows{display:flex;flex-direction:column;gap:8px;margin-bottom:14px} .row{display:flex;align-items:center;gap:11px;background:#F5F8FE;border:1px solid #EEF1F7;border-radius:11px;padding:11px 13px} .row .emoji{font-size:17px} .row .rt{flex:1;min-width:0} .row .rt .n{font-size:13px;font-weight:700;color:#0F172A} .row .rt .s{font-size:12px;color:#64748B} .pillsm{font-size:11px;font-weight:800;color:#155DFC;background:#E6EEFF;padding:4px 9px;border-radius:6px;flex-shrink:0} .pillsm.gray{font-weight:700;color:#64748B;background:#EEF1F7} /* chain / timeline */ .chainwrap{position:relative;padding-left:26px} .chainline{position:absolute;left:8px;top:8px;bottom:8px;width:2px;background:#E3E9F4} .cnode{position:relative;margin-bottom:14px} .cdot{position:absolute;left:-26px;top:4px;width:16px;height:16px;border-radius:50%;background:#fff;border:3px solid #94A3B8} .clabel{font-size:9.5px;font-weight:800;letter-spacing:.5px;text-transform:uppercase;color:#64748B;margin-bottom:4px} .cbox{background:#F5F8FE;border:1px solid #EEF1F7;border-radius:11px;padding:10px 12px;font-size:12px;line-height:1.5;color:#334155} .cbox.graded{display:flex;align-items:flex-start;gap:9px;border-left-width:3px;border-left-style:solid} .cnote{margin:0 0 14px 4px;font-size:11px;line-height:1.5} .cnote .plus{display:inline-flex;width:16px;height:16px;align-items:center;justify-content:center;background:#155DFC;color:#fff;border-radius:4px;font-size:10px;font-weight:800;flex-shrink:0;margin-right:6px} .csummary{display:flex;align-items:center;gap:12px;background:#0A1B3D;border-radius:13px;padding:11px 15px;margin-top:4px} .csummary .t{flex:1;font-size:11.5px;color:#CBD8F5} .csummary .t b{color:#F1F5FF} /* matrix */ .mxwrap{border:1px solid #EEF1F7;border-radius:12px;overflow:hidden;margin-bottom:10px} .mxhead{display:grid;grid-template-columns:118px 1fr 1fr;background:#F5F8FE;border-bottom:1px solid #EEF1F7} .mxhead div{font-size:9px;font-weight:800;letter-spacing:.5px;text-transform:uppercase;color:#64748B;padding:7px 9px} .mxrow{display:grid;grid-template-columns:118px 1fr 1fr;border-bottom:1px solid #EEF1F7} .mxrow:last-child{border-bottom:none} .mxrow>div{padding:9px;font-size:11.5px;line-height:1.4;color:#334155;display:flex;align-items:center;flex-wrap:wrap;gap:5px} .mxrow .mxlabel{font-weight:700;color:#0F172A;background:#FAFBFE} .mxchip{font-size:9px;font-weight:800;letter-spacing:.3px;text-transform:uppercase;padding:3px 6px;border-radius:5px;white-space:nowrap} .promptwrap{padding:0 20px 18px} .promptlbl{font-size:10px;font-weight:800;letter-spacing:1px;text-transform:uppercase;color:#94A3B8;margin-bottom:7px} .prompt{display:flex;align-items:flex-start;gap:9px;font-family:ui-monospace,'SF Mono',Menlo,monospace;font-size:11px;line-height:1.5;color:#1E293B;background:#F5F8FE;border:1px solid #EEF1F7;border-left:3px solid #155DFC;border-radius:9px;padding:11px 12px} .prompt .car{color:#155DFC;font-weight:800;flex-shrink:0} .flagrow{display:flex;align-items:flex-start;gap:10px;background:#F5F8FE;border:1px solid #EEF1F7;border-radius:11px;padding:10px 12px;border-left-width:3px;border-left-style:solid;margin-bottom:8px} .flagtag{font-size:9.5px;font-weight:800;letter-spacing:.4px;text-transform:uppercase;padding:4px 8px;border-radius:5px;white-space:nowrap;flex-shrink:0} .flagtxt{font-size:12px;line-height:1.45;color:#334155} .lp{display:flex;align-items:center;gap:12px;background:#0A1B3D;border-radius:13px;padding:14px 16px;margin-top:6px} .lp .ic{display:inline-flex;width:34px;height:34px;align-items:center;justify-content:center;background:#14295C;border:1px solid #26407A;border-radius:9px;color:#7FA8FF;font-size:16px;flex-shrink:0} .lp .rt{flex:1;min-width:0} .lp .rt .n{font-size:13px;font-weight:800;color:#F1F5FF} .lp .rt .s{font-size:11.5px;color:#9DB2D9} .lp .open{font-size:11px;font-weight:800;color:#0A1B3D;background:#7FA8FF;padding:6px 11px;border-radius:7px;white-space:nowrap} </style> </head> <body> <div class="card"> <div class="hdr"> <span class="ic">&#129517;</span> <div class="t"> <div class="n">Impact-fund portfolio · Thin Data Portfolio</div> <div class="s">DEMO-06 · Sopact Sense · Funder Portfolio</div> </div> <span class="pill"><span class="d"></span>Estimating</span> </div> <div class="tabs" id="tabs"></div> <div class="divider"></div> <div class="body" id="body"></div> <div class="promptwrap"> <div class="promptlbl">The prompt behind this step</div> <div class="prompt"><span class="car">&gt;</span><span id="promptTxt"></span></div> </div> </div> <script> (function(){ var TABS = ["Setup", "Estimate", "Fix", "Report"]; var CONTENT = [{"eyebrow": "Step 1 · Load the portfolio", "headline": "The input is your Decision Brief, nothing else", "lede": "Clean data with persistent contact IDs, loaded before any value gets estimated.", "prompt": "You are the Sopact Sense Assistant working over the [DEMO] dataset (clean data + persistent contact IDs). Load my Decision Brief (decision, audience, outcomes, indicators, evidence standard) first, then wait for my task."}, {"eyebrow": "Step 2 · Separate measured from benchmarked", "headline": "Measured value stays measured, benchmarked stays labeled", "lede": "Each investee is graded <strong style=\"color:#15884F\">green</strong>, <strong style=\"color:#C9820A\">amber</strong>, <strong style=\"color:#C63E2B\">red</strong> — thin data gets a confidence label and a collect-next, not a guess.", "prompt": "For portfolio [PORTFOLIO] with thin outcome data, estimate value using benchmark proxies for [SECTOR]. Separate measured vs benchmarked + confidence. List collect-next. Grade green/amber/red."}, {"eyebrow": "Step 3 · One-fix follow-up", "headline": "Plan the collection", "lede": "The lowest-graded element gets one realistic fix — the single edit that moves it toward green.", "prompt": "Take the lowest-graded element above and fix it using only what the program could realistically measure. Show the before → after grade and the single indicator/edit that moves it to green."}, {"eyebrow": "Step 4 · Missing & incomplete report", "headline": "Every gap becomes one named ask", "lede": "Every amber or red item becomes one named ask — the report leads with the decision it informs.", "prompt": "Create a 'missing & incomplete' report from this analysis in Sopact branding [or paste your website URL / brand guideline to apply your own]. List every element graded amber or red, what is missing, and the one input that fixes each. Lead with the decision this report informs."}]; var BODIES = { setup: "<div class=\"row\"><span class=\"emoji\">&#128202;</span><div class=\"rt\"><div class=\"n\">Funder Portfolio dataset</div><div class=\"s\">DEMO-06 · clean data + persistent contact IDs</div></div><span class=\"pillsm\">Loaded</span></div><div class=\"row\"><span class=\"emoji\">&#128203;</span><div class=\"rt\"><div class=\"n\">Decision Brief</div><div class=\"s\">Decision, audience, outcomes, indicators, evidence standard</div></div><span class=\"pillsm gray\">Structure</span></div><div class=\"row\"><span class=\"emoji\">&#129517;</span><div class=\"rt\"><div class=\"n\">Sector benchmark proxies</div><div class=\"s\">For portfolio investees with thin outcome data</div></div><span class=\"pillsm gray\">Structure</span></div>", build: "<div class=\"mxwrap\"><div class=\"mxhead\"><div></div><div>Measured</div><div>Benchmarked / confidence</div></div><div class=\"mxrow\"><div class=\"mxlabel\">INV-A</div><div>$300k<span class=\"mxchip\" style=\"background:#15884F;color:#fff\">GREEN</span></div><div>— · high</div></div><div class=\"mxrow\"><div class=\"mxlabel\">INV-B</div><div>—</div><div>$240k · medium<span class=\"mxchip\" style=\"background:#C9820A;color:#fff\">AMBER</span></div></div><div class=\"mxrow\"><div class=\"mxlabel\">INV-C</div><div>—</div><div>$0 · none — collect next<span class=\"mxchip\" style=\"background:#C63E2B;color:#fff\">RED</span></div></div></div>", fix: "<div class=\"mxwrap\"><div class=\"mxhead\"><div></div><div>Measured</div><div>Benchmarked / confidence</div></div><div class=\"mxrow\"><div class=\"mxlabel\">INV-A</div><div>$300k<span class=\"mxchip\" style=\"background:#15884F;color:#fff\">GREEN</span></div><div>— · high</div></div><div class=\"mxrow\"><div class=\"mxlabel\">INV-B</div><div>—</div><div>$240k · medium<span class=\"mxchip\" style=\"background:#C9820A;color:#fff\">AMBER</span></div></div><div class=\"mxrow\"><div class=\"mxlabel\">INV-C</div><div>—</div><div>One-question outcome measure added for INV-C<span class=\"mxchip\" style=\"background:#15884F;color:#fff\">GREEN</span></div></div></div><div class=\"cnote\" style=\"color:#15884F;margin-left:0\"><span class=\"plus\">+</span><strong>Fix applied:</strong> Add a one-question outcome measure for INV-C</div>", reportFlags: "<div class=\"flagrow\" style=\"border-left-color:#C9820A\"><span class=\"flagtag\" style=\"color:#C9820A;background:#FBF0DA\">AMBER</span><div class=\"flagtxt\">INV-B — $240k of value is benchmarked, not measured, at medium confidence.</div></div><div class=\"flagrow\" style=\"border-left-color:#C63E2B\"><span class=\"flagtag\" style=\"color:#C63E2B;background:#FCE9E7\">RED</span><div class=\"flagtxt\">INV-C — no data exists to even benchmark; value is currently $0.</div></div>", lpTitle: "Missing & incomplete report · shareable link", lpSub: "Decision-first · Sopact branding · Impact-fund portfolio · Thin Data Portfolio", summaryBefore: "Grade: 1 green &middot; 1 amber &middot; 1 red. Measured, benchmarked, and a gap.", summaryAfter: "Grade: 2 green &middot; 1 amber &middot; 0 red. One question plans the collection." }; var phase = 1; var tabsEl = document.getElementById('tabs'); var bodyEl = document.getElementById('body'); var promptEl = document.getElementById('promptTxt'); function renderTabs(){ tabsEl.innerHTML = ''; TABS.forEach(function(label, i){ var b = document.createElement('button'); b.type = 'button'; b.className = 'tab' + (i === phase ? ' on' : ''); b.innerHTML = '<span class="num">' + (i+1) + '</span><span>' + label + '</span>'; b.addEventListener('click', function(){ phase = i; render(); }); tabsEl.appendChild(b); }); } function renderBody(){ var c = CONTENT[phase]; var eyebrowClass = (phase===2) ? 'eyebrow g' : 'eyebrow'; var out = '<div class="' + eyebrowClass + '">' + c.eyebrow + '</div><div class="headline">' + c.headline + '</div><p class="lede">' + c.lede + '</p>'; if (phase === 0) { out += '<div class="rows">' + BODIES.setup + '</div>'; } else if (phase === 1) { out += BODIES.build; out += '<div class="csummary"><div class="t"><b>' + BODIES.summaryBefore + '</b></div></div>'; } else if (phase === 2) { out += BODIES.fix; out += '<div class="csummary"><div class="t"><b>' + BODIES.summaryAfter + '</b></div></div>'; } else { out += BODIES.reportFlags; out += '<div class="lp"><span class="ic">&#128196;</span><div class="rt"><div class="n">' + BODIES.lpTitle + '</div><div class="s">' + BODIES.lpSub + '</div></div><span class="open">Open &rarr;</span></div>'; } bodyEl.innerHTML = out; promptEl.textContent = c.prompt; } function render(){ renderTabs(); renderBody(); } render(); })(); </script> </body> </html>

In short: A funder rarely has complete outcome data across every grantee — but thin data isn't a reason to stop, only a reason to be honest. The discipline is to estimate value with benchmark proxies where you must, keep that benchmarked value clearly separate from what you actually measured, mark the confidence of each line, and name what to collect next. Point Sopact Sense at your portfolio; it does exactly that and grades each line — green where the value is measured, amber where it's benchmarked, red where there's no data at all.

1 · Set up over your portfolio data

Honest estimation starts from whatever clean data you do have. Work from your portfolio dataset with persistent contact IDs and load your Decision Brief so Sense knows the evidence standard:

You are the Sopact Sense Assistant working over the [DEMO] dataset (clean data + persistent contact IDs). Load my Decision Brief (decision, audience, outcomes, indicators, evidence standard) first, then wait for my task.

2 · Write the measured-vs-benchmarked prompt

Ask Sense to fill the gaps with benchmarks but never to blur the line between what's measured and what's borrowed:

For portfolio [PORTFOLIO] with thin outcome data, estimate value using benchmark proxies for [SECTOR]. Separate measured vs benchmarked + confidence. List collect-next. Grade green / amber / red.

Five elements make it honest: the dataset (what you actually have); measured vs benchmarked (the two never mixed); confidence per line (how much to trust each figure); a collect-next list (the path out of thin data); and the grade (green / amber / red at a glance).

3 · What Sense estimates

Sense returns an estimate with each line labelled measured or benchmarked and graded. The demo runs on the Funder Portfolio dataset, engineered to grade one green, one amber, one red:

Run on the Funder Portfolio dataset (DEMO 06) already loaded in Sopact Sense.

GRADE: green | INV-A | value measured from its own outcome data; amber | INV-B | value benchmarked from sector proxies, not measured; red | INV-C | no data — nothing to estimate, excluded

The green line is measured from the grantee's own data, the amber line is benchmarked from sector proxies and flagged as such, and the red line has no data at all — so it's excluded rather than invented.

4 · Turn a weak link green

The estimate firms up when you move one line from benchmarked to measured. Take the lowest-graded line and fix it with one realistic change:

Take the lowest-graded element above and fix it using only what the program could realistically measure. Show the before → after grade and the single indicator/edit that moves it to green.

For the portfolio, that's collecting one real outcome indicator from the benchmarked grantee — replacing a borrowed proxy with measured value.

5 · Make the report and share it

Generate a decision-first report in your own brand, then a shareable link:

Create a 'missing & incomplete' report from this analysis in Sopact branding [or paste your website URL / brand guideline to apply your own]. List every element graded amber or red, what is missing, and the one input that fixes each. Lead with the decision this report informs.
Create a shareable link for this report and open it in a new tab.

Tricks, tips, and troubleshooting

Never blur measured and benchmarked. The whole credibility of a thin-data estimate rests on keeping the two visibly separate. Ask Sense to label every line, and to total them separately.

Confidence is part of the number. A benchmarked figure with low confidence isn't the same as a measured one. Ask Sense to attach a confidence level to each line so readers weight them correctly.

The collect-next list is the real output. Thin data is temporary if you know what to gather. Ask Sense for the single highest-value indicator to collect from each under-measured grantee.

Tighten the portfolio while you're here. Ask Sense which one grantee, if measured next cycle, would most reduce the share of benchmarked value:

Which grantee, if it collected one outcome indicator next cycle, would most reduce the portfolio's reliance on benchmarked value — and which indicator should it be?

Frequently asked questions

How do you estimate impact when grantee data is incomplete?

Use benchmark proxies to fill the gaps, but keep that benchmarked value strictly separate from value you actually measured, attach a confidence level to each estimate, and publish a list of what to collect next. The goal isn't a single confident number — it's an honest split between what you know and what you've inferred, with a clear path to measuring more.

What's the difference between measured and benchmarked impact?

Measured impact comes from a grantee's own outcome data — their participants, their indicators. Benchmarked impact is inferred from sector averages or published proxies when that data is missing. Both can appear in an estimate, but only if they're labelled and totalled separately; mixing them is what makes a portfolio number misleading.

Can you report SROI or portfolio value with incomplete data?

Yes — provided you're transparent. Report the measured value, report the benchmarked value separately with its confidence, exclude grantees with no data rather than guessing, and state what you'll collect to close the gaps. A clearly-caveated estimate is credible; a single blended number that hides the thin spots is not.

Ready to try it for yourself?

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

Try in Sopact