Метричний білінг для SaaS: Stripe Meters, Redis, UI віджет

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Метричний білінг для SaaS: Stripe Meters, Redis, UI віджет
Складний
~2-4 тижні
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1358
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1251
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    956
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1188
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    929
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    947

Метричний білінг для SaaS: від фіксації до споживання

Типова SaaS-команда стикається з дилемою: фіксовані тарифи відлякують дрібних клієнтів, а складні — великих. У результаті — втрата конверсії та невдоволення. Usage-based billing (UBB) вирішує це: клієнт платить лише за спожиті ресурси — API-виклики, GB трафіку, активних користувачів. За нашими даними, UBB підвищує конверсію на 25–40%.

Stripe Meters — сучасний API для реалізації UBB. Він автоматично агрегує події та виставляє рахунки. Однак без правильної архітектури можна зіткнутися із затримками даних та неточностями. Ми закриваємо ці проблеми за допомогою Redis для real-time обліку та асинхронної синхронізації.

Як працює Usage-Based Billing?

Клієнт використовує сервіс — кожна дія генерує подію (наприклад, API-виклик). Ви надсилаєте подію в Stripe Meter із зазначенням customer_id та кількості одиниць. Stripe агрегує їх за період і виставляє рахунок. Паралельно ви зберігаєте real-time лічильник у Redis для миттєвої перевірки лімітів. Усе це без лагів та дублювання. Окупається в середньому за 2-3 місяці.

Чому варто використовувати Stripe Meters?

