Submitting your assessment...
HEAD OF FINANCE & ACCOUNTS
Finance Leadership Assessment
45 real-world scenarios across six dimensions of professional judgment
45
Scenarios
70
Total Time
90s
Per Scenario
Confidentiality
Loyalty
Stability Under Pressure
Professional Ethics
Moral Judgment
Leadership

A few things before you start

  • → Each scenario is drawn from real finance leadership situations. four options, pick one
  • → 90 seconds per question. go with your professional instinct, don't overthink it
  • → You can go back to any question at any point. as long as time allows
  • → The test wraps up automatically once 70 minutes are up
  • → No trick questions. just choose what you'd actually do in that situation
Press 14 to select an option  ·  for next  ·  to go back

About You

Take a minute to fill this in. it helps us put your results in context.

PROGRESS 1 / 45
Question 1 Confidentiality
SEC
90
All done. thank you.
Your responses have been submitted to the Boardroom CXO team. We'll review your assessment and come back to you within two working days.

What happens next

Your results have been sent to the Boardroom CXO team. covering six dimensions of finance leadership judgment. Someone will reach out directly with your feedback and next steps. In the meantime, feel free to drop us a note if you have questions.

Got a question? Reach us at hire@boardroomcxo.com
s.classList.remove('active')); document.getElementById(id).classList.add('active'); } function showIntake() { showScreen('screen-intake'); } function showComplete(){ showScreen('screen-complete'); } // ── Intake helpers ──────────────────────────────────────────────────────────── function toggleTeamSize() { const v = document.getElementById('f-team').value; document.getElementById('f-teamsize-wrap').style.display = v==='yes' ? '' : 'none'; } function collectIntake() { return { name: document.getElementById('f-name').value.trim(), email: document.getElementById('f-email').value.trim(), mobile: document.getElementById('f-mobile').value.trim(), desig: document.getElementById('f-desig').value.trim(), exp: document.getElementById('f-exp').value, fexp: document.getElementById('f-fexp').value, qual: document.getElementById('f-qual').value, ctc: document.getElementById('f-ctc').value.trim() || 'Not disclosed', np: document.getElementById('f-np').value, team: document.getElementById('f-team').value, teamsize: document.getElementById('f-teamsize').value || 'N/A', reason: document.getElementById('f-reason').value.trim(), ideal: document.getElementById('f-ideal').value.trim(), }; } function validateIntake(d) { const req = ['name','email','mobile','desig','exp','fexp','qual','np','team','reason']; for (const k of req) { if (!d[k]) { alert('Please fill all required fields before proceeding.'); return false; } } if (!d.email.includes('@')) { alert('Please enter a valid email address.'); return false; } return true; } // ── Test start ──────────────────────────────────────────────────────────────── function startTest() { const d = collectIntake(); if (!validateIntake(d)) return; intakeData = d; testStartTime = new Date(); showScreen('screen-test'); buildDots(); renderQ(0); startGlobalTimer(); document.getElementById('globalTimer').style.display = 'flex'; } // ── Timer: global ───────────────────────────────────────────────────────────── function startGlobalTimer() { globalTimer = setInterval(() => { globalSec--; const m = Math.floor(globalSec/60); const s = globalSec % 60; const el = document.getElementById('globalTime'); el.textContent = `${m}:${s.toString().padStart(2,'0')}`; const wrap = document.getElementById('globalTimer'); if (globalSec <= 300) wrap.classList.add('warn'); else wrap.classList.remove('warn'); if (globalSec <= 0) { clearInterval(globalTimer); autoSubmit(); } }, 1000); } // ── Timer: per-question ─────────────────────────────────────────────────────── function startQTimer(seconds) { clearInterval(qTimer); qSec = seconds; updateQTimer(); qTimer = setInterval(() => { qSec--; updateQTimer(); if (qSec <= 0) { clearInterval(qTimer); onQTimerEnd(); } }, 1000); } function updateQTimer() { const el = document.getElementById('qTimerNum'); const circ = document.getElementById('timerCircle'); const max = QUESTIONS[currentQ].timer; const pct = qSec / max; el.textContent = qSec; el.className = 'q-timer-num' + (qSec <= 15 ? ' warn' : ''); circ.style.strokeDashoffset = CIRC * (1 - pct); circ.style.stroke = qSec <= 15 ? '#FCA5A5' : '#C9A84C'; } function onQTimerEnd() { if (currentQ < 44) nextQ(true); else autoSubmit(); } // ── Navigation ──────────────────────────────────────────────────────────────── function renderQ(idx) { currentQ = idx; const q = QUESTIONS[idx]; window.scrollTo({top: 0, behavior: 'smooth'}); document.getElementById('qNum').textContent = `Question ${idx+1}`; document.getElementById('qDim').textContent = q.dim; document.getElementById('qText').textContent = q.text; document.getElementById('progNum').textContent = `${idx+1} / 45`; document.getElementById('progFill').style.width = `${((idx+1)/45)*100}%`; // Options const opts = document.getElementById('optionsList'); opts.innerHTML = ''; const letters = ['A','B','C','D']; q.opts.forEach((opt, i) => { const btn = document.createElement('button'); btn.className = 'option-btn' + (answers[idx]===i ? ' selected' : ''); btn.innerHTML = `
${letters[i]}
${opt}
`; btn.onclick = () => selectOpt(i); opts.appendChild(btn); }); // Nav buttons document.getElementById('btnPrev').style.visibility = idx===0 ? 'hidden' : 'visible'; const btnSkipEl = document.querySelector('.btn-skip'); if (btnSkipEl) btnSkipEl.style.display = idx===44 ? 'none' : ''; const btnNext = document.getElementById('btnNext'); if (idx === 44) { btnNext.textContent = 'Submit Assessment'; btnNext.className = 'btn-nav btn-submit'; btnNext.onclick = () => submitTest(); } else { btnNext.textContent = 'Next →'; btnNext.className = 'btn-nav btn-next'; btnNext.onclick = () => nextQ(); } updateDots(); startQTimer(q.timer); } function selectOpt(i) { answers[currentQ] = i; document.querySelectorAll('.option-btn').forEach((b,j) => { b.classList.toggle('selected', j===i); }); updateDots(); } function nextQ(auto=false) { if (currentQ < 44) renderQ(currentQ+1); } function prevQ() { if (currentQ > 0) renderQ(currentQ-1); } function skipQ() { if (currentQ < 44) renderQ(currentQ+1); } // ── Progress dots ───────────────────────────────────────────────────────────── function buildDots() { const wrap = document.getElementById('qDots'); wrap.innerHTML = ''; for (let i=0;i<45;i++) { const d = document.createElement('div'); d.className = 'q-dot'; d.textContent = i+1; d.onclick = () => renderQ(i); d.title = `Question ${i+1}. ${QUESTIONS[i].dim}`; d.id = `dot-${i}`; wrap.appendChild(d); } } function updateDots() { let answeredCount = 0; for (let i=0;i<45;i++) { const d = document.getElementById(`dot-${i}`); d.className = 'q-dot'; if (i === currentQ) d.classList.add('current'); else if (answers[i] !== null) { d.classList.add('answered'); answeredCount++; } } const ac = document.getElementById('answeredCount'); if (ac) ac.textContent = answeredCount > 0 ? `${answeredCount} answered` : ''; } // ── Score calculation ───────────────────────────────────────────────────────── function calcScores() { const dimScores = {}; for (const [dim, cfg] of Object.entries(DIMS_CONFIG)) { let raw = 0; cfg.qs.forEach(qi => { if (answers[qi] !== null) raw += QUESTIONS[qi].scores[answers[qi]]; }); const score10 = Math.round((raw / cfg.max) * 10 * 10) / 10; dimScores[dim] = { raw, max: cfg.max, score10 }; } const totalRaw = Object.values(dimScores).reduce((s,d) => s+d.raw, 0); const overall = Math.round((totalRaw / 180) * 10 * 10) / 10; return { dimScores, overall, totalRaw }; } function getBand(s) { if (s>=8.5) return {label:'Excellent',color:'#059669'}; if (s>=7.0) return {label:'Good',color:'#2563EB'}; if (s>=5.5) return {label:'Average',color:'#D97706'}; if (s>=4.0) return {label:'Weak',color:'#EA580C'}; return {label:'Concern',color:'#DC2626'}; } function getOverallBand(s) { if (s>=8.5) return 'Exceptional'; if (s>=7.0) return 'Strong'; if (s>=5.5) return 'Moderate'; if (s>=4.0) return 'Below Expectation'; return 'Not Recommended'; } function checkRedFlags() { const triggered = []; const rfMap = { 5: { q:6, desc:'Brought proprietary models from previous employer' }, 13: { q:14, desc:'Framed assessment findings to protect own role' }, 21: { q:22, desc:'Accepted aggressive revenue entry without formal objection' }, 23: { q:24, desc:'Chose quiet restatement with minimal external disclosure' }, 25: { q:26, desc:'Let CFO decide level of disclosure on material findings' }, 26: { q:27, desc:'Declined facilitation payment verbally but did not report' }, 28: { q:29, desc:'Consulted personal advisor instead of compliance team' }, }; for (const [qi, ans] of Object.entries(RED_FLAGS)) { if (answers[parseInt(qi)] === ans) { triggered.push(rfMap[parseInt(qi)]); } } return triggered; } function checkConsistency() { const flags = []; // Pair 1: Q2(idx1) vs Q5(idx4). both should be formal/process-driven if (answers[1]===1 && answers[4]!==2) flags.push('Q2 vs Q5 (Confidentiality): Inconsistent response to data security breach scenarios'); // Pair 2: Q22(idx21) vs Q25(idx24) const q22score = answers[21]!==null ? QUESTIONS[21].scores[answers[21]] : 0; const q25score = answers[24]!==null ? QUESTIONS[24].scores[answers[24]] : 0; if (Math.abs(q22score - q25score) >= 3) flags.push('Q22 vs Q25 (Ethics): Significantly inconsistent responses to similar ethical compromise scenarios'); // Pair 3: Q32(idx31) vs Q34(idx33) const q32score = answers[31]!==null ? QUESTIONS[31].scores[answers[31]] : 0; const q34score = answers[33]!==null ? QUESTIONS[33].scores[answers[33]] : 0; if (Math.abs(q32score - q34score) >= 3) flags.push('Q32 vs Q34 (Morals): Inconsistent approach to formal process when investigating implicated colleagues'); return flags; } // ── Email report ────────────────────────────────────────────────────────────── function buildEmailHTML(scores, redFlags, conFlags) { const {dimScores, overall} = scores; const band = getOverallBand(overall); const duration = testStartTime ? Math.round((new Date()-testStartTime)/60000) : 'N/A'; const dimRows = Object.entries(dimScores).map(([dim,d]) => { const b = getBand(d.score10); return ` ${dim} ${d.score10}/10 ${b.label} ${d.raw}/${d.max} `; }).join(''); const rfHtml = redFlags.length===0 ? '

✓ No red flags triggered (0/7)

' : redFlags.map(f => `

