Digital Products Payment Guide: License Keys, Subscriptions, and Automated Delivery

Selling digital products (software licenses, ebooks, online courses, membership subscriptions) is simpler than selling physical goods — there are no logistics or inventory issues. However, to achieve automated sales (users receive the product immediately after payment), you need a complete payment + delivery system.

1. Digital Product Sales Process

A complete digital product sales process includes:

User browses → Payment processing → Tax compliance → Product delivery → After-sales support
                                          ↓
                                    License Key generation
                                    Download link sent
                                    Account access granted

2. Major Solution Comparison

Platform-Based Solutions

Platform Monthly Fee Transaction Fee Best For Features
LemonSqueezy $0 5% + $0.50 Software/ebooks/courses Auto tax handling, License Key
Gumroad $0 8.5% + $0.30 Ebooks/design assets Strong community features
Sellfy $19/month 0% Digital files Simple and easy to use
Payhip $0 5% Ebooks/courses Tax compliance
Paddle $0 5% + $0.50 SaaS/software Enterprise tax handling

Self-Built Solution (Stripe + Code)

Cost: Stripe rate 2.9% + $0.30 (no platform commission)
Flexibility: Highest
Development cost: Need to build your own delivery system
Tax: Need to handle global tax yourself

A concrete fee comparison

Numbers make this clearer. Say a piece of software is priced at $29 and sells 200 copies a month:

Solution Cost per order Monthly fees Net (pre-tax)
LemonSqueezy 5% + $0.50 ≈ $1.95 $390 $5,410
Gumroad 8.5% + $0.30 ≈ $2.77 $553 $5,247
Stripe direct 2.9% + $0.30 ≈ $1.14 $228 $5,572

The difference comes mostly from platform commission: the more you sell and the higher the average order value, the more Stripe direct saves. But do not forget taxes — MoRs like LemonSqueezy fold global VAT/sales-tax handling into their fees, while with Stripe direct you handle that yourself, which may not be cheaper after all.

3. License Key Management System

3.1 What is a License Key

A License Key is a common authorization method for software products. Users receive a unique authorization code after purchase to activate the software.

3.2 Using LemonSqueezy's License Key Feature

LemonSqueezy has built-in License Key generation and management:

// Validate License Key
const response = await fetch('https://api.lemonsqueezy.com/v1/licenses/validate', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${apiKey}`,
    'Accept': 'application/json',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    license_key: userInputKey,
    instance_id: machineId,
  }),
});

const { valid, error, license_key } = await response.json();
if (valid) {
  // Activate software
  activateSoftware(license_key);
}

3.3 Building Your Own License Key System

// Simple License Key generation
const crypto = require('crypto');

function generateLicenseKey(productId, customerEmail) {
  const data = `${productId}-${customerEmail}-${Date.now()}`;
  const hash = crypto.createHash('sha256').update(data).digest('hex');
  
  // Group display: XXXXX-XXXXX-XXXXX-XXXXX
  const key = hash.substring(0, 20).toUpperCase()
    .replace(/(.{5})/g, '$1-')
    .slice(0, -1);
  
  return key;
}

4. Subscription Management System

4.1 Stripe Billing Solution

Stripe provides comprehensive subscription management features:

// Create subscription
const subscription = await stripe.subscriptions.create({
  customer: customerId,
  items: [{ price: 'price_monthly_123' }],
  payment_behavior: 'default_incomplete',
  expand: ['latest_invoice.payment_intent'],
});

// Subscription lifecycle handling
// Listen for subscription events via Webhook
switch (event.type) {
  case 'invoice.payment_succeeded':
    // Extend subscription validity
    extendSubscription(event.data.object.subscription);
    break;
  case 'invoice.payment_failed':
    // Send dunning email
    sendDunningEmail(event.data.object.customer);
    break;
  case 'customer.subscription.deleted':
    // Revoke user access
    revokeAccess(event.data.object.id);
    break;
}

4.2 Subscription State Machine

active
  ↓ User cancels
cancel_at_period_end
  ↓ Period ends
canceled
  
active
  ↓ Payment fails
past_due
  ↓ Failed retries after 3 days
unpaid
  ↓ No action taken
canceled

5. Automated Delivery Flow

5.1 Post-Payment Automation

// Webhook handling for successful payments
app.post('/webhook', async (req, res) => {
  const event = req.body;
  
  if (event.type === 'checkout.session.completed') {
    const session = event.data.object;
    const customerEmail = session.customer_details.email;
    const productId = session.metadata.product_id;
    
    // 1. Generate License Key
    const licenseKey = generateLicenseKey(productId, customerEmail);
    
    // 2. Send email (with download link and License Key)
    await sendDeliveryEmail(customerEmail, {
      productId,
      licenseKey,
      downloadUrl: generateDownloadUrl(productId, licenseKey),
    });
    
    // 3. Record to database
    await database.saveOrder({
      email: customerEmail,
      productId,
      licenseKey,
      status: 'delivered',
    });
  }
  
  res.json({ received: true });
});

5.2 File Protection

Digital file download links should be temporary and one-time use:

// Generate temporary download link (valid for 24 hours)
const crypto = require('crypto');

function generateDownloadUrl(productId, customerEmail) {
  const token = crypto.randomBytes(32).toString('hex');
  const expiresAt = Date.now() + 24 * 60 * 60 * 1000;
  
  // Save token to database
  saveToken(token, productId, customerEmail, expiresAt);
  
  return `https://yourdomain.com/download/${token}`;
}

