Вы запустили 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 — мы определим сложность интеграции и точные сроки.







