play icon for videos
← Academy
Analyze · Kirkpatrick coverage

How Do You Apply the Kirkpatrick Model to a Survey?

Most training surveys only measure Level 1 — did people enjoy it. Here is how to map every question to Kirkpatrick's four levels, flag what you don't cover, and fill the gaps with Sopact Sense.

<!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">&#127919;</span> <div class="t"> <div class="n">Workforce training (L&amp;amp;D) · mapping a survey to Kirkpatrick&#x27;s 4 levels</div> <div class="s">DEMO-10 · Sopact Sense · Training / Kirkpatrick</div> </div> <span class="pill"><span class="d"></span>Mapping</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", "Map", "Fix", "Report"]; var CONTENT = [{"eyebrow": "Step 1 · Load the dataset", "headline": "You don't crunch it by hand. You write the prompt.", "lede": "Point the Assistant at the Training / Kirkpatrick dataset (DEMO-10) — clean, with persistent contact IDs — and wait for the task.", "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 · Map to Kirkpatrick levels", "headline": "Five elements turn a dataset into a graded Kirkpatrick map.", "lede": "Every question is tagged L1–L4 and graded <strong style=\"color:#15884F\">green</strong>, <strong style=\"color:#C9820A\">amber</strong>, or <strong style=\"color:#C63E2B\">red</strong> — most training surveys only measure Level 1.", "prompt": "Tag each question in [SURVEY] with the Kirkpatrick level (L1-L4) or 'none'; flag uncovered levels; propose one question per gap. Grade green/amber/red."}, {"eyebrow": "Step 3 · One-fix follow-up", "headline": "Cover the top level.", "lede": "The Assistant names the single data point that moves the lowest-graded element 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": "Training — Kirkpatrick Coverage Report", "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\">&#128203;</span><div class=\"rt\"><div class=\"n\">Dataset</div><div class=\"s\">Training / Kirkpatrick demo (DEMO-10), clean data with persistent contact IDs</div></div><span class=\"pillsm\">Pasted</span></div><div class=\"row\"><span class=\"emoji\">&#128260;</span><div class=\"rt\"><div class=\"n\">Structure</div><div class=\"s\">Question → level → coverage</div></div><span class=\"pillsm gray\">Structure</span></div><div class=\"row\"><span class=\"emoji\">&#128274;</span><div class=\"rt\"><div class=\"n\">No hallucination rule</div><div class=\"s\">Mark anything absent as MISSING; don&#x27;t guess</div></div><span class=\"pillsm gray\">Required</span></div>", build: "<div class=\"mxwrap\"><div class=\"mxhead\"><div></div><div>Level</div><div>Coverage</div></div><div class=\"mxrow\"><div class=\"mxlabel\">Q1 satisfaction</div><div>L1<span class=\"mxchip\" style=\"background:#15884F;color:#fff\">GREEN</span></div><div>reaction ✓</div></div><div class=\"mxrow\"><div class=\"mxlabel\">Q2 quiz score</div><div>L2<span class=\"mxchip\" style=\"background:#15884F;color:#fff\">GREEN</span></div><div>learning ✓</div></div><div class=\"mxrow\"><div class=\"mxlabel\">Q3 applied on job</div><div>L3<span class=\"mxchip\" style=\"background:#C9820A;color:#fff\">AMBER</span></div><div>behavior — self-report</div></div><div class=\"mxrow\"><div class=\"mxlabel\">Q4 promotion</div><div>L4<span class=\"mxchip\" style=\"background:#C63E2B;color:#fff\">RED</span></div><div>results — not tracked</div></div></div>", fix: "<div class=\"mxwrap\"><div class=\"mxhead\"><div></div><div>Level</div><div>Coverage</div></div><div class=\"mxrow\"><div class=\"mxlabel\">Q1 satisfaction</div><div>L1<span class=\"mxchip\" style=\"background:#15884F;color:#fff\">GREEN</span></div><div>reaction ✓</div></div><div class=\"mxrow\"><div class=\"mxlabel\">Q2 quiz score</div><div>L2<span class=\"mxchip\" style=\"background:#15884F;color:#fff\">GREEN</span></div><div>learning ✓</div></div><div class=\"mxrow\"><div class=\"mxlabel\">Q3 applied on job</div><div>L3<span class=\"mxchip\" style=\"background:#C9820A;color:#fff\">AMBER</span></div><div>behavior — self-report</div></div><div class=\"mxrow\"><div class=\"mxlabel\">Q4 promotion</div><div>L4 covered<span class=\"mxchip\" style=\"background:#15884F;color:#fff\">GREEN</span></div><div>results — not tracked</div></div></div><div class=\"cnote\" style=\"color:#15884F;margin-left:0\"><span class=\"plus\">+</span><strong>Fix applied:</strong> Add a 6-month promotion/retention check</div>", reportFlags: "<div class=\"flagrow\" style=\"border-left-color:#C9820A\"><span class=\"flagtag\" style=\"color:#C9820A;background:#FBF0DA\">AMBER</span><div class=\"flagtxt\">Level 3 (behavior) is self-report only. Fix: add a manager-verified application check.</div></div><div class=\"flagrow\" style=\"border-left-color:#C63E2B\"><span class=\"flagtag\" style=\"color:#C63E2B;background:#FCE9E7\">RED</span><div class=\"flagtxt\">Level 4 (results) is not tracked. Fix: add a 6-month promotion/retention measure.</div></div>", lpTitle: "Missing & incomplete report · shareable link", lpSub: "Decision-first · Sopact branding · Workforce training (L&amp;D) · mapping a survey to Kirkpatrick's 4 levels", summaryBefore: "Grade: 2 green &middot; 1 amber &middot; 1 red. Level 4 results, untracked", summaryAfter: "Grade: 3 green &middot; 1 amber &middot; 0 red. promotion/retention check added, L4 covered" }; 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: All four Kirkpatrick levels run on ONE persistent participant ID, so reaction, learning, behavior, and results stay on the same record instead of scattering across four disconnected surveys. You set up four instruments — Level 1 reaction at session end, Level 2 pre/post around the training, Level 3 behavior at 60–90 days, Level 4 results against an organizational metric — and map each to the same ID. Design all four before the cohort starts, and Sopact Sense chains them into one evaluation you can trace from a satisfaction score all the way to a business result.

1 · Anchor every level to one persistent participant ID

The whole model only works if the same person's reaction, learning gain, on-the-job behavior, and downstream result live on one record. In Sopact Sense every participant gets a persistent contact ID at intake, and each of the four instruments below writes back to that ID. That is what lets you later ask "did the people who reacted well also learn, apply it, and move the metric?" — a question you cannot answer if Level 1 sits in one form tool and Level 4 sits in a spreadsheet no one joined.

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

2 · Design the Level 1 (Reaction) instrument — fires at session end

Level 1 measures how participants reacted to the training itself, collected immediately at the end of the session while it is fresh. Frame these as instrument design, not a satisfaction dump: each question should map to a driver you can act on — content, facilitator, relevance, pace, and would-recommend. Sample questions to build into the reaction form: "How satisfied were you with this session overall?", "How relevant was the content to your day-to-day work?", "How would you rate the facilitator?", and one open field, "What is the one thing that would have made this session more useful?" Every response lands on the participant's persistent ID so the reaction score can later be correlated with whether they actually learned and applied anything.

Once the post-session feedback is in, run the reaction analysis:

Analyze Level 1 (Reaction) for [COHORT]: code the post-session feedback into themes (content, facilitator, relevance, pace, would-recommend), give a reaction score per participant on their persistent ID, rank the top two drivers of low satisfaction with a representative quote each, and flag any participant whose reaction predicts drop-off.

Expected output. A reaction score per participant tied to their ID, the post-session comments coded into the five themes, the top two drivers of low satisfaction each with a representative verbatim quote, and a flag list of participants whose reaction predicts they will disengage before Level 2 or Level 3. Input: the post-session feedback form on the persistent ID. Output: a scored, themed reaction table plus a drop-off watch list.

3 · Design the Level 2 (Learning) instrument — fires pre and post

Level 2 measures what participants actually learned, captured as a pre/post pair around the training so the gain is the change on the same ID rather than a single after-the-fact score. Build a short knowledge or skills assessment and administer it once before the training and again immediately after. Sample questions to build into it: a scored knowledge check on the core competency, a confidence-to-apply self-rating, and a short scenario item that tests judgement rather than recall. Because both sittings write to the same persistent ID, the pre-to-post delta per participant is the learning gain — the number Level 3 and Level 4 later lean on. This is exactly the measurement covered in how to analyze pre / mid / post survey data, the Level 2 how-to in this chain.

4 · Design the Level 3 (Behavior) instrument — fires at 60–90 days

Level 3 measures whether the learning changed behavior back on the job, and it cannot be asked at session end — behavior needs time to show up, so this instrument fires 60–90 days later against the same ID. Design it as more than a self-report: pair a self-rated application scale with a manager or peer verification and one open field on what blocked application. Sample questions: "How often have you used [skill] in your work since the training?", a manager-rated "How consistently is this person applying [skill]?", and "What has made it hard to apply what you learned?" Treat self-report alone as amber and aim for the observed check. The full method — application rate, transfer barriers, and correlating behavior back to the Level 2 gain — is in how to measure behavior change after training.

5 · Design the Level 4 (Results) instrument — fires against an org metric

Level 4 measures whether the behavior change produced an organizational result, and you plan it first even though it fires last. Pick ONE metric the organization already records — retention, promotion rate, error rate, productivity, customer satisfaction — set a baseline, and where possible hold a comparison group. Sample questions are mostly not survey questions at all: they are the metric join. On the participant's persistent ID you attach the recorded outcome (for example a 6-month promotion/retention flag) so the result sits on the same record as their reaction, learning gain, and behavior. Building the board-ready summary that traces the result back through behavior, learning, and reaction — while stating the attribution limits — is covered in how to connect training to organizational results.

6 · Chain the four levels into one evaluation

Because all four instruments write to the same ID, Sense can read up the chain: a reaction score, a pre/post learning gain, a 60–90 day application rate, and one organizational result, per participant. Grade the coverage so you can see at a glance where the evaluation is solid and where it is thin.

GRADE: green | L1/L2 | reaction + learning on one ID; amber | L3 | behavior self-report at 60–90 days; red | L4 | result not yet joined to the record

Green is Levels 1 and 2 covered — reaction and learning are measured on the same ID. Amber is Level 3 resting on self-report rather than an observed or manager-verified check. Red is Level 4: the organizational result exists somewhere but is not yet joined to the participant record.

Tricks, tips, and troubleshooting

Design all four instruments before the cohort starts. Level 3 fires at 60–90 days and Level 4 against a metric that needs a baseline — if you wait until after the training to design them, you have already lost the pre-measure and the baseline. Draft all four forms and the metric join up front, even though they fire at different times.

Reuse the same IDs and codebook across waves. Run cohort after cohort on the same persistent contact IDs and the same theme codebook (content, facilitator, relevance, pace, would-recommend) so waves stack into a trend instead of four unrelated one-off reports. A shared codebook is what keeps "relevance" meaning the same thing in wave 1 and wave 4.

Plan Level 4 first. The organizational result is the hardest to retrofit, so pick the ONE metric and its baseline before the first session. Everything upstream — which behaviors you watch, which knowledge you test, which reaction drivers you code — gets sharper once you know the business result you are ultimately trying to move.

Treat self-report behavior as amber, not green. "Do you use this on the job?" is Level 3 in name only. Grade it amber and add a manager or on-the-job check so behavior is observed, not merely claimed.

Frequently asked questions

How do you apply the Kirkpatrick model to a survey?

Applying the Kirkpatrick model to a survey means running all four levels on one persistent participant ID: a Level 1 reaction form at session end, a Level 2 pre/post assessment around the training, a Level 3 behavior follow-up at 60–90 days, and a Level 4 join to an organizational metric. Because every instrument writes to the same ID in Sopact Sense, you can trace one participant from their satisfaction score through their learning gain and on-the-job behavior to a business result — rather than collecting four disconnected surveys that never join.

When should each Kirkpatrick level be measured?

Level 1 (Reaction) is collected at session end while the experience is fresh. Level 2 (Learning) is a pre/post pair administered right before and right after the training so the gain is a change on the same ID. Level 3 (Behavior) fires 60–90 days later, once there has been time to apply the learning on the job. Level 4 (Results) is measured against an organizational metric on whatever cadence that metric already reports, with a baseline set before the training begins.

Why does everything have to run on one participant ID?

Without a shared persistent ID, reaction, learning, behavior, and results sit in separate tools and can never be joined, so you can never answer whether the people who reacted well also learned, applied it, and moved the metric. Anchoring all four levels to one ID in Sopact Sense turns four isolated surveys into a single chained evaluation you can trace end to end.

Ready to try it for yourself?

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

Try in Sopact