Перейти до основного вмісту
Усі проєкти

Внутрішній інструмент · дизайн + розробка · закритий доступ

CRM сайтів

CRM сайтів — знімок головної сторінки
Next.jsTypeScriptSupabaseгоризонт 2 роки

Завдання

Кожен сайт, який я веду, тягне за собою низку дрібних зобов'язань: домен в одного реєстратора, хостинг в іншого, поштові скриньки ще десь, доступи до всього цього і своя дата платежу в кожного. Розкидана між рахунками, листами реєстраторів і власною пам'яттю, ця низка стає помітною лише тоді, коли щось уже прострочено, — а тихо втрачений домен у цій справі найдорожча з можливих помилок.

Що було зроблено

Одна панель над усіма власними проєктами. У кожного сайту перелічені його сервіси — домен, хостинг, пошта — з постачальником за кожним, потрібними доступами, датою продовження та вартістю. Дашборд починається з того, що справді потребує уваги: що прострочено, що спливає протягом тридцяти днів і які суми спишуться автоматично, без жодного підтвердження. Нижче горизонт продовжень розгортає два роки помісячно, тож скупчення продовжень в одному місяці видно задовго до самих рахунків. Кожен сайт має власну річну суму, а панель складає їх у загальні витрати на те, щоб усе лишалося онлайн.

Технічні рішення

Next.js з App Router і TypeScript: кожен сервіс, постачальник і платіж — типізований запис, а не рядок таблиці, яка мовчки приймає будь-що. Дані й авторизація — обидва на Supabase: Postgres для самих записів, Supabase Auth для доступу до них. Основну роботу роблять дати: залишок часу, строки та автосписання обчислюються з однієї збереженої дати продовження кожного сервісу — саме це дозволяє взагалі показати горизонт на два роки, не ведучи поруч другий календар вручну.

Свідомо не зроблено одного — публічної адреси. Панель містить імена клієнтів, акаунти постачальників і реальні суми платежів, тому вона ніде не розгорнута так, щоб до неї міг дійти відвідувач: цей кейс показує, що вона вміє і як влаштована, і на цьому спиняється. З тієї ж причини з цієї сторінки немає посилання на живий сайт — тут просто немає на що безпечно послатися.