Triggers y nodos
Triggers
Eventos de registro
| Trigger | Cuándo corre | Tenés | Típico |
|---|---|---|---|
| Antes de crear | En el mismo guardado, con el registro todavía sin id | record (los datos nuevos) | Completar campos, normalizar, calcular, cancelar si algo no cierra |
| Antes de actualizar | En el mismo guardado | record (nuevo) y old (anterior) | Validar transiciones, guardar el valor anterior, recalcular |
| Después de crear | En segundo plano, con el registro guardado | record | Email de bienvenida, crear registros relacionados, avisar a un sistema externo |
| Después de actualizar | En segundo plano | record y old | Notificar un cambio de estado, sincronizar |
| Después de eliminar | En segundo plano | record (el eliminado) | Limpieza en otros sistemas |
Una automation puede escuchar varias operaciones a la vez (crear y actualizar).
Las automations antes corren antes de la validación de campos, así que pueden completar un campo obligatorio; si una cancela (un nodo Detener, un nodo que falla o un componente que lo decide), el usuario ve el mensaje y no se guarda nada. Si una automation crea o actualiza otro registro, ese guardado dispara sus propias automations, hasta 5 niveles de encadenamiento.
Condiciones de entrada
En Configuración (el engranaje de la barra superior) una automation de evento de registro puede tener condiciones de entrada: filtros sobre el registro que se evalúan antes de arrancar. Se combinan con Y (tienen que cumplirse todas) y usan los mismos operadores que el nodo Condición; el valor acepta {{referencias}} ({{old.stage}}, {{now}}). Si alguna no se cumple, el flujo no corre ningún nodo y la ejecución queda en los logs como Saltado.
Ejemplo: “solo si stage cambió” es una condición record.stage · Cambió. En una automation de crear no hay valor anterior, así que Cambió siempre se cumple.
Endpoint de API (http.request)
Al crear la automation con el tipo Endpoint de API definís un esquema de entrada (los campos que va a recibir, con tipo: texto, número, booleano, JSON / objeto / lista) y uno de salida. Después la publicás como Custom Endpoint en Configuración → Integraciones y API → Endpoints → Endpoints y webhooks, que le da una URL /public/v1/custom/<slug> y su autenticación. Cada llamada corre el flujo con los campos recibidos como variables ({{inputs.monto}}) y devuelve lo que escribas en outputs.* (con Asignar valor sobre outputs.<nombre>). Cada llamada queda en los Logs de la automation, igual que una ejecución por evento de registro. También se puede agendar con un scheduled job. Detalle de la URL y la auth en Public API.
Lo lanza un usuario (Stepper)
Ver Steppers.
Nodos
| Nodo | Qué hace | Opciones clave |
|---|---|---|
| Asignar valor | Escribe una variable, un campo del registro del trigger (record.campo, solo en antes) o una entrada de una lista | Modo set / append / prepend / remove; valor literal, {{referencia}} o fórmula (Fórmulas) |
| Obtener registro | Busca registros de una entidad | Modo Un registro (por ID o por el valor de un campo) o Lista de registros (filtro opcional de un campo = un valor, límite hasta 200) — la lista alimenta un Loop. Guarda en una variable |
| Crear registro | Inserta un registro en una entidad y guarda su id | Entidad y valores campo a campo. Dispara las automations de esa entidad |
| Actualizar registro | Modifica el registro del trigger o uno guardado en una variable | Campos a cambiar (el autocompletado ofrece los campos de la entidad del registro destino) |
| Condición | Bifurca evaluando ramas de arriba hacia abajo | Ver Conditions y loops |
| Loop | Repite un subflujo por cada elemento de una lista | Lista, nombre del elemento y del índice |
| Detener | Corta el flujo con un mensaje. En una antes cancela el guardado y la persona ve ese mensaje | Mensaje (acepta {{referencias}}) y, opcional, campo al que apunta |
| Enviar email | Manda un email desde un template | Template (carga sus variables como campos), Para / CC / BCC / nombre del remitente — todos aceptan {{referencias}}, con autocompletado por relaciones ({{record.account.owner.email}}) — y Adjuntos opcionales ({{pdf.fileId}}) |
| Generar PDF | Genera un PDF desde una plantilla PDF y, si querés, lo adjunta al registro | Plantilla, Datos (por defecto {{record}}), Guardar en el registro, nombre del archivo, variable de resultado, continuar si falla |
| Notificación | Crea una notificación en la campana de un usuario | Usuario destino (fijo o {{record.owner_id}}), mensaje |
| Obtener global / Definir global | Lee o escribe una global structure | Estructura; al escribir, combinar o reemplazar |
| Llamar Integración | Invoca una integration HTTP y guarda { status, ok, headers, body, durationMs } (el autocompletado ofrece status, ok y body.*) | Integración, método, path y body (JSON) con {{…}}, variable de salida, continuar si falla |
| Componente Custom | Ejecuta un Logic Component con entradas y guarda sus salidas como variables | Componente, mapeo de inputs |
Modificar el registro que se está guardando
En triggers antes, usá Asignar valor sobre record.campo: los cambios se acumulan y se guardan con el registro; no hace falta un Actualizar registro.
Asignar valor: record.description = "Cuenta Premium"
Asignar valor: record.score = {{record.amount}} * 0.1 (fórmula)Modificar otro registro
- Variable de tipo Registro (
cuenta, entidad Cuentas). - Asignar valor
cuenta.id = {{record.account}}y, si necesitás sus datos, Obtener registro sobrecuenta. - Asignar valor a sus campos y Actualizar registro con destino variable
cuenta.
Enviar email
- Elegí el template con el buscador: sus variables aparecen como campos individuales.
- Completá cada variable con un literal o una referencia; Para, CC, BCC y Nombre del remitente aceptan
{{record.contact.email}}. En CC y BCC van varias direcciones separadas por coma (o una variable de tipo lista). - El email sale por el SMTP de la plataforma (el remitente es la dirección del sistema; el nombre del remitente solo cambia el nombre que se ve). No sale por la inbox del workspace ni queda registrado en la entidad Emails.
Generar PDF
Genera un documento desde una plantilla PDF sin escribir código — una cotización, un recibo, un certificado.
- Plantilla: elegís una de las plantillas PDF activas del workspace. Es obligatoria: el builder no guarda el flujo sin ella.
- Datos: lo que recibe la plantilla. Por defecto
{{record}}, el registro entero (en la plantilla sus campos se leen como{{data.nombre_del_campo}}). Podés pasar otra variable con el autocompletado. - Guardar en el registro (prendido por defecto cuando el flujo tiene registro): el PDF queda en los Adjuntos del registro que disparó el flujo. En Adjuntar a otro registro podés indicar otro (
{{record.account}}o una variable de tipo registro). En una automation antes de crear el registro todavía no existe, así que no hay a qué adjuntarlo: usá una después. - Nombre del archivo: acepta referencias (
{{record.name}}.pdf). Se quitan los caracteres que no pueden ir en un nombre de archivo y siempre termina en.pdf; vacío, se usa el nombre de la plantilla. - Guardar resultado como (por defecto
pdf): los nodos que siguen ven{{pdf.fileId}},{{pdf.name}},{{pdf.sizeBytes}}y{{pdf.__status}}. - Continuar si falla: si la plantilla no existe o el archivo no se puede guardar, el flujo sigue y
{{pdf.__status}}valeerror. También podés usar Fallback si esto falla para reaccionar. Lo que nunca se saltea es la falta de permiso: la identidad con la que corre el flujo necesita el permisorender_pdfomanage_pdf_templates(o que la automation corra como sistema).
Generar la cotización y mandarla por mail:
Generar PDF: plantilla "Cotización" · Guardar en el registro · resultado: pdf
Enviar email: template "Envío de cotización" · Para {{record.contact.email}} · Adjuntos: {{pdf.fileId}}En Adjuntos de Enviar email van referencias separadas por coma: el resultado de un Generar PDF ({{pdf}} o {{pdf.fileId}}) o el id de un archivo. Si una no es un archivo, el nodo falla y el email no sale.
Detener — rechazar con un motivo
El nodo Detener corta el flujo con un mensaje escrito por vos. No tiene salida: lo que viene después no corre.
- En una automation antes, el registro no se guarda y la persona ve exactamente ese mensaje: en el formulario de edición, en el kanban al arrastrar una tarjeta y en la barra de etapas (Path), que vuelven a su valor anterior y muestran el aviso.
- Campo al que apunta (opcional): el formulario de edición muestra el mensaje debajo de ese campo (en un formulario público, si el campo está en el formulario).
- En una automation después, el registro ya se guardó: solo corta el flujo y el mensaje queda en los logs.
- No ofrece Fallback si esto falla: un rechazo deliberado nunca se captura.
Condición: record.close_date · Menor que · {{now}}
└─ Detener: "La fecha de cierre ({{record.close_date}}) no puede ser pasada" → campo: close_dateAsignar el dueño
En una antes, Asignar valor sobre record.owner_id cambia el dueño del registro que se está guardando (tiene que ser un usuario interno activo; si no, el guardado falla con un error en el campo Owner). {{record.owner_id}} lee el dueño actual en cualquier trigger.
Llamar Integración — Output sample y Test
Para que el autocompletado conozca la forma de la respuesta, el nodo admite un sample de salida: Usar sample de la integración (el que guardaste al probarla en Settings), pegar un JSON, o la pestaña Test del inspector: ejecutás la llamada con valores reales (las {{variables}} no se resuelven ahí) y Guardar como output sample. Los samples se compactan (un elemento por lista, textos recortados) para no inflar la definición. Sin sample el nodo funciona igual; solo perdés las sugerencias.