snapshot of https://github.com/twentyhq/twenty.git (main, 2026-09-17; blobs > 131072B omitted)
Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 2s

This commit is contained in:
upstream-mirror
2026-09-17 23:28:13 +05:00
commit e7da97194a
32688 changed files with 4208681 additions and 0 deletions

View File

@@ -0,0 +1,167 @@
---
title: Enviar correos electrónicos desde flujos de trabajo
description: Envía correos electrónicos personalizados automáticamente utilizando acciones de flujos de trabajo.
---
Envía correos electrónicos automáticamente cuando se produzcan eventos específicos en tu CRM—da la bienvenida a nuevos contactos, haz seguimiento de oportunidades o notifica a los miembros del equipo.
## Prerrequisitos
Antes de poder enviar correos electrónicos desde flujos de trabajo:
1. Conecta una cuenta de correo electrónico en **Configuración → Cuentas**
2. Asegúrate de que la cuenta tenga habilitados los permisos de envío
## Flujo de trabajo de correo electrónico básico
### Ejemplo: Correo de bienvenida para nuevos contactos
**Objetivo**: Enviar un correo de bienvenida cuando se agregue una persona nueva al CRM.
**Configuración**:
1. **Crear flujo de trabajo**: Ve a **Configuración → Flujos de trabajo** y haz clic en **+ Nuevo flujo de trabajo**
2. **Agregar disparador**: Selecciona **Se crea el registro** → **Personas**
3. **Agregar la acción Enviar correo electrónico**:
* Haz clic en **+** para agregar una acción
* Selecciona **Enviar correo electrónico**
* Configura el correo electrónico:
| Campo | Valor |
| ---------- | -------------------------------------- |
| **Para** | `{{trigger.object.email}}` |
| **Asunto** | `Bienvenido a {{Your Company Name}}` |
| **Cuerpo** | `Hi {{trigger.object.firstName}}, ...` |
4. **Probar y activar**: Prueba con un registro de ejemplo y luego actívalo
## Uso de variables en correos electrónicos
Haz referencia a datos de pasos anteriores usando la sintaxis `{{variable}}`:
```text
Hi {{trigger.object.firstName}},
Thank you for connecting with us!
Your company, {{trigger.object.company.name}}, is now in our system.
Best regards,
The Team
```
### Variables disponibles de los disparadores
| Tipo de disparador | Variables comunes |
| ------------------------------- | -------------------------------------- |
| **Registro creado/actualizado** | `{{trigger.object.fieldName}}` |
| **Manual** | `{{trigger.selectedRecord.fieldName}}` |
| **Webhook** | `{{trigger.body.fieldName}}` |
## Avanzado: correos electrónicos condicionales
### Ejemplo: Correos diferentes según el origen del lead
**Objetivo**: Enviar correos de bienvenida diferentes según de dónde provenga el lead.
**Configuración**:
1. **Disparador**: Se crea el registro (Personas)
2. **Agregar la acción de filtro**:
* Condición: `{{trigger.object.source}}` es igual a `"Website"`
* Si es verdadero → continúa al correo de bienvenida del sitio web
3. **Rama para otras fuentes**:
* Crea ramas paralelas para diferentes fuentes
* Cada rama tiene su propia acción Enviar correo electrónico
## Envío de correos electrónicos a múltiples destinatarios
### Ejemplo: Notificar al equipo cuando se cierre una oportunidad
**Objetivo**: Enviar un correo al representante de ventas y a su gerente cuando se gane una oportunidad.
**Configuración**:
1. **Disparador**: Se actualiza el registro (Oportunidades, Etapa = "Cerrado Ganado")
2. **Buscar registros**: Busca al gerente del propietario de la oportunidad
3. **Enviar correo electrónico #1**: Al propietario de la oportunidad
* Para: `{{trigger.object.owner.email}}`
* Asunto: `Congratulations on closing {{trigger.object.name}}!`
4. **Enviar correo electrónico #2**: Al gerente
* Para: `{{searchRecords.manager.email}}`
* Asunto: `Deal Won: {{trigger.object.name}}`
## Correos de seguimiento programados
### Ejemplo: Hacer seguimiento 3 días después de la reunión
**Objetivo**: Enviar un correo de seguimiento 3 días después de registrar una reunión.
**Configuración**:
1. **Disparador**: Se crea el registro (Actividades, Tipo = "Reunión")
2. **Acción de retraso**: Espera 3 días
3. **Enviar correo electrónico**:
* Para: Asistente a la reunión
* Asunto: Seguimiento de nuestra conversación
* Cuerpo: Consulta los detalles de la reunión a partir del disparador
## Archivos adjuntos de correo electrónico
Puedes adjuntar archivos a los correos electrónicos enviados desde los flujos de trabajo. El archivo adjunto es un archivo estático que cargas al configurar el flujo de trabajo.
### Cómo añadir un archivo adjunto
1. En la acción **Enviar correo electrónico**, haz clic en el botón **Archivos adjuntos**
2. Haz clic para cargar un archivo desde tu equipo
3. El archivo se adjuntará a todos los correos electrónicos enviados por esta acción
### Casos de Uso Comunes
| Caso de uso | Archivo de ejemplo |
| ------------------------------- | ---------------------------------------- |
| **Correos de bienvenida** | Folleto de la empresa (PDF) |
| **Secuencias de incorporación** | Guía de primeros pasos |
| **Seguimientos de ventas** | Catálogo de productos o lista de precios |
| **Confirmaciones de eventos** | Detalles o agenda del evento |
<Note>
Los archivos adjuntos son estáticos—se envía el mismo archivo a todos los destinatarios. Para documentos dinámicos (como presupuestos personalizados), genera y adjunta archivos usando una [Función lógica](/l/es/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
</Note>
## Mejores prácticas
### Contenido del correo electrónico
* Mantén las líneas de asunto concisas y relevantes
* Personaliza con el nombre del destinatario
* Incluye una llamada a la acción clara
* Prueba los correos antes de activar
### Entregabilidad
* No envíes demasiados correos demasiado rápido
* Usa firmas de correo profesionales
* Evita palabras que activan filtros de spam
* Asegúrate de incluir opciones para darse de baja en los correos de marketing
### Solución de Problemas
* Verifica que la cuenta de correo esté conectada y activa
* Comprueba que la dirección de correo del destinatario sea válida
* Revisa las ejecuciones del flujo de trabajo para ver mensajes de error
* Prueba primero con tu propia dirección de correo electrónico
## Relacionado
* [Disparadores de flujos de trabajo](/l/es/user-guide/workflows/capabilities/workflow-triggers)
* [Acciones de flujos de trabajo](/l/es/user-guide/workflows/capabilities/workflow-actions)

View File

@@ -0,0 +1,88 @@
---
title: Usar ramas en flujos de trabajo
description: Comprende cómo funcionan las ramas y cómo controlar qué ruta se ejecuta.
---
## Cómo funcionan las ramas
En el editor de flujos de trabajo, puedes crear varias rutas (ramas) que salgan de un solo nodo. Esto te permite crear automatizaciones complejas con diferentes resultados.
**Importante**: cuando se ejecuta un flujo de trabajo, **todas las ramas se ejecutan en paralelo de forma predeterminada**. No hay una lógica "if/else" incorporada para elegir una rama sobre otra—todas las rutas se ejecutarán simultáneamente.
## Controlar qué rama se ejecuta
Para ejecutar solo una rama según condiciones específicas, **añade un nodo Filter al principio de cada rama**.
### Ejemplo de configuración
1. Crea tu flujo de trabajo con varias ramas desde un único nodo
2. Añade un nodo **Filter** como primer paso en cada rama
3. Configura condiciones en cada **Filter** para determinar cuándo debe continuar esa rama
4. Solo continuarán la(s) rama(s) cuyas condiciones del **Filter** se cumplan
### Cómo funcionan los nodos Filter
* Si se cumple la condición del Filter: la rama sigue ejecutándose
* Si la condición del Filter no se cumple: la rama se detiene en el nodo Filter
Esto crea, en la práctica, una lógica condicional en la que solo se ejecuta la rama adecuada según tus datos.
## Ejemplo: enrutar por tamaño del negocio
**Escenario**: cuando se cierra un negocio, envía distintas notificaciones según el tamaño del negocio.
1. **Disparador**: Oportunidad actualizada (Etapa = Cerrado Ganado)
2. **Rama 1**: Filter para Importe > $10,000 → Enviar mensaje de Slack a #big-deals
3. **Rama 2**: Filter para Importe ≤ $10,000 → Enviar un correo electrónico al gerente de ventas
Ambas ramas se inician, pero solo la que coincida con el importe del negocio continuará más allá de su Filter.
## Creación de ramas
<Note>
Para crear una nueva rama a partir de un paso existente, haz clic en el botón **+** del paso y agrega tu acción. Puedes añadir varias ramas haciendo clic en **+** varias veces.
</Note>
1. En el editor de flujos de trabajo, selecciona el paso desde el que quieres ramificar
2. Haz clic en **+** para agregar una acción
3. Esto crea una rama
4. Haz clic en **+** de nuevo en el mismo paso para crear ramas adicionales
5. Cada rama puede tener su propia secuencia de acciones
## Volver a unir las ramas
Después de que las ramas en paralelo completen su trabajo, puedes volver a unirlas en una sola ruta:
1. Completa tus acciones en las ramas
2. Añade un nuevo paso que deba ejecutarse después de todas las ramas
3. Arrastra conexiones desde el final de cada rama a este nuevo paso
4. El paso fusionado espera a que todas las ramas conectadas se completen antes de ejecutarse
### Ejemplo: procesar y luego notificar
```
Trigger
│
├── Branch A: Update Customer Record
│
└── Branch B: Create Support Ticket
↘ ↙
Merged Step: Send Confirmation Email
```
El correo electrónico de confirmación se envía sólo después de que se hayan completado tanto la actualización del cliente como la creación del ticket.
## Mejores prácticas
* Usa siempre nodos **Filter** al inicio de las ramas cuando quieras una ejecución condicional
* Mantén las condiciones de las ramas mutuamente excluyentes para evitar acciones duplicadas
* Prueba tus flujos de trabajo con distintos datos para asegurarte de que se ejecuten las ramas correctas
* **Renombra los pasos de las ramas** de forma descriptiva para que quede claro qué hace cada ruta
* **Fusiona las ramas** cuando necesites una acción final después del procesamiento en paralelo
## Relacionado
* [Preguntas frecuentes sobre flujos de trabajo](/l/es/user-guide/workflows/how-tos/need-more-help/workflows-faq) — respuestas sobre la ejecución en paralelo
* [Acciones de flujos de trabajo](/l/es/user-guide/workflows/capabilities/workflow-actions) — acciones disponibles para las ramas

View File

@@ -0,0 +1,183 @@
---
title: Usar Iterador
description: Recorre arrays de registros para realizar acciones en cada elemento.
---
El iterador te permite recorrer un array de registros y realizar acciones en cada uno. Es esencial para los flujos de trabajo que necesitan procesar varios registros devueltos por Search Records o recibidos mediante webhooks.
## Cuándo usar el iterador
| Escenario | Ejemplo |
| ----------------------------------- | ------------------------------------------------------ |
| **Procesar resultados de búsqueda** | Enviar un correo electrónico a cada persona encontrada |
| **Gestionar arrays de webhooks** | Crear registros para cada elemento en orden |
| **Actualizaciones masivas** | Actualizar varios registros con valores calculados |
| **Notificaciones** | Alertar a varias personas sobre un evento |
## Comprender el iterador
El iterador espera un **array** como entrada. Luego:
1. Toma el primer elemento del array
2. Ejecuta todas las acciones dentro del iterador con ese elemento
3. Pasa al siguiente elemento
4. Repite hasta que se procesen todos los elementos
### Seleccionar el array sobre el que iterar
La mayoría de las fuentes de arrays (Search Records, un campo de array de un webhook, un Bulk manual trigger) se pueden seleccionar directamente en el selector de variables.
Cuando un paso de **Code** o **Logic Function** devuelve un *array de nivel superior*, su salida aparece en el selector de variables como entradas indexadas (`0`, `1`, `2`, …). Para iterar sobre el array como un todo, selecciona la opción **Whole list** para ese paso; el Iterator entonces infiere automáticamente la estructura de cada elemento a partir de la lista.
## Configuración básica
### Ejemplo: enviar un correo electrónico a todos en los resultados de búsqueda
**Objetivo**: Encontrar todos los contactos de una empresa específica y enviar a cada uno un correo electrónico personalizado.
### Paso 1: Buscar registros
1. Añade la acción **Search Records**
2. Objeto: **People**
3. Filtro: Company es igual a "Acme Inc"
4. Esto devuelve un array de personas
### Paso 2: Comprobar que existan resultados
1. Añade la acción **Filter**
2. Condición: `{{searchRecords.length}}` es mayor que 0
3. Esto evita errores del iterador con resultados vacíos
### Paso 3: Añadir un iterador
1. Añade la acción **Iterator**
2. Entrada del array: selecciona `{{searchRecords}}`
3. Esto crea un bucle
### Paso 4: Añadir acciones dentro del iterador
Las acciones colocadas después del iterador se ejecutan para cada elemento:
1. Añadir acción **Enviar correo electrónico** (dentro del Iterador)
2. Para: `{{iterator.currentItem.email}}`
3. Asunto: Hola `{{iterator.currentItem.firstName}}`!
4. Cuerpo: Mensaje personalizado utilizando los campos del elemento actual
### Resultado
Si Search Records devuelve 5 personas, el iterador:
* Envía un correo electrónico a la persona 1
* Envía un correo electrónico a la persona 2
* ... continúa con las 5
## Acceder a los datos del elemento actual
Dentro del iterador, usa `{{iterator.currentItem}}` para acceder al registro actual:
| Variable | Descripción |
| --------------------------------------- | --------------------------------------------- |
| `{{iterator.currentItem}}` | Todo el objeto de registro actual |
| `{{iterator.currentItem.id}}` | ID de registro |
| `{{iterator.currentItem.email}}` | Campo de correo electrónico |
| `{{iterator.currentItem.company.name}}` | Nombre de la empresa relacionada |
| `{{iterator.index}}` | Posición actual en el array (comenzando en 0) |
En el selector de variables, puedes profundizar en un campo específico del elemento actual, o elegir **Use the whole item** para hacer referencia a todo el elemento actual (`{{iterator.currentItem}}`). Seleccionar el elemento completo es útil cuando quieres pasar un registro completo directamente a un paso posterior en lugar de reconstruirlo campo por campo.
## Patrones comunes
### Actualizar varios registros
**Objetivo**: Marcar todas las tareas atrasadas como "Late"
```
1. Search Records (Tasks, Due Date < Today, Status ≠ Completed)
2. Filter (length > 0)
3. Iterator (searchRecords)
└── Update Record
- Object: Tasks
- Record: {{iterator.currentItem.id}}
- Status: Late
```
### Crear registros desde un array
**Objetivo**: El webhook recibe un pedido con varios artículos, crear un registro para cada uno
```
1. Webhook Trigger (receives items array)
2. Filter (items.length > 0)
3. Iterator (trigger.body.items)
└── Create Record
- Object: Order Items
- Name: {{iterator.currentItem.name}}
- Quantity: {{iterator.currentItem.qty}}
- Related Order: {{trigger.body.orderId}}
```
### Procesamiento condicional dentro del bucle
**Objetivo**: Enviar correo electrónico solo a los contactos con correos válidos
```
1. Search Records (People)
2. Iterator (searchRecords)
└── Filter (currentItem.email is not empty)
└── Send Email
- To: {{iterator.currentItem.email}}
```
## Solución de Problemas
### "El iterador espera un array"
**Causa**: Pasaste un único registro en lugar de un array.
**Solución**: Asegúrate de pasar el resultado de Search Records o un campo de tipo array, no un único registro.
```
✅ Correct: {{searchRecords}}
❌ Wrong: {{searchRecords[0]}}
```
### El iterador no se ejecuta
**Causa**: El array está vacío.
**Solución**: Añade un Filter antes del iterador para comprobar la longitud del array:
```
Filter: {{searchRecords.length}} > 0
```
### Las acciones se ejecutan demasiadas veces
**Causa**: Search Records devolvió más registros de los esperados.
**Solución**:
* Añade filtros más específicos a Search Records
* Establece un límite en Search Records (máx. 200)
* Añade un Filter dentro del iterador para condiciones adicionales
## Consideraciones de rendimiento
* **Uso de créditos**: Cada iteración consume créditos por sus acciones
* **Tiempo**: Los arrays grandes tardan más en procesarse
* **Límites**: Considera procesar por lotes las operaciones muy grandes
* **Límites de velocidad**: Las llamadas a API externas pueden alcanzar límites de velocidad con muchas iteraciones
## Mejores prácticas
1. **Comprueba siempre la longitud del array** antes del iterador para evitar errores
2. **Añade filtros dentro de los bucles** cuando no sea necesario procesar todos los elementos
3. **Renombra tu paso del iterador** para describir qué está recorriendo
4. **Prueba con arrays pequeños** antes de procesar conjuntos de datos grandes
5. **Supervisa las ejecuciones de flujos de trabajo** para asegurarte de que las iteraciones se completen como se espera
## Relacionado
* [Acciones de flujos de trabajo](/l/es/user-guide/workflows/capabilities/workflow-actions)
* [Cómo usar ramas](/l/es/user-guide/workflows/capabilities/use-branches-in-workflows)
* [Preguntas frecuentes sobre flujos de trabajo](/l/es/user-guide/workflows/how-tos/need-more-help/workflows-faq)

View File

@@ -0,0 +1,332 @@
---
title: Acciones del Flujo de Trabajo
description: Conoce las acciones disponibles en los flujos de trabajo de Twenty.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
## Acerca de las acciones
Las acciones definen lo que ocurre después de que se dispara un activador. Puedes encadenar varias acciones para crear automatizaciones complejas.
<Tip>
* Usa el selector de variables (haz clic en el icono `(x+)`) para explorar los datos disponibles de pasos anteriores
* Pasa el cursor sobre cualquier campo de entrada para ver de qué paso proviene una variable — útil cuando el mismo campo (p. ej., ID) existe en varios pasos anteriores
* Asigna a cada acción un nombre descriptivo para facilitar el mantenimiento
</Tip>
## Acciones con registros
<img src="/images/user-guide/workflows/workflow_actions.png" style={{width:'100%'}} />
### Crear Registro
Agrega un nuevo registro a un objeto seleccionado.
**Configuración**:
* Seleccione el objeto de destino
* Complete los campos obligatorios y opcionales
* Usa datos de pasos anteriores o introduce valores manualmente para completar los campos
**Salida**: Los datos del registro recién creado están disponibles para su uso en pasos posteriores.
### Actualizar Registro
Modifica un registro existente en un objeto seleccionado.
<img src="/images/user-guide/workflows/update_record.png" style={{width:'100%'}} />
**Configuración**:
* Seleccione el objeto de destino
* Elija el registro específico a actualizar.
* Puedes elegir un registro fijo, usando el menú desplegable que muestra todos los registros disponibles.
* O puedes seleccionar el registro de forma dinámica, designando un registro encontrado en un paso anterior, usando el `(x+)`. No puedes buscar el registro en función de diferentes criterios en esta etapa. Si aún no has identificado el registro, añade un paso `Search Record` antes de este paso `Update Record`.
* Seleccione campos a modificar e ingrese nuevos valores
**Salida**: Los datos del registro actualizado están disponibles para su uso en pasos posteriores.
### Eliminar Registro
Elimina un registro de un objeto seleccionado.
**Configuración**:
* Seleccione el objeto de destino
* Elija el registro específico a eliminar
**Salida**: Los datos del registro eliminado permanecen disponibles para su uso en pasos posteriores.
### Buscar Registros
Encuentra registros dentro de un objeto seleccionado usando condiciones de filtro.
**Configuración**:
* Seleccione el objeto a buscar
* Establezca criterios de filtro para restringir resultados
* Configure la clasificación y los límites
**Salida**: Devuelve registros coincidentes que se pueden usar en pasos posteriores.
<Note>
**Límite**: Search Records devuelve un máximo de **200 registros**. Si necesitas procesar más, añade filtros específicos para reducir los resultados o utiliza flujos de trabajo programados para procesar por lotes.
</Note>
**Mejor práctica**: Usa [ramas](/l/es/user-guide/workflows/capabilities/workflow-branches) después de Search Records para manejar escenarios de "encontrado" vs "no encontrado".
### Insertar o actualizar registro
Crea un registro nuevo o actualiza uno existente según criterios de coincidencia. Esto es útil cuando no estás seguro de si un registro ya existe.
<img src="/images/user-guide/workflows/upsert_double_identifier.png" style={{width:'100%'}} />
**Configuración**:
* Seleccione el objeto de destino
* Ten en cuenta qué campos pueden usarse para la coincidencia: email para Personas, dominio para Empresas, ID para cualquier objeto o cualquier campo marcado como Único. Deberás completar al menos uno de los siguientes.
* Completa los valores de los campos. No olvides completar al menos uno de los identificadores únicos.
<Note>
**La coincidencia suele funcionar aún mejor al agregar solo un identificador único.** Por ejemplo, la captura de pantalla a continuación hará coincidir empresas según su dominio. El ID no es estrictamente necesario.
</Note>
<img src="/images/user-guide/workflows/upsert_simple_identifier.png" style={{width:'100%'}} />
* Utilice datos de pasos anteriores para completar los campos
**Cómo funciona**:
1. Busca un registro que coincida con sus criterios
2. Si se encuentra → actualiza el registro existente
3. Si no se encuentra → crea un registro nuevo
**Salida**: Los datos del registro creado o actualizado están disponibles para su uso en pasos posteriores.
## Acciones de flujo
### Iterador
**Itera a través de un array de registros** devueltos por un paso anterior, lo que le permite realizar acciones en cada registro de forma individual.
**Configuración**:
* Seleccione la matriz de registros de un paso anterior (por ejemplo, resultados de registros de búsqueda, de un disparador manual con disponibilidad masiva, de un nodo Code). Cuando un paso de Code o de una función lógica devuelve un array de nivel superior, selecciona la opción **Lista completa** para iterar sobre toda la salida.
* Defina las acciones a realizar en cada registro en el bucle.
<Note>
- Puede agregar varias acciones dentro de un Iterador.
- Cuando use ramas dentro de un Iterador, asegúrese de que el último paso de cada rama se conecta de vuelta al Iterador para cerrar el bucle.
</Note>
* Acceda a los campos de `Elemento actual`: para usar campos del registro que se está procesando, haga clic en el paso **Iterador** y luego seleccione **Elemento actual**. Se mostrará la lista de campos disponibles de ese registro y podrá seleccionarlos para usarlos en acciones posteriores. También puedes seleccionar **Usar el elemento completo** para pasar el elemento actual completo a un paso posterior.
<VimeoEmbed videoId="1146577247" title="Demostración en video" />
### Filtro
Filtra registros según condiciones especificadas, permitiendo que solo los registros que cumplan los criterios pasen.
**Configuración**:
* Seleccione el registro a filtrar
* Defina condiciones y criterios de filtro
* Configure qué registros deben pasar a pasos posteriores
<Note>
1. **Salida**: Los nodos de filtro no devuelven datos—actúan como compuertas. Si se cumplen las condiciones, el flujo de trabajo continúa. Si no, el flujo de trabajo se detiene en esa rama.
2. El operador `IS` se puede usar con campos numéricos. Funciona como un `EQUAL`.
</Note>
### Retraso
Pausa la ejecución del flujo de trabajo durante una duración especificada o hasta una fecha/hora específica.
**Tipos de retraso**:
| Tipo | Descripción |
| -------------------- | ------------------------------------------------------------------------ |
| **Duración** | Esperar un período de tiempo específico (días, horas, minutos, segundos) |
| **Fecha programada** | Esperar hasta una fecha y hora específicas |
**Configuración para la duración**:
* Establezca días, horas, minutos y/o segundos
* Combine múltiples unidades (p. ej., 2 días y 4 horas)
**Configuración para la fecha programada**:
* Seleccione una fecha y hora
* Puede hacer referencia a un campo de fecha de un paso anterior (p. ej., hacer seguimiento 3 días después de una reunión)
**Casos de uso**:
* Esperar 24 horas antes de enviar un correo de seguimiento
* Pausar hasta la fecha de cierre de una oportunidad
* Programar acciones para el horario laboral
<Note>
La fecha programada no puede estar en el pasado. Si se usa un campo de fecha de un paso anterior y la fecha ya ha pasado, el flujo de trabajo fallará.
</Note>
**Límites y créditos**:
* **Sin límite máximo de duración**—puede establecer retrasos de minutos, días, semanas o más
* **1 crédito consumido** cuando se ejecuta el nodo Retraso, independientemente de la duración
* **No se consumen créditos** mientras se espera—un retraso de 5 minutos cuesta lo mismo que uno de 5 días
## Acciones de comunicación
### Enviar correo electrónico
Envía un correo electrónico desde su flujo de trabajo. Esto es ideal para correos electrónicos grupales con plantillas. Los correos se verán como los que envía desde su buzón.
No es adecuado para boletines (que requieren un formato más richer) o secuencias de correo electrónico automatizadas.
**Prerrequisitos**: Agregue una cuenta de correo electrónico en Configuración → Cuentas
**Configuración**:
* Seleccione la cuenta de correo del remitente
<Note>
Solo puede enviar correos desde buzones sincronizados con su propia cuenta de Twenty. El envío desde los buzones de otros miembros del equipo (p. ej., el correo del propietario de la cuenta) está en la hoja de ruta.
</Note>
En todos los pasos siguientes, puede hacer referencia a variables de pasos anteriores para la personalización.
* Ingrese la dirección de correo electrónico del destinatario.
<Note>
Por el momento, solo es posible un destinatario.
</Note>
* Establezca la línea de asunto.
* Redacte el cuerpo del mensaje. Puede formatear enlaces, crear listas numeradas, listas de puntos de ballet y añadir archivos adjuntos.
<Note>
No es posible agregar firmas HTML por el momento.
</Note>
### Formulario
Solicita un formulario durante la ejecución del flujo de trabajo para recopilar la entrada del usuario. Las respuestas pueden usarse luego en pasos posteriores para crear registros, enviar correos o ejecutar cualquier otra acción según la entrada.
<Warning>
**Los formularios están diseñados solo para disparadores manuales**. Para flujos de trabajo con otros disparadores (Registro Creado, Actualizado, etc.), los formularios solo son accesibles a través de la interfaz de ejecución de flujos de trabajo, lo cual no es la experiencia de usuario esperada. En 2026 se lanzará un centro de notificación para soportar adecuadamente los formularios en flujos de trabajo automatizados.
</Warning>
**Configuración**:
* Configure los campos que se pedirá a los usuarios que completen. Para cada campo, elija
* un tipo entre texto, número, fecha, un registro dado, un campo de selección. Los campos de todos los objetos están disponibles para su selección.
* una etiqueta
* un valor predeterminado en `Placeholder` (opcional)
* Edite el título del formulario
**Salida**: Las respuestas del formulario están disponibles para su uso en pasos posteriores.
**Ejemplo**: El flujo de trabajo "Quick Lead" está disponible por defecto en todos los espacios de trabajo, disponible en cualquier lugar del menú de comandos `Cmd+K`.
**Cómo completar el formulario**:
* Activa tu flujo de trabajo manual desde el menú de comandos `Cmd+K`
* Complete el formulario que se muestra en el panel lateral y haga clic en `Submit`.
<Note>
Los campos no se pueden hacer obligatorios.
</Note>
<VimeoEmbed videoId="1147277989" title="Demostración en video" />
## Acciones de integración
### Código
Ejecuta JavaScript personalizado dentro de su flujo de trabajo.
Detrás de escena, cada acción de código está respaldada por su propia **función lógica** —una función TypeScript del lado del servidor que se ejecuta en la plataforma Twenty—. Cuando agregas una acción de código, Twenty crea una función lógica dedicada para ese paso y muestra su editor en línea, de modo que el código que escribes queda asociado al flujo de trabajo.
**Configuración**:
* Acceda a variables de pasos anteriores. Puede editar los nombres de las variables dinámicamente.
<VimeoEmbed videoId="1147281795" title="Demostración en video" />
* Escriba el código JavaScript en el editor
* Devuelva variables para su uso en pasos posteriores
* Pruebe el código directamente en el paso
<Note>
Si necesita usar claves de API externas en su código, debe introducirlas directamente en el cuerpo de la función. No puede configurar claves de API en otro lugar y hacer referencia a ellas en la función lógica.
</Note>
<Tip>
**¿Trabaja con arrays?** Los arrays de sistemas externos o de pasos anteriores pueden venir como cadenas. Consulte [Cómo manejar arrays en acciones de código](/l/es/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions) para la solución.
</Tip>
<Tip>
Haga clic en el icono cuadrado en la parte superior derecha del editor de código para mostrarlo en pantalla completa — es útil, ya que el ancho predeterminado del editor es limitado.
</Tip>
#### Reutilizar una función lógica en distintos flujos de trabajo
La acción de código en línea es ideal para lógica puntual, pero el código que contiene pertenece a ese único paso. Cuando quieras compartir la misma lógica en varios flujos de trabajo —o mantenerla como código fuente versionado en una app—, define una **función lógica reutilizable** en lugar de copiar y pegar código en cada acción de código.
Una función lógica se define una sola vez en una app (usando el `defineLogicFunction` del SDK) y se expone al generador de flujos de trabajo agregando `workflowActionTriggerSettings`. Una vez que tu app está instalada, esa función aparece como su propia acción en el generador de flujos de trabajo, junto con las acciones integradas. Al seleccionarla se muestran los campos de entrada que declaraste (con selectores de variables, como en las demás acciones) y se ejecuta tu código compartido; no se requiere JavaScript en línea.
| | Acción de código | Función lógica reutilizable |
| ------------------------ | -------------------------------------------------------- | -------------------------------------------------------------- |
| **Dónde vive el código** | Editor en línea, vinculado a un paso de flujo de trabajo | Definida en una app, versionada en el control de código fuente |
| **Reutilización** | Copiada y pegada por paso | Agregada como una acción en cualquier flujo de trabajo |
| **Entradas** | Variables conectadas en el editor | Campos mostrados a partir de tu esquema de entrada declarado |
| **Ideal para** | Lógica rápida y específica de un flujo de trabajo | Lógica compartida usada en varios flujos de trabajo |
Ambas se ejecutan en el mismo entorno de ejecución de funciones lógicas, por lo que una acción de código que hayas prototipado en línea puede luego promocionarse a una función lógica reutilizable con cambios mínimos.
<Tip>
Para la referencia orientada a desarrolladores sobre cómo definir funciones lógicas y exponerlas en el generador de flujos de trabajo, consulta [Logic Functions](/l/es/developers/extend/apps/logic/logic-functions), en particular la sección **Exposing a function as an AI tool or workflow action** y `workflowActionTriggerSettings`.
</Tip>
### Solicitud HTTP
Envía una solicitud a un API externo como parte de su flujo de trabajo.
<img src="/images/user-guide/workflows/http_action.png" style={{width:'100%'}} />
**Configuración**:
* Ingrese la URL del extremo de la API. Es posible usar parámetros de pasos anteriores.
* Seleccione el método HTTP (GET, POST, PUT, PATCH, DELETE)
* Agregue encabezados y valores necesarios
* Proporcione una respuesta de muestra para vista previa de estructura
## Acciones de IA
### Agente de IA - Próximamente
Ejecuta un agente de IA dentro de su flujo de trabajo para realizar tareas inteligentes.
**Configuración**:
* **Agente**: Seleccione un agente de IA existente o use el agente predeterminado
* **Prompt**: Escriba la instrucción para el agente de IA
* Haga referencia a variables de pasos anteriores en el prompt
**Qué pueden hacer los agentes de IA**:
* Analizar y resumir datos
* Clasificar o categorizar registros
* Generar contenido de texto
* Tomar decisiones basadas en datos
* Interactuar con sus datos de CRM usando herramientas
**Salida**: La respuesta del agente de IA está disponible para su uso en pasos posteriores. Si el agente tiene un esquema de salida estructurado, la respuesta seguirá ese formato.
<Note>
Las acciones del agente de IA consumen créditos de flujo de trabajo según el modelo de IA utilizado. Consulte [Créditos de flujo de trabajo](/l/es/user-guide/workflows/capabilities/workflow-credits) para obtener detalles.
</Note>
<Note>
Los agentes de IA respetan los permisos basados en roles. Puede asignar roles específicos a los agentes en **Configuración → Miembros → Roles** para controlar a qué datos pueden acceder. Consulte [Permisos](/l/es/user-guide/permissions-access/capabilities/permissions) para obtener detalles.
</Note>

View File

@@ -0,0 +1,66 @@
---
title: Ramas del flujo de trabajo
description: Crea rutas paralelas y lógica condicional en tus flujos de trabajo.
---
Las ramas te permiten dividir tu flujo de trabajo en varias rutas que pueden ejecutarse simultáneamente o de forma condicional según tus datos.
<img src="/images/user-guide/workflows/branches.png" style={{width:'100%'}} />
## Cómo funcionan las ramas
Cuando creas varias conexiones desde un único nodo, cada ruta se convierte en una rama. De forma predeterminada, **todas las ramas se ejecutan en paralelo**—no esperan unas a otras.
## Crear ramas
### Añadir una nueva rama
1. Haz **clic con el botón derecho en el lienzo principal** del flujo de trabajo (no en un nodo existente)
2. Haz clic en **Añadir nodo**
3. Elige el tipo de nodo para tu nueva rama
4. Arrastra una flecha desde la parte inferior del paso anterior hasta la parte superior de esta nueva acción
5. Repite para añadir más ramas desde el mismo nodo
<Note>
Cada rama es independiente. Añadir una rama no afecta a otras rutas existentes desde ese nodo.
</Note>
### Diseño visual
Las ramas aparecen como rutas paralelas en el editor de flujos de trabajo. Puedes arrastrar nodos para reorganizar el diseño visual sin afectar la ejecución.
## Ramas condicionales
Dado que todas las ramas se ejecutan de forma predeterminada, usa nodos **Filter** para controlar qué rutas se ejecutan realmente:
| Rama | Condición del filtro | Acción |
| ---- | --------------------- | ----------------------------- |
| A | Etapa = "Ganada" | Enviar correo de felicitación |
| B | Etapa = "Perdida" | Crear tarea de seguimiento |
| C | Etapa = "Negociación" | Notificar al gerente |
1. Crea ramas desde tu disparador o acción
2. Añade un nodo **Filter** como el primer paso de cada rama
3. Configura cada filtro con condiciones mutuamente excluyentes
4. Añade tus acciones después de cada filtro
Solo continuarán ejecutándose las ramas en las que se cumpla la condición del filtro.
## Combinar ramas
**Las ramas no se combinan automáticamente.** Cada rama se ejecuta de forma independiente hasta que termina. Tienes total flexibilidad para gestionar esto:
* **Opción 1: Mantener las ramas separadas**
Cada rama gestiona sus propias acciones de seguimiento de forma independiente. Este es el enfoque más sencillo cuando las ramas no necesitan converger.
* **Opción 2: Combinar ramas manualmente**
Al crear tu flujo de trabajo, puedes conectar manualmente varias ramas a la misma acción posterior. Simplemente arrastra flechas desde el final de cada rama hasta un nodo común.
<Note>
Aunque puedes usar un nodo [Delay](/l/es/user-guide/workflows/capabilities/workflow-actions#delay) para pausar la ejecución, actualmente no se puede configurar para esperar "hasta que otra rama termine".
</Note>
## Relacionado
* [Cómo usar las ramas en flujos de trabajo](/l/es/user-guide/workflows/capabilities/use-branches-in-workflows) - Guía paso a paso
* [Acciones de flujo de trabajo](/l/es/user-guide/workflows/capabilities/workflow-actions) - Acciones disponibles, incluyendo Filter

View File

@@ -0,0 +1,75 @@
---
title: Créditos de Workflow
description: Comprender el consumo y la gestión de los créditos de flujo de trabajo.
---
Los créditos de workflow potencian tus automatizaciones en Twenty. Comprender cómo funcionan te ayuda a optimizar costos y gestionar de manera efectiva tu presupuesto de automatización.
## Asignación de créditos
Los créditos de flujo de trabajo se asignan según tu ciclo de facturación, no según tu nivel de plan:
| Ciclo de facturación | Créditos |
| ----------------------- | ------------------- |
| **Suscripción mensual** | 5 créditos por mes |
| **Suscripción anual** | 50 créditos por año |
<Note>
5 créditos mensuales son generosos para las automatizaciones estándar. La mayoría de los equipos no superarán este límite con un uso típico de flujos de trabajo. Los créditos adicionales se necesitan principalmente para acciones avanzadas de Code y flujos de trabajo impulsados por IA.
</Note>
## Cómo Funciona el Consumo de Créditos
Los créditos se consumen cuando se ejecutan los workflows, no cuando los creas. Cada acción de workflow consume créditos en base a su complejidad:
### Consumo de Créditos por Tipo de Acción
* **Operaciones internas básicas**: Consumo de créditos muy bajo
* Buscar Registros
* Crear Registro
* Actualizar Registro
* Eliminar Registro
* Acciones de formulario
* **Operaciones complejas**: Mayor consumo de créditos
* Acciones de código (ejecución de JavaScript)
* Solicitudes HTTP a servicios externos
* **Funciones de IA**: mayor consumo de créditos
* Las acciones del agente de IA consumen créditos según el modelo de IA utilizado
* Los prompts más complejos y las respuestas más largas usan más créditos
* **Acciones de Delay**: consumo mínimo de créditos
* El nodo Delay consume **1 crédito** cuando se ejecuta
* **No se consumen créditos** durante el período de espera
* Un retraso de 5 minutos cuesta lo mismo que un retraso de 5 días
### Deducción en Tiempo Real
Los créditos se deducen en tiempo real a medida que se ejecutan los workflows. Esto significa:
* Los workflows en borrador no consumen créditos
* Solo los workflows activos y en ejecución utilizan la asignación de créditos
* Los workflows fallidos aún consumen créditos para los pasos completados
## Gestión de Créditos
### Verificar Uso de Créditos
1. Ir a **Ajustes → Facturación**
2. Ve tu consumo actual de créditos y saldo restante
3. Monitorea patrones de uso para optimizar tus workflows
### Adquirir Créditos Adicionales
Si necesitas más créditos adicionales a la asignación de tu plan:
1. Ir a **Ajustes → Facturación**
2. Haz clic en la opción para adquirir créditos adicionales. Hay paquetes de diferentes tamaños disponibles.
3. Los créditos se suman a tu saldo actual
## Mejores prácticas
* **Procesamiento por lote**: Usa operaciones a granel e Iterador de forma eficiente para reducir las llamadas de acción individuales
* **Optimización de disparadores manuales**: Para los disparadores manuales, elige la disponibilidad `Bulk` para procesar varios registros en una sola ejecución de un flujo de trabajo
* Optimiza acciones de Código para eficiencia

View File

@@ -0,0 +1,93 @@
---
title: Ejecuciones de flujos de trabajo
description: Supervise y gestione las ejecuciones de flujos de trabajo.
---
## Acerca de las ejecuciones
Una **Ejecución** es un registro de la ejecución de un flujo de trabajo. Cada vez que se activa un flujo de trabajo—ya sea por un evento de registro, una programación, una acción manual o un webhook—se crea una nueva ejecución.
## Visualización de ejecuciones
### Desde el editor de flujos de trabajo
1. Abra el flujo de trabajo que desea supervisar
2. Haga clic en el panel **Ejecuciones** en el lado derecho
3. Vea una lista de ejecuciones recientes con su estado
### Desde la vista de ejecuciones de flujos de trabajo
1. Vaya a **Ejecuciones de flujos de trabajo** en la barra lateral
2. Vea ejecuciones en todos los flujos de trabajo
3. Filtre por estado, flujo de trabajo o fecha
## Estados de las ejecuciones
| Estado | Descripción |
| ---------------- | ------------------------------------------------------------------------------------------------------- |
| **En ejecución** | El flujo de trabajo se está ejecutando actualmente |
| **Completado** | El flujo de trabajo finalizó correctamente |
| **Fallido** | El flujo de trabajo encontró un error y se detuvo |
| **En espera** | El flujo de trabajo está en pausa (p. ej., esperando una acción de Retardo o el envío de un Formulario) |
## Detalles de la ejecución
Haga clic en cualquier ejecución para ver:
* **Estado**: Estado actual de la ejecución
* **Iniciado**: Momento en que comenzó la ejecución
* **Duración**: Tiempo que tardó la ejecución
* **Datos del disparador**: La entrada que inició el flujo de trabajo
* **Salidas de los pasos**: Datos devueltos por cada paso
* **Mensajes de error**: Si la ejecución falló, qué salió mal
## Ejecución paso a paso
Cada ejecución muestra el progreso a través de su flujo de trabajo:
1. Vea qué pasos se completaron correctamente
2. Identifique dónde se produjeron fallos
3. Vea los datos transferidos entre pasos
4. Depure problemas examinando las entradas y salidas de los pasos
## Gestión de errores
Cuando una ejecución falla:
1. Abra la ejecución fallida
2. Encuentre el paso que causó el fallo
3. Revise el mensaje de error para obtener detalles
Problemas comunes:
* Faltan campos obligatorios
* Formato de datos no válido
* Errores de API externa
* Problemas de permisos
## Volver a ejecutar workflows
Si una ejecución falla, puedes:
* Corregir el problema subyacente y esperar al siguiente disparador
* Para flujos de trabajo manuales, se activa de nuevo con los mismos datos o actualizados
* Revisar la lógica del flujo de trabajo para prevenir futuras fallas
## Consejos de rendimiento
### Gestionar Historial de Ejecución
* Las ejecuciones se mantienen para referencia histórica
* Las ejecuciones muy antiguas pueden ser archivadas automáticamente
* Exportar datos de ejecución si necesita mantener registros
### Monitoreo de Mejores Prácticas
* Comprobar que se ejecuta regularmente después de activar nuevos flujos de trabajo
* Revisar ejecuciones fallidas para identificar patrones
## Relacionado
* [Disparadores de flujos de trabajo](/l/es/user-guide/workflows/capabilities/workflow-triggers)
* [Acciones de flujos de trabajo](/l/es/user-guide/workflows/capabilities/workflow-actions)
* [Solución de problemas de flujo de trabajo](/l/es/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting)

View File

@@ -0,0 +1,137 @@
---
title: Disparadores de Flujos de Trabajo
description: Obtén información sobre los distintos activadores que inician tus flujos de trabajo.
---
## Acerca de los activadores
Los flujos de trabajo siempre comienzan con un solo disparador que define cuándo debe ejecutarse la automatización.
<img src="/images/user-guide/workflows/workflow_triggers.png" style={{width:'100%'}} />
<Tip>
**¡Se admiten objetos avanzados!** Más allá de los objetos estándar de CRM (Personas, Empresas, Oportunidades), también puedes activar flujos de trabajo y ejecutar acciones sobre:
* Miembros del espacio de trabajo
* Eventos del calendario
* Mensajes (correos electrónicos)
* Tareas, notas y muchos otros objetos del sistema
Esto abre potentes automatizaciones como notificar a los miembros del equipo cuando se crean eventos del calendario o procesar automáticamente los correos electrónicos entrantes.
</Tip>
## Se crea un registro
Inicia el flujo de trabajo cuando se crea un nuevo registro en un objeto seleccionado (Personas, Empresas, Oportunidades o cualquier objeto personalizado).
**Configuración**: Selecciona el tipo de objeto para monitorear nuevos registros.
<Note>
* Este disparador es ideal para registros creados por CSV, buzón de correo y sincronización de calendario, o API.
* **No se recomienda para registros creados manualmente**: con este activador, los flujos de trabajo comienzan tan pronto como se crea el registro. Ya que la interfaz de usuario veinte ofrece guardado automático en la marcha (no hay modo de edición y luego una validación para guardar registros), el flujo de trabajo se activará antes de que el usuario introduzca todos los campos.
Para activar este flujo de trabajo en registros creados manualmente, se recomienda usar el activador `Record is created or updated` en su lugar.
</Note>
## Se actualiza un registro
Inicia el flujo de trabajo cuando se realizan cambios en un registro existente.
**Configuración**:
* Selecciona el tipo de objeto
* Opcionalmente especifica qué campos monitorear para cambios
## Se actualiza o se crea un registro
Inicia el flujo de trabajo cuando un registro es creado o actualizado en un objeto seleccionado.
**¿Por qué esto es importante?**:
* **Importaciones API/CSV**: Los registros se crean con todos los campos poblados inmediatamente
* **Creación manual**: Los registros se crean primero, luego los campos se agregan en actualizaciones posteriores
**Configuración**:
* Selecciona el tipo de objeto para monitorear
* Opcionalmente especifica qué campos monitorear para cambios
* El flujo de trabajo se activará tanto en la creación inicial como en cualquier actualización posterior
## Se elimina un registro
Inicia el flujo de trabajo cuando un registro es eliminado de un objeto.
**Configuración**: Selecciona el tipo de objeto para monitorear eliminaciones.
## Activador manual
Inicia el flujo de trabajo cuando es desencadenado por una acción del usuario. Se puede acceder a este activador a través del menú `Cmd+K` o mediante un botón personalizado que se mostrará en la barra de navegación superior después de seleccionar uno o varios registros.
<img src="/images/user-guide/workflows/add_to_newsletter_button.png" style={{width:'100%'}} />
**Configuración de Disponibilidad**:
Elige cómo debe manejar el flujo de trabajo la selección de registros:
* **Global**: No se requiere ningún registro para activar este flujo de trabajo. El flujo de trabajo se activa desde el menú de comandos `Cmd+K` en cualquier lugar (desde cualquier objeto) y no utiliza registros como entrada.
Para una disponibilidad **única** y **masiva**, los registros seleccionados se pasarán a tu flujo de trabajo. Esto está configurado para un objeto dado, y se pueden seleccionar varios registros antes de activar el flujo de trabajo.
* **Single**: El flujo de trabajo se ejecutará de principio a fin tantas veces como haya registros seleccionados.
<Note>
**Límite flexible: 100 ejecuciones/minuto**. A partir de ese punto, los flujos de trabajo permanecen en estado "Not Started" y se procesan gradualmente—ya sea mediante un trabajo en segundo plano o cuando otro flujo de trabajo entra en la cola. Esto significa que puedes seleccionar más de 100 registros con un único activador; la ejecución solo será más lenta.
</Note>
* **Bulk**: El flujo de trabajo se ejecutará una vez, proporcionando la lista completa de registros como entrada. Esto significa que el flujo de trabajo debe contener una [Acción Iterator](/l/es/user-guide/workflows/capabilities/workflow-actions#iterator).
<Note>
Esto es más avanzado y es ideal para quienes quieren optimizar la cantidad de ejecuciones del flujo de trabajo.
</Note>
<img src="/images/user-guide/workflows/manual_trigger.png" style={{width:'100%'}} />
**Configuración Adicional**:
* Selecciona el objeto de destino (para disponibilidad individual y en masa)
* Elige un ícono de comando para el disparador del flujo de trabajo
* Configura la ubicación en la barra de navegación (fijado o no fijado)
**Métodos de Acceso**:
* Menú `Cmd+K` para encontrar e iniciar flujos de trabajo manuales
* Botón personalizado en la barra de navegación superior (si está configurado)
## Activador basado en tiempo: según un horario
Inicia el flujo de trabajo de forma recurrente según lo defina.
**Configuración**:
* Selecciona la unidad de tiempo (minutos, horas, días)
* Ingresa un valor o usa expresiones cron personalizadas para una programación avanzada
<Note>
**Zona horaria**: Los flujos de trabajo programados se ejecutan en **UTC**. Al configurar las horas para programaciones diarias, convierte tu hora local a UTC.
</Note>
## Activador externo: Webhook
Inicia el flujo de trabajo cuando se recibe una solicitud GET o POST de un servicio externo.
<img src="/images/user-guide/workflows/webhook_trigger.png" style={{width:'100%'}} />
**Configuración**:
* El flujo de trabajo proporciona una URL de webhook única—cópiala y agrégala a tu sistema externo como el endpoint a invocar.
* Para solicitudes POST, define la estructura del cuerpo esperada para que Twenty sepa qué datos esperar. Añade aquí los campos que recibirás y que se necesitarán más abajo en tu flujo de trabajo.
* Configura la autenticación (próximamente).
## Elegir el activador correcto
| Caso de uso | Activador recomendado |
| ------------------------------------------------- | ---------------------------------- |
| Los nuevos leads necesitan procesamiento | Se crea un registro |
| Los cambios en los datos requieren sincronización | Se actualiza un registro |
| Importación/gestión manual de datos | Se actualiza o se crea un registro |
| Limpieza después de la eliminación | Se elimina un registro |
| Acción iniciada por el usuario | Iniciar manualmente |
| Informes recurrentes | Según una programación |
| Integración externa | Webhook o según un horario |

View File

@@ -0,0 +1,84 @@
---
title: Versiones del flujo de trabajo
description: Gestiona versiones y borradores de flujos de trabajo.
---
## Acerca de las versiones
Cada vez que activas un flujo de trabajo, se crea una nueva versión. Esto te permite hacer un seguimiento de los cambios a lo largo del tiempo y revertir a configuraciones anteriores si es necesario.
## Estados de la versión
| Estado | Descripción |
| --------------- | ---------------------------------------------- |
| **Borrador** | En edición, aún no publicado |
| **Activo** | Versión en vivo respondiendo a activadores |
| **Desactivado** | Anteriormente activo pero detenido manualmente |
| **Archivado** | Versiones pasadas guardadas para historial |
## Trabajar con borradores
Cuando editas un flujo de trabajo activo, tus cambios se guardan como un **borrador**. La versión activa sigue ejecutándose mientras trabajas en las actualizaciones.
Cuando termines de editar, puedes:
* **Activar**: Publica el borrador como la nueva versión activa (la versión anterior se archiva)
* **Descartar**: Elimina el borrador y conserva la versión activa actual
## Historial de versiones
### Ver versiones anteriores
1. Abre el flujo de trabajo
2. Haz clic en la pestaña **Versiones**
3. Consulta todas las versiones anteriores con marcas de tiempo
### Restaurar una versión
1. Encuentra la versión que quieres restaurar
2. Haz clic en **Usar como borrador**
3. La versión se copia a un nuevo borrador
4. Realiza las actualizaciones necesarias
5. Activa cuando esté lista
## Mejores prácticas
### Gestión de versiones
* Activa solo cuando esté lista para producción
* Mantén cambios significativos entre versiones
* Documenta los cambios importantes en los nombres o descripciones de los flujos de trabajo
* Prueba en modo borrador antes de activar
### Revertir cambios
* Si una nueva versión causa problemas, restaura la versión anterior
* Usa el historial de versiones para ver qué cambió
* Siempre prueba las versiones restauradas antes de activar
## Flujos de Trabajo comunes
### Edición rápida
1. Realiza cambios menores en un flujo de trabajo activo
2. Prueba en modo borrador
3. Activa la nueva versión
### Revisión importante
1. Usa la versión anterior como punto de partida
2. Realiza cambios significativos en el borrador
3. Prueba a fondo todos los escenarios
4. Activa cuando estés seguro
### Reversión
1. Identifica el problema con la versión actual
2. Encuentra la última versión funcional en el historial
3. Haz clic en **Usar como borrador**
4. Activa para restaurar el comportamiento anterior
## Relacionado
* [Primeros pasos con Flujos de Trabajo](/l/es/user-guide/workflows/overview)
* [Ejecuciones de flujos de trabajo](/l/es/user-guide/workflows/capabilities/workflow-runs)