Lemon Squeezy alternative: a merchant of record for SaaS, licenses and usage billing
On 28 January 2026 the CEO of Lemon Squeezy, which Stripe bought in 2024, wrote that the company is being rebuilt around Stripe Managed Payments. The same post said support answers and product updates had slowed during the transition, and that Lemon Squeezy users will get a way to migrate to Managed Payments. If you would rather move now, Skalp is a merchant of record with what a software business uses: hosted checkout, subscriptions, usage charges, license keys and signed webhooks.
What maps to what
| On Lemon Squeezy | On Skalp |
| Store | Store, at yourname.skalp.gg or your own domain |
| Products and variants | Products. Each plan is its own product, and subscriptions.changePlan moves a subscriber between them |
| Checkout | checkout.create for one-off sales, subscriptions.createCheckout for plans |
| License keys | License key delivery and licenses.validate, with device limits |
| Usage-based billing | subscriptions.createUsageCharge |
| Discount codes | Coupons, which also work on subscriptions |
| Affiliates | The partner program |
| Webhooks | Webhooks signed with HMAC-SHA256 in the Skalp-Signature header |
Starting a subscription from your app
import { Skalp } from '@skalpgg/sdk'
const skalp = new Skalp()
const checkout = await skalp.subscriptions.createCheckout({
productSlug: 'pro-monthly',
externalRef: team.id,
customerEmail: user.email,
returnUrl: 'https://app.example.com/billing?status=done',
})
redirect(checkout.url)
The externalRef comes back on every webhook for that subscription, so you can match payments to a team or account in your database without storing Skalp ids first.
Keeping access in sync
const event = await skalp.webhooks.constructEvent(rawBody, request.headers)
switch (event.type) {
case 'subscription.created':
case 'subscription.renewed':
await setPlan(event.data.externalRef, event.data.productSlug, event.data.currentPeriodEnd)
break
case 'subscription.past_due':
await warnAboutBilling(event.data.externalRef)
break
case 'subscription.canceled':
await endPlan(event.data.externalRef)
break
}
When a customer cancels, the plan stays active until the end of the period they paid for and you get subscription.updated. subscription.canceled arrives once the plan has ended, with a cancelReason such as requested, payment_failure or dispute.
Usage charges
await skalp.subscriptions.createUsageCharge(subscription.id, {
amount: 12.34,
currency: 'EUR',
description: 'API calls over the plan, September 2026',
idempotencyKey: `overage:${team.id}:2026-09`,
periodStart: new Date('2026-09-01T00:00:00Z'),
periodEnd: new Date('2026-10-01T00:00:00Z'),
})
The charge goes on the subscriber's saved card, in your store currency. If the card fails, the charge comes back as open with a payment link you can send to the customer. The same idempotencyKey always returns the same charge, so a retry after a timeout never bills twice.
Moving existing subscribers
Card details stay with the processor that collected them, so active subscriptions cannot be copied from one platform to another. Most teams send new signups to Skalp first. Existing subscribers then get an email with a Skalp checkout link before their next renewal, and the old plan is cancelled once they switch. If you use your own account id as the externalRef, your app can treat both kinds of subscriber the same way.
Fees
Skalp keeps 10% of each sale, or 7% once your sales over the last 30 days pass $20,000. Payment processing is included and there is no monthly fee. Every renewal counts as a sale at the same rate.
Questions people ask
Is Skalp only for games?
No. Skalp sells software, SaaS plans, license keys and other digital products. Game servers and scripts are one part of what it supports.
Who appears on the customer's card statement?
Skalp, because Skalp is the merchant of record. It also issues the invoice for every payment, renewals included.
Can I offer a free trial?
Yes, up to 14 days per plan.
Do business customers get invoices without VAT?
A business in the EU that enters a valid VAT number at checkout buys under the reverse charge, and its invoice shows no VAT.
Is there a Go SDK?
Yes. go get skalp.gg/go installs it, and it covers the same API as the Node package.