Skip to content
private / NDA2026

Automated Client Onboarding

One command, an interview on WhatsApp, and a client account exists.

Role

Architecture, agent design, implementation

to provision an account

112s

provisioning steps

14

human gates

2

Python / FastAPIPostgreSQLSQLiteSlack APIWhatsApp (Go bridge)GoHighLevel APIPlaywrightClaude Sonnet 4.5Docker

Before

  • A web form most clients never filled in
  • An external workflow on someone else's infrastructure
  • Answers copied between spreadsheets by hand
  • ~20 setup steps on a checklist
  • No way to tell which steps had already run

After

  • A conversation on WhatsApp, where clients already are
  • Native code in our own deployed container
  • One database as the source of truth
  • 14 steps, all recorded
  • A ledger — so a retry re-runs only what failed

How it runs

runs itselfneeds a person
  1. 01human

    Slack command

    one line, by a named person

  2. 02repeats

    Interview on WhatsApp

    until a validator says nothing is missing

  3. 03human

    Review card

    approve, or cancel

  4. 04

    Provisioning

    14 steps · 112 seconds

  5. 05human

    Handoffs

    4 asks, to the people who own them

The model writes language; Python owns state — it decides when the interview is done and what the client is asked to confirm. Everything left of the approval is reversible: the first write anyone else can see happens after a person clicks.

The interview, as the client sees it

The opening. It says what it will ask, how long it takes, and that there is no rush — then starts. No form, no link, no login.
Mid-interview. Asked why it wants the number, it explains rather than repeating the question; told "will answer this later", it moves on and comes back.

One run, fourteen steps

3 critical — a failure stops the run10 best-effort — failure costs that step only1 to a person
  1. 01CRM account
  2. 02client record
  3. 03knowledge base
  4. 04shared drive
  5. 05chat channels
  6. 06wire channel IDs
  7. 07API token
  8. 08CRM fields
  9. 09calendars
  10. 10dialer list
  11. 11caller access
  12. 12workspace
  13. 13chat groups
  14. 14handoffs
Every step short-circuits if the ledger already has it as ok. On the first live run one step failed on a type error; the fix went in, approve was pressed again, and only that step re-ran.

Keeping strangers out

runs itselfneeds a person
  1. 01

    Any inbound message

    patients, vendors, staff, clients

  2. 02

    Resolve the sender

    WhatsApp now hides the phone number

  3. 03human

    Enrolled by a person?

    no session → recorded and ignored

  4. 04

    Interview

    only numbers someone put on the list

The agent's number is a real company line carrying hundreds of human conversations, and every inbound message hits the webhook. No live session for that number means no model call at all — the check sits before any spend.

Where it got hard

A vendor API gated without saying so
User endpoints 403, behind a validation error about a different field. Those paths go through browser automation.
A plural field that isn't
Opening hours are accepted one day at a time; the same day sent twice is silently deduped, halving a doctor's availability.
₹1.5 lakh is not ₹15
Stripping non-digits would have written a ₹150,000 budget as ₹15. Lakh, crore and Indian grouping are parsed explicitly.
Photos arrive unasked
Filing every image as the logo made one client's payment QR their brand mark. Routing now uses what was last asked for.
Schedules arrive as prose
"Mon to Fri 10 to 2" is re-derived in Python. Anything that won't parse is flagged, never guessed.
Timeouts and edge rules
Calendars needed 120s, an older API version, and a non-default user-agent to get past the vendor's edge.

Where it honestly stands

Proven, and not

112 seconds
Account, client record, knowledge base, drive, three channels, token and 18 CRM fields — measured on the first live run.
12 manual steps removed
Of the old checklist. Four handoffs and the final smoke test are still deliberately a person's job.
Sample size is one
Every timing and failure mode above comes from a single real client.
One path unproven
No client has yet dictated a schedule over WhatsApp and had a calendar come out. The chain exists; it hasn't been exercised.

The interesting part isn't that an agent can hold a conversation. It's that the conversation decides almost nothing — a validator says when it's done, a person says whether it runs, and a ledger says what a retry may touch.