No narration. Every scene is: show a caption, do the action, let the result land. Target 2:45. Times below are real, measured against the actual debounce settings.
Captions are what you put on screen (Loom text overlay, or a plain notes window you cut to). Keep them short — they replace your voice.
/demo.html. The simulator posts to the legacy
/webhook route, which has no debounce and cannot store the file. Scene 2
would not work there and scene 1 would be half-true.NOTIFICATION_EMAIL lands,
and the Supabase table editor on leads.https://unitedlease.innoworks.ai/login with APP_PASSWORD.
You need that session for the reset call below.Reset between scenes (browser devtools console, on the logged-in tab):
await fetch('/chat/reset/31612345678', { method: 'POST' })
Use your own number. This deletes the lead, the session and the message history,
so the next message starts a fresh intake. It needs the login session — from a
plain curl it returns 401.
Timing you cannot speed up: text replies wait TEXT_DEBOUNCE_MS (8s by
default), attachments wait MEDIA_DEBOUNCE_MS (4s), and the AI itself takes a
few seconds on top. Every "wait" below already accounts for that.
Caption: Klant stuurt foto's
Send one photo. Wait ~6s.
Expect exactly this reply, and nothing else:
Dank voor het sturen. Het is momenteel erg druk bij United Lease. Daarom belt een van onze professionals je zo snel mogelijk op. Houd je telefoon dus bij de hand!
Caption: Vijf foto's achter elkaar
Send four more photos as fast as you can. Wait ~8s.
Point the cursor at the thread: still only the one reply. No second message.
Caption: Eén mail naar het team
Caption: Klant typt in losse berichten
Reset first (see above), or just continue the thread — both work.
Send these four as separate messages, fast:
hoi
ik zoek
een bus
voor mijn zaak
Wait ~10s. One reply arrives, addressing all four.
Caption: Eén antwoord, niet vier
The 8 seconds of silence is the feature, but it is dead air on camera. Speed this stretch up 2× in Loom, or hold the caption over it.
Seed the lead so you skip six questions. Run this in the Supabase SQL editor, with your own number:
delete from message_history where session_id = '31612345678';
delete from leads where phone_number = '31612345678';
delete from sessions where phone_number = '31612345678';
insert into leads (phone_number, name, email, is_business, address, city,
yearly_kilometers, bkr_negative, status, current_phase)
values ('31612345678', 'Jan de Vries', 'jan@voorbeeld.nl', false,
'Dorpsstraat 1', 'Utrecht', 15000, false, 'in_progress', 3);
-- Zonder geschiedenis begint de agent opnieuw met het welkomstbericht: de lead-data
-- alleen is niet genoeg. Deze regels doen alsof het gesprek al liep.
insert into message_history (session_id, role, content, created_at) values
('31612345678','user','Jan de Vries, jan@voorbeeld.nl', now() - interval '4 minutes'),
('31612345678','assistant','Dankjewel! Wil je zakelijk of particulier leasen?', now() - interval '3 minutes'),
('31612345678','user','Particulier, Dorpsstraat 1 Utrecht', now() - interval '2 minutes'),
('31612345678','assistant','Hoeveel kilometers per jaar rijd je?', now() - interval '1 minutes');
Caption: Particulier vraagt private lease aan
Send: 15.000 km, en ik heb geen negatieve BKR
Wait ~10s. The agent asks which lease type suits you, with the Krediet and Private Lease explanation.
Send: Private Lease
Wait ~10s. Expect exactly this, and then nothing:
Dankjewel voor je private lease aanvraag. We hebben het momenteel erg druk bij United Lease. Gelukkig kun je dit heel snel en eenvoudig regelen via de website: https://unitedlease.nl/advies-aanvragen/. Kom je er niet uit? Bel ons dan op: 085 - 760 9020.
Caption: Nog een bericht? Zelfde antwoord
en dan?Caption: Lead staat op closed
leads, point at status = closed for this row.Seed again, now as a business lead that is one step away from the car question:
delete from message_history where session_id = '31612345678';
delete from leads where phone_number = '31612345678';
delete from sessions where phone_number = '31612345678';
insert into leads (phone_number, name, email, is_business, kvk_number,
company_name, yearly_kilometers, bkr_negative,
financing_type, status, current_phase)
values ('31612345678', 'Jan de Vries', 'jan@voorbeeld.nl', true, '12345678',
'De Vries Installatie BV', 25000, false, 'financial_lease',
'in_progress', 3);
insert into message_history (session_id, role, content, created_at) values
('31612345678','user','Jan de Vries, jan@voorbeeld.nl', now() - interval '5 minutes'),
('31612345678','assistant','Dankjewel! Wil je zakelijk of particulier leasen?', now() - interval '4 minutes'),
('31612345678','user','Zakelijk, KvK 12345678', now() - interval '3 minutes'),
('31612345678','assistant','Hoeveel kilometers per jaar rijd je?', now() - interval '2 minutes'),
('31612345678','user','25000, geen negatieve BKR, Financial Lease', now() - interval '1 minutes');
Caption: Zakelijke intake — auto uitvragen
Send: ja, ik heb al een auto op het oog
Wait ~10s. Expect only this:
Heb je een URL van de auto die je op het oog hebt?
Caption: Geen kenteken, geen kilometerstand, geen inruil
Send a car URL, e.g. https://www.autoscout24.nl/aanbod/voorbeeld
Wait ~10s → "We zijn bijna klaar! Wat is je gewenste looptijd? Dit kan tot 72 maanden!"
Send: 48 maanden
Wait ~10s → "Hoeveel had je in gedachten kwijt te willen zijn aan de auto per maand?"
Send: 700 euro
Wait ~12s. Closing message plus the summary.
Caption: Samenvatting — geen inruilregel
Caption: Noemt de klant zelf een kenteken, dan slaan we het wél op
de auto heeft trouwens kenteken AB-123-Clicense_plate = AB-123-C.The real trigger needs 24 hours of silence, so do not try to produce it live. Trigger one from the logged-in tab instead:
https://unitedlease.innoworks.ai/email-test/inactive
https://unitedlease.innoworks.ai/email-test/inactive?reminder=2
This route used to send a mail without the two new blocks — it still called the old three-argument version of the function, so it showed a mail that no longer matches production. Fixed in
src/routes/email-test.js(uncommitted, like the rest). Deploy that before you record, or scene 5 shows the old mail.
Caption: Klant reageert niet meer — team krijgt bericht
Caption: Max 2 herinneringen, daarna stopt het
Verified in the code, so the expected texts above are exact and the behaviour is what the code does:
PRIVATE_LEASE_REDIRECT and
ATTACHMENT_ACK in src/handlers/message.js).closed and the session to COMPLETED, and a
later message repeats the same text.Not verified, because I cannot send WhatsApp messages or reach production:
NOTIFICATION_EMAIL in production points where you expect.Five-minute dry run before you record. Do scenes 1 and 3 once, unrecorded. Those two prove the deploy is current: if the fixed attachment message and the private-lease redirect both come back word for word, everything else in this script follows from code paths I checked.