Pagos · modules/billing
Adapter listo para producciónPolar,
de punta a punta.
Polar es el más completo de los tres adapters de billing: corre sobre @polar-sh/sdk con checkout, un customer portal alojado, verificación de webhooks firmados y sync del catálogo de planes, todo implementado contra el mismo port IPaymentProvider.
Checkout y webhooks, implementados
Una sola llamada a checkouts.create maneja tanto productos de pago único como de suscripción — Polar lee la cadencia desde el precio del producto, así que el argumento mode es informativo. Los webhooks entrantes se verifican con el helper del SDK (spec Standard Webhooks); una firma inválida mapea a un ValidationError, así la capa HTTP devuelve 400.
1 const checkout = await this.client.checkouts.create({
2 products: [productId],
3 externalCustomerId: input.customer.internalId,
4 successUrl: input.successUrl,
5 });
6
7 // Standard-Webhooks signature verification via the SDK:
8 payload = validateEvent(req.rawBody, req.headers, this.cfg.webhookSecret);
Todo cableado
Mapeo de customer lazy
externalCustomerId indexa todo por tu propio id de usuario/org; Polar crea su customer de forma lazy en el primer checkout — sin paso de pre-aprovisionamiento.
Portal alojado
createCustomerPortalLink llama a customerSessions.create y devuelve una URL de portal alojado — sin UI de billing para construir.
Mapeo de eventos
parseWebhook mapea subscription.created/updated/active/canceled/revoked y order.paid al BillingEvent normalizado.
Sync de planes
listPlans pagina products.list({ isArchived: false }) y lee metadata.features / metadata.highlight hacia el DTO Plan.
Aislamiento del sandbox
POLAR_SERVER (sandbox | production) elige el host de la API. Por defecto es sandbox en el schema de env, así un clon fresco nunca pega en live por accidente.
El mismo port que el resto
Polar devuelve los mismos tipos Result que Stripe y MercadoPago, así que cambiarte a él es un cambio de un solo archivo.
Referencia de configuración
Variables de entorno
PAYMENT_PROVIDERrequeridaSet to polar
POLAR_ACCESS_TOKENrequeridaPOLAR_WEBHOOK_SECRETrequeridaPOLAR_SERVERopcionalsandbox | production — env default: sandbox
Dónde vive
apps/server/src/modules/billing/infrastructure/providers/polar-payment-provider.tsapps/server/src/modules/billing/infrastructure/providers/index.ts
Shippeá billing como merchant of record hoy.
Polar está completamente cableado — checkout, portal, webhooks y sync de planes — detrás del mismo contrato que Stripe y MercadoPago.