Flujos de firma
Orden de firma, recordatorios, expiración y cancelación.
Un flujo le dice a Firmame cómo recolectar las firmas: en qué orden, cada cuánto insistir, cuándo darse por vencido y a quién copiar. Sin flujo tienes un documento firmable y tú repartes las ligas. Con flujo, Firmame se encarga.
Se puede adjuntar al crear el documento o agregarse después, con el mismo objeto en los dos casos.
// al crear
await services.request({ url_doc: {...}, stickers: [...], workflow: {...} });
// o después, sobre un documento que ya existe
await services.workflow(documentTicket, {...});Orden de firma
ordered: true hace que cada persona reciba su invitación cuando la anterior firma. El orden lo marca
signersConfig:
workflow: {
ordered: true,
signersConfig: [
{ data: '[email protected]' },
{ data: '[email protected]' },
{ data: 'VECJ880326XXX' },
],
}Con ordered: false (el valor por defecto) todos reciben la invitación de inmediato y firman en
cualquier orden.
Cada entrada se empareja con un sticker por su valor data, así que tiene que coincidir exactamente con
lo que pusiste en el sticker.
Watcher
Destinatarios no firmantes. Este campo es opcional, si se encuentra presente, estos correos recibiran una notificación cuando inicie y otra cuando termine el flujo, sin tener que ser parte de los firmantes
workflow: {
watchers: ['[email protected]', '[email protected]'],
}Recordatorios y expiración
workflow: {
subject: 'Contrato de arrendamiento',
message: 'Te compartimos el contrato para tu firma.',
remindEvery: '1d',
expirationDate: '25/11/2026',
language: 'es',
}| Campo | Valores | Por defecto |
|---|---|---|
remindEvery | none, 12h, o Nd con N de 1 a 7 | cada 24 h |
expirationDate | dd/MM/yyyy o dd/MM/yyyy HH:mm | a 14 días |
language | es o en | es |
subject | hasta 150 caracteres | el asunto estándar |
message | hasta 3500 caracteres | el texto estándar |
La fecha va con el día primero
expirationDate es dd/MM/yyyy: 12/11/2026 es 12 de noviembre, no 11 de diciembre. Un formato
distinto se rechaza con error parsing workflow expiration date.
También puedes ajustar qué correos recibe cada quien:
signersConfig: [
{ data: '[email protected]', notifications: 'ALL' },
{ data: '[email protected]', notifications: 'ONLY_START' },
]Los valores son ALL, ONLY_START, ONLY_END, START_AND_END, START_AND_REMINDERS_NO_END y NONE.
Qué se adjunta al final
workflow: {
attachFiles: true, // el documento firmado (por defecto)
attachTimestamp: true, // el sello NOM-151
includeHistory: true, // el historial de eventos
alertAll: true, // avisar a todos al concluir (por defecto)
blockExpired: true, // impedir firmar después de la expiración
}includeHistory adjunta el mismo PDF que devuelve
GET /api/v1/document/{frmxId}/history/pdf.
Editar un flujo en curso
Manda solo lo que quieras cambiar; el resto se queda igual. El caso más común es revivir un flujo que expiró:
await services.workflow(documentTicket, { expiration_date: '25/12/2026' });Quitar el orden para que todos puedan firmar ya:
await services.workflow(documentTicket, { ordered: false });Cancelar
await services.workflow(documentTicket, { cancel: true });cancel: true corta todo lo demás: cuando lo mandas, no se lee ninguna otra propiedad del objeto. Manda
la cancelación sola, y si vas a reconfigurar, hazlo en una llamada aparte.
Un flujo para varios documentos
Si el trámite abarca más de un documento —contrato, anexo y pagaré— conviene un expediente: una sola invitación, un solo orden y una sola conclusión para todo el paquete.
La lista completa está en el esquema Workflow.