# Códigos de error: Workflows: guardar, validar y activar

> Validaciones al guardar, activar o correr `wf validar` sobre un workflow (`src/workflows/services/*.validator.ts`). Un workflow que no pasa no se guarda o no se activa.

**Cómo se detecta (toda la familia):** Respuesta del guardado o de `yarn -s wf validar` (el `code` y el paso culpable).

**Qué hacer (toda la familia):** Corregir la configuración del paso que nombra el mensaje (skill `cambiar-workflow` o `crear-workflow`).

Lo que un código no dice lo hereda de la familia.

## `max_steps_reached`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** El workflow llegó al máximo de pasos; hay que dividir la lógica en otro workflow.

## `WORKFLOW_ACTION_CHANNEL_UNSUPPORTED`

- **Tipo:** detalle · **HTTP:** — · **Estado:** vigente
- **Qué significa:** Una action del workflow no sale por un canal que escucha el trigger (p. ej. una lista de WhatsApp en un workflow de Instagram). Guardar el paso o la action lo rechaza siempre (400) desde el 15/10/2026, por la API, `wf` y el editor; antes era solo un aviso en el log.
- **Qué hacer:** Quitar esa action o cambiarla por una que el canal sí mande (el mensaje dice cuál y en qué rama), o separar el workflow por canal.

## `WORKFLOW_ACTION_TREE_TOO_DEEP`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** El árbol de ramas es más hondo que el tope (10 niveles); hay que separar ramas en pasos con «Ir a paso».

## `WORKFLOW_ACTIVE_CANNOT_DELETE`

- **Tipo:** HTTP · **HTTP:** 409 · **Estado:** vigente
- **Qué significa:** No se borra un workflow activo: hay que desactivarlo antes (y borrar es irreversible).

## `WORKFLOW_CATEGORY_MISSING_SPECIAL_BRANCH`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** Ramificar por categoría exige las ramas `_none` (sin categoría) y `_other` (otra).

## `WORKFLOW_CATEGORY_NO_SNAPSHOT`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** Ramificar por categoría necesita al menos una categoría: hay que recargar las categorías de Zauru antes de guardar.

## `WORKFLOW_CONFIG_MISSING_FIELDS`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** Faltan campos obligatorios de la configuración de una action; el mensaje dice cuáles.

## `WORKFLOW_DURATION_INVALID`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** Una duración no es un número entero de segundos mayor a 0.

## `WORKFLOW_DURATION_TOO_LONG`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** Una duración pasa el máximo de 1 año.

## `WORKFLOW_FAN_OUT_TRIGGER_NOT_ALLOWED`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** El workflow reparte a muchos contactos (fan-out) y su trigger no lo permite (solo programado o manual).

## `WORKFLOW_GOTO_STEP_NOT_FOUND`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** Hay saltos «Ir a paso» a pasos que no existen.

## `WORKFLOW_INVOKED_TRIGGER_IS_INTERNAL`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** Este workflow solo puede ser invocado desde la action final de otro workflow.

## `WORKFLOW_LIST_INVALID_ROWS`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** La lista no la aceptaría WhatsApp (título largo, filas repetidas o de más); el mensaje dice qué.

## `WORKFLOW_LIST_WITHOUT_ROWS`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** La lista no tiene ninguna opción que ofrecer.

## `WORKFLOW_LOCATION_IN_USE`

- **Tipo:** HTTP · **HTTP:** 409 · **Estado:** vigente
- **Qué significa:** La ubicación la usan actions de workflow: se archiva en vez de borrarla, o se quita primero de esos flujos.

## `WORKFLOW_LOOP_BODY_NO_RETURN`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** El cuerpo del bucle tiene ramas que terminan sin volver; cada hoja debe terminar en «Ir a paso», nunca en «Finalizar».

## `WORKFLOW_LOOP_CANNOT_BE_NESTED`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** Un bucle no puede vivir dentro de una rama: tiene que ser la única action de su paso.

## `WORKFLOW_LOOP_MISSING_BRANCH`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** Al bucle le faltan las ramas `_item` (cuerpo) o `_done` (al terminar).

## `WORKFLOW_LOOP_SOURCE_MUST_BE_STABLE`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** El bucle tiene que ser la única action de su paso; la lectura de datos va en un paso anterior.

## `WORKFLOW_LOOP_SOURCE_NOT_CONFIGURED`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** El bucle no dice de dónde sacar la colección o cómo identificar cada ítem.

