Next.js - Polar
Examples
Installation
Install the required Polar packages using the following command:
- npm
- yarn
- pnpm
- bun
Terminal
npm install zod @polar-sh/nextjs
Terminal
yarn add zod @polar-sh/nextjs
Terminal
pmn add zod @polar-sh/nextjs
Terminal
bun add zod @polar-sh/nextjs
Checkout
Create a Checkout handler which takes care of redirections.
checkout/route.ts
import { Checkout } from "@polar-sh/nextjs";
export const GET = Checkout({
accessToken: process.env.POLAR_ACCESS_TOKEN,
successUrl: process.env.SUCCESS_URL,
returnUrl: "https://myapp.com", // An optional URL which renders a back-button in the Checkout
server: "sandbox", // Use sandbox if you're testing Polar - omit the parameter or pass 'production' otherwise
theme: "dark", // Enforces the theme - System-preferred theme will be set if left omitted
});
Query Params
Pass query params to this route.
- products
?products=123 - customerId (optional)
?products=123&customerId=xxx - customerExternalId (optional)
?products=123&customerExternalId=xxx - customerEmail (optional)
?products=123&customerEmail=janedoe@gmail.com - customerName (optional)
?products=123&customerName=Jane - metadata (optional)
URL-Encoded JSON string
Customer Portal
Create a customer portal where your customer can view orders and subscriptions.
portal/route.ts
import { CustomerPortal } from "@polar-sh/nextjs";
export const GET = CustomerPortal({
accessToken: process.env.POLAR_ACCESS_TOKEN,
getCustomerId: (req: NextRequest) => "", // Function to resolve a Polar Customer ID
returnUrl: "https://myapp.com", // An optional URL which renders a back-button in the Customer Portal
server: "sandbox", // Use sandbox if you're testing Polar - omit the parameter or pass 'production' otherwise
});
Webhooks
A simple utility which resolves incoming webhook payloads by signing the webhook secret properly.
api/webhook/polar/route.ts
import { Webhooks } from "@polar-sh/nextjs";
export const POST = Webhooks({
webhookSecret: process.env.POLAR_WEBHOOK_SECRET!,
onPayload: async (payload) => {
// Handle the payload
// No need to return an acknowledge response
},
});
Payload Handlers
The Webhook handler also supports granular handlers for easy integration.
onPayload- Catch-all handler for any incoming Webhook eventonCheckoutCreated- Triggered when a checkout is createdonCheckoutUpdated- Triggered when a checkout is updatedonOrderCreated- Triggered when an order is createdonOrderPaid- Triggered when an order is paidonOrderRefunded- Triggered when an order is refundedonRefundCreated- Triggered when a refund is createdonRefundUpdated- Triggered when a refund is updatedonSubscriptionCreated- Triggered when a subscription is createdonSubscriptionUpdated- Triggered when a subscription is updatedonSubscriptionActive- Triggered when a subscription becomes activeonSubscriptionCanceled- Triggered when a subscription is canceledonSubscriptionRevoked- Triggered when a subscription is revokedonSubscriptionUncanceled- Triggered when a subscription cancellation is reversedonProductCreated- Triggered when a product is createdonProductUpdated- Triggered when a product is updatedonOrganizationUpdated- Triggered when an organization is updatedonBenefitCreated- Triggered when a benefit is createdonBenefitUpdated- Triggered when a benefit is updatedonBenefitGrantCreated- Triggered when a benefit grant is createdonBenefitGrantUpdated- Triggered when a benefit grant is updatedonBenefitGrantRevoked- Triggered when a benefit grant is revokedonCustomerCreated- Triggered when a customer is createdonCustomerUpdated- Triggered when a customer is updatedonCustomerDeleted- Triggered when a customer is deletedonCustomerStateChanged- Triggered when a customer state changes