Credits & subscriptions infrastructure
Your customers top up a balance or subscribe to a plan — on your site, under your brand. Every top-up is collected through whichever rail they prefer, and a signed webhook reaches your server the moment funds are final, so you can credit the account and move on.
Most credit businesses need both: customers who buy a bundle when they need it, and customers who want it handled automatically every month. Both run through the same API and produce the same webhook vocabulary.
The customer picks an amount and a payment method on your site. You create one order; we take it from there and tell you when the money is genuinely final — not merely promised.
payment.paid → credit the balance
Plans that renew on their own schedule, with the provider handling billing retries and tax. You get told when a subscription starts, renews, lapses or is cancelled.
subscription.* → grant or revoke access
Your site stays the source of truth for the balance itself. This platform's job is the part in the middle: collecting the money, confirming it is final, and telling you exactly once.
Step 04 is the one that matters: you credit a customer on a signed webhook or a confirmed order status — never on a redirect back to your site, which anyone can forge by typing a URL.
Switch any of them on or off from your dashboard. The column that usually goes unsaid is the one that matters most — whose account the money actually lands in.
| Rail | What the customer sees | Where the money lands |
|---|---|---|
Crypto |
A deposit address and exact amount, on whichever chain they hold
|
Platform wallets, swept to cold storage. Custodial. |
Cards & wallets |
Card fields, Apple Pay and Google Pay, on a page we host so the processor never sees your domain | Your own Stripe account. |
PayPal rail |
Card, Apple Pay, Google Pay and Trustly bank redirect | Routed to your PayPal at capture. |
Hosted checkout |
A complete checkout page priced per order, opened without ever revealing your domain | Your own Whop account. |
Subscriptions |
A hosted plan page that renews on schedule, with tax handled for you | Your own Lemon Squeezy account. |
Managed plans |
The same recurring or one-off hosted checkout, with no provider account of your own to open | The platform's FastSpring account, as Merchant of Record. |
Bank / manual |
Your own instructions and a unique reference code, under a name you choose | Straight to you. You confirm receipt. |
Each rail is a switch in your dashboard, enforced server-side — turning one off actually refuses the order, it does not merely hide a button.
That is the whole integration. One REST call, one handler, and the same event shape no matter which rail the customer chose.
# POST /v1/payment-orders
curl https://your-domain.example/v1/payment-orders \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"idempotency_key": "topup-8841",
"external_reference": "user-204:topup",
"method": "STRIPE_CARD",
"currency": "USD",
"expected_amount_atomic": "2500"
}'
// The response carries a page hosted on
// our domain — embed or redirect to it.
window.location =
order.checkout_payload
.hosted_checkout_path;
// Processors see our domain, not yours.
# X-Webhook-Event: payment.paid
# X-Webhook-Signature: sha256=...
{
"external_reference": "user-204:topup",
"rail": "STRIPE",
"new_status": "PAID",
"expected_amount_atomic": "2500"
}
Every event carries your own external_reference, so you map it to a customer without a second lookup. Delivery is at-least-once and signed with HMAC-SHA256 — dedupe on order_id and verify before you trust it.
Register, get a test key immediately, and have a top-up working against the sandbox before you commit to anything.
Get started