Saltar al contenido principal

Suscripciones

Suscribe a tus clientes con un plan existente o definido en la misma llamada, y consulta, actualiza, cambia de plan, cancela, reanuda o abre la página para actualizar el método de pago.

¿Primera vez con este módulo? Sigue la guía Cobrar suscripciones.

Métodos

Subscription

Así se ve el objeto que devuelven los métodos de este módulo.

CampoTipoDescripción
idstringIdentificador, empieza por sub_
statusSubscriptionStatusincomplete, trialing, active, past_due, unpaid, canceled o completed
customerstringId del cliente (cus_...)
planstringId del plan (plan_...)
currency"COP" | "USD"Moneda de los cobros
intervalPlanIntervalFrecuencia de cobro
phasesPlanPhase[]Fases de precio copiadas del plan al suscribirse
termCycleCountnumber | nullCobros antes de terminar
currentPeriodStartstring | nullInicio del periodo actual
currentPeriodEndstring | nullFin del periodo actual
nextBillingAtstring | nullFecha del próximo cobro
trialEndsAtstring | nullFin de la prueba gratis
cancelAtPeriodEndbooleantrue si se cancelará al final del periodo
balancenumberSaldo en centavos: positivo es a favor del cliente y se descuenta de los próximos cobros; negativo se suma al próximo
pendingPlanChangePendingPlanChange | nullCambio de plan programado (scheduled) o esperando su cobro (pending_payment): toPlan, behavior, effectiveAt, charge…
cancelReasonstring | nullMotivo de la cancelación
canceledAtstring | nullCuándo se pidió la cancelación
endedAtstring | nullCuándo terminó
paymentMethodPaymentMethodSummary | nulltype, brand y last4 del método registrado
externalIdstring | nullId del usuario en tu sistema
metadataRecord<string, string>Tus datos propios
source"manual" | "checkout" | "api"Origen
livemodebooleantrue si se creó con una llave live
startedAtstringInicio de la suscripción
createdAtstringFecha de creación
updatedAtstringFecha de la última edición

Suscribir a un cliente

landapay.subscriptions.create(params, options?)

Devuelve la URL del checkout donde el cliente registra su método de pago. Si plan es un objeto, primero se crea el plan; si customer es un objeto, se crea el cliente o se reutiliza el que ya tiene ese email o externalId. La suscripción se crea cuando el cliente completa el checkout y te llega con el webhook subscription.created.

Parámetros

CampoTipoDescripción
planobligatoriostring | InlinePlanParamsId de un plan (plan_...) o el plan definido aquí mismo: interval, amount, trialDays, phases, termCycleCount, currency, name…
customerstring | CustomerCreateParamsId del cliente (cus_...) o sus datos. Sin cliente, se piden en el checkout
externalIdstring | nullId del usuario o la licencia en tu sistema; lo hereda la suscripción
metadataRecord<string, string | number | boolean | null>Hasta 50 pares llave/valor. Al actualizar se combina con la actual; null en una llave la borra
redirectUrlstring | nullRecibe subscription_id y checkout_id en la URL al volver
expiresAtstring | Date | nullVencimiento del checkout. 24 horas por defecto, máximo 7 días
optionsRequestOptionsOpcional. idempotencyKey, timeout (ms) y maxRetries solo para esta llamada

Devuelve

Promise<{ checkoutUrl: string; checkout: SubscriptionCheckout; plan: Plan | null; customer: string | null; subscription: null }>

EjemploTypeScript
const { checkoutUrl } = await landapay.subscriptions.create({  plan: {    name: "Licencia Pro",    interval: "monthly",    amount: 4_990_000,    trialDays: 14,  },  customer: { name: "María Gómez", email: "[email protected]" },  externalId: "user_42",  redirectUrl: "https://tuapp.com/suscripcion",}); // Envía al usuario a checkoutUrl

Obtener una suscripción

landapay.subscriptions.retrieve(id, options?)

