Back to portfolio

Cruiser Aviation - WhatsApp Assistant & Scheduler

A production WhatsApp conversational assistant and scheduling automation for a flight school, where members check balances, buy hour packages, pay invoices, and submit weekly availability in Romanian or English - with the LLM explicitly kept out of every financial transaction.

Problem

Flight school members were already living in WhatsApp, but self-service required logging into a web app and scheduling relied on a human dispatcher managing a WhatsApp group. The gap meant routine tasks - checking hour balances, buying flight packages, paying invoices, submitting weekly availability - all created unnecessary friction or manual overhead. The deeper problem was trust: early LLM-assisted payment flows produced live incidents where the model fabricated payment URLs and narrated fake orders. Any assistant handling real money and real phone numbers needed a security model strong enough to survive a hostile or hallucinating model, not just a well-behaved one. On the scheduling side, collecting availability from students and instructors across multiple bases, parsing free-text Romanian replies, and notifying only the affected members when a day's schedule changed were all problems a simple chatbot or group message could not solve cleanly.

Solution

The assistant resolves identity exclusively from the verified sender phone number, so the model can never read or transact on behalf of anyone else. Seven tools are exposed to the model, only one of which takes any argument. Three independent layers keep the model out of money: all URLs the model emits are stripped in code except a pre-filled login link; a deterministic pending-selection mechanism in DynamoDB intercepts the member's numeric reply before Bedrock is ever called; and the payment link is injected by the handler into its own confirmation message, never by the model. The Lambda calls internal order and pay routes with a shared secret, and those routes re-validate role gates and invoice state server-side, returning typed 200s so the bot can surface business failures in plain language. The scheduling loop sends a Meta UTILITY template every Saturday, parses free-text availability replies with a forced-tool Bedrock call, clamps every parsed window to flyable hours via NOAA solar math, echo-backs a deterministic rendering for member confirmation, and only writes to Postgres on an explicit "da." A dispatcher week board shows aircraft, bookings, and availability; per-day publishing diffs a booking hash against each member's last-notified state and messages only changed entries. A 15-minute idempotent cron tick drives polls, nudges, reminders, and admin alerts, with every send claiming a dedupe key first. Template sends default to a hard log mode that runs the full pipeline but swaps the API call for a log line; a per-number allowlist enables supervised live testing; and a per-base toggle flips to production. An admin conversations console threads every audited conversation with template and kind badges and supports human replies from the browser, enforced to Meta's 24-hour service window.

Tech Stack

AWS LambdaAWS SNSAWS End User Messaging SocialAmazon DynamoDBAmazon AuroraRDS Data APIAmazon BedrockClaude Sonnet 4.6Claude Haiku 4.5Bedrock Converse APIMeta Cloud APIWhatsApp BusinessStripeNOAA solar mathTypeScript

Ask about Julian Walder

Grounded in his real work

Hi! I'm Julian Walder's assistant. Ask me anything about his work, projects, or background in AI.