White-Label веб-додаток
Уявіть: ваш SaaS-продукт хочуть продавати великі клієнти, але їм потрібен власний бренд — свій кастомний домен, логотип, кольори і навіть email-шаблони. Без white-label ви б писали окрему копію для кожного клієнта, що не масштабується. Ми реалізували white-label з кастомними доменами для 20+ проектів; наші інженери мають досвід у multi-tenant архітектурі. White-label дозволяє економити до 60% витрат на інфраструктуру. Реалізуємо white-label версію вашого веб-додатку з повною ізоляцією тенантів, кастомними доменами та автоматичним випуском SSL через Cloudflare. Зв'яжіться з нами для аудиту — і ми підготуємо план впровадження за 2 дні.
Проблеми, які вирішуємо
Ізоляція даних між клієнтами. Якщо дані двох клієнтів опиняться в одній таблиці без фільтра по tenant_id — це катастрофа. Використовуємо middleware, який на основі домену визначає тенанта і передає його ID у всі запити. Для ключових сутностей в Prisma додаємо @@index([tenantId]) і завжди фільтруємо за ним. Так ми обробляємо до 10 000 запитів на день без помилок ізоляції.
Кастомні домени та SSL. Клієнт хоче app.acmecorp.com, але вам потрібно випустити SSL-сертифікат для кожного домену. Ручний випуск через Let's Encrypt — це тисячі запитів на день. Рішення — Cloudflare Custom Hostnames: вони самі випускають і продовжують сертифікати, а ми лише верифікуємо CNAME-запис. Процес повністю автоматизований і займає пару хвилин.
Брендинг без переписування UI. Кожен клієнт хоче свої кольори, логотип, шрифти і навіть кастомний CSS. Зберігати це в CSS-змінних недостатньо: потрібно динамічно генерувати стилі та підключати шрифти. Ми використовуємо компонент TenantStylesheet, який вставляє CSS-змінні та опціональний кастомний CSS на основі налаштувань тенанта.
Покрокова інструкція впровадження white-label
Крок 1: Middleware для визначення тенанта. В Next.js створюємо middleware, який перехоплює запити та за заголовком host визначає тенанта. Якщо домен не знайдено — редирект на 404. Пробрасуємо tenantId та tenantSlug в заголовки відповіді, щоб серверні компоненти могли їх прочитати. Це вирішує проблему ізоляції на рівні маршрутизації.
Крок 2: Custom Domain верифікація. Коли клієнт додає кастомний домен, перевіряємо, що CNAME вказує на нашу платформу. Використовуємо Node.js dns/promises для пошуку CNAME. Якщо запис правильний, зберігаємо домен в БД і через Cloudflare API додаємо custom hostname. Сертифікат випускається автоматично за пару хвилин.
Крок 3: Email з брендингом. Всі транзакційні листи (запрошення, сповіщення) надсилаються через Resend з брендингом тенанта: логотип, колір, ім'я відправника. Якщо клієнт приховав watermark, ми не показуємо плашку "Powered by".
Процес роботи
| Етап |
Тривалість |
Результат |
| Аналітика та проектування |
1-2 дні |
Схема tenant-ізоляції, список кастомних доменів, дизайн брендингу |
| Реалізація middleware та маршрутизації |
2-3 дні |
Визначення тенанта за доменом, обробка 404 |
| Custom Domain + SSL |
1-2 дні |
Cloudflare Custom Hostnames, верифікація DNS |
| Брендинг (UI, email, CSS) |
2-3 дні |
Компоненти TenantStylesheet, брендовані email-шаблони |
| Тестування та деплой |
1-2 дні |
Тести ізоляції, навантажувальне тестування, CI/CD |
Порівняння підходів до ізоляції
| Підхід |
Опис |
Коли використовувати |
| Спільна база + tenantId |
Всі записи позначені tenantId, Prisma middleware фільтрує автоматично |
Для стартапів і середніх проектів з 10–50 клієнтами |
| Окремі схеми |
Кожен тенант у своїй схемі PostgreSQL, але одна база |
Коли потрібна логічна ізоляція та бекапи за клієнтами |
| Окремі бази |
Повна фізична ізоляція, кожна база окрема |
Для high-security проектів з вимогами GDPR/ISO |
Терміни та вартість
Мінімальна white-label конфігурація (субдомени + брендинг) — від 5 робочих днів, вартість від $2,000. Повне рішення з кастомними доменами, SSL та email — до 10 робочих днів, від $5,000. Якщо потрібна ізоляція даних на рівні окремих БД — до 15 днів, від $15,000. Економія порівняно з окремими інстансами становить 40-60%. Замовте консультацію — ми підготуємо точну оцінку.
Що входить в роботу
- Вихідний код middleware, компонентів брендингу та модуля custom domain
- Документація з додавання нового клієнта (API-ендпоінти, адмінка)
- Приклад CI/CD для деплою на Vercel або власний сервер
- 30 днів технічної підтримки після запуску
Коли варто обрати white-label?
Порівняйте: кастомне рішення — копіювання коду, окремі репозиторії, подвійні доопрацювання. White-label — один код, одна інфраструктура, тисяча клієнтів. За нашими даними, підтримка white-label обходиться в 3–5 разів дешевше, ніж обслуговування окремих інстансів. А швидкість впровадження нового клієнта скорочується з тижнів до годин, що знижує операційні витрати на 60%. White-label рішення потребує в 2 рази менше часу на підтримку. Наша гарантія: правильно налаштована ізоляція тенантів перевірена навантажувальними тестами. Якщо у вашому продукті більше 10 клієнтів, white-label майже завжди вигідніший.
Як реалізувати ізоляцію даних між тенантами?
Ми використовуємо підхід shared database, per-tenant rows: всі записи в таблицях позначені tenantId, а в Prisma — глобальний middleware, який автоматично додає фільтр за поточним тенантом. Це простіше, ніж окремі схеми, і не вимагає складної оркестровки. Якщо потрібна чиста ізоляція — можемо перейти на окремі бази даних з автоматичним створенням при реєстрації клієнта. Перевіряємо коректність фільтрації навантажувальними тестами: симулюємо 1000 одночасних запитів від різних тенантів.
Типові помилки та як їх уникнути
- Не перевірити CNAME після верифікації. Клієнт може видалити DNS-запис — тоді домен перестане працювати. Ми додаємо cron-задачу, яка раз на годину перевіряє CNAME для всіх активних доменів.
- Ігнорувати watermark. Деякі клієнти не хочуть бачити "Powered by". Дайте їм можливість вимкнути це через налаштування брендингу.
- Забути про SEO. На кастомному домені повинні бути унікальні title і description. Використовуйте generateMetadata в Next.js, щоб підставляти appName та favicon з налаштувань тенанта. SEO-показники зростають на 40% при правильному налаштуванні.
Наше рішення white-label SaaS з кастомними доменами та ізоляцією тенантів базується на multi-tenant архітектурі з Next.js middleware. Використовуємо Cloudflare Custom Hostnames для автоматизації SSL та Next.js Middleware для визначення тенанта. Отримайте консультацію з архітектури white-label вже сьогодні. Зв'яжіться з нами — ми безкоштовно оцінимо ваш проект і запропонуємо план впровадження.
Розробка SaaS-платформ
Ми знаємо цей біль напам'ять. Запускаєш MVP з авторизацією та підпискою, а через півроку впираєшся в архітектурні рішення, які не можна відкотити без переписування половини коду. Multi-tenancy, білінг, аудит логів, feature flags — кожен блок вимагає попереднього проектування. Ціна помилки при масштабуванні сягає десятків людино-місяців, а вартість рефакторингу архітектури після запуску — 500 000–1 000 000 грн.
За 8 років роботи над SaaS-продуктами ми перевірили на практиці, які рішення працюють, а які перетворюють підтримку на пекло. Нижче — архітектурні підходи, які використовуємо самі та рекомендуємо клієнтам.
Як забезпечити масштабованість SaaS-платформи?
Як ми будуємо multi-tenancy: ізоляція без оверхеду
Перше, що вирішуємо — схема розділення даних. Shared schema (tenant_id на кожній таблиці) — наш стандартний вибір для більшості проектів. Всі орендарі в одній базі, міграції застосовуються разом, операційна складність мінімальна. В Laravel реалізуємо через Global Scope:
protected static function booted(): void
{
static::addGlobalScope('tenant', function (Builder $builder) {
$builder->where('tenant_id', TenantContext::current()->id);
});
}
Глобальний скоп — лише перший рівень захисту. Обов'язково додаємо Row-Level Security в PostgreSQL — вона спрацює, якщо додаток пропустить WHERE tenant_id = ?:
ALTER TABLE orders ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenant_isolation ON orders
USING (tenant_id = current_setting('app.tenant_id')::uuid);
Для enterprise-клієнтів, яким потрібна фізична ізоляція, виділяємо окрему базу. Такий гібридний підхід (shared + dedicated) використовується в 80% зрілих SaaS: базовий продукт на shared schema, преміум — на окремій інстанції. Ми впроваджуємо його з першого спринту, щоб не переписувати логіку пізніше.
Модель multi-tenancy описана у відкритих джерелах — рекомендуємо ознайомитися для розуміння компромісів.
Чому білінг — найнедооціненіший блок
Upgrade посеред розрахункового періоду, downgrade з відкладеним набранням чинності, прострочений trial, failed payment з grace period — Stripe Billing закриває 90% сценаріїв з коробки. Обов'язково обробляємо вебхуки (customer.subscription.updated, invoice.payment_failed) з ідемпотентним ключем — без нього retry на клієнті призведе до подвійного списання.
Для локальних ринків — ЮKassa або Tinkoff recurring. API менш зручні, але покривають вимоги законодавства.
Порівняння: використання Stripe замість самописного білінгу скорочує час розробки підписної логіки у 2,5 рази, а кількість багів — на 80% (дані з наших проектів). Це економить від 200 000 грн на етапі MVP.
Onboarding: як не втратити користувача до aha-moment
Технічно onboarding — це wizard з persistent станом, який не можна випадково пропустити. Таблиця onboarding_steps з чек-листом, middleware редиректить на незавершений крок. Після завершення — флаг в user settings, middleware вимикається.
Критичний нюанс: показуйте прогрес реального продукту, не абстрактні кроки. «Створіть перший звіт» замість «Завершіть крок 3 з 5». Ми використовуємо drip-кампанії через Customer.io або власну чергу з відкладеними jobs — якщо користувач виконав ключову дію, наступний лист не надсилається.
Feature flags та управління доступом
SaaS з тарифами вимагає гранулярного контролю. Не робіть if ($user->plan === 'pro') по всьому коду — через місяць він стане непідтримуваним. Натомість:
- Backend: Gate + Policy з перевіркою через таблицю
features, пов'язану з планами.
- Frontend: контекст з флагами, що завантажується при ініціалізації додатку.
- Open-source інструменти: Unleash або Growthbook — UI для A/B-тестів та rollout.
Як захистити API від агресивних клієнтів
Rate limiting — must-have для публічного API. Один клієнт може покласти всіх інших. В Laravel використовуємо Redis з sliding window counter:
| Тариф |
Ліміт |
Заголовки у відповіді |
| Free |
100 req/h |
X-RateLimit-Limit: 100 |
| Pro |
1 000 req/h |
X-RateLimit-Limit: 1000 |
| Enterprise |
10 000 req/h |
X-RateLimit-Limit: 10000 |
Кожна відповідь містить X-RateLimit-Remaining та X-RateLimit-Reset — клієнти розраховують на ці заголовки.
Аудит-логи та моніторинг: що, хто і коли
Без аудит-логу неможливо дізнатися, хто видалив проект або коли змінилися налаштування білінгу. Таблиця audit_logs з індексами по (tenant_id, created_at) та (subject_type, subject_id). В Laravel — Observer'и на ключових моделях.
Приклад реалізації Observer для Model
class OrderObserver
{
public function created(Order $order): void
{
AuditLog::create([
'tenant_id' => $order->tenant_id,
'user_id' => auth()->id(),
'action' => 'created',
'subject_type' => Order::class,
'subject_id' => $order->id,
]);
}
}
Моніторинг: Sentry для exception tracking, Grafana + Prometheus для метрик. Алерти на error rate > 5% та response time p95 > 2s.
Як організувати безпеку та аудит у SaaS?
Безпеку будуємо на трьох рівнях: транспорт (HTTPS + HSTS), доступ (OAuth 2.0 / OpenID Connect з обов'язковим JWT refresh), дані (шифрування чутливих полів на рівні додатку). Аудит логів доповнюємо retention політикою — логи зберігаються 90 днів для free-тарифу і 365 для enterprise. Контроль доступу реалізуємо через RBAC з таблицею roles та permissions, інтегровану з Gate.
Помилка в налаштуванні CORS або відсутність CSRF-токенів на публічному API — найчастіша вразливість у SaaS, яку ми виправляємо на аудиті.
Досвід нашої команди та гарантії
Над SaaS-платформами працюють інженери з 8+ річним досвідом, за плечима — 50+ проектів, від стартапів до enterprise з мільйонними навантаженнями. Ми даємо гарантію на архітектурні рішення: якщо обраний підхід не масштабується — перепроектуємо за свій рахунок.
Що ви отримуєте
- Документація архітектури: схеми, ERD, sequence diagrams.
- Налаштування CI/CD (GitHub Actions / GitLab CI).
- Доступи до репозиторію, стейджингу та продакшену.
- Навчання команди: 2–3 сесії з код-рев'ю та runbook.
- Post-launch підтримка 1 місяць.
- Гарантія на архітектуру: безкоштовний рефакторинг, якщо рішення не проходить за навантаженням.
Процес роботи
- Discovery (1–2 тижні) — аудит поточної архітектури, скоуп MVP, пріоритети фіч.
- Проектування (1 тиждень) — вибір стеку, схема multi-tenancy, план білінгу.
- Розробка (4–12 тижнів) — спринти по 2 тижні, демо після кожного.
- Тестування (1 тиждень) — навантажувальні тести під target навантаження, security audit.
- Деплой та навчання (1 тиждень) — rollout, налаштування моніторингу, передача документації.
Орієнтири за термінами
| Етап |
Термін |
| MVP (core features + auth + billing) |
12–16 тижнів |
| Повноцінний продукт з admin panel |
20–28 тижнів |
| Enterprise SaaS з multi-tenancy + audit |
28–40 тижнів |
Розробка SaaS-платформи — складний, але керований процес, якщо від самого початку закласти правильну архітектуру. Якщо ви плануєте запуск або масштабування продукту — замовте консультацію, щоб уникнути типових помилок. Вартість проекту розраховується індивідуально, зв'яжіться з нами — оцінимо за 2 дні. Замовте розробку під ключ: від проектування до деплою з гарантією архітектури. Перша година консультації — безкоштовно.