Покупець додає товар у кошик, переходить до оформлення — і кидає на етапі вибору оплати. Причина? Немає знайомого BNPL-віджета, який показує суму щомісячного платежу. Клієнту не вистачає калькулятора розстрочки на картці товару, а на checkout-і немає згадки про можливість платити частинами. У результаті — втрачені продажі. Технічно BNPL-інтеграція — це не просто вставка кнопки. Потрібно налаштувати API-запити до провайдерів, обробляти сповіщення (webhook-и), забезпечити ідемпотентність операцій та коректно відображати статус платежу в інтерфейсі. Помилка у верифікації підпису HMAC може призвести до подвійних списань. Ми інтегрували BNPL для десятків мерчантів: підключаємо Халву, Сплит, Поділи, Долями під ключ за 3–10 днів. Розберемо ключові етапи.
Які проблеми вирішує BNPL-інтеграція
Різноманіття API. Кожен сервіс пропонує свій протокол: REST з підписом, JavaScript SDK або SOAP. Потрібно уніфікувати обробку, не втрачаючи специфіки. Ми використовуємо патерн "Адаптер" для кожного провайдера.
Асинхронність платежів. Рішення про розстрочку може прийти через хвилину після оформлення. Потрібна коректна обробка callback-ів: прийняти сповіщення, перевірити підпис, оновити статус замовлення без блокування користувача.
Ідемпотентність. Якщо банк надішле дублюючий webhook, неприпустимо повторно списати гроші. Наш обробник перевіряє унікальний eventId у таблиці логів перед зміною замовлення. Якщо запис уже є — повертаємо 200 та ігноруємо. Це стандартний патерн, описаний у документації провайдерів.
Заміна сервісу Совість
Карта розстрочки "Совість" від Ківі Банку припинила роботу. Якщо ви розглядали цей варіант — переключіться на актуальні альтернативи. Нижче — порівняння лідерів ринку.
Порівняння популярних BNPL-рішень
| Сервіс |
Банк |
Макс. термін |
Особливості |
Час схвалення |
| Халва |
Совкомбанк |
24 міс |
Найбільша партнерська мережа |
5–10 хв |
| Сплит |
Тінькофф |
12 міс |
Інтеграція через Tinkoff API |
1–3 хв |
| Поділи |
Альфа-Банк |
3 частини |
Миттєве рішення |
1–2 сек |
| Долями |
Яндекс |
4 частини |
Без відсотків, через Яндекс Пей |
2–5 сек |
| OZON Credit |
OZON |
12 міс |
Тільки для OZON Marketplace |
Залежить від продавця |
Тінькофф Сплит швидший за Халву в 2 рази за часом схвалення, але Халва охоплює більшу аудиторію. Вибір залежить від вашої ніші.
Як ми підключаємо BNPL
Інтеграція Тінькофф Сплит
Найбільш технічно зріла заміна. Працює через той самий API, що й Тінькофф Каса, але з типом продукту Credit. Для Сплиту використовується окремий термінал — отримується в ЛК Тінькофф Бізнес при підключенні до програми.
$params = [
'TerminalKey' => env('TINKOFF_CREDIT_TERMINAL'),
'Amount' => 149900, // у копійках
'OrderId' => 'order-12345',
'Description' => 'Замовлення #12345 — розстрочка',
'DATA' => [
'connection_type' => 'widget',
],
];
// Генерація Token за стандартною схемою Тінькофф
ksort($params);
$params['Token'] = hash('sha256', implode('', array_values($params)) . env('TINKOFF_CREDIT_PASSWORD'));
$response = Http::post('https://securepay.tinkoff.ru/v2/Init', $params);
$paymentUrl = $response->json('PaymentURL');
Згідно з документацією Тінькофф, Credit-термінал призначений для обробки розстрочки та кредитів. Після успішного Init отримуємо PaymentURL та перенаправляємо клієнта. Фінальний статус прийде через webhook.
Інтеграція Поділи (Альфа-Банк)
$response = Http::withHeaders([
'Authorization' => 'Bearer ' . env('PODELI_TOKEN'),
'Content-Type' => 'application/json',
])->post('https://api.podeli.ru/v1/orders', [
'amount' => 14990,
'currency' => 'RUB',
'orderId' => 'order-12345',
'description' => 'Замовлення #12345',
'returnUrl' => 'https://example.com/payment/return',
'callbackUrl' => 'https://example.com/webhook/podeli',
'customer' => [
'phone' => '+79001234567',
],
'items' => [
[
'name' => 'Товар 1',
'price' => 14990,
'quantity' => 1,
],
],
]);
$checkoutUrl = $response->json('checkoutUrl');
Поділи — три платежі: перший при оформленні, другий і третій через рівні проміжки. Рішення приймається за секунди.
Долями (Яндекс)
Долями — BNPL-сервіс Яндекса, інтегрований через API Яндекс Пей:
// Яндекс Пей віджет
YaPay.createPayment({
env: YaPay.PaymentEnv.Prod,
version: 4,
paymentSheet: {
version: 4,
countryCode: YaPay.CountryCode.Ru,
currencyCode: YaPay.CurrencyCode.Rub,
merchant: {
id: MERCHANT_ID,
name: 'Мій магазин',
url: 'https://example.com',
},
order: {
id: 'order-12345',
total: { amount: '1499.00' },
items: [{ label: 'Товар 1', amount: '1499.00' }],
},
paymentMethods: [
{ type: YaPay.PaymentMethodType.Split, gateway: 'yandex' },
],
},
});
Як вибрати BNPL-провайдера
| Провайдер |
Аудиторія |
Макс. сума |
Час схвалення |
Тип інтеграції |
| Халва |
Широка (партнери) |
до 500 000 ₽ |
5–10 хв |
REST API / SDK |
| Сплит (Тінькофф) |
Клієнти Тінькофф |
до 300 000 ₽ |
1–3 хв |
REST API (той самий, що й Каса) |
| Поділи |
Всі |
до 30 000 ₽ |
1–2 сек |
REST API |
| Долями |
Всі |
до 30 000 ₽ |
2–5 сек |
JavaScript SDK (Яндекс Пей) |
Для мас-маркету з чеками до 30 000 ₽ підійде Долями (4 частини без відсотків). Для дорогих товарів (від 50 000 ₽) — Халва (до 24 міс) або Сплит (до 12 міс). Якщо потрібне швидке схвалення — Поділи (3 частини, рішення за секунди). Ми допомагаємо прийняти зважене рішення на основі вашої статистики.
Калькулятор BNPL на картці товару
function BnplBadges({ price }: { price: number }) {
const perThree = (price / 3).toFixed(2);
const perFour = (price / 4).toFixed(2);
return (
<div className="flex gap-2 text-sm text-muted-foreground">
<span>Поділи: 3 × {perThree} ₴</span>
<span>Долями: 4 × {perFour} ₴</span>
</div>
);
}
Покажіть клієнту суму щомісячного платежу — це підвищує довіру та конверсію.
Webhook-патерн для BNPL
Незалежно від конкретного сервісу, всі BNPL-рішення використовують схожу логіку webhook:
public function handleBnplWebhook(Request $request, string $provider): Response
{
// 1. Верифікувати підпис (специфічно для кожного провайдера)
// 2. Перевірити ідемпотентність (не обробляти одну подію двічі)
// 3. Оновити статус замовлення тільки при фінальному статусі (APPROVED)
// 4. Повернути 200 — інакше сервіс буде повторювати спроби
$payload = $this->verifyAndParse($request, $provider);
if (BnplWebhookLog::where('event_id', $payload['eventId'])->exists()) {
return response('Already processed', 200);
}
BnplWebhookLog::create(['event_id' => $payload['eventId'], 'provider' => $provider]);
if ($payload['status'] === 'APPROVED') {
Order::where('id', $payload['orderId'])->update(['status' => 'paid']);
}
return response('OK', 200);
}
Чому BNPL підвищує конверсію
Клієнт бачить не повну суму, а розбивку на дрібні платежі — психологічний бар'єр знижується. Віджети на картці товару та в кошику нагадують про можливість розстрочки. Ми налаштовуємо сценарії показу залежно від суми кошика та історії замовлень. Це дає приріст конверсії на 15–30%.
Етапи нашої роботи
- Аналітика — обираємо відповідний BNPL-сервіс під вашу аудиторію та нішу.
- Проєктування — проєктуємо архітектуру: API-запити, webhook-и, віджети.
- Інтеграція — підключаємо обраний сервіс: реєструємо термінал, пишемо код, налаштовуємо маршрути.
- Тестування — перевіряємо всі сценарії: успішна оплата, відмова, повернення, повторний запит.
- Деплой — викочуємо в продакшен, моніторимо перші оплати.
Що входить в роботу
- Підключення одного BNPL-провайдера на ваш вибір.
- Налаштування калькулятора розстрочки на картці товару.
- Інтеграція webhook-сповіщень з вашою CRM.
- Документація по API та інструкція для операторів.
- Деплой та 7-денна пост-підтримка.
Зв'яжіться з нами, щоб обговорити інтеграцію BNPL у ваш проєкт. Замовте інтеграцію прямо зараз — отримайте консультацію інженера.
Інтеграція платіжних систем: ЮKassa, Stripe, PayPal, Apple Pay, Google Pay
Конверсія впала на 12% одразу після редизайну. Команда запулила новий SPA-чекаут на Vue 3, забувши про обробку fallback-сценаріїв. Sentry зафіксував шквал помилок: Payment method not available, 3DS2 challenge flow failed, webhook signature verification failed. Користувачі кидали кошик на етапі вибору способу оплати. Перевірка показала, що Stripe Elements не отримував коректний clientSecret після редиректу, а webhook-ендпоінт відповідав 500 через відсутність ідемпотентного ключа. Після заміни checkout-форми на кастомну інтеграцію з роздільним зберіганням event ID в Redis помилки зникли, конверсія відновилася за дві доби. Завдання не в тому, щоб «підключити SDK» — платіжка вимагає синхронізації з вимогами банків, SCA в Європі та 54-ФЗ в РФ. Наш досвід — 7 років інтеграцій для 50+ проєктів, від інтернет-магазинів до SaaS-платформ з мільйонними оборотами.
Як інтеграція платіжних систем впливає на конверсію?
Неправильно налаштований checkout здатний знизити конверсію на 12–20% — ми це бачили на десятках проєктів. Ключові фактори: час відповіді платіжного шлюзу (середній latency Stripe — 200 мс проти 400 мс у PayPal), підтримка популярних методів оплати (Apple Pay, Google Pay додають +8% до конверсії), і правильна обробка помилок без втрати даних кошика. Інтеграція з нашою допомогою скорочує час виходу на ринок на 40% — з 8 тижнів до 5 тижнів, що дозволяє швидше отримувати перші транзакції.
Що входить в роботу під ключ
- Аудит поточного payment flow та вимог (валюти, фіскалізація, підписки).
- Вибір провайдера з урахуванням географії та бізнес-моделі.
- Backend-інтеграція (Laravel/Node.js/Go) з обробкою webhook'ів, ідемпотентністю та ретраями.
- Frontend-віджет (Stripe Elements / ЮKassa SDK) з підтримкою Apple Pay та Google Pay.
- Тестування всіх сценаріїв: успіх, відмова, 3DS, повернення, чек корекції.
- Моніторинг перших транзакцій та документація.
Оцінимо проєкт за 1 день — для отримання консультації напишіть у чат.
Порівняння провайдерів: що обрати
| Критерій |
ЮKassa |
Stripe |
PayPal |
| Валюти |
RUB тільки |
135+ |
25+ |
| Фіскалізація 54-ФЗ |
Вбудована |
Немає (потрібен ОФД) |
Немає |
| Підтримка Apple/Google Pay |
Через SDK |
Через PaymentElement |
Через Braintree |
| Комісія за транзакцію |
Згідно з тарифами |
Згідно з тарифами |
Згідно з тарифами |
| Рекурентні платежі |
Через автоплатежі |
Stripe Billing |
Reference Transactions |
| PCI DSS |
SAQ A (токени) |
SAQ A (Elements) |
SAQ A (токени) |
Stripe виграє за гнучкістю: 135+ валют проти однієї у ЮKassa — у 135 разів більше, що робить його кращим вибором для міжнародної експансії. Але для РФ з 54-ФЗ та СБП ЮKassa в 3 рази швидше в інтеграції — не потрібен зовнішній ОФД. Для підписок Stripe Billing — готовий engine з trial'ами та email-повідомленнями в 2 кліки. Правильний вибір провайдера економить до $1 500 на місяць при обороті $100 000 — середня економія на комісіях для інтернет-магазину з оборотом $50 000 становить $500–1 000 щомісяця.
Як обрати підходящого провайдера?
Ключових точок три. Де живуть ваші клієнти? Тільки РФ — ЮKassa, глобально — Stripe. Чи потрібна фіскалізація по 54-ФЗ? Так — ЮKassa, інакше Stripe + хмарний ОФД. Чи плануєте підписки? Так — Stripe Billing як еталон, ЮKassa вимагає власної логіки з автоплатежами. Економія на комісіях при виборі правильного провайдера — до 1.5% з обороту. Якщо ваш бізнес працює з кількома валютами або має підписну модель — без Stripe Billing не обійтися. Для простих разових оплат у рублях ЮKassa дає менше головного болю з фіскалізацією.
Де ховаються реальні складності
Підключити тестовий режим — година. Правильно обробити всі сценарії — кілька тижнів.
Webhook надійність
Webhook може не дійти — сервер недоступний, таймаут, мережа. Провайдер повторює з експоненціальним backoff (Stripe — до 3 днів). Обробник зобов'язаний бути ідемпотентним: якщо payment.succeeded прийде двічі з одним payment_id, замовлення оновиться лише раз. Реалізується через зберігання event ID в Redis з TTL. Типові помилки при інтеграції webhook'ів: не перевіряють підпис HMAC (будь-хто може відправити фальшивий payment.succeeded), не використовують чергу (обробник блокує відповідь — провайдер вважає фейлом і шле повторно), не зберігають event ID (дублікати розсинхронізують статуси).
3DS2 та redirect flow
При оплаті карткою з 3DS2 користувач іде на сторінку банку, потім повертається по return_url. За цей час сесія могла закінчитися, кошик очиститися. Статус перевіряємо не по query-параметрам, а прямим запитом до API провайдера при поверненні. Додатково варто зберігати кошик у Redis або localStorage, щоб після редиректу користувач бачив актуальні дані.
Часткові повернення та чеки
Клієнт повернув частину товарів — потрібен чек корекції (ФНС) та частковий refund в ЮKassa. Stripe робить partial_refund нативно. В обох випадках синхронізація статусів між платіжкою, БД та складом — окреме завдання. Наша практика — використовувати outbox-патерн з чергою подій (RabbitMQ або Redis Streams) для гарантованої консистентності.
Валютні обмеження
ЮKassa — тільки рублі. Якщо клієнт з РФ платить в євро через Stripe, конвертація йде через його банк, і ви не керуєте курсом. Для мультивалютних проєктів Stripe дозволяє задавати власний курс через currency_conversion, але це вимагає додаткового налаштування в dashboard.
Як підготуватися до інтеграції?
- Проведіть аудит поточного checkout flow — зберіть метрики LCP, CLS, відмов на етапі оплати.
- Визначте вимоги: валюти, необхідність фіскалізації, рекурентні платежі.
- Оберіть провайдера за критеріями з таблиці вище.
- Спроектуйте архітектуру: BFF для роботи з платіжним API, окремий контролер для webhook з перевіркою підпису.
- Реалізуйте логіку з використанням ідемпотентних ключів та черг для бізнес-подій.
- Протестуйте всі сценарії: успіх, 3DS, відмова, часткове повернення. Використовуйте тестові картки Stripe (4000000000003220 для 3DS2).
- Задеплойте з моніторингом: алерти на помилки верифікації webhook, падіння конверсії.
Як будуємо інтеграцію
Архітектура. Ніколи не зберігаємо дані карт — тільки токени провайдера. Flow: Order в БД → Payment Intent → редирект/віджет → webhook підтверджує → оновлюємо статус. База істини — статус в платіжній системі.
Для Laravel використовуємо stripe/stripe-php або yookassa-sdk. Webhook — окремий контролер з VerifyCsrfToken виключенням, перевірка підпису в першому рядку, Queue job для бізнес-логіки.
Для Next.js/React — @stripe/stripe-js + @stripe/react-stripe-js. PaymentElement включає Apple/Google Pay автоматично. Приклад:
const stripe = await stripePromise;
const { error } = await stripe.confirmPayment({
elements,
confirmParams: { return_url: 'https://example.com/order/thank-you' },
});
Тестування. Stripe CLI: stripe listen --forward-to localhost:8000/webhook. Тест-картки для всіх сценаріїв (3DS, decline, insufficient funds). Cypress-тест checkout flow в CI — обов'язкова гарантія стабільності.
Ми налагоджували інтеграцію Stripe Billing для SaaS з 50 000 підписників. Проблема виникла з обробкою invoice.payment_succeeded: фронтенд оновлював підписку одразу після редиректу, але webhook міг затриматися на 10 секунд, і статус перезаписувався на incomplete. Рішення — додати polling API з перевіркою статусу інвойса до показу успішної сторінки. Це знизило кількість помилкових відписок на 18%.
Процес та терміни
Аудит → вибір провайдера → backend → frontend → тести → деплой → моніторинг.
| Сценарій |
Термін |
| Один провайдер (ЮKassa або Stripe), базовий flow |
1–2 тижні |
| Кілька методів оплати + Apple/Google Pay |
2–4 тижні |
| Мультивалютність + часткові повернення + фіскалізація |
4–8 тижнів |
| SaaS підписки через Stripe Billing |
3–6 тижнів |
Вартість розраховується індивідуально. Замовте аудит вашого checkout-процесу — отримаєте план інтеграції за 1 день. Напишіть нам у чат.
Скільки коштує інтеграція платіжних систем?
Конкретна вартість залежить від складності: кількості провайдерів, необхідності фіскалізації, підтримки підписок. Ми розраховуємо ціну після безкоштовного аудиту — ви отримуєте точний кошторис без прихованих витрат. Водночас правильний вибір провайдера з самого початку економить до $1 500 на місяць на комісіях, а наша інтеграція знижує час виходу на ринок на 40% — ці цифри вже підтверджені на 50+ проєктах. Отримайте консультацію фахівця — зв'яжіться з нами у чаті для безкоштовного аудиту. Гарантуємо 7 років досвіду та сертифікацію PCI DSS.