Як я написав власну CRM (Tenzura), бо втомився платити за "кожного юзера" в Asana та Jira

5 хвилин читання

Привіт, спільното! Мене звати Андрій, і я хочу поділитися досвідом розробки власного B2B SaaS-продукту — Tenzura CRM.

Усе почалося з класичної болі: ви керуєте командою, клієнтами, проектами, і використовуєте для цього умовну Asana, ClickUp або Jira. Спочатку все чудово, але як тільки команда розростається, ви починаєте отримувати рахунки на сотні доларів просто тому, що ці сервіси тарифікують «кожного юзера» окремо. Додайте сюди підрядників чи клієнтів, яких теж треба пустити на дошку — і бюджет летить у космос.

Я вирішив, що хочу створити систему, яка буде швидкою, матиме весь необхідний інструментарій (Канбан, таймери, заявки) і продаватиметься за фіксованою ціною на всю компанію, без лімітів на кількість людей.

Так народилася Tenzura.

Читайте також: Практична перевірка VPN без складних інструментів: що означає «підключено» і чому зелений перемикач ще нічого не гарантує

🛠 Під капотом: Сучасний стек для швидкого SaaS

Я хотів, щоб система працювала миттєво, тому обрав сучасний та перевірений стек. Ніякого овер-інжинірингу, тільки те, що дійсно працює в продакшені.

Фронтенд:

  • React + TypeScript + Vite (швидкість розробки та збірки просто вражає).
  • TailwindCSS + Lucide-react для іконок. Дизайн будував на принципах Glassmorphism — хотілося, щоб інтерфейс виглядав преміально, чисто, але не був перевантаженим.
  • Zustand для стейт-менеджменту. Після Redux це просто ковток свіжого повітря.
  • React Router для навігації.

Підписуйтеся на наші соцмережі

Бекенд:

  • Node.js + Express (написано на TypeScript).
  • Prisma ORM — найкраще, що ставалося з екосистемою Node.js за останні роки. Типізація бази даних прямо з коробки економить купу часу.
  • MySQL як основна база даних.
  • Socket.io — для real-time оновлень (сповіщення, таймери задач).
  • JWT (JSON Web Tokens) + HTTP-only cookies для безпечної авторизації.

⚙️ Основний функціонал та Архітектура

Оскільки Tenzura — це SaaS, найпершим викликом стала мультитеннантність (multi-tenancy). Кожен юзер належить до певної компанії (companyId). Усі запити до бази даних (через Prisma) жорстко фільтруються за цим ID, щоб унеможливити витік даних між різними бізнесами.

Що вміє система:

  • 1
    Рольова модель (RBAC): Керівник (Head), Менеджер (Manager), Виконавець (Executor), Клієнт (Client) та Спостерігач. У кожного свої права доступу.
  • 2
    Управління Заявками (Requests): Модуль для сервісних компаній. Клієнт створює заявку, менеджер її апрувить, переводить у Задачу і призначає виконавця.
  • 3
    Канбан та Задачі: Класичні дошки, можливість прикріплювати файли, ставити дедлайни.
  • 4
    Тайм-трекер (Time-tracking): Прямо в задачі є таймер. Виконавець натискає "Play", час рахується (синхронізується через WebSockets), натискає "Stop" — час логується в базу для звітності.
  • 5
    Дашборди: Аналітика по відкритих/закритих заявках, KPI команди.
  • 6
    Інтеграція з Telegram: Вбудований бот для надсилання критичних сповіщень.

Фінансовий модуль: Оплата в Крипті

Оскільки продукт орієнтований на глобальний ринок і B2B, я інтегрував Plisio API для прийому оплат у криптовалюті. Це значно спрощує прийом платежів від фріланс-команд та міжнародних клієнтів, уникаючи складнощів зі Swift-переказами.

🚀 Деплой та шишки, які я набив

На етапі деплою я стикнувся з класичними проблемами хостингів.

Спочатку бекенд крутився локально через ts-node, але для продакшену довелося все компілювати в dist і налаштовувати правильну прив'язку до хоста та порту (особливо нюанси з тим, як shared-хостинги прокидають process.env.HOST). Також багато крові випив модуль dotenv, який відмовлявся читати файл .env через те, що Windows зберіг його у кодуванні UTF-16. Але зрештою — CI/CD налаштовано, бекенд літає, WebSockets працюють стабільно.

💡 Що далі?

Зараз проект уже задеплоєний і готовий до використання: Tenzura CRM.

У найближчих планах:

  • 1
    Додати підтримку AWS S3 для надійного зберігання великих об'ємів файлів клієнтів.
  • 2
    Докрутити автоматичний експорт звітів у Excel/PDF.
  • 3
    Зробити повноцінну англійську локалізацію (i18n).

Буду дуже вдячний спільноті DOU за фідбек! Заходьте, реєструйтеся, клацайте. Що б ви додали або змінили в архітектурі? Як вам підхід з фіксованою підпискою замість оплати «за юзера»?

Пишіть у коментарі, буду радий обговорити технічні нюанси та продуктові рішення!

P.S. Якщо ви шукаєте інструмент для своєї команди і вас дістали ліміти — Tenzura відкрита для вас.