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!