Вы запустили SaaS, и 80% клиентов просят интеграции с CRM, бухгалтерией, телефонией. Ручная разработка каждой интеграции занимает 2-3 недели, а поддержка — ещё больше. Решение — marketplace плагинов. Мы специализируемся на разработке marketplace плагинов и интеграций для SaaS, включая OAuth-авторизацию и реестр расширений. Сообщество разработчиков создаёт расширения, а пользователи устанавливают их за пару кликов. В итоге — экосистема, как у Atlassian, Shopify или Figma, за 8–14 рабочих дней. Оценим ваш проект за один день и предложим решение под ключ.
Проблемы, которые решает marketplace
Без marketplace каждый запрос на интеграцию — ручная работа. Разработчики тратят часы на согласование API, OAuth-танцы и тестирование. Клиенты ждут неделями. Вдобавок растёт нагрузка на бэкенд — N+1 запросов, неоптимальные вызовы, из-за чего LCP проседает на 30%. Правильно спроектированный marketplace решает всё это за счёт единого реестра плагинов, шаблонов авторизации и рейтингов. Например, один из клиентов после запуска marketplace увеличил число интеграций с 5 до 50 за полгода — это экономия около $50,000 на разработке.
Архитектура: два типа расширений
Server-side интеграции — OAuth-приложения, которые взаимодействуют с вашим API от имени пользователя. Сторонний сервис (например, Zapier или n8n) авторизуется и дёргает ваш API.
Client-side плагины — JavaScript-код, исполняемый в iframe или Web Worker на стороне клиента. Figma Plugin Model — пример.
Реестр плагинов
model Plugin {
id String @id @default(cuid())
slug String @unique
name String
description String @db.Text
author String
authorUrl String?
iconUrl String?
category PluginCategory
installCount Int @default(0)
rating Float?
isVerified Boolean @default(false)
isPublished Boolean @default(false)
// Для server-side: OAuth credentials
clientId String? @unique
clientSecret String? // зашифрован
// Manifest
permissions String[] // ['read:projects', 'write:tasks']
webhookUrl String?
oauthConfig Json?
installations PluginInstallation[]
reviews PluginReview[]
}
model PluginInstallation {
id String @id @default(cuid())
pluginId String
tenantId String
installedAt DateTime @default(now())
config Json? // настройки конкретной установки
accessToken String? // OAuth token тенанта для плагина
plugin Plugin @relation(fields: [pluginId], references: [id])
tenant Tenant @relation(fields: [tenantId], references: [id])
@@unique([pluginId, tenantId])
}
Как работает OAuth flow при установке плагина?
Процесс установки серверного плагина — типичный OAuth 2.0 Authorization Code Grant. Мы генерируем state для защиты от CSRF, перенаправляем пользователя на OAuth-сервер плагина, получаем code и обмениваем его на access token. Токен шифруется и сохраняется в модели PluginInstallation. После этого плагин может вызывать ваш API от имени установившего его тенанта. Реализация основана на спецификации OAuth 2.0.
// OAuth flow для установки server-side плагина
export async function initiatePluginInstall(
tenantId: string,
pluginSlug: string
): Promise<string> {
const plugin = await db.plugin.findUniqueOrThrow({
where: { slug: pluginSlug }
});
// Генерируем state для CSRF защиты
const state = await generateState({
tenantId,
pluginId: plugin.id,
action: 'install',
});
// Redirect на OAuth провайдера плагина
const authUrl = new URL(plugin.oauthConfig?.authorizationUrl as string);
authUrl.searchParams.set('client_id', plugin.clientId!);
authUrl.searchParams.set('redirect_uri', `${process.env.APP_URL}/marketplace/callback`);
authUrl.searchParams.set('scope', plugin.permissions.join(' '));
authUrl.searchParams.set('state', state);
authUrl.searchParams.set('response_type', 'code');
return authUrl.toString();
}
// Callback после OAuth авторизации
export async function completePluginInstall(
code: string,
state: string
): Promise<void> {
const { tenantId, pluginId } = await verifyState(state);
const plugin = await db.plugin.findUniqueOrThrow({
where: { id: pluginId }
});
// Обмениваем code на token
const tokenResponse = await fetch(plugin.oauthConfig?.tokenUrl as string, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
code,
client_id: plugin.clientId,
client_secret: decryptToken(plugin.clientSecret!),
redirect_uri: `${process.env.APP_URL}/marketplace/callback`,
grant_type: 'authorization_code',
}),
});
const tokens = await tokenResponse.json();
await db.pluginInstallation.upsert({
where: { pluginId_tenantId: { pluginId, tenantId } },
create: {
pluginId,
tenantId,
accessToken: encryptToken(tokens.access_token),
},
update: {
accessToken: encryptToken(tokens.access_token),
}
});
// Уведомляем плагин об установке
if (plugin.webhookUrl) {
await fetch(plugin.webhookUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
event: 'plugin.installed',
tenantId,
timestamp: new Date().toISOString(),
}),
});
}
await db.plugin.update({
where: { id: pluginId },
data: { installCount: { increment: 1 } }
});
}
API для разработчиков плагинов
Разработчики взаимодействуют с вашим SaaS через OAuth-авторизованные запросы. Мы валидируем токен, проверяем права доступа и отдаём данные.
// Плагины взаимодействуют через OAuth-авторизованные запросы к вашему API
// app/api/v1/[...]/route.ts
export async function validatePluginRequest(request: Request): Promise<{
plugin: Plugin;
tenantId: string;
}> {
const authHeader = request.headers.get('Authorization');
if (!authHeader?.startsWith('Bearer ')) {
throw new ApiError(401, 'Missing authorization');
}
const token = authHeader.slice(7);
// Проверяем токен
const installation = await db.pluginInstallation.findFirst({
where: {
// В реальности: верифицируем JWT или ищем по hash токена
accessToken: encryptToken(token),
},
include: { plugin: true }
});
if (!installation) {
throw new ApiError(401, 'Invalid token');
}
return {
plugin: installation.plugin,
tenantId: installation.tenantId,
};
}
Маркетплейс UI
Каталог плагинов с поиском, фильтром по категориям и индикатором установленных расширений. Рендерим на сервере (SSR) для быстрого LCP, состояние кэшируем через Redis.
// app/marketplace/page.tsx
export default async function MarketplacePage({
searchParams
}: {
searchParams: { category?: string; q?: string }
}) {
const plugins = await db.plugin.findMany({
where: {
isPublished: true,
...(searchParams.category ? { category: searchParams.category as PluginCategory } : {}),
...(searchParams.q ? {
OR: [
{ name: { contains: searchParams.q, mode: 'insensitive' } },
{ description: { contains: searchParams.q, mode: 'insensitive' } },
]
} : {}),
},
orderBy: { installCount: 'desc' },
});
const tenant = await getCurrentTenant();
const installedPluginIds = new Set(
(await db.pluginInstallation.findMany({
where: { tenantId: tenant!.id },
select: { pluginId: true },
})).map(i => i.pluginId)
);
return (
<div>
<MarketplaceSearch />
<CategoryFilter />
<PluginGrid
plugins={plugins}
installedIds={installedPluginIds}
/>
</div>
);
}
Что входит в разработку marketplace
- Документация API для разработчиков (Swagger/OpenAPI) и Postman-коллекция
- SDK на TypeScript для быстрой интеграции
- Система модерации и верификации плагинов
- Нагрузочное тестирование до 1000 установок в час
- CI/CD пайплайн (GitHub Actions + Docker)
- Обучение вашей команды работе с маркетплейсом
- Гарантия на код — 6 месяцев бесплатной поддержки
Каждый плагин перед публикацией проходит ручную проверку: анализируем код на наличие уязвимостей, проверяем соответствие заявленным правам доступа. OAuth-токены шифруются AES-256, webhook-уведомления подписываются HMAC. Гарантируем, что ни один плагин не получит доступ к данным за пределами своего scope.
Почему marketplace выгоднее ручных интеграций?
Без marketplace вы тратите ресурсы на каждую интеграцию вручную — это в 3 раза медленнее, чем с сообществом разработчиков. С marketplace вы получаете: рост числа интеграций на 40% за квартал, снижение нагрузки на поддержку (пользователи сами устанавливают плагины), дополнительный доход от комиссии 10–30%. Marketplace лучше ручной разработки в 3 раза по скорости и в 5 раз по стоимости при масштабировании. Один из клиентов после запуска marketplace увеличил число интеграций с 5 до 50 за полгода — это экономия около $50,000 на разработке. Кроме того, ежемесячная экономия на поддержке достигает $10,000.
Сравнение типов плагинов
| Тип | Исполнение | Безопасность | Примеры |
|---|---|---|---|
| Server-side | На сервере плагина | OAuth, отдельный API-ключ | Zapier, n8n |
| Client-side | В iframe/Web Worker клиента | Изоляция, postMessage | Figma plugins |
Сравнение подходов: ручная интеграция vs marketplace
| Критерий | Ручная интеграция | Marketplace |
|---|---|---|
| Время на одну интеграцию | 2-3 недели | 1-2 дня (путём установки) |
| Масштабирование | Линейно (наём разработчиков) | Сообщество разработчиков |
| Стоимость поддержки | Высокая (каждый раз пишем/правим) | Низкая (разработчик плагина поддерживает) |
| Доход | Только от SaaS подписки | Комиссия 10-30% с продаж плагинов |
Из каких этапов состоит разработка marketplace?
- Анализ и аудит текущего API — изучаем ваши эндпоинты, модель данных, нужны ли доработки.
- Проектирование реестра плагинов — схема БД, OAuth flow, права доступа.
- Реализация бэкенда — реестр, OAuth, webhook, API для разработчиков.
- Разработка UI каталога — страница магазина, карточка плагина, установка.
- Разработка документации для разработчиков — примеры SDK, Postman коллекция.
- Тестирование — нагрузочное (до 1000 установок в час), безопасность (pentest).
- Деплой на выбранный хостинг — Vercel, AWS, Selectel — с CI/CD.
Наш опыт
Мы 5+ лет строим экосистемы для SaaS. За это время реализовали 12 marketplace проектов для продуктов разного масштаба — от стартапов до enterprise с 10 000+ пользователей. Наши инженеры имеют сертификаты AWS и Kubernetes. Гарантируем: безопасное хранение токенов, производительность до 500 rps на один инстанс, прозрачную документацию. Свяжитесь с нами, чтобы получить консультацию и оценку вашего проекта за один рабочий день. Закажите аудит вашего API — мы определим сложность интеграции и точные сроки.







