Биллинг SaaS через merchant of record: планы, пробные периоды, оплата за использование и вебхуки
Skalp может выставлять счета за Ваш SaaS как merchant of record. Приложение открывает оплату подписки, Skalp принимает платёж, прибавляет НДС страны клиента и выставляет каждый счёт, а подписанные вебхуки держат Вашу базу в актуальном состоянии. Использование сверх плана списывается с той же карты.
Планы
Каждый план это товар, который оплачивается раз в неделю, месяц или год, с необязательным пробным периодом до 14 дней. Цены указаны без налога и в валюте Вашего магазина. Плану можно также задать круглую цену максимум в трёх других валютах для клиентов из Польши, еврозоны, США и Бразилии.
Открытие страницы оплаты
client := skalp.New(skalp.Options{})
session, err := client.CreateSubscriptionCheckout(ctx, skalp.CreateSubscriptionCheckoutParams{
ProductSlug: "pro-monthly",
ExternalRef: orgID,
ReturnURL: "https://app.example.com/billing?checkout=success",
})
if err != nil {
return err
}
http.Redirect(w, r, session.URL, http.StatusSeeOther)
В Node тот же вызов называется skalp.subscriptions.createCheckout(...). Клиент платит на странице Skalp, так что приложению не нужно показывать форму карты. Компания из ЕС может указать там номер плательщика НДС и покупает по обратному начислению. ExternalRef возвращается в каждом событии подписки, поэтому не нужно сохранять идентификаторы Skalp до первого платежа.
Вебхуки на весь жизненный цикл
| Событие | Когда приходит |
subscription.created | Подписка началась. |
subscription.renewed | Период оплачен. Содержит идентификатор счёта, сумму и новую дату окончания. |
subscription.past_due | Продление не прошло. Содержит число попыток и время следующей. |
subscription.updated | Что-то изменилось, например план или отмена, назначенная на конец периода. |
subscription.canceled | План закончился. Содержит cancelReason. |
subscription.refunded, subscription.disputed | Платёж возвращён, или банк клиента открыл спор. |
Каждый запрос несёт подпись HMAC-SHA256 в заголовке Skalp-Signature. skalp.webhooks.constructEvent в Node и client.ConstructEvent в Go проверяют её и отклоняют доставки старше пяти минут.
Смена плана и отмена
subscriptions.changePlan переводит клиента на другой план и пересчитывает разницу пропорционально. subscriptions.cancel завершает план в конце оплаченного периода, так что доступ у клиента остаётся до этого момента.
Списания за использование
const charge = await skalp.subscriptions.createUsageCharge(subscription.id, {
amount: 12.34,
currency: 'EUR',
description: 'Seats over the plan, September 2026',
idempotencyKey: `seats:${orgId}:2026-09`,
periodStart: new Date('2026-09-01T00:00:00Z'),
periodEnd: new Date('2026-10-01T00:00:00Z'),
})
if (charge.status === 'open') await sendPaymentLink(charge.hostedUrl)
Списания за использование идут с сохранённой карты в валюте Вашего магазина. Один и тот же idempotencyKey всегда возвращает то же списание, так что после таймаута или ошибки 5xx можно повторить запрос без двойного списания. У каждой подписки есть дневной лимит списаний за использование, который поддержка Skalp может поднять.
Неудачные платежи
Если продление не прошло, клиент получает открытый счёт, который можно оплатить любой картой, и эта карта используется для следующих продлений. Вы получаете subscription.past_due и можете показывать в приложении предупреждение, пока не придёт subscription.renewed.
Счета, купоны и налоги
Skalp выставляет PDF-счёт на каждый платёж с НДС страны клиента, а subscriptions.listInvoices отдаёт их для Вашей страницы оплаты. Купоны на план могут действовать на первый платёж, на заданное число месяцев или на всю подписку.
Частые вопросы
Чьё имя стоит в счёте?
Skalp. Skalp выступает merchant of record, поэтому продаёт план Вашему клиенту и выплачивает Вам Вашу долю.
Можно оставить свою страницу с ценами?
Да. Ваша страница с ценами вызывает API и отправляет клиента на полученную страницу оплаты.
Нужен ли клиенту аккаунт в Skalp?
Нет. Клиенты, пришедшие через API, управляют подпиской с помощью кода, который приходит им на email.
Сколько это стоит?
10% с каждого платежа, или 7%, когда Ваши продажи за последние 30 дней превышают $20 000, с обработкой платежей в цене и без ежемесячной платы.