Webhook-driven fulfilment
A completed Paddle transaction creates the account, the order, the subscription, and the license key with no action from you.
Self-hosted license commerce
A self-hosted panel that turns a Paddle sale into an account, a license key, and a gated download — automatically.
One install replaces four systems you would otherwise wire together yourself.
What it does
The unglamorous machinery every software business ends up building twice. This is the second time, already done.
A completed Paddle transaction creates the account, the order, the subscription, and the license key with no action from you.
Every event is HMAC-verified with a timestamp tolerance and recorded by its Paddle event ID, so a retry can never double-issue a license.
One key per subscription, activated on as many domains as the plan allows. Domains are normalised, so www and https do not eat three slots.
Releases live on a private disk and are streamed only after five checks pass, including whether the update window covers that release date.
Upload a build with a bearer token, or drop archives on the disk and let the sync endpoint register them with SHA-256 hashes.
Generate and export batches for AppSumo, Dealify, DealMirror, and PitchGround. Redeeming creates the account and subscription.
Several codes collapse into one subscription at the tier they add up to. Run out of tiers and the code is returned unconsumed, refundable.
Click, signup, and conversion tracked separately, with commissions, approval workflow, auto-approval, and payout records.
MRR, revenue over time, subscriptions by plan, top products — and revenue by source, which tells you whether a marketplace deal actually paid.
Customers cancel, pause, resume, change plan, move domains, and request refunds themselves — the tickets you were answering by hand.
Super admin, admin, support, and customer roles backed by per-record policies, with every administrative change logged.
Admin panel, customer panel, and installer, all translated. Each user picks their own; the switcher lists every language under its native name.
How it works
Steps two through four need nothing from you. That is the point.
Paddle takes the payment as merchant of record and handles the tax. Your panel never touches a card number.
The panel verifies the HMAC signature and timestamp, then records the raw event before doing anything with it.
User, order, transaction, and a subscription with a fresh key — resolved to an existing account by Paddle customer ID or email, or created new.
A welcome email carries a signed set-password link. They sign in, copy their key, and download the current release.
It calls the license API, which confirms entitlement and registers the domain it is running on — all in one request.
Paddle is the source of truth. Every purchase, renewal, pause, cancellation, and refund reaches the panel as an event — so when something looks wrong, there is one log to read rather than a database to guess at.
For your software
Four endpoints. The license key is the credential, so nothing you ship has to carry a shared secret.
Check entitlement and register the domain in one call. This is the endpoint most integrations use.
POST /api/v1/license/verify
{
"license_key": "MP-XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"domain": "customer-site.com",
"product_slug": "my-plugin"
}
200 OK
{
"valid": true,
"status": "active",
"plan": "Agency",
"update_entitled": true,
"update_access_until": "2027-03-14",
"domain_limit": 5,
"domains_used": 2,
"domains_remaining": 3,
"activated_domains": [
"customer-site.com",
"another-site.com"
]
}
Same contract as verify. It exists so your integration reads clearly: activate on first entry, verify on every later check.
POST /api/v1/license/activate
{
"license_key": "MP-XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"domain": "new-site.com"
}
403 Forbidden
{
"valid": false,
"reason": "domain_limit_exceeded"
}
A narrower answer to one question: may this installation take a newer build?
POST /api/v1/license/update-check
{
"license_key": "MP-XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"current_version": "1.3.0"
}
200 OK
{
"valid": true,
"update_available": false,
"reason": "update_window_expired",
"update_expires_at": "2026-03-14T00:00:00.000000Z"
}
Streams the archive so your software can update itself, with the same five entitlement checks applied.
POST /api/v1/license/download
{
"license_key": "MP-XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"version": "1.4.2",
"domain": "customer-site.com"
}
200 OK
Content-Disposition: attachment; filename="my-plugin-1.4.2.zip"
<binary release archive>
Lifetime deals
Marketplaces do not send webhooks. They sell a code and the buyer brings it to you. Generate a batch, export it as CSV, hand it over, and let redemption do the rest.
One customer, three codes
One subscription. One license key. Upgraded in place.
Installation
No terminal, no Composer, no npm. The archive ships with its dependencies and compiled assets already inside, so shared hosting and cPanel are enough.
Requires PHP 8.3 and:
bcmathctypecurldomfileinfogdintlmbstringopensslpdotokenizerxmlzipSpecification
Pricing
Both options are the same complete product. The only difference is how long you keep receiving updates.
One year of updates and support
$149 one-time
Buy StandardUpdates for as long as the product exists
$299 one-time
Buy LifetimeOne-time payment. No recurring fees, no per-customer charges.
A license covers one panel installation you operate. When the update window ends, the panel keeps working and keeps serving your customers — you simply stop receiving new releases.
Questions
For automatic fulfilment of card payments, yes — the webhook integration is built around Paddle as merchant of record. You can run the panel without it and create orders manually or through redeem codes, but nobody will be able to buy from you unattended.
No, and deliberately so. You sell on your own marketing site through Paddle's checkout overlay, or on a lifetime-deal marketplace. The panel owns everything that happens after the payment: accounts, licenses, downloads, support context, and reporting.
Yes. Products, plans, versions, and subscriptions are all first-class, and analytics breaks revenue down per product. A customer with subscriptions to several of your products sees each one separately.
Nothing breaks. Your installed panel keeps running and keeps serving your customers indefinitely. You stop receiving new releases until you renew.
No. The license API runs on your install, not ours. Your customers' software talks to your panel on your domain — nothing routes through us.
Yes, provided PHP 8.3 with the listed extensions and a MySQL 8 database. Dependencies and compiled assets ship inside the archive, so there is no build step and no Composer or npm required on the server.
It is a deterrent, not enforcement — and it is worth being straight about that. The panel ships as readable PHP, so a determined buyer can edit the config and switch the check off. License checking keeps honest customers honest and gives you visibility into where your software runs. Businesses that budget for some leakage and compete on support and updates do better than ones that spend their engineering time on protection schemes.
Yes. You get the full source and it is conventional Laravel — action classes, policies, form requests, backed enums. Any developer who knows the framework can find their way around it. Keep your changes in version control so upgrades stay manageable.
A license covers one installation you operate. Redistribution is a separate arrangement — get in touch. The installer does include three license drivers if you are building a product on top of it and need to license copies of your own.
Every event is recorded with its raw payload before processing. Failures keep the error message and attempt count, retry automatically every fifteen minutes, and can be retried on demand. Because events are idempotent by their Paddle event ID, retrying is always safe.
Install it this afternoon, take your first automated sale tomorrow.
Welcome to WordPress. This is your first post. Edit or delete it, then start writing!