Your binary ships no secret
SDK endpoints take the customer’s own license key. No API secret inside your installer, so a leaked build leaks nothing extra.
How offline verification worksActivation, trials, subscriptions, perpetual licenses, payments, auto-updates and a customer portal — in one platform. Your app ships a license key, verifies offline, and your customers manage their own devices and invoices.
// 客户端只保存授权码与公钥 const res = await fetch('https://keygate.unionuser.com/api/v1/license/activate', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ license_key: userKey, // WB-XXXX-XXXX identifier: deviceId, // sha256(machine-id) identifier_type: 'device' }) }); const { token } = await res.json(); await store.save(token); // verify offline with Ed25519
Most desktop apps eventually hand-roll a license server, payment hooks and an update feed. UnionUser turns that pile of glue into a product.
SDK endpoints take the customer’s own license key. No API secret inside your installer, so a leaked build leaks nothing extra.
How offline verification worksDevice moves, seat changes, invoices and maintenance renewals all live in the customer portal — not in your support inbox.
Customer portalUse the managed SaaS, or buy a commercial self-hosted license. Go + PostgreSQL, and it runs without Redis.
Self-hostingFrom the first trial key to the 10,000th activated device, the dashboard answers: who, until when, on which device, paid how much, and which release they should get.
Every capability maps to a real API and a real screen in the dashboard.
Subscriptions, perpetual, trials and floating licenses across the full lifecycle.
Learn morePin the public key, keep the private key on the server. Check-in interval is separate from licence expiry.
Learn moreEmail-OTP signup issues a trial instantly, one per address, daily capped, with fallback plans.
Learn moreStripe Checkout with webhook, success-page and scheduled reconciliation safeguards.
Learn moreOwner and member keys, seat pause, boolean, numeric and quota entitlements.
Learn moreOne release feed for Sparkle, Velopack and Tauri, with atomic publishing and yank.
Learn moreAtomic quotas on hourly, daily, monthly or yearly windows with threshold webhooks.
Learn moreProducts, plans, customers, API keys, audit, team and branding; customers self-serve.
Learn moreYou do not need the whole manual. Five steps get you a working license path.
Sign in with an email code. Takes 30 seconds.
Set device limits, grace period and entitlements.
Issue keys manually, or let Stripe issue them.
Call activate and store the signed token.
Verify offline; watch devices, payments and releases.
Every guide covers activate → store → verify on startup → deactivate. The client stores a license key and a public key, never an API secret.
import { verify } from 'node:crypto'; const [body, sig] = token.split('.'); const ok = verify( null, Buffer.from(body, 'ascii'), publicKey, // pinned SPKI Buffer.from(sig, 'base64url') ); if (!ok) throw new Error('bad signature');
Developer is free forever. Pro comes with a 31-day, full-feature trial — no credit card.
Personal projects and prototypes
Indie developers and small teams
Multiple products and teams
Large teams, self-hosting and white-label
Billed on active licenses · annual saves two months · self-hosted licenses quoted separately. See full pricing →
No. Public license endpoints accept the customer’s license key as the credential. Your app only pins the public key used to verify signatures.
Yes. The license token is Ed25519-signed and the client verifies signature, device binding and expiry offline. It checks in again when the token expires.
The plan defines it; 3 is the recommended default. Slots are decremented atomically in the database, so retries do not double-count, and customers can release devices in the portal.
Stripe is built in: subscriptions, perpetual licenses, trials, refunds, billing portal and expiry reminders. You can also issue keys manually after an offline sale.
Yes. A commercial self-hosted license lets you run the Go service and PostgreSQL with Docker Compose. The source is not public.
No. Keep your existing OSS/CDN if you prefer. Using the UnionUser feed adds license-gated downloads, yank and per-product signatures.
Start a 31-day trial. Verify offline in the client, revoke from the dashboard anytime.