Loom — silent demo, step by step

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.


Before you record

  1. Use real WhatsApp, not /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.
  2. Open three tabs: WhatsApp Web, the inbox where NOTIFICATION_EMAIL lands, and the Supabase table editor on leads.
  3. Log in once at https://unitedlease.innoworks.ai/login with APP_PASSWORD. You need that session for the reset call below.
  4. Have a photo ready on your phone.

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.


Scene 1 — Attachments (0:00 – 0:40)

Caption: Klant stuurt foto's

  1. Send one photo. Wait ~6s.

  2. 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!

  3. Caption: Vijf foto's achter elkaar

  4. Send four more photos as fast as you can. Wait ~8s.

  5. Point the cursor at the thread: still only the one reply. No second message.

Caption: Eén mail naar het team

  1. Cut to the inbox. Open "Klant stuurde een bijlage, graag bellen: …". One mail, not five.
  2. Hover over, in this order: the name, the phone number, and the line "De bijlage is niet automatisch uitgelezen".

Scene 2 — Split messages (0:40 – 1:05)

Caption: Klant typt in losse berichten

  1. Reset first (see above), or just continue the thread — both work.

  2. Send these four as separate messages, fast:

    hoi
    ik zoek
    een bus
    voor mijn zaak
    
  3. 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.


Scene 3 — Private lease (1:05 – 1:35)

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

  1. Send: 15.000 km, en ik heb geen negatieve BKR

  2. Wait ~10s. The agent asks which lease type suits you, with the Krediet and Private Lease explanation.

  3. Send: Private Lease

  4. 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

  1. Send: en dan?
  2. Wait ~10s. The same message comes back. The intake does not restart.

Caption: Lead staat op closed

  1. Cut to Supabase, refresh leads, point at status = closed for this row.

Scene 4 — Shorter intake (1:35 – 2:25)

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

  1. Send: ja, ik heb al een auto op het oog

  2. 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

  3. Send a car URL, e.g. https://www.autoscout24.nl/aanbod/voorbeeld

  4. Wait ~10s → "We zijn bijna klaar! Wat is je gewenste looptijd? Dit kan tot 72 maanden!"

  5. Send: 48 maanden

  6. Wait ~10s → "Hoeveel had je in gedachten kwijt te willen zijn aan de auto per maand?"

  7. Send: 700 euro

  8. Wait ~12s. Closing message plus the summary.

Caption: Samenvatting — geen inruilregel

  1. Scroll the summary slowly. There is no "Inruil" line and no licence plate.

Caption: Noemt de klant zelf een kenteken, dan slaan we het wél op

  1. Send: de auto heeft trouwens kenteken AB-123-C
  2. Cut to Supabase, refresh, point at license_plate = AB-123-C.

Scene 5 — Customer goes quiet (2:25 – 2:45)

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

  1. Open the mail "Inactieve klant: …".
  2. Hover, in order: "1e herinnering", the "Laatste vraag van de agent" block, and the "Nog ontbrekend" list.

Caption: Max 2 herinneringen, daarna stopt het

  1. End on the mail, or back to the WhatsApp thread.

What I verified, and what you still have to

Verified in the code, so the expected texts above are exact and the behaviour is what the code does:

Not verified, because I cannot send WhatsApp messages or reach production:

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.