Реализация эскроу-платежей на маркетплейсе
Эскроу — механизм условного хранения средств: покупатель платит, деньги удерживаются платформой и освобождаются продавцу только после подтверждения получения товара. Это ключевой инструмент доверия на маркетплейсах, где продавец и покупатель незнакомы.
Зачем нужно эскроу
Без эскроу покупатель рискует заплатить и не получить товар. Продавец рискует отправить товар и не получить деньги. Эскроу решает обе проблемы: деньги существуют, но ни одна сторона не контролирует их до выполнения условий. Это стандарт для маркетплейсов от Авито до Wildberries.
Варианты реализации
Собственное эскроу на балансе платформы — деньги поступают на расчётный счёт платформы, ведётся внутренний учёт обязательств перед каждым продавцом. Самый распространённый вариант для российских маркетплейсов.
ЮKassa для маркетплейсов (Split-платежи) — ЮKassa удерживает средства и распределяет их по счетам продавцов (онбординг в ЮKassa) с удержанием комиссии платформы. Требует регистрации продавцов в ЮKassa.
Stripe Connect — аналог для международных платформ. Платформа создаёт Connected Accounts для продавцов, использует Transfer + Destination Charge. Stripe хранит средства и управляет выплатами.
Модель данных для собственного эскроу
escrow_transactions (
id, order_id, buyer_id, seller_id,
amount, currency,
status: pending | held | released | refunded | disputed,
held_at, release_trigger: delivery_confirmed | auto_timeout | admin_release,
released_at, payment_id,
notes
)
-- Баланс платформы (сводный учёт)
platform_escrow_balance (
total_held, -- сумма по всем активным эскроу
available, -- средства, доступные для выплат
updated_at
)
Жизненный цикл эскроу
Покупатель оплачивает заказ
↓
Средства удерживаются (status: held)
↓
┌──────┴──────────┐
Подтверждение Спор открыт
получения ↓
↓ Арбитраж
release ↓ ↓
↓ refund release
Продавцу Покупателю Продавцу
Автоматическое освобождение
Если покупатель не подтвердил и не оспорил заказ в течение N дней после доставки — средства освобождаются автоматически. Это защищает продавцов от ситуации, когда покупатель "забыл" подтвердить.
// Scheduler: каждые 6 часов
$autoRelease = EscrowTransaction::where('status', 'held')
->whereHas('order', function($q) {
$q->where('delivered_at', '<', now()->subDays(config('escrow.auto_release_days')));
})
->get();
foreach ($autoRelease as $tx) {
EscrowService::release($tx, 'auto_timeout');
}
Типичный таймаут: 7–14 дней после доставки. Для высокоценных товаров — дольше.
Частичное освобождение
При частичном возврате (товар пришёл, но с дефектом) часть суммы освобождается продавцу, часть возвращается покупателю. Разбивка согласовывается в процессе арбитража.
Интеграция с ЮKassa Split
// Создание платежа с разделением
$payment = $client->createPayment([
'amount' => ['value' => '5000.00', 'currency' => 'RUB'],
'transfers' => [
[
'account_id' => $seller->yookassa_account_id,
'amount' => ['value' => '4250.00', 'currency' => 'RUB'], // за вычетом комиссии
'platform_fee_amount' => ['value' => '750.00', 'currency' => 'RUB']
]
],
// ... остальные параметры
]);
Transfer создаётся отложенным — средства не перечисляются продавцу до явного подтверждения.
Юридические аспекты
Агентская схема (платформа — агент продавца) — наиболее распространённая правовая конструкция для маркетплейсов в РФ. Агентский договор с каждым продавцом регулирует условия эскроу, сроки и порядок выплат. Это важно настроить до запуска — ФНС может квалифицировать хранение чужих денег без договора как незаконную банковскую деятельность.
Мониторинг и отчётность
- Ежедневная сверка: сумма
heldв БД должна совпадать с фактическим остатком на счёте - Алерт при расхождении больше 1%
- Реестр эскроу по продавцам для финансового отдела
- Отчёт о сроках удержания (средний, максимальный) — индикатор проблем с доставкой
Срок разработки: 6–8 недель для полной эскроу-системы с интеграцией платёжного провайдера, арбитражем и автоматическим освобождением.