## `WORKFLOW_MESSAGE_LIMIT_EXCEEDED`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** Un mensaje del workflow pasa los límites del canal; hay que acortarlo antes de guardar.

## `WORKFLOW_REPLY_MISSING_CATCH_ALL`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** Una action que espera respuesta no tiene las ramas `_other` y `_timeout`; sin ellas el flujo muere en silencio ante una respuesta no prevista.

## `WORKFLOW_RETURN_POINT_DUPLICATE`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** El mismo punto de regreso está marcado más de una vez.

## `WORKFLOW_RETURN_POINT_IN_USE`

- **Tipo:** HTTP · **HTTP:** 409 · **Estado:** vigente
- **Qué significa:** Se quitó un punto de regreso que todavía usa un «Volver».

## `WORKFLOW_RETURN_POINT_INVALID`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** El punto de regreso necesita nombre y una clave válida.

## `WORKFLOW_RETURN_POINT_NOT_ALLOWED`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** Esa action no puede ser punto de regreso (salta o termina el flujo).

## `WORKFLOW_RETURN_POINT_NOT_FOUND`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** El punto de regreso elegido no es válido; hay que elegirlo de nuevo.

## `WORKFLOW_SCHEDULE_CRON_MISSING`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** Un workflow programado no tiene horario: se activaría y nunca correría.

## `WORKFLOW_STEP_HAS_REFERENCES`

- **Tipo:** HTTP · **HTTP:** 409 · **Estado:** vigente
- **Qué significa:** El paso que se quiere borrar recibe saltos de otros pasos (pasarían a «Finalizar»).

## `WORKFLOW_STEP_TOO_LARGE`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** El paso es muy grande (cerca del tope de ~100 KB del cuerpo); hay que dividirlo en más pasos.

## `WORKFLOW_SWITCH_CASE_WITHOUT_CONDITIONS`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** Un caso de la evaluación múltiple no tiene condiciones y nunca se cumpliría.

## `WORKFLOW_SWITCH_NO_CASES`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** La evaluación múltiple no tiene casos: todo se iría por «Sino».

## `WORKFLOW_TEMPLATE_BRANCH_WITHOUT_BUTTON`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** Hay ramas que no corresponden a ningún botón de la plantilla.

## `WORKFLOW_TEMPLATE_BUTTON_WITHOUT_BRANCH`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** La plantilla espera respuesta y tiene botones sin rama: el flujo quedaría esperando sin saber a dónde ir.

## `WORKFLOW_TEMPLATE_BUTTONS_NEED_SWITCH`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** Con varios números emisores, las plantillas con botones no caben en un solo envío: hay que separar los números con un switch.

## `WORKFLOW_TEMPLATE_CHANNEL_ACCOUNT_NOT_IN_ENTITY`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** La configuración de «plantilla por número» nombra números que no son de la entidad.

## `WORKFLOW_TEMPLATE_HEADER_MEDIA_MISSING`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** La plantilla tiene encabezado con archivo y no se resolvió; hay que volver a elegir la plantilla.

## `WORKFLOW_TEMPLATE_INVALID_CHANNEL_ACCOUNT`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** Las claves de «plantilla por número» no son ids de número emisor.

## `WORKFLOW_TEMPLATE_NOT_SELECTED`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** Selecciona un template. Si la entidad tiene varios numeros, configura el template de cada numero: una plantilla pertenece a la WABA de un solo numero.

## `WORKFLOW_TEMPLATE_PARAM_COUNT_MISMATCH`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** La plantilla espera otro número de variables que las configuradas.

## `WORKFLOW_TEMPLATE_VARIANT_WITHOUT_TEMPLATE`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** Una variante por número no tiene plantilla elegida.

## `WORKFLOW_TERMINAL_ACTION_NOT_LAST`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** Hay actions después de una que corta el flujo (sale por sus ramas): nunca se ejecutarían.

## `WORKFLOW_TEST_PHONE_NUMBERS_LIMIT`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** «Avisar a un número (pruebas)» tiene más números de los permitidos.

## `WORKFLOW_TIME_TRAVEL_TARGET_REQUIRED`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** «Volver» no tiene a dónde volver, o tiene paso y punto de regreso a la vez.

## `WORKFLOW_WEB_PAGE_ORDER_DISCOUNT_INVALID`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** El descuento de «Página web» en modo orden no es válido.

## `WORKFLOW_WEB_PAGE_RESULT_MISSING_BRANCH`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** «Esperar resultado de la página web» necesita sus cinco ramas fijas.
