Skip to content

Self-hosted license commerce

Sell your software. Deliver it too.

A self-hosted panel that turns a Paddle sale into an account, a license key, and a gated download — automatically.

  • Yours Full PHP source, self-hosted
  • 11 Interface languages
  • No SaaS fee One payment, unlimited customers

One install replaces four systems you would otherwise wire together yourself.

  • Checkout plumbing Webhook handling, account creation, receipts, retries.
  • A license server Key issuing, domain activation, and an HTTP API to check against.
  • Gated delivery Private release storage with entitlement checked on every request.
  • An affiliate tool Referral tracking, commissions, approvals, and payout records.

What it does

Everything between the payment and the download

The unglamorous machinery every software business ends up building twice. This is the second time, already done.

Webhook-driven fulfilment

A completed Paddle transaction creates the account, the order, the subscription, and the license key with no action from you.

Signed, idempotent webhooks

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.

Licenses with domain limits

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.

Gated version delivery

Releases live on a private disk and are streamed only after five checks pass, including whether the update window covers that release date.

Publish from CI

Upload a build with a bearer token, or drop archives on the disk and let the sync endpoint register them with SHA-256 hashes.

Lifetime-deal redeem codes

Generate and export batches for AppSumo, Dealify, DealMirror, and PitchGround. Redeeming creates the account and subscription.

Code stacking that works

Several codes collapse into one subscription at the tier they add up to. Run out of tiers and the code is returned unconsumed, refundable.

Built-in referral program

Click, signup, and conversion tracked separately, with commissions, approval workflow, auto-approval, and payout records.

Revenue analytics

MRR, revenue over time, subscriptions by plan, top products — and revenue by source, which tells you whether a marketplace deal actually paid.

Customer self-service

Customers cancel, pause, resume, change plan, move domains, and request refunds themselves — the tickets you were answering by hand.

Roles and an audit trail

Super admin, admin, support, and customer roles backed by per-record policies, with every administrative change logged.

Eleven languages

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

From payment to running software

Steps two through four need nothing from you. That is the point.

  1. 1

    A buyer checks out

    Paddle takes the payment as merchant of record and handles the tax. Your panel never touches a card number.

  2. 2

    A signed webhook arrives

    The panel verifies the HMAC signature and timestamp, then records the raw event before doing anything with it.

  3. 3

    The account and license are created

    User, order, transaction, and a subscription with a fresh key — resolved to an existing account by Paddle customer ID or email, or created new.

  4. 4

    The buyer gets in

    A welcome email carries a signed set-password link. They sign in, copy their key, and download the current release.

  5. 5

    Your software checks in

    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

A licensing API your product calls

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.

Request
POST /api/v1/license/verify

{
  "license_key": "MP-XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "domain": "customer-site.com",
  "product_slug": "my-plugin"
}
Response
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"
  ]
}
  • Rate limited to 60 requests per minute.
  • Failure reasons are explicit: invalid_or_inactive, product_mismatch, domain_limit_exceeded, domain_invalid.
  • A lapsed customer still verifies as valid — only update_entitled flips to false.
  • Send product_slug and a key for one product cannot unlock another.
Full API reference

Lifetime deals

Built for marketplace launches, including the stacking

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.

  • Redeeming creates the account, order, and subscription — same panel, same downloads, same API as a Paddle buyer.
  • Codes stack: several collapse into one subscription at the tier they add up to, with one license key.
  • Redemption holds a row lock, so a double-clicked button cannot consume a code twice.
  • Run out of tiers and the code is returned unconsumed, so the buyer can still refund it.
  • Order source is recorded per marketplace, so revenue analytics tells you whether the launch paid.
AppSumo Dealify DealMirror PitchGround Manual

One customer, three codes

  1. Tier 1 1 code · 1 domain
  2. Tier 2 2 codes · 5 domains
  3. Tier 3 3 codes · unlimited domains

One subscription. One license key. Upgraded in place.

Installation

Upload, open your domain, fill in five steps

No terminal, no Composer, no npm. The archive ships with its dependencies and compiled assets already inside, so shared hosting and cPanel are enough.

  • The wizard runs on a fresh unzip, before any .env file or database exists.
  • All five steps submit as one atomic request — no half-finished install to clean up.
  • A rejected field reopens the step that owns it, not the beginning.
  • It works with JavaScript disabled, as one long form.
  • Migrations, roles, the admin account, and storage linking all happen for you.
Installation guide
  1. 1 Language and server requirements
  2. 2 License key
  3. 3 Database credentials
  4. 4 Site details and admin account
  5. 5 Email settings (optional)

Requires PHP 8.3 and:

  • bcmath
  • ctype
  • curl
  • dom
  • fileinfo
  • gd
  • intl
  • mbstring
  • openssl
  • pdo
  • tokenizer
  • xml
  • zip

Specification

What you are actually buying

Framework
Laravel 13
Language
PHP 8.3+
Database
MySQL 8+
Front end
Blade, Tailwind CSS, Alpine.js — server-rendered, no SPA
Payments
Paddle, as merchant of record
Authentication
Email and password, plus Google and GitHub sign-in
Identifiers
UUID primary keys throughout, so nothing is enumerable
Release storage
Private disk, never web-accessible, streamed after authorisation
Interface languages
English, Spanish, French, German, Portuguese (BR), Italian, Dutch, Japanese, Russian, Hindi, Bengali
Source code
Full, readable PHP. Nothing obfuscated or encoded.
In the archive
Dependencies and compiled assets included — the host needs neither Composer nor npm
Licensing for resale
Three install-time drivers: none, remote, or offline Ed25519-signed keys

Pricing

One payment. No per-customer fees, ever.

Both options are the same complete product. The only difference is how long you keep receiving updates.

Standard

One year of updates and support

$149 one-time

Buy Standard
  • Full, readable PHP source
  • Self-hosted on your own server
  • Unlimited end customers and license keys
  • Unlimited products and plans
  • Every feature — nothing is held back for a higher tier
  • Full documentation
  • Updates and support for 12 months

One-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

Before you buy

Do I need Paddle to use this?

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.

Is this a storefront?

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.

Can it handle more than one product?

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.

What happens when my update window ends?

Nothing breaks. Your installed panel keeps running and keeps serving your customers indefinitely. You stop receiving new releases until you renew.

Does my software have to call your servers?

No. The license API runs on your install, not ours. Your customers' software talks to your panel on your domain — nothing routes through us.

Will it run on shared hosting?

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.

How strong is the license enforcement?

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.

Can I modify the code?

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.

Can I resell the panel itself?

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.

What if a webhook fails?

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.

Stop building the plumbing. Start shipping the product.

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!