Заказы и личный кабинет покупателя

Статусы заказа, webhook'и, возвраты, отмена, /my для клиентов, уведомления.

Заказы и личный кабинет покупателя

Статусы заказа

СтатусЧто значит
draftСоздан, клиент ещё не подтвердил данные на чекауте. Сток не лочится.
pending_paymentСсылка отдана клиенту, ждём оплату от провайдера. Сток залочен.
awaiting_codКлиент выбрал оплату при получении. Провайдер не вызывается.
paidОплачен (webhook payment.succeeded). Сток списан окончательно.
cancelledОтменён клиентом или бизнесом до оплаты. Сток возвращён.
refundedБыл оплачен, потом сделан возврат.
expiredСсылка протухла, оплата не дошла за TTL (cron auto-cancel).

Переходы:

draft ─┬─→ pending_payment ─┬─→ paid ──→ refunded
       │                    └─→ cancelled / expired
       └─→ awaiting_cod ────┬─→ paid (отметка вручную)
                            └─→ cancelled

Webhook'и

Когда платёж проходит у провайдера (YooKassa / CloudPayments / Tinkoff / Robokassa), он шлёт webhook на сервер Framix. Сервер:

  1. Проверяет подпись (для CloudPayments/Tinkoff — отдельный webhookSecret, если указан, иначе основной ключ; для YooKassa — basic auth по shopId:secretKey).
  2. Находит commerce_order по providerPaymentId.
  3. Меняет статус (paid / cancelled / refunded / expired).
  4. Списывает commission Framix в commerce_operation.
  5. Декрементирует/возвращает сток.
  6. Триггерит уведомления (email клиенту, push владельцу, сообщение в чат-сессию агента, Telegram/VK).

Сырые payload'ы хранятся в webhook 90 дней — для отладки и расследований.

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

  • /account/commerce → «Заказы» — список заказов текущего workspace с фильтрами по статусу и поиском по покупателю/email/телефону.
  • /account/orders — то же, отдельная страница (быстрый шорткат из меню).

Карточка заказа:

  • товары + их количество и цена снапшотом;
  • сумма, валюта, способ оплаты, способ доставки, адрес;
  • контакты покупателя;
  • статус и история (когда оплачен, отменён, возвращён);
  • ссылка на лид CRM (если был);
  • кнопка «Открыть карточку клиента» — переход в единый клиент workspace с полным таймлайном по этому человеку (другие заказы, лиды, брони).

Если у заказа нет привязки к лиду (collectionId=null), система пытается найти лида по email/phone через /api/crm/find-lead — обычно успешно.

Возвраты

Сейчас возврат в один клик через UI не реализован — рефанд оформляется на стороне провайдера (в личном кабинете YooKassa/CloudPayments/Tinkoff/Robokassa), webhook возвращает заказ в refunded.

Уведомления владельцу

При новом заказе и при смене статуса (paid / cancelled) владелец получает уведомление:

  • In-app — колокольчик в шапке /account/* с бейджем непрочитанных, полная лента на /account/notifications.
  • Email — если включено в настройках уведомлений.
  • Telegram-DM — через платформенного бота Framix, привязка по /start <code>.
  • VK-DM — через платформенное сообщество, привязка кодом-сообщением.

Какие типы уведомлений и в какие каналы доставлять — настраивается в /account/notifications/settings (матрица per-type × per-channel).

Личный кабинет покупателя /my

Покупатели не регистрируются на Framix — у них общая «гостевая» страница: /my.

  • Вход по email + одноразовому коду (OTP), который приходит письмом.
  • Вкладка «Заказы» — статусы, кнопка повторной оплаты для pending_payment.
  • Вкладка «Записи» — все брони этого клиента.
  • Старые URL /my-orders и /my-bookings редиректят с сохранением ?order=<id> / ?booking=<id> (для подсветки конкретной строки).

Покупатель может слать сам себя в личный кабинет через маркер в чате агента: бот пишет [[my-orders]] → сервер резолвит в magic-link на /my?order=..., отправляет письмо с одноразовым кодом, клиент открывает свои заказы без логина.

Связь с агентом

Когда заказ создан или оплачен, агент, который вёл клиента в чате (commerce_order.agentId + sessionId), получает push:

  • статус оплаты записывается в чат-сессию (системное сообщение);
  • если виджет открыт — клиент видит обновление в реальном времени;
  • если закрыт — счётчик непрочитанных подсветит при следующем открытии.

Это закрывает цикл: спросил в чате → агент создал заказ → клиент оплатил → агент в той же сессии благодарит и говорит дальнейшие шаги.

Что хранится

ТаблицаЧто
commerce_orderЗаказы
commerce_operationИстория проведений, расчёт комиссии Framix
customer_orders_otpOTP-коды для /my
webhookСырые входящие webhook'и от провайдеров

На этой странице