⚠ Q${f.q}: ${f.desc}

`).join(''); const cfHtml = conFlags.length===0 ? '

✓ No consistency flags

' : conFlags.map(f => `

⚠ ${f}

`).join(''); const rec = redFlags.length>=2 ? '🔴 HIGH RISK. NOT RECOMMENDED (2+ red flags)' : overall >= 7.0 ? '🟢 PROCEED TO FINAL INTERVIEW' : overall >= 5.5 ? '🟡 FURTHER ASSESSMENT RECOMMENDED' : '🔴 NOT RECOMMENDED FOR THIS ROLE'; return `
BOARDROOM CXO
Psychometric Assessment Report
${intakeData.name}
${intakeData.desig} · ${intakeData.qual}
Role: Head of Finance & Accounts · Test Date: ${new Date().toDateString()}
Duration: ~${duration} min · Experience: ${intakeData.exp}
${overall}
OUT OF 10
${band}

DIMENSION SCORES

${dimRows}
Dimension Score Band Raw

RED FLAG CHECK

${rfHtml}

CONSISTENCY FLAGS

${cfHtml}
RECOMMENDATION
${rec}

CANDIDATE PROFILE

Email${intakeData.email}
Mobile${intakeData.mobile}
Total Experience${intakeData.exp}
Finance Experience${intakeData.fexp}
Notice Period${intakeData.np}
Team Managed${intakeData.team==='yes' ? intakeData.teamsize : 'No'}
Current CTC${intakeData.ctc}
Why this role${intakeData.reason}
Boardroom CXO · hire@boardroomcxo.com · This report is strictly confidential
`; } // ── Submit ───────────────────────────────────────────────────────────────────── async function submitTest() { const unanswered = answers.filter(a => a===null).length; if (unanswered > 0) { const go = confirm(`You still have ${unanswered} question${unanswered===1?'':'s'} without an answer. Submit anyway, or go back and complete them?`); if (!go) return; } clearInterval(globalTimer); clearInterval(qTimer); doSubmit(); } function autoSubmit() { clearInterval(qTimer); doSubmit(); } async function doSubmit() { document.getElementById('sendingOverlay').classList.add('active'); const scores = calcScores(); const redFlags = checkRedFlags(); const conFlags = checkConsistency(); const reportHtml = buildEmailHTML(scores, redFlags, conFlags); const payload = { candidate_name: intakeData.name, candidate_email: intakeData.email, overall_score: scores.overall, overall_band: getOverallBand(scores.overall), red_flags: redFlags.length, consistency: conFlags.length, report_html: reportHtml, }; try { await fetch(GAS_URL, { method: 'POST', mode: 'no-cors', body: JSON.stringify(payload), }); } catch(e) { console.error('Submission error:', e); // Don't block candidate. show completion regardless } document.getElementById('sendingOverlay').classList.remove('active'); showComplete(); } // ── Keyboard shortcuts ──────────────────────────────────────────────────────── document.addEventListener('keydown', (e) => { // Only active during test screen if (!document.getElementById('screen-test').classList.contains('active')) return; // 1-4 keys select options A-D if (['1','2','3','4'].includes(e.key)) { const idx = parseInt(e.key) - 1; const opts = document.querySelectorAll('.option-btn'); if (opts[idx]) selectOpt(idx); return; } // Arrow keys / Enter for navigation if (e.key === 'ArrowRight' || e.key === 'Enter') { if (currentQ === 44) submitTest(); else nextQ(); } if (e.key === 'ArrowLeft') prevQ(); });