You built it. Now sell it.
Time to ideate

You've got code to ship. Not "I lost my key" emails to answer.

Paycheck handles payments, activation, and recovery.
Works offline. One integration.

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.