SiteForge

Техническая документация

SaaS-платформа для создания маркетплейсов, интернет-магазинов и досок объявлений. Пользователь выбирает тип сайта, модули, тему — и получает готовую платформу за минуты.

Next.js 16Payload CMS 3.xPostgreSQLTailwind CSS 4

1. О проекте

SiteForge — SaaS-платформа для создания маркетплейсов, интернет-магазинов и досок объявлений. Пользователь выбирает тип сайта, модули, тему — и получает готовую платформу за минуты. Каждый сайт = отдельный тенант в Payload CMS. Платформа управляет данными, медиа, заказами, отзывами и уведомлениями через единую инсталляцию Payload.

🛒 Магазин

Каталог, корзина, оформление заказов, приём платежей

🏪 Маркетплейс

Мультипродавцовая платформа с комиссией и рейтингами

📋 Доска объявлений

Публикация, модерация, категории, продвижение

2. Инфраструктура и доступы

Сервер:93.183.81.233 (root)
Пароль SSH:aywrNd3WUP-eyH
Путь проекта:/var/www/marketplace/
Домен:https://siteforge.rodnoy.site
PM2 процесс:siteforge (port 3010, fork mode)
Nginx:reverse proxy 443 → 3010
Admin CMS:admin@siteforge.rodnoy.site / Admin2024!secure
PostgreSQL:siteforge:siteforge2024secure@127.0.0.1:5432/siteforge
Node.js:v22.x (bun для start)
Деплой:npm run build → pm2 restart siteforge
Важно: SSH-доступ через Paramiko (Python), не через системный ssh-клиент. Файлы на сервере нужно писать через base64-кодирование, т.к. heredoc ломает backticks.

3. Архитектура

  • Next.js 16.2.6 — App Router, Server Components, Server Actions, standalone output
  • Payload CMS 3.85.x — headless CMS, PostgreSQL, REST + GraphQL API, Lexical editor
  • Мультитенантность — через @payloadcms/plugin-multi-tenant (настроен, customTenantField, tenant selector в админке)
  • Route Groups(site)/ для витрины, (payload)/ для админки Payload. У каждой группы свой layout с html/body
  • Изоляция данных — по tenant relationship в каждой коллекции. Доступ фильтруется через access control
  • Tailwind CSS 4 — стилизация, shadcn/ui компоненты
  • withPayload() — в next.config.ts, авто-генерирует importMap при build
Критичные особенности Payload 3.x:
  • getPayload({ config }), НЕ устаревший payload.init()
  • @payload-config path alias → ./payload.config.ts в корне проекта
  • Server Actions: 'use server' обязателен для serverFunction
  • handleServerFunctions из @payloadcms/next требует /* webpackIgnore: true */ dynamic import
  • RootLayout из @payloadcms/next/layouts рендерит свой html/body — нельзя вкладывать
  • @payloadcms/next/css ОБЯЗАТЕЛЬНО импортировать в layout для стилей админки
  • При добавлении новой auth-коллекции нужно вручную обновлять таблицу payload_preferences_rels (добавить колонку collectionname_id)

4. Коллекции Payload CMS

КоллекцияОписаниеКлючевые поляAuth
tenantsТенанты/сайтыname, slug, type, modules (json), theme (json), settings (json)
usersАдминистраторы CMSemail, role, tenants[]Да (built-in)
productsТоварыname, slug, price, oldPrice, category, images[], features, description, status, stock, tenant
categoriesКатегорииname, slug, parent, image, icon, order, filters (json), tenant
ordersЗаказыorderNumber, status, customer, items (json), total, shippingAddress (json), promoCode, paymentMethod, tenant
reviewsОтзывыauthor, rating (1-5), content, product, tenant, verified, pros, cons
pagesСтраницы (редактор)title, slug, type (home/custom/category/landing), modules (json), published, tenant, seoTitle, seoDescription
notificationsУведомленияtype, title, message, read, relatedId, relatedType, tenant
mediaМедиафайлыurl, alt, tenant
listingsОбъявленияtitle, description, price, status, images[], category, tenant
sellersПродавцыname, description, rating, logo, tenant
customersПокупателиemail, name, phone, favorites (json), compareList (json), addresses (json), tenantДа (useAPIKey)
Hooks: createNotification — beforeChange hook на Orders, автоматически создаёт уведомление при новом заказе.

5. Модульная система

tenant.modules — JSON-массив активных модулей. Каждый модуль управляет доступностью функционала. Хук useModule(name) проверяет наличие модуля в контексте.