6. Tax Compliance

6.1 Tax Requirements by Region

Region Tax Type Needs Auto-Processing
EU VAT Recommended to use MoR
UK VAT Recommended to use MoR
US Sales Tax (varies by state) Recommended to use MoR
China VAT Requires domestic qualifications

6.2 MoR (Merchant of Record) Model

The biggest advantage of using LemonSqueezy or Paddle is that they act as the Merchant of Record, taking on tax compliance responsibilities:

  • Charges customers tax-inclusive prices
  • Automatically calculates and remits global VAT/sales tax
  • Issues compliant invoices
  • Sellers don't need to worry about tax issues

7. Solution Recommendations

Indie Developer (Solo Publisher)

Recommended: LemonSqueezy
Reason: Zero monthly fee, auto tax handling, built-in License Key management
Add: Your own website as the sales page

Small SaaS Team

Recommended: Stripe Billing
Reason: High flexibility, low fees, supports complex subscription logic
Add: Manage tax yourself (or use tools like TaxJar)

Mid-to-Large Software Company

Recommended: Paddle
Reason: Enterprise-grade tax handling, professional checkout experience, multi-channel sales support

8. FAQ and Best Practices

Payment succeeded but the user got nothing? Attach delivery to the webhook, not to a front-end callback — users may close the page, lose connectivity, or have the browser crash; only server-side confirmation of payment should trigger delivery.

Can License Keys be validated offline? Yes, with asymmetric signatures: the server signs and the client verifies locally, preventing forgery without depending on the network.

How are refunds handled? Platform solutions ship a refund flow out of the box; with Stripe direct you listen for charge.refunded and revoke the License Key or access accordingly.

A few practical tips: draw the order state machine before writing code; make every delivery endpoint idempotent (the same order must be delivered only once); and run through "checkout → payment → delivery → refund" end to end in test mode before going live.

9. Summary

Choosing a payment solution for digital product sales depends on product type, sales volume, and tax handling capabilities. For indie developers, LemonSqueezy offers the most hassle-free solution. For SaaS teams maximizing profits, the Stripe direct integration requires more self-management but has lower long-term costs. Regardless of the solution, ensuring fully automated post-payment delivery is key — users expect to access their product the moment payment is complete.

Reference: Stripe webhooks https://docs.stripe.com/webhooks
Reference: LemonSqueezy docs https://docs.lemonsqueezy.com/
Reference: Paddle tax https://www.paddle.com/legal/tax