How to Identify the Common Barriers Your Clients Keep Hitting
Tagging barriers system-versus-individual changes what you fix. This shows how to surface the barriers a whole caseload keeps hitting in Sopact Sense — counted, quoted, and classified.
<!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">🚫</span>
<div class="t">
<div class="n">Workforce program · Caseload Barriers</div>
<div class="s">DEMO-04 · Sopact Sense · Case Management</div>
</div>
<span class="pill"><span class="d"></span>Tagging</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">></span><span id="promptTxt"></span></div>
</div>
</div>
<script>
(function(){
var TABS = ["Setup", "Tag", "Fix", "Report"];
var CONTENT = [{"eyebrow": "Step 1 · Load the Decision Brief", "headline": "Tagging system vs individual changes what you fix.", "lede": "The Assistant works only from the Open-Text Barriers dataset (DEMO-04) — a workforce program's barriers survey.", "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 · Identify common barriers across clients", "headline": "Name, count, quote — tag system vs individual.", "lede": "Every barrier is tagged and graded <strong style=\"color:#15884F\">green</strong>, <strong style=\"color:#C9820A\">amber</strong>, <strong style=\"color:#C63E2B\">red</strong> on whether it's a system fix or compounding.", "prompt": "Across clients in [PROGRAM], identify common barriers: name, count, quote; tag system vs individual; note co-occurrence. Grade green/amber/red."}, {"eyebrow": "Step 3 · One-fix follow-up", "headline": "Address the system barrier.", "lede": "Transport sits at AMBER — program-fixable, not individual. The Assistant names the single data point that moves it to 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": "Mostly system barriers; transport+childcare compound.", "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\">📝</span><div class=\"rt\"><div class=\"n\">Decision Brief</div><div class=\"s\">Decision, audience, outcomes, indicators, evidence standard loaded first</div></div><span class=\"pillsm\">Pasted</span></div><div class=\"row\"><span class=\"emoji\">📋</span><div class=\"rt\"><div class=\"n\">Five elements</div><div class=\"s\">Dataset · barriers + counts · system vs individual · co-occurrence · grade G/A/R</div></div><span class=\"pillsm gray\">Structure</span></div><div class=\"row\"><span class=\"emoji\">🔒</span><div class=\"rt\"><div class=\"n\">No hallucination rule</div><div class=\"s\">Only what the program states; infer = flagged</div></div><span class=\"pillsm gray\">Required</span></div>",
build: "<div class=\"mxwrap\"><div class=\"mxhead\"><div></div><div>Count</div><div>Level</div></div><div class=\"mxrow\"><div class=\"mxlabel\">Transport</div><div><span class=\"mxchip\" style=\"background:#15884F;color:#fff\">GREEN</span></div><div>system</div></div><div class=\"mxrow\"><div class=\"mxlabel\">Housing</div><div></div><div>system</div></div><div class=\"mxrow\"><div class=\"mxlabel\">Motivation</div><div><span class=\"mxchip\" style=\"background:#C9820A;color:#fff\">AMBER</span></div><div>individual</div></div><div class=\"mxrow\"><div class=\"mxlabel\">Co-occurrence</div><div>transport+childcare<span class=\"mxchip\" style=\"background:#C63E2B;color:#fff\">RED</span></div><div>compounding</div></div></div>",
fix: "<div class=\"mxwrap\"><div class=\"mxhead\"><div></div><div>Count</div><div>Level</div></div><div class=\"mxrow\"><div class=\"mxlabel\">Transport</div><div><span class=\"mxchip\" style=\"background:#15884F;color:#fff\">GREEN</span></div><div>system</div></div><div class=\"mxrow\"><div class=\"mxlabel\">Housing</div><div><span class=\"mxchip\" style=\"background:#15884F;color:#fff\">GREEN</span></div><div>Add a transport stipend / schedule shift</div></div><div class=\"mxrow\"><div class=\"mxlabel\">Motivation</div><div><span class=\"mxchip\" style=\"background:#C9820A;color:#fff\">AMBER</span></div><div>individual</div></div><div class=\"mxrow\"><div class=\"mxlabel\">Co-occurrence</div><div>transport+childcare<span class=\"mxchip\" style=\"background:#C63E2B;color:#fff\">RED</span></div><div>compounding</div></div></div><div class=\"cnote\" style=\"color:#15884F;margin-left:0\"><span class=\"plus\">+</span><strong>Fix applied:</strong> Add a transport stipend / schedule shift — moves the transport barrier from AMBER (program-fixable, not individual) to GREEN (mitigated).</div>",
reportFlags: "<div class=\"flagrow\" style=\"border-left-color:#C9820A\"><span class=\"flagtag\" style=\"color:#C9820A;background:#FBF0DA\">AMBER</span><div class=\"flagtxt\">Motivation barrier: individual-level. Fix: coaching; don't treat as system-wide.</div></div><div class=\"flagrow\" style=\"border-left-color:#C63E2B\"><span class=\"flagtag\" style=\"color:#C63E2B;background:#FCE9E7\">RED</span><div class=\"flagtxt\">Compounding barriers: transport + childcare together. Fix: bundle support for affected clients.</div></div>",
lpTitle: "Missing & incomplete report · shareable link",
lpSub: "Decision-first · Sopact branding · Workforce program · Caseload Barriers",
summaryBefore: "Grade: 1 green · 1 amber · 1 red. barriers named, not yet fixed",
summaryAfter: "Grade: 2 green · 1 amber · 1 red. transport mitigated with stipend"
};
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">📄</span><div class="rt"><div class="n">' + BODIES.lpTitle + '</div><div class="s">' + BODIES.lpSub + '</div></div><span class="open">Open →</span></div>';
}
bodyEl.innerHTML = out;
promptEl.textContent = c.prompt;
}
function render(){ renderTabs(); renderBody(); }
render();
})();
</script>
</body>
</html>
In short: Whether a barrier is system or individual changes what you fix. In Sopact Sense the analysis names each barrier across the whole caseload, counts it, quotes a client, tags it system-versus-individual, and notes where barriers co-occur — so you fix the pattern, not the anecdote.
1 · Set up over your data
Point the Assistant at clean open-text barrier responses with persistent contact IDs so each client's barriers stay tied to them. Load your Decision Brief first — the decision, the audience, the program, and your evidence standard — so the analysis surfaces barriers that map to something you can act on.
2 · Write the prompt
Across clients in [PROGRAM], identify common barriers: name, count, quote; tag system vs individual; note co-occurrence. Grade green/amber/red.
The prompt carries five elements. The dataset is the loaded barriers survey. Barriers plus counts names each barrier and how often it appears. System versus individual classifies whether the barrier is structural or personal. Co-occurrence flags barriers that show up together. Grade G/A/R rates how solid each tag is.
3 · What Sense produces
Run on the Open-Text Barriers dataset (DEMO 04) already loaded in Sopact Sense.
GRADE: green | 1 | System barrier; amber | 1 | Individual tag; red | 1 | Compounding barriers
Sense returns each barrier counted and tagged with a quote. A clearly structural barrier like transport or housing comes back green. A barrier read as 'individual motivation' that might be a system gap in disguise comes back amber — the tag needs a second look. Clients hitting two barriers at once that aren't counted as a pattern come back red: the compounding case is invisible.
4 · Turn a weak link green
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 compounding red, the fix is to capture co-occurrence so that transport plus childcare shows up as one fixable cluster rather than two separate tallies. That single change reveals the clients your program is failing twice over.
5 · Make the report and share it
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
Tag against an explicit rule. Don't let the model decide system-versus-individual on vibes. Write down what counts as structural and apply it consistently.
Always keep a quote with the count. A barrier tallied without a verbatim line behind it is hard to trust and harder to act on.
Co-occurrence is where the program fails twice. Single-barrier counts hide the clients carrying two or three at once. Capture the overlap.
Re-check the 'individual' pile first. It's where mis-tags hide.
Re-read the quotes behind every 'individual motivation' tag — a missed bus or a closed childcare slot often reads as a personal failing.
Frequently asked questions
How do you identify common client barriers?
Across the whole caseload, name each barrier, count how often it appears, quote a client, and tag it system-versus-individual — then note where barriers co-occur. Sopact Sense does this in one prompt over clean open-text responses.
Why does system-versus-individual tagging matter?
Because it changes the fix. A structural barrier like transport calls for a program-level change; an individual one calls for a different response. Mis-tagging a system gap as personal sends you after the wrong solution.
What is a compounding barrier and why is it graded red?
A compounding barrier is two or more barriers a client hits at once — transport plus childcare, say. It grades red when co-occurrence isn't captured, because the most stuck clients stay invisible until you count the overlap.
Ready to try it for yourself?
Open Sopact Sense, paste your program description, and put it to work.