Rozliczenia SaaS z merchant of record: plany, okresy próbne, opłaty za zużycie i webhooki
Skalp może rozliczać twój SaaS jako merchant of record. Aplikacja otwiera checkout subskrypcji, Skalp pobiera płatność, dolicza VAT kraju klienta i wystawia każdą fakturę, a podpisane webhooki utrzymują twoją bazę w zgodzie z płatnościami. Zużycie ponad plan trafia na tę samą kartę.
Plany
Każdy plan to produkt rozliczany co tydzień, miesiąc albo rok, z opcjonalnym okresem próbnym do 14 dni. Ceny są netto i w walucie twojego sklepu. Planowi możesz też dać okrągłą cenę w maksymalnie trzech innych walutach dla klientów z Polski, strefy euro, USA i Brazylii.
Otwarcie checkoutu
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)
W Node to samo wywołanie to skalp.subscriptions.createCheckout(...). Klient płaci na stronie Skalpa, więc twoja aplikacja nigdy nie wyświetla formularza karty. Firma z UE może tam podać numer VAT i kupuje w odwrotnym obciążeniu. ExternalRef wraca w każdym zdarzeniu subskrypcji, więc nie musisz zapisywać identyfikatorów Skalpa przed pierwszą płatnością.
Webhooki na cały cykl życia
| Zdarzenie | Kiedy przychodzi |
subscription.created | Subskrypcja wystartowała. |
subscription.renewed | Okres został opłacony. Zawiera identyfikator faktury, kwotę i nową datę końca. |
subscription.past_due | Odnowienie się nie udało. Zawiera liczbę prób i termin następnej. |
subscription.updated | Coś się zmieniło, na przykład plan albo anulowanie zaplanowane na koniec okresu. |
subscription.canceled | Plan się skończył. Zawiera cancelReason. |
subscription.refunded, subscription.disputed | Płatność została zwrócona albo bank klienta otworzył spór. |
Każde żądanie ma podpis HMAC-SHA256 w nagłówku Skalp-Signature. skalp.webhooks.constructEvent w Node i client.ConstructEvent w Go sprawdzają go i odrzucają dostawy starsze niż pięć minut.
Zmiana planu i anulowanie
subscriptions.changePlan przenosi klienta na inny plan i rozlicza różnicę proporcjonalnie. subscriptions.cancel kończy plan z końcem opłaconego okresu, więc klient zachowuje dostęp do tego czasu.
Opłaty za zużycie
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)
Opłaty za zużycie są pobierane w walucie twojego sklepu z zapisanej karty. Ten sam idempotencyKey zawsze zwraca tę samą opłatę, więc możesz ponowić żądanie po timeoucie albo błędzie 5xx bez podwójnego obciążenia. Każda subskrypcja ma dzienny limit opłat za zużycie, który support Skalpa może podnieść.
Nieudane płatności
Gdy odnowienie się nie uda, klient dostaje otwartą fakturę, którą może zapłacić dowolną kartą, i ta karta służy do kolejnych odnowień. Ty dostajesz subscription.past_due i możesz pokazywać w aplikacji komunikat, dopóki nie przyjdzie subscription.renewed.
Faktury, kupony i podatek
Skalp wystawia fakturę PDF za każdą płatność, z VAT kraju klienta, a subscriptions.listInvoices zwraca je dla twojej strony z rozliczeniami. Kupony na plan mogą obejmować pierwszą płatność, określoną liczbę miesięcy albo całą subskrypcję.
Najczęstsze pytania
Czyja nazwa jest na fakturze?
Skalpa. Skalp jest sprzedawcą (merchant of record), więc sprzedaje plan twojemu klientowi i wypłaca ci twój udział.
Mogę zostawić własną stronę z cennikiem?
Tak. Strona z cennikiem wywołuje API i przekierowuje klienta do zwróconego checkoutu.
Czy klient potrzebuje konta w Skalpie?
Nie. Klienci, którzy przychodzą przez API, zarządzają subskrypcją kodem wysłanym na e-mail.
Ile to kosztuje?
10% od każdej płatności, a 7%, gdy twoja sprzedaż z ostatnich 30 dni przekroczy 20 000 $, z obsługą płatności w cenie i bez opłaty miesięcznej.