От установки SDK до пейвола, прав и оплаты.

Быстрый старт

Плейсхолдеры в документации:

ПлейсхолдерСмысл
YOUR_API_URLБазовый URL Platform API
YOUR_APP_CODEКод приложения из админки
YOUR_PUBLIC_KEYPublic key rb_pub_…
YOUR_ACCESS_TOKENJWT пользователя из вашего Auth

1. Админка (один раз)

  1. Создайте приложение → YOUR_APP_CODE.
  2. Добавьте права (справочник фич, например premium_feature, cloud_sync).
  3. Создайте тарифы (главный объект: free / pro / cloud…) и привяжите к ним права; задайте цены.
  4. Создайте пейвол main — витрина цен этих тарифов для SDK.
  5. Скопируйте YOUR_PUBLIC_KEY.

2. TypeScript

import { RaidBossPlatformClient } from "@raidboss/platform-sdk";

const platform = new RaidBossPlatformClient({
  apiUrl: "YOUR_API_URL",
  applicationCode: "YOUR_APP_CODE",
  publicKey: "YOUR_PUBLIC_KEY",
  getAccessToken: async () => YOUR_ACCESS_TOKEN,
});

await platform.registerUser({
  platform: "web",
  // опционально — видно в админке Users
  // display_name: "Иван",
  // avatar_url: "https://cdn.example.com/a.jpg",
  // timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
});
// Нужен для «Устройства active» в аналитике / списке устройств в админке
await platform.registerDevice({
  installation_id: "stable-uuid-on-device", // один UUID на установку
  platform: "web",
  app_version: "1.0.0",
});

// После смены аватара в приложении:
// await platform.updateUserProfile({ avatar_url: "https://…" });

// Опционально: trackEvent с тем же installation_id + platform тоже обновляет last_seen
await platform.trackEvent({
  event: "app_opened",
  platform: "web",
  installation_id: "stable-uuid-on-device",
  app_version: "1.0.0",
});

const { data: paywall } = await platform.getPaywall("main");
const canPremium = await platform.hasEntitlement("premium_feature");

3. Flutter

final platform = RaidBossPlatformClient(
  apiUrl: 'YOUR_API_URL',
  applicationCode: 'YOUR_APP_CODE',
  publicKey: 'YOUR_PUBLIC_KEY',
  getAccessToken: () async => YOUR_ACCESS_TOKEN,
);

await platform.registerUser(
  platform: 'android',
  // optional — shown in admin Users
  // displayName: 'Ivan',
  // avatarUrl: 'https://cdn.example.com/a.jpg',
  // timezone: 'Europe/Moscow',
);
// Required for admin «Devices active» / device list
await platform.registerDevice(
  installationId: installationId, // one UUID per install
  platform: 'android',
  appVersion: '1.0.0',
);

// After avatar change:
// await platform.updateUserProfile(avatarUrl: 'https://…');

// Optional: trackEvent with the same installationId + platform also heartbeats last_seen
await platform.trackEvent(
  event: 'app_opened',
  platform: 'android',
  installationId: installationId,
  appVersion: '1.0.0',
);

final paywall = await platform.getPaywall(paywallCode: 'main');
final canPremium = await platform.hasEntitlement('premium_feature');

4. Покупка (только платные)

const price = paywall.paywall_items?.[0]?.plan_prices;
if (price && !RaidBossPlatformClient.isFreePrice(price)) {
  const { data } = await platform.createPayment({
    plan_price_id: String(price.id),
    return_url: "https://your.app/pay/return",
  });
  // открыть data.confirmation_url
}

Не вызывайте createPayment для free (is_free / works_offline / requires_purchase: false).

5. Правило гейтинга

если фича free-local → разрешить (даже offline)
иначе если есть сеть → sync entitlements, обновить кэш, проверить код
иначе → проверить кэш + expires_at

Далее: Права · Пользователи · Платежи · Офлайн