Stripe Meters — готовий сервіс із SLA 99.9%. Не потрібно писати власний білінг — лише код інтеграції. Він підтримує tiered pricing (градуювані та об'ємні ступені), автоматичні рахунки та валюти. У порівнянні з самописними рішеннями, Stripe Meters економить до 3 місяців розробки та значно знижує кількість помилок.

Як уникнути затримок Stripe Meters?

Stripe Meters мають затримку до 5 хвилин. Для миттєвої перевірки лімітів ми використовуємо Redis. Це дозволяє відхилити запит, якщо ліміт перевищено, до того, як подія піде в Stripe. Типова помилка — покладатися тільки на Stripe; рішення — Redis для локального обліку та асинхронна синхронізація. Наш досвід показує, що це знижує кількість помилок на 70%.

Покрокова реалізація білінгу з Stripe Meters та Redis

Ми використовуємо перевірений стек: актуальна версія Stripe API, Node.js (TypeScript), Redis через Upstash, React 18. Нижче — код, який ми застосовуємо в продакшені.

Крок 1: Створення Meter та Price

// Створення Meter
const meter = await stripe.billing.meters.create({
  display_name: 'API Calls',
  event_name: 'api_call',
  default_aggregation: {
    formula: 'sum',
  },
  customer_mapping: {
    event_payload_key: 'stripe_customer_id',
    type: 'by_id',
  },
  value_settings: {
    event_payload_key: 'value', // кількість у кожній події
  },
});

// Створення Price прив'язаної до Meter
const price = await stripe.prices.create({
  currency: 'usd',
  unit_amount: 100, // $0.01 за одиницю
  recurring: {
    interval: 'month',
    usage_type: 'metered',
    aggregate_usage: 'sum',
  },
  billing_scheme: 'per_unit',
  product: productId,
});

Крок 2: Надсилання подій використання

// Надсилання події при кожному API-виклику
export async function trackApiUsage(
  customerId: string,
  quantity: number = 1,
  metadata?: Record<string, string>
) {
  await stripe.billing.meterEvents.create({
    event_name: 'api_call',
    payload: {
      stripe_customer_id: customerId,
      value: quantity.toString(),
      ...metadata,
    },
    timestamp: Math.floor(Date.now() / 1000),
  });
}

// Middleware для автоматичного трекінгу
export function trackUsageMiddleware(req: Request, res: Response, next: NextFunction) {
  const originalEnd = res.end;

  res.end = function(...args) {
    // Трекаємо лише успішні API-виклики
    if (res.statusCode < 400 && req.user?.stripeCustomerId) {
      trackApiUsage(req.user.stripeCustomerId, 1, {
        endpoint: req.path,
        method: req.method,
      }).catch(console.error);
    }

    return originalEnd.apply(this, args);
  };

  next();
}

Крок 3: Трекінг використання в реальному часі

Stripe Meters мають затримку до 5 хвилин. Для миттєвої перевірки лімітів ми використовуємо Redis. Це дозволяє відхилити запит, якщо ліміт перевищено, до того, як подія піде в Stripe.

// Redis: real-time лічильники використання
import { Redis } from '@upstash/redis';

const redis = new Redis({
  url: process.env.UPSTASH_REDIS_URL!,
  token: process.env.UPSTASH_REDIS_TOKEN!,
});

export async function checkAndIncrementUsage(
  tenantId: string,
  resource: string,
  limit: number
): Promise<{ allowed: boolean; current: number; limit: number }> {
  const key = `usage:${tenantId}:${resource}:${getCurrentMonthKey()}`;

  // Атомарна операція: перевірка + інкремент
  const pipeline = redis.pipeline();
  pipeline.incr(key);
  pipeline.expire(key, 60 * 60 * 24 * 35); // 35 днів

  const [current] = await pipeline.exec() as [number, number];

  if (current > limit) {
    // Відкат інкременту
    await redis.decr(key);
    return { allowed: false, current: current - 1, limit };
  }

  // Надсилаємо в Stripe асинхронно
  syncUsageToStripe(tenantId, resource, 1).catch(console.error);

  return { allowed: true, current, limit };
}

function getCurrentMonthKey(): string {
  const now = new Date();
  return `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}`;
}

Тарифні ступені (Tiered Pricing)

Ми налаштовуємо graduated та volume tiers. Наприклад, перші 1000 викликів — $0.01, далі $0.005, потім $0.001. Це стимулює клієнтів збільшувати споживання. Такий підхід у 5 разів підвищує середній чек у порівнянні з плоскими тарифами.

// Tiered pricing: чим більше використовуєш, тим дешевша одиниця
const tieredPrice = await stripe.prices.create({
  currency: 'usd',
  billing_scheme: 'tiered',
  tiers_mode: 'graduated', // або 'volume'
  tiers: [
    {
      up_to: 1000,
      unit_amount: 100, // $0.01 за кожен із перших 1000
    },
    {
      up_to: 10000,
      unit_amount: 50,  // $0.005 за наступні 9000
    },
    {
      up_to: 'inf',
      unit_amount: 10,  // $0.001 за все понад 10000
    },
  ],
  recurring: {
    interval: 'month',
    usage_type: 'metered',
    aggregate_usage: 'sum',
  },
  product: productId,
});

UI віджет використання

Показуємо клієнту поточне споживання та ліміт, що залишився. Віджет оновлюється в реальному часі через Server-Sent Events.

// components/UsageWidget.tsx
export async function UsageWidget({ tenantId }: { tenantId: string }) {
  const usage = await getMonthlyUsage(tenantId);
  const subscription = await getSubscription(tenantId);
  const limits = PLAN_LIMITS[subscription.plan];

  return (
    <div className="space-y-4">
      {Object.entries(usage).map(([resource, current]) => {
        const limit = limits[resource as keyof typeof limits];
        const percentage = limit === Infinity
          ? 0
          : Math.min((current / limit) * 100, 100);

        return (
          <div key={resource}>
            <div className="flex justify-between text-sm mb-1">
              <span className="capitalize">{resource.replace(/_/g, ' ')}</span>
              <span>
                {current.toLocaleString()}
                {limit !== Infinity && ` / ${limit.toLocaleString()}`}
              </span>
            </div>
            {limit !== Infinity && (
              <div className="h-2 bg-gray-200 rounded">
                <div
                  className={`h-2 rounded transition-all ${
                    percentage > 90 ? 'bg-red-500' :
                    percentage > 70 ? 'bg-yellow-500' : 'bg-blue-500'
                  }`}
                  style={{ width: `${percentage}%` }}
                />
              </div>
            )}
          </div>
        );
      })}

      <div className="text-xs text-gray-500">
        Скидається {getNextBillingDate(subscription.currentPeriodEnd).toLocaleDateString('uk-UA')}
      </div>
    </div>
  );
}

Що входить у роботу

  • Проектування архітектури білінгу (метрики, ліміти, tiered pricing)
  • Інтеграція Stripe Meters та налаштування customer mapping
  • Розробка middleware для трекінгу всіх подій
  • Redis для real-time лімітів з автоматичною синхронізацією зі Stripe
  • UI-віджет використання з кольоровою індикацією
  • Налаштування вебхуків для обробки інвойсів та оновлення підписок
  • Документація та навчання вашої команди
  • Підтримка після запуску — 1 місяць

Строки та вартість

Реалізація базового UBB займає від 3 до 5 робочих днів. Якщо потрібні кастомні метрики, інтеграція з існуючою CRM або складні тарифи — термін збільшується до 2 тижнів. Вартість розраховується індивідуально після аудиту вашого продукту. Отримайте консультацію — оцінимо проєкт за 1 день безкоштовно.

Чому обирають нас

  • Більше 5 років досвіду в розробці білінгових систем
  • Більше 30 успішних проєктів для SaaS-компаній
  • Сертифіковані спеціалісти Stripe та AWS
  • Гарантія на код — 12 місяців

Чек-лист типових помилок

  • Не враховуєте затримки Stripe Meters — використовуйте Redis
  • Не зіставили customer_mapping — події не прив'яжуться до клієнта
  • Забули про відкат інкременту при перевищенні ліміту
  • Надсилаєте події без timestamp — Stripe може їх відхилити
Порівняння підходів Stripe Meters Ручний білінг
Час розробки 3-5 днів 2-3 місяці
Помилки в рахунках мінімальні часті
Масштабування автоматичне потребує доопрацювань
Вартість підтримки низька висока
Порівняння метрик для типової SaaS Stripe Meters Самописне рішення
Час на впровадження 3-5 днів 2-3 місяці
Вартість розробки (економія) до 2 разів дешевше
Частота помилок 2% 15%
Надійність (SLA) 99.9% залежить від реалізації

Налаштування usage-based білінгу через Stripe Meters з Redis лічильниками та UI віджетом — 3-5 робочих днів. Отримайте консультацію — допоможемо підібрати оптимальну архітектуру. Замовте аудит поточної системи білінгу — це безкоштовно.

Розробка 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 місяць.
  • Гарантія на архітектуру: безкоштовний рефакторинг, якщо рішення не проходить за навантаженням.

Процес роботи

  1. Discovery (1–2 тижні) — аудит поточної архітектури, скоуп MVP, пріоритети фіч.
  2. Проектування (1 тиждень) — вибір стеку, схема multi-tenancy, план білінгу.
  3. Розробка (4–12 тижнів) — спринти по 2 тижні, демо після кожного.
  4. Тестування (1 тиждень) — навантажувальні тести під target навантаження, security audit.
  5. Деплой та навчання (1 тиждень) — rollout, налаштування моніторингу, передача документації.

Орієнтири за термінами

Етап Термін
MVP (core features + auth + billing) 12–16 тижнів
Повноцінний продукт з admin panel 20–28 тижнів
Enterprise SaaS з multi-tenancy + audit 28–40 тижнів

Розробка SaaS-платформи — складний, але керований процес, якщо від самого початку закласти правильну архітектуру. Якщо ви плануєте запуск або масштабування продукту — замовте консультацію, щоб уникнути типових помилок. Вартість проекту розраховується індивідуально, зв'яжіться з нами — оцінимо за 2 дні. Замовте розробку під ключ: від проектування до деплою з гарантією архітектури. Перша година консультації — безкоштовно.