Parámetros

CampoTipoDescripción
idobligatoriostringId de la suscripción (sub_...)
optionsRequestOptionsOpcional. idempotencyKey, timeout (ms) y maxRetries solo para esta llamada

Devuelve

Promise<Subscription>

EjemploTypeScript
const subscription = await landapay.subscriptions.retrieve("sub_SUBSCRIPTION2345"); if (subscription.status === "active" || subscription.status === "trialing") {  // Dar acceso}

Obtener el checkout de una suscripción

landapay.subscriptions.retrieveCheckout(id, options?)

Útil al volver del checkout: el campo subscription trae el id de la suscripción cuando el cliente lo completó.

Parámetros

CampoTipoDescripción
idobligatoriostringId del checkout (scs_...)
optionsRequestOptionsOpcional. idempotencyKey, timeout (ms) y maxRetries solo para esta llamada

Devuelve

Promise<SubscriptionCheckout>

EjemploTypeScript
const checkout = await landapay.subscriptions.retrieveCheckout("scs_SESSIONCODE23456"); console.log(checkout.status, checkout.subscription);

Actualizar una suscripción

landapay.subscriptions.update(id, params, options?)

Cambia la referencia externa o la metadata. El precio y la frecuencia vienen del plan.

Parámetros

CampoTipoDescripción
idobligatoriostringId de la suscripción (sub_...)
externalIdstring | nullId del usuario en tu sistema
metadataRecord<string, string | number | boolean | null>Hasta 50 pares llave/valor. Al actualizar se combina con la actual; null en una llave la borra
optionsRequestOptionsOpcional. idempotencyKey, timeout (ms) y maxRetries solo para esta llamada

Devuelve

Promise<Subscription>

EjemploTypeScript
await landapay.subscriptions.update("sub_SUBSCRIPTION2345", {  metadata: { seats: 10 },});

Cancelar una suscripción

landapay.subscriptions.cancel(id, params?, options?)

Por defecto sigue activa hasta el final del periodo pagado (subscription.cancel_scheduled). Con atPeriodEnd: false termina de inmediato (subscription.canceled). En ambos casos el cliente recibe un correo.

Parámetros

CampoTipoDescripción
idobligatoriostringId de la suscripción (sub_...)
atPeriodEndbooleantrue por defecto
reasonstringMotivo opcional
optionsRequestOptionsOpcional. idempotencyKey, timeout (ms) y maxRetries solo para esta llamada

Devuelve

Promise<Subscription>

EjemploTypeScript
await landapay.subscriptions.cancel("sub_SUBSCRIPTION2345", {  atPeriodEnd: false,  reason: "Pedido del usuario",});

Reanudar una suscripción

landapay.subscriptions.resume(id, options?)

Quita una cancelación programada para el final del periodo.

Parámetros

CampoTipoDescripción
idobligatoriostringId de la suscripción (sub_...)
optionsRequestOptionsOpcional. idempotencyKey, timeout (ms) y maxRetries solo para esta llamada

Devuelve

Promise<Subscription>

EjemploTypeScript
await landapay.subscriptions.resume("sub_SUBSCRIPTION2345");

Calcular un cambio de plan sin aplicarlo

landapay.subscriptions.previewPlanChange(id, params, options?)

Devuelve lo que se cobraría hoy, lo que quedaría a favor del cliente y cuándo entraría en vigor, para mostrarlo antes de confirmar. Recibe lo mismo que changePlan; usa un id de plan para no crear planes que no se van a usar.

Parámetros

CampoTipoDescripción
idobligatoriostringId de la suscripción (sub_...)
planobligatoriostring | InlinePlanParamsId del plan nuevo (plan_...) o el plan definido aquí mismo
behavior"prorate" | "reset" | "no_prorate" | "period_end"Por defecto el configurado en el panel para subidas o bajadas
optionsRequestOptionsOpcional. idempotencyKey, timeout (ms) y maxRetries solo para esta llamada

Devuelve

Promise<PlanChangePreview>

PlanChangePreview

CampoTipoDescripción
fromPlanstringPlan actual (plan_...)
toPlanstringPlan nuevo (plan_...)
direction"upgrade" | "downgrade"Según el precio por día de cada plan; un empate es upgrade
behaviorPlanChangeBehaviorEl que se aplicará. En prueba gratis es no_prorate y con otra frecuencia prorate pasa a reset
applyNowbooleanfalse si se programa al final del periodo
effectiveAtstringCuándo entra en vigor el plan nuevo
unusedRationumberFracción del periodo sin usar, de 0 a 1
creditnumberLo no usado del plan actual, en centavos
chargenumberLo que se cobra hoy, en centavos
balanceDeltanumberCambio en el saldo: positivo queda a favor del cliente; negativo es un monto menor al mínimo que se suma al próximo cobro
balanceAfternumberSaldo de la suscripción después del cambio
currency"COP" | "USD"Moneda de los montos
nextBillingAtstring | nullPróximo cobro con el plan nuevo
nextAmountnumber | nullMonto de ese cobro, ya con el saldo
EjemploTypeScript
const preview = await landapay.subscriptions.previewPlanChange("sub_SUBSCRIPTION2345", {  plan: "plan_PRO2345ABCDEFGH",}); if (preview.charge > 0) {  console.log(`Pagarás hoy ${preview.charge / 100} ${preview.currency}`);} else if (preview.balanceDelta > 0) {  console.log(`Quedarán a tu favor ${preview.balanceDelta / 100} ${preview.currency}`);}

Cambiar el plan de una suscripción

landapay.subscriptions.changePlan(id, params, options?)

Aplica el cambio de inmediato, lo programa para el final del periodo o cobra la diferencia al método de pago guardado; el cambio solo se aplica si ese cobro se aprueba. Si se rechaza lanza InvalidRequestError con código payment_declined. Si el cobro queda pendiente (Nequi o Bancolombia), pendingPlanChange.status es pending_payment hasta el webhook subscription.plan_changed o subscription.plan_change_failed. Si plan es un objeto, primero se crea el plan.

Parámetros

CampoTipoDescripción
idobligatoriostringId de la suscripción (sub_...)
planobligatoriostring | InlinePlanParamsId del plan nuevo (plan_...) o el plan definido aquí mismo. Debe tener la misma moneda
behavior"prorate" | "reset" | "no_prorate" | "period_end"prorate cobra la diferencia y conserva la fecha, reset reinicia el ciclo hoy, no_prorate cambia sin cobrar y period_end espera al final del periodo. Por defecto el del panel
optionsRequestOptionsOpcional. idempotencyKey, timeout (ms) y maxRetries solo para esta llamada

Devuelve

Promise<Subscription>

EjemploTypeScript
const subscription = await landapay.subscriptions.changePlan("sub_SUBSCRIPTION2345", {  plan: "plan_PRO2345ABCDEFGH",  behavior: "prorate",}); console.log(subscription.plan, subscription.pendingPlanChange);

Deshacer un cambio de plan programado

landapay.subscriptions.cancelPlanChange(id, options?)

Quita el cambio programado con period_end; la suscripción sigue en su plan. Si no hay uno programado responde 409 no_plan_change_scheduled.

Parámetros

CampoTipoDescripción
idobligatoriostringId de la suscripción (sub_...)
optionsRequestOptionsOpcional. idempotencyKey, timeout (ms) y maxRetries solo para esta llamada

Devuelve

Promise<Subscription>

EjemploTypeScript
await landapay.subscriptions.cancelPlanChange("sub_SUBSCRIPTION2345");

Listar las facturas de una suscripción

landapay.subscriptions.listInvoices(id, params?, options?)

Una factura por ciclo y una por cada cobro de cambio de plan, la más reciente primero, igual que el tab Cobros del panel. Con await obtienes una página con data, page, totalPages, total, hasMore y los métodos nextPage() y previousPage() (devuelven null si no hay más). Con for await recorres todas las facturas y la librería pide las páginas siguientes por ti.

Parámetros

CampoTipoDescripción
idobligatoriostringId de la suscripción (sub_...)
pagenumberPágina a consultar, empieza en 1 (por defecto)
limitnumberFacturas por página: 15 por defecto, máximo 50
optionsRequestOptionsOpcional. idempotencyKey, timeout (ms) y maxRetries solo para esta llamada

Devuelve

PagePromise<Invoice> (con await: Page<Invoice>)

Invoice

CampoTipoDescripción
idstringIdentificador, empieza por inv_
kind"cycle" | "plan_change"Factura de un ciclo o del cobro de un cambio de plan
numberstringConsecutivo del proyecto, ej. FAC-00012
urlstringPágina pública de la factura
statusInvoiceStatusopen, paid o void
chargeStatusInvoiceChargeStatusEstado del cobro del ciclo: pending, trial, charging, paid, failed, canceled o void
subscriptionstringId de la suscripción (sub_...)
paymentstring | nullPago con el que se cobró (pay_...)
planChangestring | nullCambio de plan que la originó; null en las de ciclo
cyclenumber | nullNúmero del ciclo; null en un cambio de plan
phase"trial" | "priced"Fase del plan en ese ciclo
amountnumberPrecio en centavos de currency, antes del saldo
creditAppliednumberSaldo a favor descontado; negativo si se sumó una deuda
amountDuenumberLo cobrado: amount - creditApplied
currency"COP" | "USD"Moneda del cobro
attemptsnumberIntentos de cobro del ciclo
periodStartstringInicio del periodo facturado
periodEndstringFin del periodo facturado
dueAtstringFecha programada del cobro
nextRetryAtstring | nullPróximo reintento si el cobro falló
paidAtstring | nullFecha de pago
livemodebooleantrue si es una factura real
createdAtstringFecha de emisión
EjemploTypeScript
// Una página (15 por defecto, máximo 50)const page = await landapay.subscriptions.listInvoices("sub_SUBSCRIPTION2345", {  page: 1,  limit: 15,}); console.log(page.total, page.totalPages);const next = await page.nextPage(); // null si no hay más // Todas, sin pensar en páginasfor await (const invoice of landapay.subscriptions.listInvoices("sub_SUBSCRIPTION2345")) {  console.log(invoice.number, invoice.url);}

Abrir la página para actualizar el método de pago

landapay.subscriptions.createPaymentMethodSession(id, params?, options?)

Devuelve un enlace de un solo uso, válido 15 minutos, para que el cliente vea, agregue o elimine métodos. Si la suscripción está en past_due o unpaid, guardar o elegir un método cobra el ciclo que falló. Si aprueba, el cliente vuelve a returnUrl (o al redirectUrl del checkout) con subscription_id y payment_id, y recibes payment.approved y subscription.activated. Si la suscripción está al día, solo se guarda el método.

Parámetros

CampoTipoDescripción
idobligatoriostringId de la suscripción (sub_...)
returnUrlstringURL https de regreso tras un cobro aprobado. Sin ella se usa el redirect del checkout
optionsRequestOptionsOpcional. idempotencyKey, timeout (ms) y maxRetries solo para esta llamada

Devuelve

Promise<PaymentMethodSession>

PaymentMethodSession

CampoTipoDescripción
idstringIdentificador, empieza por pms_. No es el secreto del enlace
urlstringEnlace de un solo uso al que rediriges al cliente
expiresAtstringCuándo caduca el enlace, antes de abrirlo
subscriptionstringSuscripción (sub_...)
EjemploTypeScript
const session = await landapay.subscriptions.createPaymentMethodSession(  "sub_SUBSCRIPTION2345",  { returnUrl: "https://tuapp.com/facturacion" },); console.log(session.url, session.expiresAt);