Transport logistics · AI backend
Gll Backend System — from message to completed freight request
A backend system for a transport company that consolidates requests from WhatsApp, email, and Telegram, completes missing details through dialogue, and sends a prepared deal to Bitrix24.
- request channels
- 3
- freight exchanges
- 3
- structured deal
- 1

Request workflow
From message to logistics specialist
The system receives a real conversation, not a perfect form: several messages in a row, a photo, then a voice note. It merges the stream into one request and asks only for genuinely missing details.
- 01
Inbound stream
WhatsApp, email, and Telegram enter one processing flow.
- 02
Buffer and deduplication
A wait window joins message bursts; the queue removes duplicates.
- 03
Multimedia
Text, photos, and voice become verifiable request fields.
- 04
Completion dialogue
The bot asks only for missing data while preserving context.
- 05
Deal and trucks
The completed card goes to Bitrix24 and search runs on three exchanges.
The hardest integration is human
Five messages, one request
Customers rarely describe a shipment in one message. Buffering lets the conversation finish, while idempotency prevents one event from creating two deals.
Memory with a safe boundary
+ Safe to remember
a returning customer’s usual cargo type
↺ Must be reset
the previous shipment’s route and terms
Message window
MERGED
1 request
Production-first
Built directly in the live production environment
The portal and WhatsApp number were already serving real customers. Reliability therefore shaped every integration from the start instead of becoming a separate stage.
Fail-closed
An invalid webhook cannot launch partially understood work.
Timeouts
Every external call has a bounded wait time.
Bot prefix
Automated deals remain distinct from manager-created deals.
Idempotency
Redelivering an event does not repeat the business action.
Watchdog
A scheduler picks up requests moved to pricing manually.
Outside-in
The external perimeter is regularly checked as a user sees it.
Not every successful response is data
HTTP 200, but the photo was not read
A vision model may return a polite refusal inside a technically successful response. A dedicated filter detects it, keeps it out of customer data, and hands the request to a logistics specialist without inventing facts.
Model response
“Unable to determine…”
System decision
Do not invent · hand off to human
Logic changed by live data
Freight marketplace rates are “negotiable”
Kazakhstan freight platforms do not publish a ready price. The system therefore finds trucks and contacts, a logistics specialist sets the rate, and the backend calculates margin and assembles the customer offer.
- 1Trucks
- 2Contacts
- 3Manually set rate
- 4Margin
- 5Offer
Technology stack
Queues, AI, and browser automation in one system
- NestJS 11
- TypeScript strict
- PostgreSQL
- Prisma
- Redis
- BullMQ
- Playwright
- OpenAI
- Vision
- Whisper
- WAHA
- Bitrix24 REST
Need a similar internal product?