Reglas y errores

Las reglas del producto y los códigos de error que puede devolver la API de suscripciones y notas de venta.

Reglas y errores

Reglas del producto

Estas reglas se aplican siempre en el servidor:

  • Los cobros automáticos requieren tarjeta. Iniciar una suscripción exige un medio de pago inscrito de autorización síncrona; las transferencias bancarias no sirven para cobros recurrentes.
  • La renovación es determinista e idempotente. El próximo período depende solo del estado guardado de la suscripción, y existe exactamente una nota de venta por período: reprocesos nunca duplican cobros.
  • Solo se inicia una suscripción incomplete. Iniciar de nuevo una suscripción ya iniciada es un error.
  • Solo se pausa una suscripción active y solo se reactiva una suspended. Durante la pausa se emiten notas de venta por $0 y los ciclos cobrados no avanzan.
  • La cancelación del cliente manda. Si el cliente canceló, el comercio no puede revertirlo ni reprogramarlo a futuro — y viceversa.
  • El cliente solo puede cancelar o pausar si tu comercio lo permite (subscription_allow_unsubscription y subscription_allow_pause, ambos habilitados por defecto).
  • duration y cancel_at son excluyentes: definir uno limpia el otro. Al completar duration ciclos, la suscripción se cancela sola (reached_cycles_duration).
  • Un cliente no puede tener dos suscripciones vigentes del mismo plan.
  • Un plan inactivo no acepta suscripciones nuevas.
  • Los productos e impuestos deben ser del mismo modo (live/test) que la suscripción, y los productos, de su misma moneda; los que no calzan se ignoran.
  • Una nota de venta solo se edita completa en draft, solo se finaliza desde draft y solo se cobra en open. void es definitivo; uncollectible no aplica a notas paid o void.
  • percentage e inclusive de un impuesto son inmutables, igual que la currency y el pricing_type de un producto. Para cambiarlos, desactiva el objeto y crea otro.
  • Los reintentos tienen ventana y desenlace configurados por comercio: subscription_retry_days (por defecto 3 días desde el inicio del período) y subscription_retry_failed_action (mark_unpaid por defecto, o cancel).
  • Las notas de venta paid_out_of_band no son reembolsables por Venti (el dinero nunca pasó por Venti).

Códigos de error

Errores del tipo invalid_request_error que puede devolver esta API:

CódigoCuándo
subscription_already_startedIntento de iniciar (o aplicar un cupón a) una suscripción que ya no está en un estado que lo permita.
subscription_inactiveLa suscripción no es renovable: cancelada, sin cliente/comercio, con cancelación vencida o con sus ciclos completos.
subscription_must_be_activeIntento de pausar una suscripción que no está active.
subscription_must_be_suspendedIntento de reactivar una suscripción que no está suspended.
subscription_cant_be_canceled_by_customerEl cliente intentó cancelar y tu comercio no lo permite.
subscription_cant_be_paused_by_customerEl cliente intentó pausar/reactivar y tu comercio no lo permite.
subscription_was_canceled_by_customerEl comercio intentó revertir o reprogramar una cancelación hecha por el cliente.
subscription_was_canceled_by_merchantEl cliente intentó revertir una cancelación hecha por el comercio.
plan_inactiveIntento de crear una suscripción desde un plan inactivo.
already_subscribedEl cliente ya tiene una suscripción vigente de ese plan.
invalid_subscriptionEl subscription_id de la nota de venta no existe o no es de tu comercio/modo.
invalid_invoiceLa nota de venta no es cobrable (ya pagada o con datos incompletos).
invalid_invoice_statusLa acción no aplica al estado actual (finalizar una no-draft, cobrar una no-open, anular una void, etc.).
invalid_period_rangeperiod_starts_at es posterior a period_ends_at.
invalid_datesAlguna fecha enviada no es válida, o el nuevo período vigente es inconsistente.
customer_not_foundEl customer_id enviado no existe.
customer_inactiveEl cliente está deshabilitado o la suscripción no tiene cliente al iniciarse.
customer_is_missingIntento de cobrar una nota de venta sin cliente asignado.
email_is_missingIntento de enviar una nota de venta a un cliente sin email.
merchant_inactiveTu comercio está deshabilitado.
invalid_merchantEl comercio de la solicitud no es válido.
invalid_payment_methodEl medio de pago no existe, no es del cliente, no está habilitado o no soporta cobro automático.
invalid_paymentLa nota de venta no tiene un pago exitoso que reembolsar.
already_refundedEl pago de la nota de venta ya fue reembolsado.
paid_out_of_bandIntento de reembolsar una nota de venta pagada fuera de Venti.
invalid_couponEl código promocional no existe, expiró o no aplica a suscripciones.
coupon_in_useEl cupón ya está aplicado a esa suscripción.

Los errores siguen el formato estándar de la API:

{
  "error": {
    "type": "invalid_request_error",
    "code": "subscription_must_be_active"
  }
}

Límites actuales

  • Cobros automáticos solo con tarjeta. Medios de autorización asíncrona (transferencia bancaria) sirven para pagar notas de venta por link, pero no para cobro recurrente.
  • Sin upgrades/downgrades prorrateados a mitad de ciclo: los cambios de productos aplican desde el próximo ciclo. El prorrateo existe solo en el primer período.
  • quantity de productos: se define por suscripción/plan; no hay cobro por uso (metered billing).
  • La nota de venta no es un documento tributario (boleta/factura); emítelos con tu propio flujo.