Pagos · modules/billing

Adapter listo para producción

Polar,
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.

polar-payment-provider.ts
 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_PROVIDERrequerida

    Set to polar

  • POLAR_ACCESS_TOKENrequerida
  • POLAR_WEBHOOK_SECRETrequerida
  • POLAR_SERVERopcional

    sandbox | production — env default: sandbox

Dónde vive

  • apps/server/src/modules/billing/infrastructure/providers/polar-payment-provider.ts
  • apps/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.