Freshworks

DealRoom

Pick your role to join the session. Connect the dots between industry, persona, problem and business impact — then pitch it.

🎴
I'm a player
Get dealt your hand, build your pitch, fire live reactions during the session
🎯
I'm the facilitator
Create a session, watch players join live, control the timer and manage scores
Create a session
A session code will be generated. Share it with players in the Zoom chat so they can join.
Join a session
Enter your name and the session code your facilitator shared.
Your name
Session code
Deal Room
2:00
Your pitch
Reactions unlock when presentations start
Your hand
being dealt…
Strategic problem — pick one
not selected
Value drivers — pick one
not selected
Facilitator Dashboard
2:00
Session closed
All session data has been deleted from the database.
Players have been disconnected.
Players online (0)
Waiting for players to join…
Leaderboard
Live reaction feed
How to play
Your 5 cards
🏭
Industry — the sector your customer operates in
👤
Persona — who you're speaking to
Problem — the tactical pain they're living with
🏢
Business Issue — tap one of 4 cards: Money In / Money Out / People / Risk
Value Driver — scroll down and tap the outcome that best anchors your pitch
Working with your cards
Hover any Industry, Persona or Problem card to reveal the swap ↻ button — tap it to browse all alternatives
Once you tap a Business Issue or Value Driver, it gets a glowing border — tap again to deselect
📋
The pitch summary bar at the top of your hand updates live as you make selections — use it to confirm your 5 elements at a glance
Pitch formula
As a [Persona] in [Industry],
you're dealing with [Problem].
This isn't just a tactical issue — it's a [Business Issue] problem.
With our solution, you [Value Driver].
Reactions (audience)
👏
Nice one — solid pitch, good effort
🔥
On fire — compelling, well connected
💥
Smashed it — excellent delivery and insight
🏆
Best pitch — top of the session
Facilitator scoring
+1
Good — completed the pitch in time
+2
Great — all 5 elements clearly connected
+3
Excellent — compelling story with business impact
+4
Top pitch 🏆 — standout pitch of the session
// ══════════════════════════════════════════════════════ // PRESENTER SPOTLIGHT (facilitator focus view) // ══════════════════════════════════════════════════════ let spotlightPresenterId = null; function openSpotlight(presenterId, presenterName, progressText) { spotlightPresenterId = presenterId; document.getElementById('spotlightName').textContent = presenterName || 'Presenter'; document.getElementById('spotlightProgress').textContent = progressText || 'Now presenting'; document.getElementById('presSpotlight').classList.add('active'); syncSpotlightTimer(); renderSpotlightCards(presenterId); } function closeSpotlight() { document.getElementById('presSpotlight').classList.remove('active'); spotlightPresenterId = null; } function syncSpotlightTimer() { // Mirror the fac timer display into the spotlight const src = document.getElementById('fTimerDisplay'); const dst = document.getElementById('spotlightTimer'); if (!src || !dst) return; dst.textContent = src.textContent; dst.className = 'spotlight-timer' + (src.classList.contains('warn') ? ' warn' : ''); // Keep synced via MutationObserver if (window._spotlightTimerObs) window._spotlightTimerObs.disconnect(); window._spotlightTimerObs = new MutationObserver(() => { dst.textContent = src.textContent; dst.className = 'spotlight-timer' + (src.classList.contains('warn') ? ' warn' : ''); }); window._spotlightTimerObs.observe(src, {childList:true, subtree:true, attributes:true, attributeFilter:['class']}); } async function renderSpotlightCards(presenterId) { const container = document.getElementById('spotlightCards'); container.innerHTML = '
Loading cards…
'; // Read player's hand from Firebase const playerData = await fbGet(`sessions/${sessionCode}/players/${presenterId}`); if (!playerData || !playerData.hand) { container.innerHTML = '
No cards saved yet — player may not have dealt their hand while connected.
'; return; } const h = playerData.hand; const ind = h.industry !== null && h.industry !== undefined ? CARD_DATA.industries[h.industry] : null; const per = h.persona !== null && h.persona !== undefined ? CARD_DATA.personas[h.persona] : null; const pro = h.problem !== null && h.problem !== undefined ? CARD_DATA.problems[h.problem] : null; const biz = h.biz !== null && h.biz !== undefined ? CARD_DATA.business[h.biz] : null; const val = h.val !== null && h.val !== undefined ? CARD_DATA.values[h.val] : null; container.innerHTML = ''; const cards = [ ind ? {type:'industry', cat:'Industry', color:'#00C473', name:ind.name, sub:ind.quote||''} : null, per ? {type:'persona', cat:'Persona', color:'#1273EB', name:per.name, sub:per.quote||''} : null, pro ? {type:'problem', cat:'Problem', color:'#a78bfa', name:null, sub:pro.quote||''} : null, biz ? {type:'biz-sel', cat:'Business Issue', color:biz.color, name:biz.name, sub:biz.sub} : null, val ? {type:'value-sel',cat:'Value Driver', color:'#22D3EE', name:null, sub:val.quotes[0]||''} : null, ].filter(Boolean); if (!cards.length) { container.innerHTML = '
No card data found for this player.
'; return; } cards.forEach(card => { const el = document.createElement('div'); el.className = `spotlight-card type-${card.type}`; el.innerHTML = `
${card.cat}
${card.name ? `
${card.name}
` : ''}
"${card.sub}"
`; container.appendChild(el); }); } async function spotlightScore(pts) { if (!spotlightPresenterId || !sessionCode) return; const cur = await fbGet(`sessions/${sessionCode}/players/${spotlightPresenterId}/score`) || 0; await fbSet(`sessions/${sessionCode}/players/${spotlightPresenterId}/score`, Math.max(0, cur + pts)); // Flash all score buttons briefly document.querySelectorAll('.spotlight-score-btn').forEach(b => { const orig = b.textContent; if (b.textContent.startsWith('+' + pts)) { b.textContent = '✓ Saved'; b.style.borderColor = '#00C473'; b.style.color = '#00C473'; setTimeout(() => { b.textContent = orig; b.style.borderColor = ''; b.style.color = ''; }, 1200); } }); } async function spotlightNext() { // nextPresenter will either open the next spotlight (via facPhaseListener) or end presentations await nextPresenter(); }
🎤
Presenter
Presenting
2:00
Waiting for hand data…
Score: