polar

$npx mdskill add TerminalSkills/skills/polar

Enables developers to add monetization features using Polar's developer-first tools

  • Helps add payments, subscriptions, and product sales to software projects
  • Uses Polar's API, webhooks, and embeddable components for integration
  • Leverages Polar's purpose-built tools instead of complex Stripe integrations
  • Delivers monetization solutions through code examples and configuration guidance

SKILL.md

.github/skills/polarView on GitHub ↗
---
name: polar
description: >-
  You are an expert in Polar, the monetization platform built for developers
  and open-source maintainers. You help developers add payments,
  subscriptions, product sales, license keys, and sponsorships to their
  projects with a developer-first API, webhooks, and embeddable components —
  replacing Stripe integration complexity with purpose-built tools for
  software monetization.
license: Apache-2.0
compatibility: ''
metadata:
  author: terminal-skills
  version: 1.0.0
  category: Backend Development
  tags:
    - monetization
    - open-source
    - payments
    - subscriptions
    - sponsorship
    - api
---

# Polar — Monetization for Developers

You are an expert in Polar, the monetization platform built for developers and open-source maintainers. You help developers add payments, subscriptions, product sales, license keys, and sponsorships to their projects with a developer-first API, webhooks, and embeddable components — replacing Stripe integration complexity with purpose-built tools for software monetization.

## Core Capabilities

### Products and Checkout

```typescript
import { Polar } from "@polar-sh/sdk";

const polar = new Polar({ accessToken: process.env.POLAR_ACCESS_TOKEN });

// Create a product
const product = await polar.products.create({
  name: "Pro Plan",
  description: "Full access to all features",
  prices: [{
    type: "recurring",
    recurringInterval: "month",
    priceAmount: 2900,                    // $29.00
    priceCurrency: "usd",
  }],
  benefits: [
    { type: "license_keys", description: "License key for desktop app" },
    { type: "discord", description: "Access to Pro Discord channel" },
    { type: "custom", description: "Priority support" },
  ],
});

// Create checkout session
const checkout = await polar.checkouts.create({
  productId: product.id,
  successUrl: "https://myapp.com/success?session={CHECKOUT_ID}",
  customerEmail: "user@example.com",
  metadata: { userId: "usr-42" },
});
// Redirect user to checkout.url

// Verify checkout
const session = await polar.checkouts.get(checkoutId);
if (session.status === "confirmed") {
  await activateUserPro(session.metadata.userId);
}
```

### Webhooks

```typescript
// Handle Polar webhooks
import { validateEvent } from "@polar-sh/sdk/webhooks";

app.post("/api/webhooks/polar", async (req, res) => {
  const event = validateEvent(req.body, req.headers, process.env.POLAR_WEBHOOK_SECRET!);

  switch (event.type) {
    case "subscription.created":
      await db.users.update(event.data.customer.metadata.userId, { plan: "pro", polarSubId: event.data.id });
      break;
    case "subscription.canceled":
      await db.users.update(event.data.customer.metadata.userId, { plan: "free", cancelAt: event.data.currentPeriodEnd });
      break;
    case "order.created":
      await fulfillOrder(event.data);
      break;
  }

  res.json({ received: true });
});
```

### License Keys

```typescript
// Validate license key (in your desktop/CLI app)
const validation = await polar.licenseKeys.validate({
  key: userProvidedKey,
  organizationId: process.env.POLAR_ORG_ID!,
});

if (validation.valid) {
  console.log(`License valid for: ${validation.customer.email}`);
  console.log(`Activations: ${validation.activations}/${validation.limit}`);
  // Activate features
} else {
  console.log(`Invalid: ${validation.error}`);
}

// Activate (track device)
await polar.licenseKeys.activate({
  key: userProvidedKey,
  label: `${os.hostname()}-${os.platform()}`,
  organizationId: process.env.POLAR_ORG_ID!,
});
```

### Embeddable Components

```tsx
// React component for checkout button
import { PolarCheckout } from "@polar-sh/react";

function PricingPage() {
  return (
    <div className="pricing-grid">
      <div className="plan">
        <h3>Pro</h3>
        <p className="price">$29/mo</p>
        <PolarCheckout
          productId="prod_abc123"
          successUrl="/success"
          className="buy-button"
        >
          Get Pro
        </PolarCheckout>
      </div>
    </div>
  );
}
```

## Installation

```bash
npm install @polar-sh/sdk
npm install @polar-sh/react                # React components
```

## Best Practices

1. **Benefits system** — Attach benefits (license keys, Discord access, downloads) to products; Polar auto-provisions
2. **Webhooks for fulfillment** — Use webhooks for subscription lifecycle; don't rely solely on checkout redirect
3. **License keys** — Use for desktop apps, CLI tools, self-hosted software; activation limits prevent sharing
4. **Metadata** — Pass `userId` in checkout metadata; link Polar customers to your user system
5. **Customer portal** — Polar provides a hosted portal for subscription management; no custom billing UI needed
6. **Open-source funding** — Use Polar for issue funding and sponsorships; backers fund specific features
7. **Usage-based** — Create metered products for API access; track usage and bill accordingly
8. **Multi-currency** — Support USD, EUR, GBP; Polar handles currency conversion and tax calculation

More from TerminalSkills/skills