МодульСтатусЧто включает
catalog✅ РеализованКаталог товаров, категории, фильтрация по цене, поиск, grid/list toggle
cart✅ РеализованКорзина, промокод, оформление заказа (гостевой чекаут), прогресс-бар, выбор доставки/оплаты
payments⏳ ФронтендВыбор способа оплаты (визуально). Бэкенд Stripe/другой будет позже
classifieds✅ РеализованОбъявления, модерация, категории
marketplace✅ РеализованПродавцы, мультипродавцовая платформа
search✅ ПлагинПоиск через @payloadcms/plugin-search (products, categories, listings)
reviews✅ РеализованОтзывы с рейтингом, верификацией, плюсами/минусами
email⏳ По командеНастройки уведомлений. Email-адаптер Resend установлен, но не активирован — включить по команде заказчика
analytics✅ РеализованДашборд аналитики с графиками выручки, заказов, топ товаров
seo✅ ПлагинSEO через @payloadcms/plugin-seo (products, pages), tabbedUI, автогенерация title/description
chat✅ РеализованЧат покупатель-продавец. Коллекции ChatRooms + Messages, API routes, UI списка чатов и переписки. Socket.IO для реалтайма (отдельный PM2 процесс siteforge-socket на порту 3011). Хук useChatSocket для подключения.
notifications✅ РеализованАвто-уведомления о заказах, CRUD, страница уведомлений

6. Тематизация

tenant.theme — JSON с настройками внешнего вида. Компонент ThemeStyles инжектит CSS-переменные. Контекст TenantContext предоставляет данные через хуки useTenant() и useModule(name).

CSS-переменные

--sf-primary
--sf-secondary
--sf-accent
--sf-bg / --sf-text
--sf-border-radius
--sf-font-heading / --sf-font-body

Структура theme JSON

{
  "colors": {
    "primary": "#7c3aed",
    "secondary": "#06b6d4",
    "accent": "#f1f5f9",
    "bg": "#ffffff",
    "text": "#1e293b"
  },
  "fonts": {
    "heading": "Inter",
    "body": "Inter"
  },
  "borderRadius": "8px"
}

6 предустановленных тем + произвольные цвета через админку. Утилитарные классы: .sf-btn-primary, .sf-card, .sf-badge, .sf-link, .sf-input

7. Маршруты

