Mono Colombia

Errores de plantilla

Por qué una plantilla termina fallida o descartada, y qué significa cada razón de estado.

Una plantilla lleva state_reason en sus dos estados terminales, y significan cosas muy distintas:

  • failed: la plantilla nunca llegó a ser pagable. La preparación de su token de pago agotó sus reintentos, así que ningún pagador pudo alcanzarla.
  • discarded: la plantilla sí fue pagable y su vida terminó: fue podada o borrada, y sus tokens de pago fueron desmontados.

Lees el código en los webhooks payin_template_failed y payin_template_discarded, y en la plantilla misma con get o list.

Ejemplo de payload del webhook

{
  "timestamp": "2026-02-11T14:22:07.913204Z",
  "event": {
    "type": "payin_template_failed",
    "data": {
      "id": "cpit_034EASMHlq36oZISbc9W4b",
      "state": "failed",
      "state_reason": "key_already_registered",
      "external_id": "campaign-2026-02",
      "subaccount_id": "csub_034EASMIAFVq06j2NxhnIJ"
    }
  }
}

Fallida: la plantilla nunca llegó a ser pagable

Una plantilla se crea en created y sólo llega a ready cuando su token de pago existe. Estas son las formas en que esa preparación termina en vez de lograrlo.

CódigoDescripciónCausaSolución sugerida
key_already_registeredLa llave ya está tomadaEl valor de llave personalizado que pediste ya está registrado en la red de pagos inmediatos: las llaves son únicas en toda la red.Crea la plantilla otra vez con otro custom_key_value, o deja que Mono genere la llave.
key_registration_failedFalló el registro de la llaveRegistrar la llave de pago en la red agotó sus reintentos.Crea la plantilla otra vez. Si se repite, contacta a soporte con el id de la plantilla.
collection_registration_failedFalló el registro del cobroMono no pudo registrar el cobro con el proveedor del método de pago.Crea la plantilla otra vez. Si se repite, contacta a soporte con el id de la plantilla.
unknownDesconocidoUna falla sin clasificar durante la preparación.Contacta a soporte con el id de la plantilla.

Una plantilla fallida es definitiva, su `external_id` no

No hay forma de reintentar la preparación de una plantilla que ya falló. El estado es terminal. Crea una nueva: una plantilla que termina failed o discarded libera su external_id, así que puedes reusar el mismo identificador para el reemplazo.

Descartada: la vida de la plantilla terminó

Tres salidas, y sólo una la pediste tú. Las tres desmontan los tokens de pago, así que cualquier llave o QR ya distribuido deja de funcionar.

CódigoDescripciónCausaSolución sugerida
deletedBorradaBorraste la plantilla por la API.Esperado. Crea una plantilla nueva cuando necesites volver a cobrar.
expiredExpiradaLa plantilla pasó su expires_at y fue podada.Define una ventana más larga en la siguiente, o crea una plantilla nueva.
inactivityInactividadLa plantilla pasó demasiado tiempo sin actividad y fue podada. Cubre los dos casos: nunca pagada, y pagada alguna vez pero inactiva desde entonces.Crea una plantilla nueva. Si el cobro es de larga vida, mantenlo en uso o reemítelo.

`prune_reason` dice más que `state_reason`

Para una plantilla podada, prune_reason conserva la distinción fina que state_reason colapsa: inactivity_without_attempts e inactivity_with_attempts se vuelven ambos inactivity. Lee prune_reason cuando necesites distinguir "nunca nadie pagó" de "los pagos se detuvieron" (ver Poda).

Cómo manejarlos

Una plantilla que falla o se descarta no es un error en un pago; es un cobro que ya no existe. Lo que importa es que dejes de distribuir su token de pago, porque a los pagadores que tengan una llave o un QR suyo se les rechazará el pago con template_deleted, template_expired o template_invalid_state.

app.post('/webhook', (req, res) => {
  const { event } = req.body;

  if (event.type === 'payin_template_failed') {
    const { id, state_reason } = event.data;

    if (state_reason === 'key_already_registered') {
      // Elige otro valor de llave y crea la plantilla de nuevo
    } else {
      // Falló la preparación: reintenta la creación, y alerta si se repite
    }
  }

  if (event.type === 'payin_template_discarded') {
    const { id, state_reason } = event.data;
    // Deja de mostrarle a los pagadores la llave o el QR de esta plantilla
    // `deleted` es tuyo; `expired` e `inactivity` son la poda
  }

  res.status(200).send();
});

Soporte

Cuando contactes a soporte por una plantilla, entrega el id de la plantilla y el external_id con el que la creaste.

Siguientes pasos

  • Errores de pago: por qué se rehusó un pago individual.
  • Poda: cuándo y por qué se barren las plantillas.
  • Webhooks: cada evento de plantilla y su payload.

En esta página