TaxiUA Bot — Telegram bot for taxi drivers (Google Sheets + n8n, no code)
Created by someone who had ZERO programming experience. Built entirely through AI-assisted dialogue.
What does it do?
A fully functional Telegram bot for taxi drivers and self-employed drivers (Ukrainian FOP) to track their work shifts, income, expenses, and car maintenance — all through simple keyboard buttons.
Features:
Add a work shift (income, fuel, km, other expenses, driver/park % split)
Reports: last shift / day / yesterday / week / month / best day
Car maintenance control (TO) with km tracking and reset
Book a service appointment with master
Browse local car service stations (СТО) from a database
Save car profile (number plate + brand)
View all past shifts
Everything stored in Google Sheets — no database needed.
How it looks
The bot uses a persistent reply keyboard:
📊 Last Report │ 📅 Day │ 📆 Yesterday │ ➕ Add Shift
📅 Week │ 📅 Month │ 🏆 Best Day │ 📋 Shifts
🔧 Maintenance │ 📅 Records│ 🚘 Car │ ℹ️ Instructions
🏪 Service Stations
Adding a shift is dead simple — just send numbers:
3000 1000 200 200
(income, fuel, km, other expenses)
Or with park/driver split:
3000 1000 200 200 60 40
You get back:
📅 Daily Report 05.05.2026
Income: 3000 UAH
Fuel: 1000 UAH
Km: 200
Other expenses: 200 UAH
Net: 1800 UAH
Driver share: 1800 UAH
Park share: 0 UAH
Profit per km: 9 UAH
Tech Stack
| Component | Tool |
|---|---|
| Automation | n8n (self-hosted) |
| Messenger | Telegram Bot API |
| Database | Google Sheets |
| Hosting | Any VPS |
No Python. No SQL. No backend frameworks.
Workflow overview
- 59 nodes in a single workflow
- Smart command parser that handles both button clicks (callback) and text messages
- User registry in Google Sheets (auto-creates row on first message)
- Daily upsert logic (update today’s row or create new)
- Maintenance tracker with km counter and reset confirmation flow
- Service station database reader with paginated output (5 СТО per message)
Key technical details
Problem I solved: n8n’s Parse Cancel Command node normalizes all button callbacks and text into $json.text, but downstream nodes were still reading message.text from the raw Telegram object.
Fix:
// Instead of:
const textRaw = callbackData || messageText;
// Use:
const textRaw = body.text || callbackData || messageText;
This single line fixed all button routing issues.
How to use
- Import
taxiua_bot_public.jsoninto n8n - Create a Telegram bot via @BotFather
- Set up Google Sheets with
DailyandСТО_базаtabs - Connect your credentials in n8n
- Update
YOUR_GOOGLE_SHEET_IDin all Google Sheets nodes - Publish workflow and send
/startto your bot
Google Sheets columns (Daily tab):
chat_id | user_id | date | income | fuel | km | other | driver_percent | park_percent | net | driver_earn | park_earn | to_reserve | profit_per_km | car_number | car_brand
My story
I had never written a single line of code before this project.
I built this entirely by describing what I wanted to Claude AI, testing the result, finding bugs, describing the errors (with screenshots of n8n execution logs), and iterating.
The process looked like this:
- Me: “The button doesn’t respond”
- Claude: “Show me the execution log for the Parse Cancel Command node”
- Me: screenshot
- Claude: “Found it — the IF node checks
callback_query?.databut after your parser runs, data is in$json.text” - Me: fixes applied, tests again
Stats:
59 nodes in final workflow
15+ bugs found and fixed
6+ workflow versions
Lines of code written manually: 0
If I could build this — so can you. n8n + AI = automation without programming.
Links
- GitHub: (add your repo link)
- Telegram channel (UA): @Drivetax_bot
Built in Ukraine ![]()
Feel free to use, adapt, and share!