Licensing infrastructure
for indie devs

Your code deserves a paycheck.

One integration. Offline validation. Email recovery handled.

Open source Works offline Stripe & LemonSqueezy
~50
Lines to integrate
0
License key support tickets
0
Server calls after activation
Offline validations

Licensing is the worst part of launching

You finished the hard part. Now this?

Building it yourself

  • Generate and store license keys securely
  • Handle "I lost my license key" emails
  • Build validation server (and keep it online)
  • Wire up payment webhooks correctly
  • Handle device limits, expiration, tiers...

With Paycheck

  • No license keys—email-based activation
  • Recovery is self-service (zero tickets)
  • Offline validation with signed JWTs
  • Stripe/LemonSqueezy webhooks handled
  • Tiers, features, limits—all built in

From zero to paycheck

01

Redirect to checkout

Point your "Buy" button at Paycheck. We redirect to Stripe or LemonSqueezy, handle the webhook, create the license.

// Your buy button POST paycheck.dev/buy { "product_id": "prod_xxx" } → Redirects to Stripe checkout → Webhook creates license → User gets activation code
Only product_id required—webhook does the rest.
02

Activate the device

Exchange activation code for a signed JWT. Web apps can auto-activate on callback—no code entry needed.

// Desktop: user enters code POST /redeem { "code": "MYAPP-XXXX-XXXX", "device_id": getMachineId() } // Web: auto-activate from callback POST /redeem { "code": urlParams.code, "device_id": crypto.randomUUID() }
Web apps auto-activate. Desktop apps use the code from email.
03

Validate offline

Verify the JWT locally with your public key. No server call. Your app doesn't depend on our uptime.

// Embed public key at build time const license = verify(jwt, PUBLIC_KEY); if (license.tier === 'pro') { enableProFeatures(); } // That's it. No network needed.
Embed the public key once—validation never requires network calls.

Ship fast. Collect forever.

Simple enough for Claude to implement. Robust enough for your 10,000th customer.

Offline-First

Ed25519 signed JWTs validate locally. Your app works in airplane mode, behind firewalls, forever. Our downtime isn't your downtime.

📧

Zero Support Tickets

No permanent license keys to lose. Your users recover access with their purchase email—self-service, no intervention needed.

🌐

Web & Desktop

Web apps auto-activate on payment callback. Desktop apps use short-lived activation codes. Same API, both workflows.

📱

Device Management

Set device limits per product. Users can self-deactivate old devices. You can revoke remotely when needed.

🏷️

Tiers & Feature Flags

Define products with different tiers and features. License expiration, update expiration, feature gates—all in the JWT.

💳

Switch Providers, Save Money

Use Stripe, LemonSqueezy, or both. Route per-product or per-transaction. Pick the cheaper option for each sale.

🔒

Privacy-First

We store email hashes, not emails. No PII in our database. Your customers' data stays with your payment provider.

🤖

AI-Ready API

Simple REST endpoints. Clear request/response patterns. Claude, Cursor, Copilot—any AI assistant can implement this.

Paste this. Get paid.

The entire client integration is a few dozen lines. Fetch your public key once, embed it at build time, validate forever.

No SDK lock-in. No runtime dependencies. Just JWT verification—use any library in any language.

import { verify } from 'jose';

// Public key embedded at build time
const PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAx8Js4D...
-----END PUBLIC KEY-----`;

export async function validateLicense(jwt: string) {
  const { payload } = await verify(jwt, PUBLIC_KEY);

  // Check expiration if not perpetual
  if (payload.license_exp && Date.now() > payload.license_exp) {
    throw new Error('License expired');
  }

  return {
    tier: payload.tier,
    features: payload.features,
    updatesUntil: payload.updates_exp,
  };
}

Simple pricing that scales with you

Start free for 14 days. Upgrade when you're ready.

Hobby

Dream and build. For side projects under $500/mo revenue.

$15 /month
  • 1 product
  • 500 emails/month
  • $500/mo revenue cap
  • Email support
Start Free Trial

Pro

Scale and automate. API access, unlimited products.

$99 /month
  • Unlimited products
  • 30,000 emails/month
  • $50K/mo revenue cap
  • API access & priority support
Start Free Trial

All plans include a 14-day free trial.
Need revocation, audit logs, or SSO? Business starts at $499/mo.
Want to self-host? Paycheck is open source.

Your code deserves a paycheck

You built something worth paying for. Setup takes 15 minutes.