МаршрутТипОписание
/СерверныйЛендинг SiteForge (маркетинговая страница)
/onboardingКлиентский5-шаговый wizard создания сайта
/editorКлиентскийВизуальный редактор страниц (3-панельный)
/loginКлиентскийАвторизация администратора платформы
/demoКлиентскийИнтерактивная демонстрация платформы
/tzСерверныйТехническая документация (эта страница)
/adminPayload CMSАдмин-панель Payload (/admin/[[...segments]])
/api/*Payload CMSREST API Payload
/graphqlPayload CMSGraphQL API Payload
/{siteId}СерверныйГлавная страница тенанта
/{siteId}/catalogКлиентскийКаталог товаров (фильтры, поиск, toggle)
/{siteId}/product/{id}СмешанныйКарточка товара + ProductClient.tsx
/{siteId}/cartКлиентскийКорзина + промокод + доставка + оплата
/{siteId}/searchКлиентскийПоиск по товарам через Payload API
/{siteId}/favoritesКлиентскийИзбранное (localStorage + CustomerAuth sync)
/{siteId}/compareКлиентскийСравнение товаров (макс. 4)
/{siteId}/accountКлиентскийЛичный кабинет (профиль/заказы/адреса)
/{siteId}/authКлиентскийАвторизация/регистрация покупателя
/{siteId}/order-successКлиентскийПодтверждение заказа
/{siteId}/adminКлиентскийПанель администратора тенанта
/{siteId}/admin/productsКлиентскийCRUD товаров тенанта
/{siteId}/admin/categoriesКлиентскийCRUD категорий тенанта
/{siteId}/admin/ordersКлиентскийЗаказы тенанта + детали
/{siteId}/admin/analyticsКлиентскийДашборд аналитики
/{siteId}/admin/mediaКлиентскийМедиа тенанта
/{siteId}/admin/settingsКлиентскийНастройки тенанта
/{siteId}/admin/notificationsКлиентскийУведомления тенанта
/{siteId}/chatКлиентскийСписок чатов покупателя
/{siteId}/chat/{chatId}КлиентскийОкно переписки чата
/{siteId}/admin/chatКлиентскийУправление чатами тенанта
/{siteId}/admin/sellersКлиентскийУправление продавцами тенанта
/{siteId}/admin/listingsКлиентскийУправление объявлениями тенанта
/{siteId}/checkoutКлиентскийОформление заказа с прогресс-баром (гостевой чекаут)
/{siteId}/admin/promoКлиентскийУправление промокодами тенанта
POST /api/promo/validateAPI RouteВалидация промокода
POST /api/payments/yookassaAPI RouteСоздание платежа ЮKassa
POST /api/payments/yookassa/webhookAPI RouteВебхук ЮKassa (подтверждение оплаты)
GET /api/loyaltyAPI RouteДанные программы лояльности
POST /api/loyaltyAPI RouteНачисление/списание баллов
GET /api/geolocationAPI RouteГеолокация по IP
POST /api/themeAPI RouteОбновление темы тенанта
POST /api/crm/webhookAPI RouteCRM вебхуки
GET /api/crm/exportAPI RouteЭкспорт товаров CSV/JSON
GET /{siteId}/ordersКлиентскийСтраница отслеживания заказов
POST /api/orders/trackAPI RouteАнонимное отслеживание заказа (order# + email)
GET /api/orders/myAPI RouteЗаказы авторизованного пользователя
POST /api/customers/social-loginPayload CMSСоциальный вход bridge (VK, Google OAuth → Customer)
/{siteId}/listingsСмешанныйСписок объявлений (для типа classifieds)
/{siteId}/seller/{sellerId}/{siteId}/listing/{listingId}Смешанный

8. Ключевые компоненты и контексты

🏪

TenantContext

src/components/tenant/TenantContext.tsx

React-контекст для данных тенанта (modules, theme, settings). Хуки: useTenant(), useModule(name). Provider в layout тенанта.

🎨

ThemeStyles

src/components/tenant/ThemeStyles.tsx

Клиентский компонент. Инжектит CSS-переменные --sf-* из tenant.theme. Используется в layout тенанта.

🔐

CustomerAuth

src/components/tenant/CustomerAuth.tsx

React-контекст для авторизации покупателей. JWT-токены через Payload API. Хуки: useCustomerAuth(), useIsLoggedIn(). Синхронизация favorites/compareList с сервером.

🛒

CartScript

src/components/tenant/CartScript.tsx

Клиентская корзина на localStorage. Синхронизирует badge в шапке через monkey-patching localStorage.setItem. Атрибуты data-add-cart.

📦

Модульная система

tenant.modules (json)

Управляет доступностью страниц и навигации. useModule(name) проверяет наличие. Недоступные модули показывают заглушки.

📝

Editor

src/app/(site)/editor/page.tsx

3-панельный визуальный редактор. Макеты сохраняются в Payload Pages collection как JSON с модулями.

📊

CheckoutProgress

src/components/tenant/CheckoutProgress.tsx

Прогресс-бар оформления заказа. Шаги: Контакт → Доставка → Оплата → Подтверждение. Анимированная полоса, кликабельная навигация.

🚚

DeliveryInfo

src/components/tenant/DeliveryInfo.tsx

Блок информации о доставке на карточке товара. Показывает стоимость и порог бесплатной доставки. Интеграция с СДЭК.

🛍️

AddToCartButton

src/components/tenant/AddToCartButton.tsx

Кнопка добавления в корзину с анимацией. Также кнопки избранного и сравнения. Интеграция с CartContext, FavoritesContext, CompareContext.

💡

RecommendationsBlock

src/components/tenant/RecommendationsBlock.tsx

Блок «С этим покупают» / «Похожие товары» на карточке товара. Загрузка товаров из той же категории через Payload API.

🛒

CartContext

src/contexts/CartContext.tsx

React-контекст корзины на localStorage. addItem, removeItem, updateQuantity, clearCart, totalPrice, totalItems. Привязка к тенанту по slug.

❤️

FavoritesContext

src/contexts/FavoritesContext.tsx

React-контекст избранного. Синхронизация с CustomerAuth при авторизации. Локальное хранение для гостей.

⚖️

CompareContext

src/contexts/CompareContext.tsx

React-контекст сравнения товаров (макс. 4). Синхронизация с сервером при авторизации.

9. Плагины Payload CMS — анализ и план

Payload CMS имеет 13 официальных плагинов. Ниже — анализ каждого в контексте SiteForge, приоритет и статус.

Установленные

@payloadcms/plugin-multi-tenantАктивен

Плагин мультитенантности. Подключён в payload.config.ts. Настроен с customTenantField: true на всех коллекциях (используются существующие tenant поля). Tenant selector в админке. Автоматическая фильтрация данных по тенанту. Пользователи привязаны к тенантам через tenants array field.

@payloadcms/richtext-lexicalАктивен

Редактор Rich Text. Используется как основной редактор в buildConfig.

Приоритет 1 — Обязательные (✅ Все выполнены)

@payloadcms/plugin-seoАктивен

SEO-оптимизация: мета-теги, Open Graph, превью в Google/Social. Подключён для products и pages с tabbedUI. Автогенерация title из name, description из shortDescription. uploadsCollection: media. URL генерация по slug.

@payloadcms/plugin-searchАктивен

Полнотекстовый поиск. Подключён для products, categories, listings. Создаёт search-коллекцию с индексами. API: /api/search?q=запрос. Поддержка multi-tenant через skipSync. Быстрый поиск с ранжированием.

@payloadcms/plugin-multi-tenantНастроить

Мультитенантность — ядро SiteForge. Должен быть правильно настроен: tenant selector в админке, автоматическая фильтрация данных, tenant-specific access control. Без правильной настройки данные разных тенантов могут смешиваться.

Приоритет 2 — Рекомендуемые

@payloadcms/plugin-stripeНе установлен

Интеграция Stripe. Двусторонняя синхронизация: Payload ↔ Stripe. Подписки, платежи, вебхуки. Для маркетплейса: комиссии, выплаты продавцам, рекуррентные платежи за подписку тенантов. Пользователь сказал "платежи потом", но плагин нужно держать в плане.

@payloadcms/plugin-form-builder⏳ По команде

Конструктор форм в админке. Установлен в package.json, но конфликтует с plugin-multi-tenant при инициализации Payload. Включить по команде заказчика — потребуется отладка совместимости или обновление Payload.

@payloadcms/plugin-nested-docsАктивен

Вложенные документы с breadcrumbs для categories. Автоматические breadcrumbs-таблица, вложенные URL. Parent relation управляется плагином.

@payloadcms/plugin-redirectsАктивен

Управление редиректами из админки. 301/302 редиректы, связь с products/pages/categories. Поддержка внутренних ссылок и кастомных URL.

@payloadcms/plugin-cloud-storage⏳ По команде

Облачное хранилище медиа (S3, GCS, Azure). Сейчас файлы хранятся локально на сервере — это не масштабируется. Для продакшена нужен S3/MinIO. Плагин поддерживает несколько провайдеров. Реализация — по команде заказчика.

Приоритет 3 — Полезные

@payloadcms/plugin-import-export⏳ По команде

Импорт/экспорт данных CSV/JSON. Установлен в package.json, но вызывает payloadInitError при подключении. Включить по команде заказчика — может потребоваться обновление Payload или изменение порядка плагинов.

@payloadcms/plugin-sentryНе установлен

Интеграция Sentry для мониторинга ошибок. В продакшене без этого не обойтись — автоматический трекинг ошибок API, производительности, пользовательских сессий.

@payloadcms/plugin-mcpНе установлен

Model Context Protocol — позволяет AI-ассистентам работать с данными Payload. Интересно для будущего: AI-помощник для продавцов, автоматическое SEO, генерация описаний товаров.

@payloadcms/plugin-ecommerceНе установлен

E-commerce расширение Payload. Новейший плагин. Проверить что он даёт поверх наших коллекций — возможно, готовые решения для корзины, чекаута, налогов.

Нужные функции (не плагины Payload)

💬

Чат покупатель-продавец

Реализован

Коллекции ChatRooms + Messages. API routes для CRUD чатов и сообщений. UI: список чатов, окно переписки. Socket.IO реалтайм (PM2 процесс siteforge-socket на порту 3011). Хук useChatSocket для подключения. Админ-панель чатов.

📧

Email-адаптер

⏳ По команде

Resend-адаптер установлен в payload.config.ts. Сейчас RESEND_API_KEY пустой — письма пишутся в консоль. Реальная отправка писем будет включена по команде заказчика (подтверждение регистрации, восстановление пароля, уведомления о заказах).

🔔

Push-уведомления

Реализован

Web Push API для уведомлений в браузере. API route /api/push (subscribe/unsubscribe/send). Хук usePushNotifications. VAPID-ключи в .env. Хранение подписок в JSON (TODO: мигрировать в Payload-коллекцию).

🚚

Доставка СДЭК/CDEK

API готов

CDEKClient реализован: расчёт стоимости, создание отправления, отслеживание, поиск городов, точки выдачи. API route /api/delivery/cdek. Нужны ключи CDEK_ACCOUNT_ID и CDEK_SECURE_PASSWORD для активации.

📊

Продвинутая аналитика

Расширенный

Дашборд с: воронка конверсии, Retention (удержание клиентов), LTV, ср. чек, топ товары, заказы по статусам, рейтинги отзывов, география заказов по городам.

🔍

SEO-оптимизация

Реализовано

SEO-плагин активен. Добавлено: sitemap.ts для автогенерации sitemap.xml по каждому тенанту, robots.ts для robots.txt, JSON-LD structured data на карточках товаров.

10. Дорожная карта разработки

План основан на результатах UX-аудита (подробности на отдельной странице), анализе конкурентов и текущем состоянии платформы. Фазы выстроены по принципу максимального влияния на конверсию и пользовательский опыт. Каждая фаза = 1-2 недели разработки.

Фаза 0 — Выполнено (базовая инфраструктура)

Настройка @payloadcms/plugin-multi-tenant — мультитенантность, tenant selector, автофильтрация
Установка @payloadcms/plugin-seo — мета-теги, Open Graph, sitemap.ts, robots.ts
Установка @payloadcms/plugin-search — полнотекстовый поиск, /api/search
Установка @payloadcms/plugin-nested-docs — вложенные категории, breadcrumbs
Установка @payloadcms/plugin-redirects — 301/302 редиректы из админки
Чат покупатель-продавец — ChatRooms, Messages, Socket.IO реалтайм, typing-индикатор
Push-уведомления — Web Push API, VAPID-ключи, /api/push
Аналитика — дашборд: выручка, воронка, LTV, топ товары, география
Доставка СДЭК — CDEKClient, расчёт стоимости, точки выдачи
SEO — JSON-LD structured data, sitemap.xml, robots.txt
Модули — catalog, cart, classifieds, marketplace, reviews, notifications, chat

Фаза 1 — Критичный UX (P0) — ВЫПОЛНЕНО

Все задачи P0 реализованы. Гостевой чекаут, прогресс-бар, доставка на карточке, breadcrumbs, toast-уведомления.

Гостевой чекаут

Выполнено

Разрешить покупку без регистрации. После оплаты предложить создать аккаунт с предзаполненными данными. Реализация: отдельный API route /api/orders/guest, форма без обязательного пароля, сохранение заказа в сессии. Влияние: +30-45% конверсия чекаута (Baymard Institute).

Файлы: cart/page.tsx, api/orders/guest/route.ts, auth/page.tsxСложность: Средний

Прогресс-бар оформления заказа

Выполнено

Визуальные шаги: Корзина → Данные → Доставка → Оплата. Пользователь видит сколько шагов осталось и может вернуться. Компонент CheckoutProgress с анимированной полосой. Влияние: +15-20% завершение чекаута.

Файлы: cart/page.tsx (новый компонент CheckoutProgress)Сложность: Низкий

Стоимость доставки на карточке товара

Выполнено

Показывать расчёт СДЭК прямо на странице товара: «Доставка от 290 ₽ / бесплатно от 3 000 ₽». Для доски объявлений — «Доставка возможна» / «Только самовывоз». Вызов CDEKClient.calculate с кешированием. Влияние: +68% доверие к покупке.

Файлы: product/[id]/page.tsx, api/delivery/cdek/route.tsСложность: Средний

Breadcrumbs (хлебные крошки)

Выполнено

Навигационная цепочка на всех страницах: Главная → Категория → Товар. Использовать @payloadcms/plugin-nested-docs breadcrumbs. Добавить Breadcrumbs компонент в layout тенанта. Влияние: предсказуемость навигации, SEO.

Файлы: components/tenant/Breadcrumbs.tsx, [siteId]/layout.tsxСложность: Низкий

Toast-уведомления на действия

Выполнено

Мгновенная обратная связь: добавление в корзину, добавление в избранное, отправка отзыва, ошибки формы. Компонент Toaster на shadcn/ui sonner. Влияние: пользовательская уверенность в действиях.

Файлы: components/ui/toaster.tsx, cart/favorites/reviews интеграцияСложность: Низкий

Фаза 2 — Продуктовый UX (P1) — ВЫПОЛНЕНО (6/6)

Все 6 задач реализованы. Социальные входы VK/Google (NextAuth.js), Quick View, рекомендации, CSV импорт, фильтры, отзывы с фото + рейтинг продавца.

Быстрый просмотр товара (Quick View)

✅ Готово

Модальное окно при клике на карточку каталога: фото, цена, характеристики, кнопка «В корзину». Без перехода на отдельную страницу. Компонент ProductQuickView с overlay. Влияние: +20% удобство просмотра каталога.

Файлы: catalog/page.tsx, components/ProductQuickView.tsxСложность: Средний

Рекомендации «С этим покупают» и «Похожие товары»

✅ Готово

Блоки на карточке товара и в корзине. Алгоритм: товары из той же категории + товары в заказах с текущим. API route /api/products/recommendations. Кеширование на 5 мин. Влияние: +10-30% средний чек.

Файлы: product/[id]/page.tsx, cart/page.tsx, api/products/recommendations/route.tsСложность: Средний

Социальные входы (VK, Google)

✅ Готово

NextAuth.js интеграция: NextAuthProvider (SessionProvider) добавлен в layout, social login bridge API (/api/customers/social-login), CustomerAuth синхронизирован с NextAuth session, страница /auth использует socialLogin() метод, VK и Google OAuth кнопки работают (credentials настраиваются в .env). Автосоздание Customer записи. Влияние: +20% конверсия регистрации.

Файлы: auth/page.tsx, api/auth/[...nextauth]/route.ts, api/customers/social-login/route.ts, payload/customers.ts, layout.tsxСложность: Средний

Массовая загрузка товаров (CSV/Excel)

✅ Готово

API route /api/products/import — приём CSV/Excel, валидация, создание товаров пачкой. Прогресс-бар загрузки. Шаблон CSV для скачивания. Критично для B2B-продавцов. Влияние: +50% привлечённых продавцов.

Файлы: api/products/import/route.ts, admin/products/page.tsx (кнопка «Импорт»)Сложность: Высокий

Расширенные фильтры в каталоге

✅ Готово

Фильтры по характеристикам (бренд, размер, цвет и т.д.), сохранение фильтров в URL (query params), фасетный счётчик товаров. Компонент FacetedFilters реализован. Базовые фильтры + фасетные фильтры по features. Влияние: +20-30% удобство поиска.

Файлы: catalog/page.tsx, components/FacetedFilters.tsxСложность: Средний

Отзывы с фото + рейтинг продавца

✅ Готово

Отзывы с фото: коллекция reviews уже имела поле photos (upload, relationTo: media, hasMany: true, maxRows: 5), ReviewForm получил UI загрузки фото с превью, на карточке товара фото отзывов отображаются в галерее. Исправлен баг синтаксиса ReviewForm и API отзывов. Рейтинг продавца на карточке товара. Бейдж «Проверенный продавец». Ссылка на страницу продавца. Кнопка «Написать продавцу». Страница продавца seller/[sellerId]. Влияние: +40% доверие к покупке.

Файлы: product/[id]/page.tsx, seller/[sellerId]/page.tsx, payload/collections/modules/Reviews.ts, components/ReviewForm.tsxСложность: Средний

Фаза 3 — Рост и удержание (P2) — ВЫПОЛНЕНО (11/11)

Функции для масштабирования платформы и повышения возврата пользователей. Все 11 задач выполнены. Промокоды, PWA, ЮKassa, уведомления, SEO, Schema.org, карточка товара, Wishlist, отслеживание заказов — всё готово.

Модерация объявлений

✅ Готово

Ручная модерация из админки + авто-модерация по стоп-словам (словарь). Статусы: на модерации / одобрено / отклонено. API /api/listings/moderate. Кнопки «Одобрить/Отклонить» в админке. Массовая автомодерация. Влияние: качество контента.

Сложность: Высокий

Уведомления о снижении цены в избранном

✅ Готово

API /api/products/price-drop: проверка подписок на товары в избранном, создание уведомлений при снижении цены. Поддержка массовой проверки и точечной проверки по товару. Влияние: +25% возврат пользователей.

Сложность: Средний
3

PWA с офлайн-режимом

P2

next-pwa плагин, service worker для кеширования карточек товаров и каталога. manifest.json с иконками. Install prompt на мобильных. Offline fallback страница. Влияние: +30% удержание, нативное ощущение.

Сложность: Средний
4

Платёжные системы РФ (ЮKassa / СБП)

P2

Интеграция ЮKassa для приёма платежей (карты, СБП, SberPay). API route /api/payments/yookassa. Webhook для подтверждения оплаты. Альтернатива Stripe, который не работает в РФ. Влияние: критично для монетизации.

Сложность: Высокий
5

Промокоды и акции для продавцов

P2

Коллекция PromoCodes: код, тип (% или ₽), минимальная сумма, срок действия, лимит использований. Применение в корзине. Seller dashboard: создание промокодов. Влияние: маркетинговый инструмент продавцов.

Сложность: Средний

SEO мета-теги (title, description, OG tags)

✅ Готово

Выполнено: generateMetadata на всех страницах (layout, home, catalog, product), OG tags, twitter cards, canonical URLs. Использует tenant.settings.seoTitle/seoDescription. Влияние: +50% CTR в поисковой выдаче.

Сложность: Средний

Schema.org разметка (Product, Review, BreadcrumbList)

✅ Готово

Выполнено: JSON-LD Product schema (offers, aggregateRating, reviews), BreadcrumbList schema на странице товара. Google Rich Results. Влияние: расширенные сниппеты в поиске, +30% CTR.

Сложность: Средний

Улучшения карточки товара (галерея, zoom, tabs)

✅ Готово

Выполнено: ProductGallery с zoom + thumbnails, ProductTabs (Описание/Характеристики/Отзывы), FavoriteButton на карточке товара. Влияние: +25% вовлечённость на карточке.

Сложность: Средний

Wishlist / Избранное

✅ Готово

Выполнено: server sync для авторизованных пользователей, merge localStorage + server favorites, toast notifications, FavoriteButton на карточке товара. Влияние: +15% возврат пользователей.

Сложность: Средний

Отслеживание заказов

✅ Готово

Выполнено: /{siteId}/orders — страница с анонимным трекингом (order# + email) и списком заказов для авторизованных. API: POST /api/orders/track и GET /api/orders/my. Влияние: -40% обращений в поддержку.

Сложность: Средний
11

Уведомления (email + push)

P3

Email-уведомления через Resend: подтверждение заказа, смена статуса, восстановление пароля. Push-уведомления через Web Push API. Настройки уведомлений в личном кабинете. Шаблоны писем с брендингом тенанта. Влияние: +20% вовлечённость.

Сложность: Высокий

Фаза 4 — Масштабирование (P3) — ВЫПОЛНЕНО (5/5)

Все 5 стратегических функций реализованы.

1

Программа лояльности

P3

Реализовано: LoyaltyAccounts collection (баллы, тиры, кешбэк 1-5%), Referrals collection (реферальные коды, бонусы 50/100 баллов). API /api/loyalty (GET/POST — начисление/списание), /api/referral (GET/POST — клики, регистрация, конверсия). LoyaltyDashboard UI с 3 табами: обзор/история/рефералка. Интеграция в checkout: начисление кешбэка + оплата баллами (до 30%). Ссылка /ref/[code] для рефералов. Шаринг в Telegram/WhatsApp/VK.

Сложность: Высокий
2

Геолокация товаров

P3

Реализовано: API /api/geolocation (определение по IP через ip-api.com), /api/regions (региональные настройки). Regions collection (множители цен/доставки, способы доставки). GeoContext provider (браузерная геолокация + reverse geocoding + IP fallback). CitySelector компонент в хедере (12 популярных городов, поиск, localStorage). Событие city-changed для реактивной фильтрации.

Сложность: Средний
3

Мультиязычность (RU / EN)

P3

Реализовано: I18nProvider context (ru/en), localStorage persistence. Словари ru.ts/en.ts с секциями: common, product, cart, checkout, loyalty, referral, geo, auth. LanguageSwitcher компонент (Globe icon, toggle ru/en). Автоопределение языка браузера. Расширенные словари для новых модулей лояльности/геолокации/рефералки.

Сложность: Высокий
4

Визуальный редактор тем

P3

Реализовано: Tenant.theme JSON с цветами/шрифтами/radius. CSS custom properties (--sf-primary, --sf-bg, --sf-text). ThemeStyles компонент для инъекции стилей. API /api/theme для сохранения. Визуальный редактор в админке: color picker, font selector. Базовые шаблоны тем. Drag-and-drop и live-preview — в roadmap для следующей итерации.

Сложность: Высокий
5

Интеграции с CRM (МойСклад, 1С)

P3

Реализовано: /api/crm/webhook для входящих хуков, /api/crm/export для экспорта данных. Webhook API для Bitrix24/AmoCRM/МойСклад. Маппинг полей заказов и покупателей. Модуль интеграций в настройках тенанта. Базовая синхронизация заказов. Глубокая 1С-интеграция — в roadmap.

Сложность: Высокий

По команде заказчика

Email-адаптер (Resend) — RESEND_API_KEY не заполнен, письма пишутся в консоль
S3/Cloud Storage — плагин установлен, но не активирован (MinIO / AWS S3)
@payloadcms/plugin-form-builder — конфликтует с plugin-multi-tenant
@payloadcms/plugin-import-export — вызывает payloadInitError при подключении
@payloadcms/plugin-stripe — для рынков вне РФ (Stripe не работает в России)
@payloadcms/plugin-sentry — нужен Sentry DSN для мониторинга ошибок

Сводка дорожной карты

38
Выполнено
0
P0 — Выполнено
6/6
P1 — Продукт ✅
11/11
P2 — Рост ✅
5/5
P3 — Масштаб ✅
6
По команде
0
Готово!

11. Известные проблемы и решения

Решено

PM2 частые рестарты (18+)

Исправлено: importMap настроен для multi-tenant компонентов, DB column tenant_id исправлен, sharp установлен.

Решено

/admin 500 ошибка после добавления Customers

В payload_preferences_rels не хватало колонки customers_id. Исправлено: ALTER TABLE ADD COLUMN + FK constraint + index.

Решено

React hydration #418

Исправлено через route groups: (site)/ и (payload)/ с отдельными html/body в каждом layout.

Решено

Missing Payload CSS

Обязательный импорт @payloadcms/next/css в (payload)/layout.tsx.

Ок

payload migrate:create не работает

ESM проблема с tsx. Миграции нужно выполнять вручную через SQL (ALTER TABLE).

Ок

Sharp warning при запуске

Установлен sharp, но warning persists — не критично, resize работает.

Ок

Email пишется в консоль

Нужен email-адаптер (Resend/SendGrid). Пока не критично для разработки.

Решено

Multi-tenant plugin не настроен

Плагин подключён в payload.config.ts. Настроен customTenantField на всех коллекциях. Tenant selector в админке. Автофильтрация по тенанту. DB column users_tenants.tenants_id переименован в tenant_id.

12. Структура ключевых файлов

src/
├── app/
│   ├── (payload)/              # Payload CMS admin + API
│   │   ├── admin/[[...segments]]/page.tsx
│   │   ├── api/[...slug]/route.ts
│   │   ├── graphql/route.ts
│   │   └── layout.tsx          # RootLayout from @payloadcms/next
│   ├── (site)/                 # Публичные страницы
│   │   ├── [siteId]/           # Страницы тенанта
│   │   │   ├── layout.tsx      # TenantProvider + CustomerAuth + ThemeStyles
│   │   │   ├── page.tsx        # Главная (Hero, категории, новинки)
│   │   │   ├── catalog/        # Каталог с фильтрами
│   │   │   ├── product/[id]/   # Карточка товара + ProductClient
│   │   │   ├── cart/           # Корзина + чекаут
│   │   │   ├── search/         # Поиск
│   │   │   ├── favorites/      # Избранное
│   │   │   ├── compare/        # Сравнение (макс 4)
│   │   │   ├── account/        # Личный кабинет
│   │   │   ├── auth/           # Логин/регистрация покупателя
│   │   │   ├── order-success/  # Подтверждение заказа
│   │   │   └── admin/          # Админ-панель тенанта
│   │   ├── onboarding/         # 5-шаговый wizard
│   │   ├── editor/             # Визуальный редактор
│   │   ├── login/              # Авторизация платформы
│   │   ├── demo/               # Демо
│   │   ├── tz/                 # Эта страница
│   │   └── page.tsx            # Лендинг SiteForge
│   └── api/                    # Custom API routes
├── components/
│   ├── tenant/                 # TenantContext, ThemeStyles, CustomerAuth, CartScript
│   ├── tenant-admin/           # Sidebar, Header для админки тенанта
│   └── ui/                     # shadcn/ui компоненты
├── payload/
│   ├── collections/            # Tenants, Users, Sites, Media
│   ├── collections/modules/   # Products, Categories, Orders, Reviews, etc.
│   ├── hooks/                  # createNotification
│   └── payload.config.ts       # Основной конфиг Payload
├── themes/                     # Предустановленные темы (ozon.ts, types.ts)
├── views/                      # View компоненты (HomeView, CartView, etc.)
└── modules/                    # Переиспользуемые модули (Header, ProductCard, etc.)

13. Команды для работы

# Деплой на продакшен

cd /var/www/marketplace && npm run build && pm2 restart siteforge

# Проверить статус

pm2 status siteforge

# Логи

pm2 logs siteforge --lines 50 --nostream

# Установить новый плагин Payload

cd /var/www/marketplace && npm install @payloadcms/plugin-seo

npm run build && pm2 restart siteforge

# SQL миграция (при добавлении auth-коллекции)

PGPASSWORD=siteforge2024secure psql -h 127.0.0.1 -U siteforge -d siteforge

ALTER TABLE payload_preferences_rels ADD COLUMN newcollection_id INTEGER;

# Тест API

curl -s http://localhost:3010/api/tenants | head -200

14. UX-аудит и анализ конкурентов

Подробный UX-аудит платформы, анализ мировых практик e-commerce и классифайдов, пожелания пользователей, приоритетные рекомендации (P0-P3), а также сравнительный анализ конкурентов в России и мире вынесены на отдельную страницу.

🔍
Открыть UX-аудит и анализ конкурентов
Мировые практики · 29 конкурентов · Приоритеты P0-P3
5 принципов UX — навигация, шаги до цели, обратная связь, мобильные, доверие
29 конкурентов — InSales, CS-Cart, Sharetribe, Yclas, Avito и другие
12 рекомендаций — от гостевого чекаута до геолокации товаров

SiteForge — Техническая документация · Обновлено 15.06.2026