Problem
The same questions arrived on WhatsApp every day, and each one was answered by hand.
Customers who did not know their filter type sent photos of the unit, mentioned the store they ordered from in a separate message and asked for installation diagrams. Information was scattered across chats, and messages sent after hours waited.
Solution
The bot sorts each question into three main branches and collects the information each branch needs, step by step. Customers can tap a button or type the number, and typing "menu" takes them back at any point.

Online orders
Customers who do not know their filter type are asked for a photo and the filter count; two photos for tanks.
After-sales
Order number, store and details are collected for wrong or missing items; shipping tracking info goes out automatically.
Installation
Open or closed case, 5, 6 or 7 filters, tank, faucet: the right diagram and video are sent instantly.
A new flow is data, not code
Texts, menus and forms are kept apart from the logic. Asking customers for something new takes a single form definition, and the bot reminds them of a missing photo or text on its own.
# content/forms.py
Form(ids.FORM_FILTER_TYPE, CATEGORY_ORDER,
"Filtre tipini bilmiyor", (
Step(texts.ASK_FILTER, photos=1, min_text=1,
photo_hint=texts.ASK_FILTER_PHOTO,
text_hint=texts.ASK_FILTER_COUNT),
)),A help desk for the team
Completed forms land in the panel’s Requests tab together with their photos, split into pending and done. When a customer types /canli during working hours (weekdays 09–18, Saturdays 10–14) they are connected to an online agent. After hours the bot records the request and the team replies in the morning. Live support can be switched to automatic, open or closed with one click.
Infrastructure and security
The bot runs as a systemd service on a dedicated Linux server and restarts itself if it crashes. Caddy provides HTTPS; logs rotate within logrotate and journald limits. The team reaches the panel over OpenVPN: the agent’s identity comes from their VPN certificate, and adding or removing a teammate is one command. The whole setup is a re-runnable script.

