Skip to main content
Si tus usuarios ya trabajan en tu propio sistema, no tienen por qué entrar a Payana a repetir la decisión. Esta guía integra los dos lados: cada paso de tu flujo interno tiene un espejo en Payana, y cuando alguien decide en tu sistema, esa decisión resuelve el paso espejo. El principio que sostiene todo lo demás:
No replicues el flujo en tu código. Pregunta a Payana qué paso está pendiente y qué opciones admite, y devuelve una de esas opciones. Así, cuando tu compañía reconfigure su flujo — agregue un paso, cambie los responsables, sume valores a un campo — tu integración sigue funcionando sin cambios.
Esta guía es para integrarte con el flujo: respetar sus pasos, sus responsables y sus efectos. Si lo único que necesitas es dejar un documento aprobado sin pasar por él, usa Aprobar documento.

Requisitos previos

1

Una API key de tu compañía

Se envía en el header api-key. Consulta las URLs base en la introducción a la API.
2

La API de flujos habilitada

Si no lo está, ambos endpoints responden 403 con feature_not_enabled. Pídela a tu contacto en Payana.
3

Los usuarios que deciden, dados de alta en Payana

Con el mismo email que usan en tu sistema. Toda decisión queda registrada a nombre de una persona, y ese email es el vínculo entre ambos lados.
4

Un endpoint para el webhook `document.created`

Es como te enteras de que hay un documento nuevo que espejar. Opcional si prefieres consultar por tu cuenta.

Cómo se ven los dos lados

Los pasos de tu sistema no tienen que corresponder uno a uno con los de Payana, ni llamarse igual. Lo único que necesitas saber en cada momento es cuál está pendiente del lado de Payana.

El ciclo, en tres llamadas

No existe un webhook por cada paso: Payana no te avisa cuando aparece uno nuevo. Consulta el paso actual cuando tu sistema lo necesite — al abrir el caso, al refrescar una bandeja, o con un sondeo periódico.

Guarda la referencia del documento

El webhook document.created trae en data.reference la referencia interna del documento en Payana. Guárdala junto a tu propio identificador: es la única llave que necesitas para todo lo que sigue.

Webhook: Document Created

El payload completo y cómo verificar la firma.

1. Consulta el paso pendiente

Un documento tiene, a lo sumo, un paso pendiente a la vez.
Lo que te importa de esa respuesta:
entity.amount_cents viene en centavos y como texto. El endpoint de documentos, en cambio, devuelve amount decimal: "1234500" aquí es el mismo monto que 12345.00 allá.

2. Traduce la decisión a tu interfaz

Hay tres clases de decisión, y decision.kind te dice cuál tienes enfrente: Dos reglas al construir el control:
"approve", "451", "88": son tokens que Payana traduce a la rama del flujo, al valor del campo o a la etiqueta. Muestra el label a tu usuario, guarda el value y devuélvelo tal cual. No construyas lógica sobre su contenido ni lo mapees a tus propios códigos.
Ocurre en etiquetado sin restricción: options es una muestra del catálogo y cualquier etiqueta de tu compañía es válida, aunque no aparezca. Si tu interfaz solo ofrece lo que llegó, estarás recortando opciones legítimas — deja que tu usuario escriba una etiqueta libre.
Cuando el flujo tiene un agente configurado, recommendations trae su sugerencia con un confidence_level y el porqué. Úsala para preseleccionar la opción en tu interfaz, o para decidir sin intervención cuando la confianza sea alta.

3. Envía la decisión

El cuerpo tiene tres campos:
acting_user_email es obligatorio y debe ser uno de los assignees del paso. Tu api-key identifica a tu compañía, no a una persona: como una aprobación queda registrada a nombre de alguien, tienes que indicar de quién. No existe un “usuario del sistema” al que atribuirla.
Ejemplos de cuerpo para las otras dos clases:
Y un rechazo con motivo:
Si el paso exige que decidan todos sus responsables, la respuesta vuelve con status: pending. No es un error: tu decisión quedó registrada y el paso espera a los demás. Vuelve a consultar el paso actual para ver quiénes faltan — son los assignees con acted: false.

Cuando no hay nada que responder

Dos situaciones que conviene no confundir:

Errores y reintentos

El miembro que indicaste no está habilitado para ese paso. Consulta assignees antes de decidir; la lista cambia si reconfiguran el flujo.
Alguien ya lo resolvió, desde Payana o desde otra llamada tuya. No lo reintentes: vuelve a consultar el paso actual del documento y sigue desde ahí.
El valor no está entre los que el paso ofrece. En etiquetado sin restricción también se rechaza una etiqueta que no exista en tu compañía.
El paso no se decide por esta API. GET /workflow-steps/current lo anticipa con actionable: false.
Ese email no es miembro de tu compañía en Payana. Suele ser un usuario que existe en tu sistema y nunca se dio de alta, o que fue eliminado.
Los códigos code son tokens estables en snake_case; el message es texto para humanos y puede cambiar. Decide sobre el code.

Cómo confirmas que funcionó

Tres señales, de la más inmediata a la más definitiva:
  1. La respuesta del complete trae status: completed y acted_by.
  2. El paso ya no está pendiente: volver a consultar devuelve el paso siguiente, o 204 si el flujo terminó.
  3. El efecto del flujo se ve en el documento. Si al paso le sigue la generación de la cuenta por pagar, aparece en payables al consultar el documento — ese array vacío antes de la decisión y con la CxP después es la confirmación de punta a punta.

Obtener un documento

Pide fields=payables,payments para ver el efecto de la decisión.
El registro de actividad del documento, en Payana, deja constancia de que la decisión entró por integración y a nombre de quién — distinguible de esa misma persona actuando desde la aplicación.

Puesta en marcha

  • Recibe el webhook document.created y guarda data.reference contra tu identificador
  • Verifica que los emails de quienes deciden existan como miembros en Payana
  • Consulta el paso actual y construye el control desde decision.kind y options
  • Respeta options_complete: false en etiquetado
  • Envía la decisión con acting_user_email
  • Trata el 409 como “vuelve a consultar”, no como fallo
  • Prueba el ciclo completo contra api.develop.payana.cloud antes de producción

Próximos pasos

Paso actual de un documento

La referencia completa del primer endpoint.

Resolver un paso

La referencia completa del segundo.

Flujos personalizados

Cómo se configuran los pasos por los que pasa un documento.

Registro de facturas en el ERP

La otra mitad de la integración: catálogo y causación.