I built a dispatch bot in a parking lot at 3am

June 28, 2026·4 min read

I do airport pickups and dropoffs in Hong Kong. I sleep in my Tesla. I code on a MacBook Air between jobs.

This is about the first tool I built for myself — a Telegram bot that turns messy WeChat order messages into a clean dashboard with revenue tracking.

The problem

My main orders come from a WeChat dispatch group. A dispatcher drops a block of text — passenger name, flight number, pickup, dropoff, time — and I grab it. On a busy day during summer peak season, that's 5-7 orders.

But that's not all. Between airport runs, if there's an Uber or DiDi job on the way, I'll take it. Why deadhead back empty when someone needs a ride in the same direction?

So at the end of the day, my income is scattered across three places. WeChat messages I have to scroll through to find. Uber receipts. DiDi records. To figure out how much I made, I do mental math. To check the details of an order from two days ago, I scroll through hundreds of messages in a group chat.

I tried Apple Notes. Updating old entries was too much friction. I tried just remembering. That stopped working past 4 orders a day.

Why now

Two things came together.

First, it's summer. Peak season for airport runs. Orders are coming in daily, and the pain of not having a system got worse fast.

Second, I decided to start building in public. I want to show that I actually write code, not just talk about it. I needed a real project to put on GitHub — and the most real thing I could build was something I'd use every single day.

I'd been putting it off. Then one night, the timing lined up.

My last dropoff was at the Ocean Park Marriott. My first pickup the next morning was at Cyberport — 10 minutes away. So I parked nearby, plugged in the Tesla, got a McDonald's, and opened my laptop.

By 3am I had the parser, database, Telegram bot, web dashboard, and deployment config all committed. By the time my morning pickup came, I was using it.

Why Telegram, not a web app

I build everything solo, with AI. Claude Code writes most of the code, but it can't see what a UI looks like. Every time I build a web interface, I end up debugging layout and spacing by hand — the AI writes it, I open the browser, it's wrong, I describe what's wrong, it tries again. Even the dashboard took a couple of rounds to get right.

Telegram gives me buttons, confirmations, inline replies, and message threading — all for free. The UX just works. I paste an order message, the bot parses it and shows a summary card, I tap Confirm, type the price. Done.

I needed this running in hours, not weeks. Telegram made that possible.

Two parsers, not one

The dispatch group sends orders from different platforms. Most come from Ctrip — structured key-value pairs, one field per line, consistent format. Easy to parse.

But some come from Tongcheng. Completely different format. Fields in different order, some without colons, passenger info on separate lines.

I could've tried to build one smart parser that detects the format and handles both. But that's the kind of cleverness that breaks at 2am when a new format variation shows up and you're trying to confirm an order before the passenger lands.

So I wrote two parsers. The bot tries the standard one first. If it doesn't get an order ID and pickup location, it tries the Tongcheng one. Simple, obvious, works.

The $32 parking fee

Every airport pickup in Hong Kong means parking. The airport gives you one free entry per day, but after that it's $32 per hour. Since most of my orders require meeting the passenger inside, parking is unavoidable.

So for every pickup order, the bot automatically records a $32 parking cost. I don't have to type it. It's a known constant.

Here's the thing though — that hour in the parking lot waiting for the passenger to clear customs? That's when I code. The parking fee is a cost on the books, but the time is productive. It's my office.

Banner fee

Some orders include a sign-holding service — I walk into the arrivals hall with the passenger's name on a sign. The platform charges extra for this, and it settles as a separate transaction.

For me, the cost is almost identical to a regular pickup. I'm already parked, already inside the terminal. But the revenue is higher. So in the database, banner fees are tracked separately. When I reconcile at the end of the day, I can see exactly how much extra that service brought in.

Small detail, but it's the kind of thing that matters when you're tracking every dollar.

What it looks like now

My daily workflow:

  1. Order drops in the WeChat group. I copy the message and paste it into Telegram.
  2. Bot shows a parsed summary. I tap Confirm.
  3. I type the price. If there's a banner fee, it auto-detects and adds it.
  4. Between airport runs, if I do a DiDi or Uber, I use the quick entry commands — just time, fare, and tunnel fee.
  5. At the end of the day, I open the dashboard on my phone. Total revenue, costs, net income, all in one place.

That's it. No login, no forms, no auth. Just a bot and a dashboard.

What's next

I'll keep adding to it as new needs come up. The SSE live-refresh isn't working yet — I just tap the refresh button. Good enough for now.

The code is on GitHub: github.com/ateliertoby/ride-dispatch

This is the first thing I'm shipping publicly. There will be more.

I do airport rides in Hong Kong and sleep in my Tesla. One night between jobs, I finally built the tool I needed — a Telegram bot that parses WeChat order messages into a dashboard.

More writing