Resource Vault
Select Page
Resource Vault
<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"/> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <title>Real Data or a Prettier Chart?</title> <style>html,body{margin:0;padding:0;background:#FAFAFD;overflow-x:hidden}</style> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Hanken+Grotesk:wght@300;400;600;700&display=swap"> <style> /* Actionable measurement check. All styles scoped to #rc so it can sit inside a HubSpot page. */ :root { color-scheme: light; } body { background: #FAFAFD; } #rc { --blue: #10069F; --purple: #963CBD; --ink: #17153A; --ink-soft: #4A4870; --line: #DCDBEA; --ground: #FAFAFD; --card: #FFFFFF; --blue-tint: #EDECFA; --purple-tint: #F4EAF8; --yes: #10069F; --partly: #B77900; --partly-tint: #FFF4DB; --no: #C81E2C; --no-tint: #FDE9EA; font-family: "Founders Grotesk", "Hanken Grotesk", Arial, sans-serif; font-weight: 300; font-size: 18px; line-height: 1.55; color: var(--ink); background: var(--ground); padding-inline: 16px; padding-block: 40px 56px; -webkit-font-smoothing: antialiased; } #rc *, #rc *::before, #rc *::after { box-sizing: border-box; } #rc [hidden] { display: none !important; } #rc .done { display: flex; flex-direction: column; gap: 28px; } #rc .wrap { max-width: 760px; margin: 0 auto; display: flex; flex-direction: column; gap: 32px; } #rc h1, #rc h2, #rc h3 { font-weight: 600; letter-spacing: -0.02em; text-wrap: balance; margin: 0; color: var(--ink); } #rc p { margin: 0; } #rc a { color: var(--blue); } #rc :focus-visible { outline: 3px solid var(--purple); outline-offset: 2px; border-radius: 6px; } #rc .eyebrow { font-size: 16px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: var(--purple); } /* Buttons */ #rc .btn { font: inherit; font-size: 18px; font-weight: 600; cursor: pointer; padding: 13px 22px; border-radius: 999px; border: 1.5px solid var(--blue); background: var(--blue); color: #fff; transition: opacity .15s, background .15s; } #rc .btn:hover { opacity: .9; } #rc .btn[disabled] { opacity: .35; cursor: not-allowed; } #rc .btn.ghost { background: transparent; color: var(--ink); border-color: var(--line); font-weight: 400; } #rc .btn.ghost:hover { border-color: var(--ink-soft); } #rc .row { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; } #rc .row.split { justify-content: space-between; } /* Intro */ #rc .intro { display: flex; flex-direction: column; gap: 20px; } #rc h1 { font-size: clamp(38px, 7vw, 58px); line-height: 1.03; } #rc h1 span { color: var(--blue); } #rc .sub-lede { font-size: 22px; font-weight: 400; max-width: 60ch; color: var(--ink); } #rc .lede-lines { display: flex; flex-direction: column; gap: 6px; font-size: 20px; font-weight: 400; color: var(--ink); max-width: 62ch; } #rc .lede { font-size: 20px; max-width: 62ch; color: var(--ink-soft); } #rc .stat { display: grid; grid-template-columns: auto 1fr; gap: 6px 20px; align-items: center; padding: 20px 22px; background: var(--blue-tint); border-radius: 14px; } #rc .stat-num { font-size: 52px; font-weight: 600; color: var(--blue); line-height: 1; font-variant-numeric: tabular-nums; } #rc .stat-num small { font-size: 22px; color: var(--ink-soft); font-weight: 400; margin-left: 6px; } #rc .stat-src { grid-column: 1 / -1; font-size: 16px; color: var(--ink-soft); } #rc .start { display: flex; flex-direction: column; gap: 12px; padding: 22px; background: var(--card); border: 1.5px solid var(--line); border-radius: 14px; } #rc label.vlabel { font-weight: 600; } #rc .hint { font-size: 16px; color: var(--ink-soft); } #rc input.vname, #rc textarea.notes { font: inherit; font-size: 18px; padding: 12px 14px; border: 1.5px solid var(--line); border-radius: 10px; background: var(--card); color: var(--ink); width: 100%; } #rc input.vname { max-width: 440px; } #rc textarea.notes { min-height: 84px; resize: vertical; } #rc input.vname:focus, #rc textarea.notes:focus { border-color: var(--blue); outline: none; } /* Progress */ #rc .progress { display: flex; flex-direction: column; gap: 10px; } #rc .progress-meta { display: flex; justify-content: space-between; gap: 12px; flex-wrap: wrap; font-size: 16px; color: var(--ink-soft); font-variant-numeric: tabular-nums; } #rc .progress-meta strong { color: var(--ink); font-weight: 600; } #rc .segs { display: grid; grid-template-columns: repeat(7, 1fr); gap: 6px; } #rc .segs button { height: 10px; border: 0; padding: 0; border-radius: 4px; background: var(--line); cursor: pointer; } #rc .segs button[data-a="2"] { background: var(--yes); } #rc .segs button[data-a="1"] { background: var(--partly); } #rc .segs button[data-a="0"] { background: var(--no); } #rc .segs button.current { outline: 2px solid var(--ink); outline-offset: 2px; } /* Question */ #rc .q { background: var(--card); border: 1.5px solid var(--line); border-radius: 16px; padding: 26px; display: flex; flex-direction: column; gap: 18px; } #rc .q h2 { font-size: clamp(26px, 4.4vw, 32px); line-height: 1.15; } #rc .q .why { color: var(--ink-soft); } #rc .sound { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; } #rc .sound div { padding: 14px 16px; border-radius: 10px; font-size: 16px; } #rc .sound strong { display: block; font-weight: 600; margin-bottom: 4px; } #rc .sound .real { background: var(--blue-tint); } #rc .sound .dodge { background: #F3F2F7; } #rc .ask { border-left: 4px solid var(--purple); padding: 4px 0 4px 14px; } #rc .ask strong { display: block; font-size: 16px; font-weight: 600; color: var(--purple); letter-spacing: .04em; text-transform: uppercase; } #rc .ask p { font-size: 19px; font-weight: 400; } #rc .answers { display: flex; flex-wrap: wrap; gap: 8px; } #rc .answers button { font: inherit; font-size: 17px; cursor: pointer; padding: 11px 18px; border-radius: 999px; border: 1.5px solid var(--line); background: var(--card); color: var(--ink); } #rc .answers button:hover { border-color: var(--ink-soft); } #rc .answers button[aria-pressed="true"][data-v="2"] { background: var(--yes); border-color: var(--yes); color: #fff; } #rc .answers button[aria-pressed="true"][data-v="1"] { background: var(--partly-tint); border-color: var(--partly); color: #5A3B00; } #rc .answers button[aria-pressed="true"][data-v="0"] { background: var(--no-tint); border-color: var(--no); color: #7A0F18; } #rc details.ours summary { cursor: pointer; font-size: 16px; font-weight: 600; color: var(--purple); list-style: none; display: inline-flex; gap: 8px; } #rc details.ours summary::-webkit-details-marker { display: none; } #rc details.ours summary::before { content: "+"; width: 14px; } #rc details.ours[open] summary::before { content: "\2013"; } #rc .ours-body { margin-top: 10px; padding: 14px 16px; background: var(--purple-tint); border-radius: 10px; font-size: 16px; display: flex; flex-direction: column; gap: 6px; } #rc .pill { display: inline-block; font-size: 16px; font-weight: 600; padding: 2px 12px; border-radius: 999px; width: fit-content; } #rc .pill.yes { background: var(--yes); color: #fff; } #rc .pill.mostly { background: var(--blue-tint); color: var(--blue); border: 1.5px solid var(--blue); } #rc .pill.partly { background: var(--partly-tint); color: #5A3B00; border: 1.5px solid var(--partly); } /* Result */ #rc .result { background: var(--ink); color: #fff; border-radius: 18px; padding: 28px 24px; display: flex; flex-direction: column; gap: 14px; } #rc .result h2 { color: #fff; font-size: clamp(28px, 5vw, 38px); } #rc .result .score { color: #D9D8F0; font-variant-numeric: tabular-nums; } #rc .result .verdict { font-size: 19px; color: #F0EFFA; max-width: 60ch; } #rc .report { display: flex; flex-direction: column; gap: 10px; } #rc .report h3 { font-size: 22px; } #rc .rep-item { display: grid; grid-template-columns: 28px 1fr auto; gap: 4px 12px; padding: 14px 0; border-bottom: 1px solid var(--line); align-items: start; } #rc .rep-item .n { font-weight: 600; font-variant-numeric: tabular-nums; } #rc .rep-item .t { font-weight: 400; } #rc .rep-item .sub { grid-column: 2 / -1; font-size: 16px; color: var(--ink-soft); } #rc .tag { font-size: 16px; font-weight: 600; padding: 2px 10px; border-radius: 999px; white-space: nowrap; } #rc .tag.v2 { background: var(--yes); color: #fff; } #rc .tag.v1 { background: var(--partly-tint); color: #5A3B00; } #rc .tag.v0 { background: var(--no-tint); color: #7A0F18; } #rc .status { font-size: 16px; color: var(--ink-soft); min-height: 1.5em; } /* Next steps */ #rc .next { display: flex; flex-direction: column; gap: 16px; } #rc .next h2 { font-size: 28px; } #rc .cards { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; } #rc .cta { display: flex; flex-direction: column; gap: 10px; padding: 22px; border-radius: 14px; text-decoration: none; color: var(--ink); border: 1.5px solid var(--line); background: var(--card); } #rc .cta:hover { border-color: var(--blue); } #rc .cta.primary { background: var(--blue); border-color: var(--blue); color: #fff; } #rc .cta h3 { font-size: 22px; color: inherit; } #rc .cta p { font-size: 17px; } #rc .cta .go { font-weight: 600; margin-top: auto; } #rc .foot { font-size: 16px; color: var(--ink-soft); border-top: 1px solid var(--line); padding-top: 16px; display: flex; flex-direction: column; gap: 6px; } @media (max-width: 620px) { #rc .sound, #rc .cards { grid-template-columns: 1fr; } #rc .q { padding: 20px; } } @media (prefers-reduced-motion: reduce) { #rc * { transition: none !important; } } /* Paths + mapped options */ #rc .paths { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; } #rc .path { font: inherit; text-align: left; cursor: pointer; display: flex; flex-direction: column; gap: 8px; padding: 22px; border-radius: 14px; border: 1.5px solid var(--line); background: var(--card); color: var(--ink); } #rc .path:hover { border-color: var(--blue); } #rc .path .when { font-size: 16px; font-weight: 600; letter-spacing: .06em; text-transform: uppercase; color: var(--purple); } #rc .path h3 { font-size: 23px; } #rc .path p { font-size: 17px; color: var(--ink-soft); } #rc .path .go { font-weight: 600; color: var(--blue); margin-top: auto; } #rc .opts { display: flex; flex-direction: column; gap: 8px; } #rc .opts button { font: inherit; font-size: 17px; text-align: left; cursor: pointer; padding: 13px 16px; border-radius: 12px; border: 1.5px solid var(--line); background: var(--card); color: var(--ink); display: grid; grid-template-columns: 22px 1fr; gap: 12px; align-items: start; } #rc .opts button::before { content: ""; width: 18px; height: 18px; margin-top: 4px; border-radius: 50%; border: 2px solid var(--line); } #rc .opts button:hover { border-color: var(--ink-soft); } #rc .opts button[aria-pressed="true"] { border-color: var(--blue); background: var(--blue-tint); } #rc .opts button[aria-pressed="true"]::before { border-color: var(--blue); background: radial-gradient(var(--blue) 45%, transparent 50%); } #rc .include { display: flex; gap: 10px; align-items: center; font-weight: 400; cursor: pointer; } #rc .include input { width: 20px; height: 20px; accent-color: var(--blue); } #rc .demo-cta { display: flex; flex-direction: column; gap: 12px; padding: 26px; border-radius: 16px; background: var(--blue); color: #fff; } #rc .demo-cta h2 { color: #fff; font-size: 28px; } #rc .demo-cta p { font-size: 18px; color: #E4E2FF; max-width: 60ch; } #rc .demo-cta a.btn { background: #fff; color: var(--blue); border-color: #fff; text-decoration: none; width: fit-content; } @media (max-width: 620px) { #rc .paths { grid-template-columns: 1fr; } } #rc .grid-wrap { overflow-x: auto; } #rc table.grid { width: 100%; border-collapse: collapse; font-size: 17px; } #rc table.grid th { font-size: 16px; font-weight: 600; text-align: center; padding: 10px 6px; border-bottom: 2px solid var(--ink); white-space: nowrap; } #rc table.grid th:first-child { text-align: left; } #rc table.grid th.c0 { color: var(--yes); } #rc table.grid th.c1 { color: var(--partly); } #rc table.grid th.c2 { color: var(--no); } #rc table.grid td { padding: 14px 6px; border-bottom: 1px solid var(--line); vertical-align: top; } #rc table.grid td.mark { text-align: center; width: 84px; font-size: 22px; font-weight: 700; line-height: 1.2; } #rc table.grid td.mark.c0 { color: var(--yes); } #rc table.grid td.mark.c1 { color: var(--partly); } #rc table.grid td.mark.c2 { color: var(--no); } #rc table.grid .gq { font-weight: 600; } #rc table.grid .gs { font-size: 16px; color: var(--ink-soft); margin-top: 4px; } @media (max-width: 620px) { #rc table.grid td.mark { width: 56px; } #rc table.grid th { font-size: 16px; padding: 8px 2px; } } </style> </head><body> <div id="rc"> <div class="wrap"> <!-- Front page --> <section id="rc-intro" class="intro"> <p class="eyebrow">A check for consultants choosing a measurement partner</p> <h1>Real behavior-change data, or a <span>prettier chart?</span></h1> <p class="sub-lede">For training and consulting firms, measuring impact is now table stakes. RedThread Research counts more than 300 learning tech vendors claiming they can help you do it. So how do you choose the right measurement partner?</p> <div class="stat"> <div class="stat-num">83%</div> <p>of learning tech vendors now list analytics and measurement as a core feature. In 2023 it was a third of them.</p> <p class="stat-src">Source: RedThread Research, State of L&D 2026 (June 2026), 461 vendors.</p> </div> <div class="lede-lines"> <p>Your clients now expect you to show impact.</p> <p>Rightly or wrongly, whichever tool you use will shape how they see you.</p> <p>Here are seven questions to help you choose the right one.</p> </div> <div class="start"> <label class="vlabel" for="rc-vendor">Which vendor are you looking at?</label> <input class="vname" id="rc-vendor" type="text" placeholder="Vendor name (optional)" autocomplete="off"> <p class="hint">About five minutes. Nothing you enter is saved or sent anywhere.</p> </div> <div class="paths"> <button class="path" type="button" id="rc-go-prep"> <span class="when">Before the demo</span> <h3>Prepare for a demo</h3> <p>Walk through the seven questions, pick the ones you'll ask, and leave with a prep sheet.</p> <span class="go">Build my prep sheet →</span> </button> <button class="path" type="button" id="rc-go-review"> <span class="when">After the demo</span> <h3>Review a demo you've seen</h3> <p>Answer seven questions about what they showed you, and get a report with the gaps to follow up on.</p> <span class="go">Review my demo →</span> </button> </div> </section> <!-- Question flow (both paths) --> <section id="rc-flow" hidden> <div class="progress" style="margin-bottom:18px"> <div class="progress-meta"><span><strong id="rc-count">Question 1 of 7</strong> · <span id="rc-group"></span></span><span id="rc-mode"></span></div> <div class="segs" id="rc-segs"></div> </div> <article class="q" id="rc-q"></article> <div class="row split" style="margin-top:18px"> <button class="btn ghost" id="rc-back" type="button">Back</button> <button class="btn" id="rc-next" type="button">Next question</button> </div> </section> <!-- Last page --> <section id="rc-done" class="done" hidden> <div class="result" id="rc-result" aria-live="polite"> <p class="score" id="rc-score"></p> <h2 id="rc-verdict-title"></h2> <p class="verdict" id="rc-verdict"></p> </div> <div class="report"> <h3 id="rc-report-title">Your report</h3> <div id="rc-report"></div> <div class="row" style="margin-top:8px"> <button class="btn" id="rc-download" type="button">Download PDF</button> <button class="btn ghost" id="rc-copy" type="button">Copy as text</button> <button class="btn ghost" id="rc-edit" type="button">Change my answers</button> <button class="btn ghost" id="rc-switch" type="button"></button> <button class="btn ghost" id="rc-restart" type="button">Start over</button> </div> <p class="status" id="rc-status" role="status"></p> </div> <div class="demo-cta"> <h2>See how Actionable answers these</h2> <p>We built this check, so we ran it on ourselves too. Here's where we're strong, and where we're not there yet.</p> <button class="btn" type="button" id="rc-go-ours">See our answers →</button> </div> </section> <!-- Actionable's answers --> <section id="rc-ours" class="done" hidden> <div class="intro"> <p class="eyebrow">Our answers</p> <h2 style="font-size:clamp(30px,5vw,42px)">How Actionable answers the seven questions</h2> <p class="lede">Five strong, one mostly, one partly. Here's the detail.</p> </div> <div id="rc-ours-list" class="report"></div> <div class="cards"> <a class="cta primary" href="https://pages.actionable.co/evolution-of-impact" target="_blank" rel="noopener"> <h3>See how Impact Consultants work</h3> <p>The stages and benefits of enhancing your program impact, plus details on our upcoming cohort.</p> <span class="go">Take a look →</span> </a> <a class="cta" href="https://resources.actionable.co/meetings/ct-calendar/impact-enhancement-session" target="_blank" rel="noopener"> <h3>Book a call</h3> <p>30 minutes on how Actionable could support your programs and the proof your clients are asking for.</p> <span class="go">Book a time →</span> </a> </div> <div class="row"><button class="btn ghost" type="button" id="rc-ours-back">Back to my report</button></div> </section> <div class="foot"> <p>Built by Actionable. Market figure from RedThread Research, State of L&D 2026. Actionable figures: Annual Insights Report 2025 and Make Learning Stick (June 2026).</p> </div> </div> </div> <script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js"></script> <script> (function () { var G1 = "Is the data reliable?", G2 = "Can you use the data?"; var Q = [ { g: G1, prep: "What percent of participants actually use the tool?", review: "What percent of participants actually used the tool?", why: "A strong result from the few people who used it tells you nothing about everyone else.", real: "They show the adoption rate alongside every result, and most participants use it.", dodge: "A headline result with no adoption rate, or “our most engaged users saw...”", ask: "What percentage of participants actually use it, and how do you report that?", ph: "e.g. typical adoption for cohorts the size of mine", opts: ["Most participants use it, and they showed the adoption rate", "Some use it, or the rate was hard to pin down", "Only a small share use it, or they couldn't say"], ours: "yes", oursLabel: "Yes", oursText: "Adoption, the share of participants who commit to a specific behavior change, is its own report alongside Engagement and Impact. Facilitators who follow our best practices see 84% of participants commit, against a 63% baseline." }, { g: G1, prep: "Who besides the participant confirms the change?", review: "Who besides the participant confirmed the change?", why: "Self-report is useful. Self-report on its own is easy for a skeptical exec to wave away.", real: "Others observe the change on an ongoing basis, and the vendor can show how closely self-report tracks what they see.", dodge: "Self-report only, or snapshot observation only.", ask: "Who confirms the change besides the participant, and how often is that observed data collected?", ph: "e.g. whether this works in a virtual environment or just in person", opts: ["Others observe it on an ongoing basis, and they showed how self-report compares", "Others weigh in, but only as a snapshot", "Self-report only"], ours: "partly", oursLabel: "Partly", oursText: "Each participant picks an accountability partner who rates their progress. Across 60,000+ participant data sets, we see a 92% correlation between self-reported and observed change. Peer and manager reflections happen in real time but are less robust, and for a formal 360 we pair with external tools and bring the data together." }, { g: G1, prep: "Is the measurement process beneficial to the participant, or just more work?", review: "Was the measurement process beneficial to the participant, or just more work?", why: "If measurement is extra homework, people stop doing it, and your data stops with them.", real: "The data comes out of something that helps the participant achieve an outcome they care about.", dodge: "Surveys and check-ins that exist only to feed the report.", ask: "What does the participant get out of the part that generates this data?", ph: "e.g. what participant feedback can you share about their enjoyment of the experience?", opts: ["It helps participants achieve an outcome they care about", "A mix: some of it helps them, some of it is extra work", "Mostly extra work: surveys and check-ins that feed the report"], ours: "yes", oursLabel: "Yes", oursText: "The data comes from the participant's own daily practice on a behavior they chose: a When / Instead of / I will / Because commitment they check in against." }, { g: G2, prep: "Which way does their data point?", review: "Which way did their data point?", why: "Showing that people did things is the floor. Knowing what should happen next is what extends the work.", real: "Three directions: back (did they do it), across (did behavior change), and forward (what should come next).", dodge: "Back only. Activity counts presented as impact.", ask: "Show me how this report equips me to be more strategic in my client conversations.", ph: "e.g. how flexible the reporting is to my specific client needs", opts: ["Back, across and forward: it points to what should come next", "Back and across: it shows what changed, not what's next", "Back only: activity and completion counts"], ours: "mostly", oursLabel: "Mostly", oursText: "Back and across are built in. Forward relies on the consultant's read of the data, and we train the consultants we work with to tell that story. It's also the area we're most bullish on for product development." }, { g: G2, prep: "Who are the reports built for, and do they speak their language?", review: "Who were the reports built for, and did they speak their language?", why: "An exec sponsor doesn't read module completion rates.", real: "The participant, L&D and the exec sponsor each get a view, organized by business unit, seniority, strategic priority or competency.", dodge: "One admin dashboard of cohorts, modules and completions.", ask: "Can I see the version of this report my client's exec sponsor would get?", ph: "e.g. how flexible the reporting is to my specific client needs", opts: ["Participant, L&D and exec sponsor each get a view, in business terms", "More than one audience, but mostly in learning terms", "One admin dashboard of cohorts, modules and completions"], ours: "yes", oursLabel: "Yes", oursText: "Behaviors map to competencies and strategic priorities through the Impact Value Chain, and results can be cut by function or seniority." }, { g: G2, prep: "Can they compare a result against a norm?", review: "Could they compare a result against a norm?", why: "“40% of people changed” means nothing until you know what typical looks like.", real: "Benchmarks from a large, current data set, so your client can see whether your result is good.", dodge: "Raw numbers with nothing to compare them against.", ask: "What would you compare my result to, and how big is that data set?", ph: "e.g. how do other consultants use benchmarking data?", opts: ["Yes, against a large, current benchmark", "Some comparison, but thin or dated", "No benchmark, just raw numbers"], ours: "yes", oursLabel: "Yes", oursText: "Our Insights Reports benchmark 45,133 behavior-change commitments across 3,959 facilitated sessions and 901 organizations (June 2026)." }, { g: G2, prep: "Is there evidence it works for programs like yours?", review: "Did they show evidence it works for programs like yours?", why: "A tool proven on compliance training hasn't been proven on leadership development.", real: "Published evidence from comparable programs: facilitated leadership and professional development.", dodge: "Generic case studies, or case studies from completely different use cases.", ask: "Can you show me results from facilitated leadership programs like mine?", ph: "e.g. are these case studies from organizations you worked with directly, or from consultants like me who used your software with those clients?", opts: ["Yes, from facilitated leadership or professional development", "Some, but mostly generic or from other kinds of training", "No, or only from unrelated use cases"], ours: "yes", oursLabel: "Yes", oursText: "That data set is facilitated professional development sessions, the same kind of work you deliver. More than 95% of it comes from consultants like you running their own programs on Actionable, not from organizations we worked with directly." } ]; var SCORE = [2, 1, 0]; var mode = "review", cur = 0; var answers, notes, include; function reset() { answers = Q.map(function () { return null; }); notes = Q.map(function () { return ""; }); include = Q.map(function () { return true; }); } reset(); var $ = function (id) { return document.getElementById(id); }; function esc(s) { return String(s).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """); } function vendor() { return $("rc-vendor").value.trim(); } function qText(i) { return mode === "prep" ? Q[i].prep : Q[i].review; } var segs = $("rc-segs"); Q.forEach(function (_, i) { var b = document.createElement("button"); b.type = "button"; b.setAttribute("aria-label", "Go to question " + (i + 1)); b.addEventListener("click", function () { if (mode === "prep" || i <= firstOpen()) { cur = i; renderQ(); } }); segs.appendChild(b); }); function firstOpen() { var i = answers.indexOf(null); return i === -1 ? Q.length - 1 : i; } function show(id) { ["rc-intro", "rc-flow", "rc-done", "rc-ours"].forEach(function (s) { $(s).hidden = s !== id; }); try { if (window.parent !== window) parent.postMessage({ aiScrollTop: true }, "*"); else { var top = $("rc").getBoundingClientRect().top + window.scrollY - 20; if (window.scrollY > top) window.scrollTo({ top: top, behavior: "smooth" }); } } catch (e) {} } function paintSegs() { Array.prototype.forEach.call(segs.children, function (b, i) { var state = mode === "prep" ? (i < cur || (i === cur && false) ? (include[i] ? "2" : "") : "") : (answers[i] === null ? "" : String(SCORE[answers[i]])); if (state) b.setAttribute("data-a", state); else b.removeAttribute("data-a"); b.classList.toggle("current", i === cur); }); } function renderQ() { var item = Q[cur]; $("rc-count").textContent = "Question " + (cur + 1) + " of " + Q.length; $("rc-group").textContent = item.g; $("rc-mode").textContent = (mode === "prep" ? "Preparing" : "Reviewing") + (vendor() ? ": " + vendor() : ""); paintSegs(); var body = '<h2>' + esc(qText(cur)) + '</h2><p class="why">' + esc(item.why) + '</p>' + '<div class="sound"><div class="real"><strong>A real answer sounds like</strong>' + esc(item.real) + '</div>' + '<div class="dodge"><strong>A dodge sounds like</strong>' + esc(item.dodge) + '</div></div>'; if (mode === "prep") { body += '<div class="ask"><strong>Ask this in the demo</strong><p>“' + esc(item.ask) + '”</p></div>' + '<label class="include"><input type="checkbox" id="rc-inc"' + (include[cur] ? " checked" : "") + '> Add this question to my prep sheet</label>' + '<div><label for="rc-note" style="font-weight:600;display:block;margin-bottom:8px">Anything specific to find out? <span class="hint" style="font-weight:300">(optional)</span></label>' + '<textarea class="notes" id="rc-note" placeholder="' + esc(item.ph) + '"></textarea></div>'; } else { body += '<div><p style="font-weight:600;margin-bottom:10px">What did ' + esc(vendor() || "they") + ' show you?</p>' + '<div class="opts" role="group" aria-label="What they showed you">' + item.opts.map(function (o, k) { return '<button type="button" data-k="' + k + '" aria-pressed="' + (answers[cur] === k) + '">' + esc(o) + '</button>'; }).join("") + '</div></div>' + '<div><label for="rc-note" style="font-weight:600;display:block;margin-bottom:8px">What did they say? <span class="hint" style="font-weight:300">(optional, goes in your report)</span></label>' + '<textarea class="notes" id="rc-note" placeholder="Their answer, in their words"></textarea></div>'; } $("rc-q").innerHTML = body; $("rc-note").value = notes[cur]; $("rc-note").addEventListener("input", function (e) { notes[cur] = e.target.value; }); if (mode === "prep") { $("rc-inc").addEventListener("change", function (e) { include[cur] = e.target.checked; }); } else { $("rc-q").querySelectorAll(".opts button").forEach(function (b) { b.addEventListener("click", function () { answers[cur] = Number(b.dataset.k); $("rc-q").querySelectorAll(".opts button").forEach(function (x) { x.setAttribute("aria-pressed", String(x === b)); }); paintSegs(); $("rc-next").disabled = false; }); }); } $("rc-back").textContent = cur === 0 ? "Back to start" : "Back"; $("rc-next").textContent = cur === Q.length - 1 ? (mode === "prep" ? "See my prep sheet" : "See my report") : "Next question"; $("rc-next").disabled = mode === "review" && answers[cur] === null; } function verdictFor(score) { if (score >= 12) return ["Real behavior-change data.", "They can back up what they show you. Push on anything that came up short before you sign."]; if (score >= 7) return ["Some real signal.", "There's something here, but the gaps below are exactly where your client will push. Ask about them before you commit."]; return ["A prettier chart.", "What you'd get is activity data with good design. Your client will still read it as your results."]; } function total() { return answers.reduce(function (s, a) { return s + SCORE[a]; }, 0); } function picked() { return Q.map(function (_, i) { return i; }).filter(function (i) { return include[i]; }); } function gridHTML(rows) { return '<div class="grid-wrap"><table class="grid"><thead><tr><th scope="col">Question</th><th scope="col" class="c0">Strong</th><th scope="col" class="c1">Partial</th><th scope="col" class="c2">Gap</th></tr></thead><tbody>' + rows.map(function (r) { return '<tr><td><div class="gq">' + r.q + '</div>' + (r.sub ? '<div class="gs">' + r.sub + '</div>' : '') + '</td>' + [0, 1, 2].map(function (c) { return '<td class="mark c' + c + '"' + (r.col === c ? ' aria-label="' + ["Strong", "Partial", "Gap"][c] + '"' : '') + '>' + (r.col === c ? '\u2713' : '') + '</td>'; }).join("") + '</tr>'; }).join("") + '</tbody></table></div>'; } function renderDone() { ping(mode === "prep" ? "PrepCompleted" : "ReviewCompleted"); var name = vendor(); $("rc-status").textContent = ""; if (mode === "prep") { var list = picked(); $("rc-score").textContent = list.length + " of 7 questions on your sheet"; $("rc-verdict-title").textContent = "Your prep sheet" + (name ? " for " + name : "") + " is ready."; $("rc-verdict").textContent = "Take it into the demo. Afterwards, come back and review what they showed you."; $("rc-report-title").textContent = "Prep sheet"; $("rc-report").innerHTML = list.length ? list.map(function (i) { return '<div class="rep-item"><span class="n">' + (i + 1) + '.</span><span class="t">“' + esc(Q[i].ask) + '”</span><span></span>' + '<span class="sub">Listen for: ' + esc(Q[i].real) + (notes[i] ? '<br>Also find out: ' + esc(notes[i]) : '') + '</span></div>'; }).join("") : '<p class="hint">No questions selected. Go back and tick the ones you want to ask.</p>'; $("rc-switch").textContent = "I've had the demo: review it"; } else { var score = total(), v = verdictFor(score); $("rc-score").textContent = score + " out of 14"; $("rc-verdict-title").textContent = (name || "This vendor") + ": " + v[0].charAt(0).toLowerCase() + v[0].slice(1); $("rc-verdict").textContent = v[1]; $("rc-report-title").textContent = "Your report"; $("rc-report").innerHTML = gridHTML(Q.map(function (item, i) { return { q: (i + 1) + ". " + esc(item.review), col: answers[i], sub: esc(item.opts[answers[i]]) + (notes[i] ? '<br>They said: ' + esc(notes[i]) : '') + (answers[i] > 0 ? '<br>Follow up: \u201c' + esc(item.ask) + '\u201d' : '') }; })); $("rc-switch").textContent = "Prep for another demo"; } $("rc-result").hidden = false; show("rc-done"); } function reportText() { var d = new Date().toLocaleDateString(), L = []; if (mode === "prep") { L.push("DEMO PREP SHEET", "Vendor: " + (vendor() || "Not named"), "Date: " + d, ""); picked().forEach(function (i, n) { L.push((n + 1) + ". \"" + Q[i].ask + "\"", " Listen for: " + Q[i].real, " Watch out for: " + Q[i].dodge); if (notes[i]) L.push(" Also find out: " + notes[i]); L.push(""); }); } else { var s = total(), v = verdictFor(s); L.push("DEMO REVIEW", "Vendor: " + (vendor() || "Not named"), "Date: " + d, "Score: " + s + " out of 14 (" + v[0] + ")", "", v[1], ""); Q.forEach(function (item, i) { L.push((i + 1) + ". " + item.review, " " + ["Strong", "Partial", "Gap"][answers[i]] + ": " + item.opts[answers[i]]); if (notes[i]) L.push(" They said: " + notes[i]); if (answers[i] > 0) L.push(" Follow up: \"" + item.ask + "\""); L.push(""); }); } L.push("Measurement partner check, built by Actionable."); return L.join("\n"); } function reportHTML() { var d = new Date().toLocaleDateString(), head, rows; if (mode === "prep") { head = '<p style="color:#963CBD;font-weight:700;letter-spacing:.06em;text-transform:uppercase">Demo prep sheet</p>'; rows = picked().map(function (i, n) { return '<tr style="border-bottom:1px solid #DCDBEA"><td style="padding:12px 8px;vertical-align:top;font-weight:600">' + (n + 1) + '</td><td style="padding:12px 8px">' + '<div style="font-weight:600">“' + esc(Q[i].ask) + '”</div><div style="margin-top:4px">Listen for: ' + esc(Q[i].real) + '</div>' + '<div style="margin-top:4px;color:#4A4870">Watch out for: ' + esc(Q[i].dodge) + '</div>' + (notes[i] ? '<div style="margin-top:4px">Also find out: ' + esc(notes[i]) + '</div>' : '') + '<div style="margin-top:8px;color:#4A4870">Their answer: ________________________________________</div></td></tr>'; }).join(""); } else { var s = total(), v = verdictFor(s); head = '<p style="color:#963CBD;font-weight:700;letter-spacing:.06em;text-transform:uppercase">Demo review</p>'; rows = '<tr><th style="text-align:left;padding:10px 8px;border-bottom:2px solid #17153A">Question</th>' + ["Strong", "Partial", "Gap"].map(function (h, c) { return '<th style="padding:10px 8px;border-bottom:2px solid #17153A;color:' + ["#10069F", "#B77900", "#C81E2C"][c] + '">' + h + '</th>'; }).join("") + '</tr>' + Q.map(function (item, i) { return '<tr style="border-bottom:1px solid #DCDBEA"><td style="padding:12px 8px">' + '<div style="font-weight:600">' + (i + 1) + '. ' + esc(item.review) + '</div><div style="margin-top:4px">' + esc(item.opts[answers[i]]) + '</div>' + (notes[i] ? '<div style="margin-top:4px">They said: ' + esc(notes[i]) + '</div>' : '') + (answers[i] > 0 ? '<div style="margin-top:4px;color:#4A4870">Follow up: \u201c' + esc(item.ask) + '\u201d</div>' : '') + '</td>' + [0, 1, 2].map(function (c) { return '<td style="padding:12px 8px;text-align:center;vertical-align:top;width:70px;font-size:22px;font-weight:700;color:' + ["#10069F", "#B77900", "#C81E2C"][c] + '">' + (answers[i] === c ? '\u2713' : '') + '</td>'; }).join("") + '</tr>'; }).join(""); head += '<div style="background:#17153A;color:#fff;border-radius:12px;padding:18px 20px;margin:20px 0 0"><div style="font-size:24px;font-weight:700">' + s + ' out of 14: ' + v[0] + '</div><div style="margin-top:6px">' + v[1] + '</div></div>'; } return '<!doctype html><html><head><meta charset="utf-8"><title>' + (mode === "prep" ? "Demo prep" : "Demo review") + (vendor() ? ": " + esc(vendor()) : "") + '</title></head>' + '<body style="font-family:Arial,sans-serif;font-size:16px;line-height:1.5;color:#17153A;max-width:760px;margin:40px auto;padding:0 20px">' + head.replace('</p>', '</p><h1 style="margin:4px 0 6px;font-size:30px">' + esc(vendor() || "Vendor not named") + '</h1><p style="color:#4A4870">' + d + '</p>') + '<table style="width:100%;border-collapse:collapse;border-top:2px solid #17153A;margin-top:20px">' + rows + '</table>' + '<p style="margin-top:28px;color:#4A4870">Measurement partner check, built by Actionable.</p></body></html>'; } $("rc-go-ours").addEventListener("click", function () { $("rc-ours-list").innerHTML = gridHTML(Q.map(function (item, i) { return { q: (i + 1) + ". " + esc(item.prep), col: item.ours === "yes" ? 0 : 1, sub: (item.ours === "mostly" ? "Mostly. " : item.ours === "partly" ? "Partly. " : "") + esc(item.oursText) }; })); show("rc-ours"); }); $("rc-ours-back").addEventListener("click", function () { show("rc-done"); }); function ping(name) { try { parent.postMessage({ aiEvent: name }, "*"); } catch (e) {} } function start(m) { mode = m; ping(m === "prep" ? "PrepStarted" : "ReviewStarted"); cur = 0; show("rc-flow"); renderQ(); } $("rc-go-prep").addEventListener("click", function () { start("prep"); }); $("rc-go-review").addEventListener("click", function () { if (mode !== "review") answers = Q.map(function () { return null; }); start("review"); }); $("rc-back").addEventListener("click", function () { if (cur === 0) show("rc-intro"); else { cur--; renderQ(); } }); $("rc-next").addEventListener("click", function () { if (mode === "review" && answers[cur] === null) return; if (cur < Q.length - 1) { cur++; renderQ(); } else renderDone(); }); $("rc-edit").addEventListener("click", function () { cur = 0; show("rc-flow"); renderQ(); }); $("rc-switch").addEventListener("click", function () { if (mode === "prep") { answers = Q.map(function () { return null; }); notes = Q.map(function () { return ""; }); start("review"); } else { reset(); $("rc-vendor").value = ""; start("prep"); } }); $("rc-restart").addEventListener("click", function () { reset(); $("rc-vendor").value = ""; show("rc-intro"); $("rc-vendor").focus(); }); function fileBase() { return (mode === "prep" ? "demo-prep" : "demo-review") + (vendor() ? "-" + vendor().toLowerCase().replace(/[^a-z0-9]+/g, "-") : ""); } function htmlFallback() { var blob = new Blob([reportHTML()], { type: "text/html" }); var a = document.createElement("a"); a.href = URL.createObjectURL(blob); a.download = fileBase() + ".html"; document.body.appendChild(a); a.click(); a.remove(); $("rc-status").textContent = "Downloaded as a web page. Open it in your browser to print or save as PDF."; } $("rc-download").addEventListener("click", function () { ping(mode === "prep" ? "PrepSheetDownload" : "ReviewReportDownload"); try { if (typeof html2pdf !== "function") { htmlFallback(); return; } var doc = new DOMParser().parseFromString(reportHTML(), "text/html"); var el = document.createElement("div"); el.setAttribute("style", "font-family:Arial,sans-serif;font-size:16px;line-height:1.5;color:#17153A;width:720px;padding:8px;background:#fff"); el.innerHTML = doc.body.innerHTML; $("rc-status").textContent = "Building your PDF..."; html2pdf().set({ margin: [12, 12, 14, 12], filename: fileBase() + ".pdf", image: { type: "jpeg", quality: 0.95 }, html2canvas: { scale: 2, backgroundColor: "#ffffff" }, jsPDF: { unit: "mm", format: "letter", orientation: "portrait" }, pagebreak: { mode: ["css", "legacy"], avoid: ["tr", "div.keep"] } }).from(el).save().then(function () { $("rc-status").textContent = "PDF downloaded."; }, function () { htmlFallback(); }); } catch (e) { try { htmlFallback(); } catch (e2) { $("rc-status").textContent = "Download didn't work here. Use Copy as text instead."; } } }); $("rc-copy").addEventListener("click", function () { ping("ReportCopied"); var t = reportText(); if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(t).then(function () { $("rc-status").textContent = "Copied. Paste it into an email or your notes."; }, function () { $("rc-status").textContent = "Copy was blocked here. Use Download instead."; }); } else { $("rc-status").textContent = "Copy isn't available here. Use Download instead."; } }); })(); </script> <script> function aiPostHeight(){try{parent.postMessage({aiHeight:Math.ceil(document.body.getBoundingClientRect().height)},"*");}catch(e){}} window.addEventListener("load",aiPostHeight); if(window.ResizeObserver){new ResizeObserver(aiPostHeight).observe(document.body);} setTimeout(aiPostHeight,1200); document.addEventListener("click",function(e){var a=e.target.closest&&e.target.closest("a[href]");if(a){try{parent.postMessage({aiClick:a.href},"*");}catch(_){}}}); </script> </body></html>