Root (/) is the client board: read-only apart from Have Alice call you. No run or reset controls, no tester numbers in the source. This is what goes on the projector and what At Events keep afterwards.
/testing is this console: everything on the client board plus one-click tester calls (Steve, Giles, Conor), Lights out (calls every record still in Waiting, all at once) and Reset grid.
Access code: atevents-demo-2026. Enter once per device, Save. Both boards share it.
Reset and what survives it
Reset grid clears every call outcome: status back to Waiting, summaries, transcripts, recordings, sentiment and HubSpot chips all wiped. It keeps the prospect records themselves and all tester ratings and comments. It does not touch HubSpot: contacts and call activities written there stay written.
Reset un-parks everyone. Any cohort parking (see below) is undone by a reset, so the cohort SQL runs again after every reset, no exceptions.
Cohort control: test crew vs demo cohort
One database serves both boards. call_status decides who Lights out rings: anything in Waiting (pending) gets called, anything parked as done is skipped.
Test crew: ATE001 Steve, ATE002 Giles, ATE003 Conor. Use freely for bug shakeout.
Demo cohort: park Conor, keep Steve and Giles pending alongside ATE010 Tim Tracy, ATE011 Andrew Hewlett, ATE012 Rebekah Brindle. Lights out then fires five calls at once.
The demo-day block (Supabase SQL editor, Bland CMS project). Safe to re-run any time:
insert into ate_record (id, name, phone, segment) values
('ATE010','Tim Tracy', '+61414637000','Melbourne Cup buyer'),
('ATE011','Andrew Hewlett', '+61413444879','AFL Grand Final box'),
('ATE012','Rebekah Brindle','+61431112272','Origin Lunch host')
on conflict (id) do nothing;
update ate_record set name='Andrew Hewlett' where id='ATE011';
update ate_record set name='Rebekah Brindle' where id='ATE012';
update ate_config set value='+19373677546' where key='transfer_number';
update ate_record set call_status='pending' where id in ('ATE001','ATE002');
update ate_record set call_status='done' where id='ATE003';
Warm transfers
Transfers ring Steve's US number +19373677546. The number is hardcoded in the transfer_to_team node of both Bland pathways (transferNumber cannot be templated); ate_config mirrors it for the board. Changing it means editing both pathways in the Bland editor.
Single lane: one transfer can connect at a time. With five simultaneous calls a clash is possible; the second caller gets a failed transfer, the call still logs. Narrate it as gone to callback and move on.
Driver split on demo day: Giles drives the board, Steve takes transfers. Phone on, volume up, DND off.
HubSpot in the demo
Live transcript and listen: tap a pulsing (on-call) row to watch the conversation as live text on either board; on this console the modal also has a Listen live button (access code required) that streams the call audio to your speakers. The projector move: client board showing the live transcript while the caller speaks in the room.
The chip appears on a tower row a few seconds after the call ends (one poll cycle after the CRM write). Click opens the contact: recording, transcript, summary on a call activity.
Log into HubSpot in the demo browser before the meeting, or the reveal becomes a login screen.
Fallback: keep HubSpot open in a second tab filtered to today's contacts. If a chip ever fails to appear, the contact is usually still there; refresh the tab.
Resets do not remove HubSpot records, so test-call activities from the dry run will be visible on GO contacts. Harmless.
Run order
Night before:
Bland editor: transfer number updated in both pathways (outbound + inbound).
/testing: Reset grid.
Supabase: run the cohort block.
One test call to yourself. Verify: car lands, chip appears, chip opens the right contact, recording plays, transfer rings the US number.
Reset grid, run the cohort block again. Board is now armed for the demo.
In the room:
Client board (root) on the projector, theme flipped to light if the room needs it. This console on the driving laptop.
NOTIFY_EMAIL in the Apps Script switched to whoever is not driving, if desired.
At the moment: Lights out. Five phones ring. Watch the grid fill.
When the calls land: pick the best one, click its HubSpot chip. That is the close.
If anything was reset or re-tested in the room, remember the rule: cohort SQL after every reset, then Lights out.
If something misbehaves
Offline in the header: the Worker is unreachable. Check at-events-voice.steve-fce.workers.dev?action=health (expect atevents-cc-v1.1).
Call not sent, code rejected: re-enter the access code and Save. Worker secrets are per-deployment; if a redeploy dropped ADMIN_TOKEN, re-add it under Settings, Variables.
Car stuck pulsing: the call is still live or Bland has not sent the postcall webhook yet. Give it 30 seconds past hangup before worrying.
No chip on a landed call: HubSpot write hiccup or the reply was slow. The board is unaffected; use the HubSpot tab fallback.