Guías
Receta: suscripción SaaS
Un plan mensual o anual en cripto. Cada periodo es una factura con recordatorios; tu app pregunta a Perly Pay quién tiene acceso.
No se puede cobrar cripto de una billetera, así que una suscripción se renueva por factura: antes de que acabe el periodo, el comprador recibe la siguiente y luego recordatorios hasta que la paga. No hay cobro automático. Tu app no cuenta los días: pregunta a entitlements.check.
sell-subscription del plugin de Perly Pay hace esta receta en tu proyecto. El ejemplo ejecutable es examples/saas-subscription (MIT) en el repositorio del plugin.Cómo funciona
- 1
Un plan
Un producto y un precio con
model: "subscription"yrecurring.interval(month,year…), con días de prueba y de gracia si quieres. - 2
Una suscripción
Una factura por ese precio con tu usuario como cliente abre la suscripción y su primera factura. Al pagarla, el plan queda activo.
- 3
Acceso a funciones
entitlements.check({ customer_external_id, product })→has_accessyends_at, en el servidor, en cada visita o con una caché corta. - 4
Escucha
invoice.fulfilledpara el primer pago y cada renovación;subscription.past_due,subscription.unpaidysubscription.endedpara avisar y cerrar. - 5
Controles para el comprador
Un enlace al portal del cliente (
portalSessions.create): pagar una renovación abierta, pagar por adelantado o cancelar.
Los días de gracia, los cambios de plan y los estados están en Subscriptions and reminders.
Ejecuta el ejemplo
- 1
Instala
npm installenexamples/saas-subscription(Node 20.12+). - 2
Clave
Copia
.env.examplea.envy pon una clave de prueba (sk_test_…) enPERLY_PAY_SECRET_KEY. - 3
Prepara
npm run setupcrea el producto y el precio con tu clave e imprime sus ids para.env. - 4
Ejecuta
npm start(onpm run dev), según diga su README. - 5
Paga sin billetera
Suscríbete en la página principal, pulsa Simulate payment en la factura y luego abre
/pro?user=you@example.com: Pro queda abierto hasta el final del periodo.
Errores comunes
- Prometer «cobraremos de tu billetera». No se cobra nada; di «se renueva por factura».
- Un correo del cliente que falta o es inventado: las facturas de renovación y los recordatorios van ahí.
- Quitar el acceso al primer minuto de retraso. Decide qué significa
past_due(dentro de los días de gracia). - Dar acceso cuando el comprador vuelve del pago. «Pagado» solo significa un webhook
invoice.fulfilledverificado oentitlements.checkdesde tu servidor.