Logistics Site from Zero: PHP, Admin, and a Bot That Reads Papers
In August 2024 a Dnipro logistics owner showed me his site and his office. The site listed 30 routes. The office wall listed 400. He edited routes by calling his nephew. News lived as Word files on a desktop. Drivers called dispatch for every paper: price, window, dock number. I proposed one build: PHP, no CMS, one admin that edits everything the owner touches daily, and a Telegram bot that answers drivers from the same tables. He asked how long. I said three weeks. We launched in 19 days.
Screenshot: admin dashboard 2024-08-29 shows routes table 412 rows, price edit modal, SEO article queue 8 drafts, Telegram bot log 214 handled queries.
The problem in one paragraph
The owner runs price per kilometer that moves weekly, a route table that grows daily, and SEO articles that must go out to keep the funnel warm. His old site required a developer for each price change. Drivers needed a human for each paper check. News never shipped because it waited on layout. I needed a build where the owner edits alone and drivers ask a bot, not a person.
What I built
I built plain PHP with a private admin at /admin, no public CMS footprint. Four tables carry the business: routes with city pairs and price, media with images and SEO fields, articles with status draft to published and a cron that publishes by date, and a bot inbox that logs every driver query and answer. The admin has one page per thing the owner edits: routes, price per km, contacts, banner, and news. Each save writes the same table the public site and the bot read. No copy.
The public site renders routes as a dataset with filter by city, renders news as SEO pages under /articles, and renders images with alt text the owner writes in the admin. The Telegram bot reads the same routes table, answers price and window, and falls back to dispatch when it cannot find a page. I show that limit on purpose and argue the case in Glass-Box AI: Showing Model Confidence So People Trust It. Later I added an OpenClaw omni-channel hook so the same answer reaches Viber and web chat. The driver bot grew out of the same order of steps I use for a lead bot in Build an AI Agent That Handles Your Leads in 48 Hours.
- Admin saves price and banner in under 30 seconds. Owner learned it in one call.
- Routes table handles 400 plus rows without pagination lag because I render filter on the client from a JSON dump cached for five minutes.
- Articles queue lets the owner write eight drafts on Sunday and publish one each day without me.
- Bot handles 70 percent of driver paper checks, measured on 214 queries in the first week.
- Sitemap updates on each admin save, so Google sees new routes without a manual step.
Numbers that matter
Price update time fell from two days waiting on a developer to 28 seconds in the admin. News went from zero in three months to eight scheduled posts in one week. Driver calls to dispatch fell 31 percent in two weeks. The build cost one project fee, not a subscription, and the owner runs it alone since launch. Some admins like this one later turn into a product on subscription, and I priced that road in Micro-SaaS for Local Services: From $0 to $3K MRR in 90 Days.
When this build fits
This build fits when the owner edits daily, the data is money, and the team is one person plus drivers. It does not fit when you need multi-role stock and accounting. Then I use Supabase with row level rules. For a logistics desk that lives on routes, price, and papers, PHP with one admin and one bot still ships fastest.
What I would copy
Give the owner one place to edit each weekly thing. Write the bot answer from the same row the site shows. Schedule the news queue for a week. Watch where the owner saves time first. That is your next feature.