Знаходить станцію
Сайт відповідає на перше питання власника човна — «скільки коштує й чи є місце». Повзунок довжини рахує суму за справжньою таблицею, а вільні місця приходять із тієї ж бази, у якій станція веде облік.
клієнтКейс · 2026 · човнова станція
Сайт, облік і кабінет клієнта в Telegram, які працюють з однієї бази. Я зробила не сайт — систему.
Станція під Вишгородом зберігає човни на воді, на суші й у критому ангарі. Облік вели в зошиті, а за кожну оплату дзвонили двічі: спершу продиктувати реквізити, потім перепитати, чи пройшло.
Девʼять кроків від першого дотику до грошей у касі. Хід щоразу переходить через стійку — біля кожного кроку видно, хто діє: клієнт чи станція. Усі екрани живі: сайт гортається, додатки клікаються, у CRM можна завести стоянку й внести гроші.
Сайт відповідає на перше питання власника човна — «скільки коштує й чи є місце». Повзунок довжини рахує суму за справжньою таблицею, а вільні місця приходять із тієї ж бази, у якій станція веде облік.
клієнтДата, довжина судна, строк і телефон. Заявка не бронює місце: це звернення, а не домовленість. Далі хід переходить на той бік стійки.
клієнтВона лежить угорі CRM, над усіма вкладками, поки з нею нічого не зробили: тип місця, довжина, телефон, строк. Натисніть «Оформити» — дані вже підставлені.
станціяІмʼя, телефон, човен, довжина, тариф і строк. Тариф можна лишити порожнім — тоді CRM покаже «ціну уточнити», а не нуль, і не рахуватиме борг із вигаданої суми.
станціяОдин «Старт» і кнопка «Поділитися номером» — бот знаходить бронь за телефоном. Відтепер рахунки приходять у цей чат. Той самий бот веде два різні міні-додатки: клієнт бачить кабінет, станція — CRM.
клієнтЗ 1 по 7 число рахунок приходить сам — рядками, з реквізитами й кнопкою, яка відкриває банк із уже вписаною сумою. QR за стандартом НБУ: переписувати IBAN у трубку більше не треба.
станція → клієнтПісля оплати клієнт тисне «Я оплатив». Ця кнопка не зараховує гроші — вона кладе станції сигнал звірити надходження. Сервіс не бачить банківського рахунку й не має права казати, що гроші прийшли.
клієнт → станціяНатисніть на стоянку в календарі — відкриється картка: клієнт, телефон, тариф і борг. Кнопки «Готівка» й «Безнал» вносять оплату, зокрема часткову: решта лишиться боргом.
станціяОплата лягає в касу й зеленить місяць у календарі. Готівка й безготівка окремо, витрати станції — тим самим вікном: пальне, матеріали, ремонт. Інакше «разом у касі» показувало б не те, що насправді лишилось.
станціяДані в демонстраціях вигадані, а тексти бота — дослівні. У справжній CRM прізвища, телефони й борги клієнтів станції, і таке в портфоліо не виносять. QR у демонстрації навмисно неплатіжний.
Він не підтверджує бронь і не зараховує оплату: він не бачить банківського рахунку.
Якщо тариф не названий, борг не рахується, і місяць отримує свій, сірий колір. Нуль тут означав би «усе гаразд», а правда — «ми не знаємо».
Місяць, оплачений наперед, зелений уже зараз. Спершу колір залежав від того, минув місяць чи ні — і той, хто розрахувався до нового року, виглядав як боржник.
Дробові числа дають похибку округлення, а це рахунок живої людини. Ціна, якої не знаємо, — не нуль, а окремий стан «ціну уточнити».
Статична сторінка без фреймворків. Шрифт Fixel від MacPaw, структуровані дані для пошуку, оферта й політика конфіденційності.
Next.js і Postgres. Один проєкт, двоє дверей: CRM у корені, кабінет клієнта на /client.
Офіційний Bot API, вебхук без окремого сервера. Вхід персоналу — натисканням «Старт», без паролів.
Система розгорнута й працює на справжній базі станції: сім човнів, їхні місця, оплати й борги вже всередині. Сайт показує вільні місця з неї ж.
Цифр продажів тут немає навмисно — станція ще не почала приймати клієнтів через систему. Коли почне, вони зʼявляться.
Сайт, облік і кабінет клієнта, які справді звʼязані між собою, роблю під конкретний бізнес — від бази відпочинку до станції обслуговування.