Back to the work
The Coffee System · 01 of 21

Small Flat White

An AI voice agent that calls Australian cafés and asks how much a flat white costs.

What it is

Small Flat White is a live pricing index for Australian flat whites. The data behind the index is collected by an AI voice agent named Oscar, who calls cafés across the country and politely asks one specific question.

The public site shows the price data. The system behind it is where the interesting bit lives.

Why I built it

I was curious. Scraping menus doesn't work because most Australian cafés don't publish prices online. Calling every café by hand would take weeks and I'd get bored by the fifth call. Hiring people to do it would cost more than the data was worth. And the question itself — "what does a flat white actually cost in this country?" — was the sort of question I kept expecting someone to have already answered, and nobody had.

So I built the thing that could answer it.

How it works

Oscar runs on an ElevenLabs conversational voice model, with Twilio handling outbound calls and Gemini 2.0 Flash steering the conversation in real time. When a café picks up, Oscar follows one of four scripts — Direct, Price Comparison, Keen Customer, Compliment — rotated for variety so the same barista answering two calls in a row doesn't hear the same script twice.

He only calls during off-peak hours. The scheduler explicitly skips 7–9:30am and 11am–1pm, and stays fifteen minutes clear of each café's open and close times. The whole idea of a polite robot calling during someone's morning rush was the one thing I needed to not do.

Oscar being polite is load-bearing. An AI voice agent that sounds like it's trying to sell something gets hung up on instantly.

Every call gets transcribed. The transcript goes to Claude, which extracts structured fields — the price, the size label, the volume in ounces, the small-vs-large difference, the roaster name, any alt-milk surcharge, a confidence score between 0 and 1, and a data-completeness score between 0 and 11 — and writes them to Postgres. Low-confidence extractions get flagged for human review. High-confidence extractions publish to the site automatically.

The data exports through a documented API to EspressoOfInterest, which uses the same roaster catalogue and the same price data for a different purpose.

What I learned

Voice is a surprisingly underused data-collection layer for small-business information. Scraping has a ceiling because nobody publishes their prices. Phone calls get past the ceiling because the information is in the barista's head, not on a webpage. Once you have an AI that can place the call and a model that can extract structure from the transcript, a whole category of previously-uncollectable data becomes collectable.

Oscar sounding like a curious customer — not a telemarketer — is what actually makes the system work. The conversion rate on calls reflects that.

Small details matter. Rotating scripts matters. The off-peak scheduling matters. The volume-in-ounces field matters more than the price field because most cafés vary cup size by a few ounces and the price-per-ounce reveals things the raw price doesn't.

Where it's at now

Live and collecting. The pricing index is being readied for a press launch. EspressoOfInterest is being built in parallel so the consumer-facing side is ready when Small Flat White starts drawing traffic.

Future work: expanding Oscar's conversational range beyond the single price question. If I can call to ask about a flat white, I can call to ask about almost anything.

Coming soon
A build walkthrough

A longer write-up on how Oscar was built — the voice prompt chain, the transcript extraction pipeline, the off-peak scheduler, and what didn't work on the first few attempts. Drop your email on the main page if you'd like to know when it's up.