The Problem
Visa applications run on email threads and portals nobody loves: applicants don't know what to send next, documents arrive in every format, agents re-type data into trackers, and status inquiries interrupt everyone. The process needs a front desk that never sleeps.
The Solution
A conversational state machine over WhatsApp. Every message hits a Twilio webhook that normalises the payload; a Google Sheets lookup decides between onboarding a new applicant or routing a returning one by their current application state. Documents sent as attachments download automatically, upload to LlamaParse for OCR-grade parsing, poll until complete, then pass through a Groq-powered LLM chain for analysis and classification before logging to Sheets. Sheet rows act as the application's state machine, and an update trigger turns every state change into an outbound WhatsApp notification — the applicant never has to ask 'any update?'.
How the workflow runs
01 · Receive
Every WhatsApp message lands on the Twilio webhook and is normalised into phone, name, text, and media URL.
02 · Identify
A Sheets lookup by phone number splits new applicants (welcome + record) from returning ones.
03 · Route
The applicant's current state drives a Switch node — each stage has its own conversation branch.
04 · Parse
Incoming documents download from Twilio's media URL and upload to LlamaParse; polling waits for SUCCESS before fetching markdown.
05 · Analyse
A Groq LLM chain reviews the parsed document and its verdict logs back to the applicant's row.
06 · Notify
Any row update fires the outbound trigger — status changes reach the applicant as WhatsApp messages.
AI layer
- OCR-grade document parsing
- LlamaParse handles photos, scans, and PDFs of arbitrary layout before any reasoning happens.
- Groq document analysis
- A low-latency LLM chain classifies and evaluates parsed documents so the workflow can act, not just store.
- State-aware routing
- Conversation behaviour adapts per applicant based on machine-readable state, not human memory.
Automation layer
- Chat-as-interface
- WhatsApp is the entire UX — intake, submission, and notifications with zero portal logins.
- Sheets as database
- A familiar spreadsheet doubles as the applicant store and state machine, auditable by anyone.
- Event-driven notifications
- Status pings are triggered by data changes, not cron jobs or manual sends.
- One-command infra
- docker-compose ships a persistent local n8n with workflows volume-mounted.
Technical challenges
Applicants submit documents as WhatsApp media, not clean uploads — URLs are temporary and formats unpredictable.
Automatic media download from Twilio's URL straight into LlamaParse, which tolerates photos and scans alike.
Multi-step conversations need memory, but building a full backend defeats the point of a lightweight bot.
Google Sheets rows double as both database and state machine — lookup, routing, and audit trail in one place.
Parsing APIs are asynchronous; naive flows read results before they exist.
An explicit wait-and-poll loop gates on parse status SUCCESS before fetching markdown.
Outcome
- An applicant can complete an entire visa inquiry from their existing WhatsApp app — zero new software.
- Documents are parsed, analysed, and logged without anyone opening a file.
- Status updates push themselves; 'any news?' conversations disappear.
Lessons learned
- “Meet users where they already are — WhatsApp adoption beats any web portal for consumer workflows.”
- “A spreadsheet can be a legitimate production datastore when state is simple and visibility matters.”
- “Compose specialised services (Twilio transport, LlamaParse vision, Groq reasoning) instead of asking one tool to do everything.”