Reglas de flujo de trabajo
Automatice sus procesos de Helpdesk con reglas de flujo de trabajo personalizables. Las reglas de flujo de trabajo le permiten actualizar automaticamente los atributos de tickets, enviar notificaciones y desencadenar acciones especificas basadas en eventos o condiciones definidos. Esta funcion ayuda a reducir el trabajo manual, mantener la consistencia y acelerar los tiempos de respuesta.
Despues de la instalacion, Helpdesk MX crea automaticamente la regla de flujo de trabajo predeterminada "Auto-change status to Waiting for Customer on agent reply".
Informacion general

- Rule Name: defina un nombre descriptivo para la regla. Una denominacion clara ayuda a su equipo a identificar facilmente lo que hace cada regla.
- Active: habilite o deshabilite la regla. Solo se ejecutan las reglas activas cuando se cumplen su evento y condiciones.
- Event: elija el evento que desencadena la regla.
- Priority / Sort Order: especifique el orden de procesamiento de la regla. Los numeros mas bajos se ejecutan primero. Esto ayuda a controlar que reglas tienen precedencia cuando multiples reglas se aplican al mismo evento.
- Stop Further Rules Processing: detener la ejecucion de reglas con menor prioridad una vez que se ha aplicado esta regla. Util cuando desea que una regla especifica tenga control total de un evento.
Eventos
Los eventos definen cuando se evalua la regla de flujo de trabajo. Los eventos disponibles incluyen:
- New Ticket — se activa cuando se crea un nuevo ticket.
- New Customer Reply — se activa cuando un cliente envia una nueva respuesta.
- New Staff Reply — se activa cuando un agente publica una respuesta.
- New Third Party Reply — se activa cuando un tercero envia un mensaje.
- Ticket Assigned — se activa cuando un ticket se asigna a un usuario.
- Ticket Updated — se activa cuando se actualizan campos del ticket.
- Cron Every Hour — activado por el sistema cada hora, permitiendo acciones basadas en tiempo.
Condiciones
Las condiciones definen cuando debe ejecutarse una regla de flujo de trabajo. Puede usar una o multiples condiciones, combinarlas con logica ALL/ANY e incluso crear grupos anidados para filtrado avanzado. Deje esta seccion vacia para que la regla se ejecute en cada ocurrencia del evento.

Campos disponibles
Puede construir condiciones usando los siguientes campos:
- Subject — verifica palabras o frases en el asunto del ticket.
- Customer Email — coincide con la direccion de correo electronico del cliente.
- Customer Name — compara el nombre del cliente.
- Channel — filtra tickets creados desde fuentes especificas (ej., correo electronico, formulario de contacto, API).
- Department — coincide con el departamento actual asignado al ticket.
- Department (Before Change) — permite comparacion con el departamento antes de un evento de actualizacion.
- Folder — verifica a que carpeta pertenece actualmente el ticket.
- Folder (Before Change) — verifica la carpeta antes del ultimo cambio.
- Owner — coincide con el agente asignado.
- Owner (Before Change) — compara el propietario antes de una actualizacion.
- Priority — verifica la prioridad actual del ticket.
- Priority (Before Change) — compara la prioridad antes de que fuera actualizada.
- Status — verifica el estado actual del ticket.
- Status (Before Change) — compara el estado anterior.
- Last Message — le permite verificar el contenido en el ultimo mensaje.
- Last Reply By — define quien respondio ultimo (cliente, personal o tercero).
- Hours Since Created — tiempo transcurrido desde que se creo el ticket.
- Hours Since Last Reply — tiempo desde que se hizo la ultima respuesta.
- Hours Since Updated — tiempo desde que se modifico el ticket por ultima vez.
Operadores de condicion
Cada condicion puede usar uno de los siguientes operadores para definir como se comparan los valores:
- Equals — se activa cuando el valor del campo coincide exactamente con el valor especificado.
- Not Equals — se activa cuando el valor del campo difiere del valor especificado.
- Greater Than — se activa cuando el valor es mayor que el especificado (principalmente usado con campos numericos o de tiempo).
- Greater Than or Equals — se activa cuando el valor es mayor o igual al especificado.
- Less Than — se activa cuando el valor es menor que el especificado.
- Less Than or Equals — se activa cuando el valor es menor o igual al especificado.
- Between — se activa cuando el valor cae entre dos numeros especificados (util para condiciones basadas en tiempo).
- Matches Regex — compara valores de campos usando expresiones regulares para coincidencia de patrones avanzada.
- Starts With — se activa si el campo comienza con el texto especificado.
- Ends With — se activa si el campo termina con el texto especificado.
- Is Empty — se activa cuando el campo no tiene valor.
- Is Not Empty — se activa cuando el campo contiene cualquier valor.
- Contains — se activa cuando el campo incluye el texto especificado.
- Does Not Contain — se activa cuando el campo no incluye el texto especificado.
Acciones
Las acciones definen que sucede una vez que se cumplen todas las condiciones. Multiples acciones pueden combinarse dentro de una sola regla.

Las acciones disponibles incluyen:
- Set Status — actualizar el estado del ticket.
- Set Priority — cambiar el nivel de prioridad.
- Set Department — reasignar el ticket a otro departamento.
- Set Owner — asignar a un agente especifico.
- Change Folder — mover el ticket a una carpeta especifica.
- Add Tags — agregar etiquetas para categorizacion.
- Remove Tags — eliminar etiquetas existentes del ticket.
- Send Email — enviar notificaciones por correo electronico a destinatarios especificados.
- Run Script — ejecutar codigo JavaScript personalizado para automatizacion avanzada.
Accion Send Email
La accion Send Email le permite enviar notificaciones automaticas por correo electronico cuando se activa una regla. Esto es util para alertar a miembros del equipo, notificar a clientes o comunicarse con partes externas.
Opciones disponibles:
- Send to ticket owner — notificar al agente asignado.
- Send to all department users — alertar a todos los miembros del departamento del ticket.
- Send to customer — informar al cliente sobre actualizaciones.
- Send to other addresses — especificar direcciones de correo electronico personalizadas.
- Email Subject — definir la linea de asunto del correo electronico (admite variables de plantilla Liquid).
- Email Body — componer el contenido del correo electronico (admite variables de plantilla Liquid).
- Include attachments — adjuntar archivos del ultimo mensaje.
Variables de plantilla
Puede usar variables de plantilla Liquid en los campos Email Subject y Email Body para insertar dinamicamente informacion del ticket, cliente y mensaje.
Variables de ticket:
| Variable | Descripcion |
|---|---|
{{ ticket.code }} | Codigo del ticket (ej., T-001) |
{{ ticket.subject }} | Linea de asunto del ticket |
{{ ticket.created_at }} | Marca de tiempo de creacion del ticket |
{{ ticket.updated_at }} | Marca de tiempo de ultima actualizacion |
{{ ticket.customer_name }} | Nombre completo del cliente |
{{ ticket.customer_email }} | Direccion de correo electronico del cliente |
{{ ticket.admin_url }} | Enlace directo al ticket en el panel de administracion |
{{ ticket.admin_last_message_text }} | Cuerpo de la ultima respuesta del agente (texto plano) |
{{ ticket.admin_last_message_html }} | Cuerpo de la ultima respuesta del agente (HTML) |
{{ ticket.customer_last_message_text }} | Cuerpo de la ultima respuesta del cliente (texto plano) |
{{ ticket.customer_last_message_html }} | Cuerpo de la ultima respuesta del cliente (HTML) |
Variables del propietario/asignado:
| Variable | Descripcion |
|---|---|
{{ owner.firstname }} | Nombre del agente asignado |
{{ owner.lastname }} | Apellido del agente asignado |
{{ owner.email }} | Correo electronico del agente asignado |
{{ owner.fullname }} | Nombre completo del agente asignado |
{{ owner.is_admin }} | Si el propietario es administrador |
Variables de departamento:
| Variable | Descripcion |
|---|---|
{{ department.name }} | Nombre del departamento |
{{ department.sender_name }} | Nombre del remitente del departamento |
Variables de mensaje (cuando se activa por eventos de mensaje):
| Variable | Descripcion |
|---|---|
{{ message.body_text }} | Contenido del mensaje (texto plano) |
{{ message.body_html }} | Contenido del mensaje (HTML) |
{{ message.type }} | Tipo de mensaje |
{{ message.created_at }} | Marca de tiempo de creacion del mensaje |
Variables de fecha/hora:
| Variable | Descripcion |
|---|---|
{{ now }} | Marca de tiempo actual (RFC3339) |
{{ date }} | Fecha actual (YYYY-MM-DD) |
{{ time }} | Hora actual (HH:MM:SS) |
{{ year }} | Ano actual |
Ejemplo de plantilla de correo electronico:
Subject: Nueva respuesta en ticket #{{ ticket.code }}
Hola {{ owner.firstname }},
Un cliente ha respondido al ticket "{{ ticket.subject }}".
Cliente: {{ ticket.customer_name }} ({{ ticket.customer_email }})
Ultimo mensaje:
{{ ticket.customer_last_message_text }}
Ver ticket: {{ ticket.admin_url }}
Accion Run Script
La accion Run Script le permite ejecutar codigo JavaScript personalizado para implementar logica de automatizacion compleja que va mas alla de simples asignaciones de campos. Los scripts pueden leer datos de tickets, tomar decisiones condicionales y actualizar multiples campos a la vez.
Propiedades de ticket disponibles (lectura):
| Propiedad | Descripcion |
|---|---|
ticket.id | Identificador unico del ticket |
ticket.subject | Linea de asunto del ticket |
ticket.folder | Carpeta actual (INBOX, ASSIGNED, SPAM, etc.) |
ticket.tags | Arreglo de etiquetas |
ticket.status | Objeto con id, code y name |
ticket.priority | Objeto con id y name |
ticket.department | Objeto con id y name |
ticket.owner | Objeto con id, email, firstname, lastname |
ticket.customer | Objeto con id, email, firstname, lastname, name |
ticket.<custom_field_code> | Valor del campo personalizado por su codigo |
Propiedades de ticket disponibles (escritura):
| Propiedad | Valor esperado |
|---|---|
ticket.status | Codigo de estado (string) o ID de estado |
ticket.priority | Nombre de prioridad (string) o ID de prioridad |
ticket.department | Nombre de departamento (string) o ID de departamento |
ticket.owner | Correo electronico del usuario (string) o ID de usuario |
ticket.folder | Nombre de carpeta: "INBOX", "ASSIGNED", "SPAM", "ARCHIVE" |
ticket.tags | Arreglo de strings de etiquetas |
ticket.<custom_field_code> | Valor que coincide con el tipo de campo personalizado |
Funciones auxiliares:
| Funcion | Retorna |
|---|---|
getStatuses() | Arreglo de todos los estados disponibles |
getPriorities() | Arreglo de todas las prioridades disponibles |
getDepartments() | Arreglo de todos los departamentos disponibles |
getUsers() | Arreglo de todos los usuarios disponibles |
fetch(url, options) | Hacer solicitudes HTTP a APIs externas |
Contexto de mensaje (disponible cuando la regla se activa por un evento de mensaje):
| Propiedad | Descripcion |
|---|---|
message.id | Identificador unico del mensaje |
message.body_text | Contenido del mensaje (texto plano) |
message.body_html | Contenido del mensaje (HTML) |
message.createdAt | Marca de tiempo de creacion del mensaje |
Ejemplos de scripts:
// Establecer prioridad basada en palabras clave del asunto
if (ticket.subject.toLowerCase().includes("urgent")) {
ticket.priority = "High";
}
// Enrutar tickets a departamentos segun el contenido
if (ticket.subject.includes("billing") || ticket.subject.includes("invoice")) {
ticket.department = "Billing";
} else if (ticket.subject.includes("technical") || ticket.subject.includes("error")) {
ticket.department = "Technical Support";
}
// Manejo de clientes VIP
if (ticket.customer && ticket.customer.email.endsWith("@enterprise.com")) {
ticket.priority = "High";
ticket.tags = ["vip", "enterprise"];
}
// Establecer valor de campo personalizado
ticket.order_id = "12345";
ticket.vip_customer = true;
ticket.order_amount = 99.99;
// Obtener datos del cliente desde API externa y actualizar ticket
var response = fetch("https://api.example.com/customers/" + ticket.customer.email, {
headers: { "Authorization": "Bearer YOUR_API_KEY" }
});
if (response.ok && response.json) {
ticket.customer_tier = response.json.tier;
if (response.json.tier === "enterprise") {
ticket.priority = "High";
ticket.department = "Enterprise Support";
}
}
Notas importantes:
- Los scripts tienen un tiempo de espera de 10 segundos para evitar bucles infinitos.
- Los valores de campo invalidos (estado inexistente, prioridad, etc.) se ignoran de manera elegante.
- Los errores de script no afectan a otras reglas ni bloquean el sistema.
- Los campos personalizados se referencian por su codigo, no por su nombre.
Notificaciones
Puede enviar notificaciones automaticas por correo electronico cuando se ejecute la regla para mantener a todas las partes informadas.

Las opciones de notificacion incluyen:
- Send email to ticket owner — notificar al agente asignado.
- Send email to all department users — alertar a todos los miembros del departamento.
- Send email to customer — informar al cliente de los cambios.
- Send email to other addresses — enviar a destinatarios externos.
- Email Subject — especificar la linea de asunto.
- Email Body — componer el contenido del correo electronico.
- Attach files previously attached to the last message — incluir archivos adjuntos anteriores para contexto.
Ejemplos de reglas de flujo de trabajo
Cambiar estado en respuesta del cliente
Cuando un cliente responde, el sistema cambia automaticamente el estado del ticket a Waiting for Agent.
Tipo: Workflow Rule
Is Active: Si
Event: New Customer Reply
Conditions: Status Not Equals Closed
Actions: Set Status -> Waiting for Agent
Nueva respuesta de tercero
Cuando un tercero envia un mensaje, el sistema establece el estado en Waiting for Agent y agrega una etiqueta `third_party`.
Tipo: Workflow Rule
Is Active: Si
Event: New Third Party Reply
Conditions: Ninguna
Actions:
Set Status -> Waiting for Agent
Add Tags -> third_party
Ticket asignado al personal
Cuando un ticket se asigna a un miembro del personal, se mueve automaticamente a la carpeta Assigned y envia una notificacion por correo electronico.
Tipo: Workflow Rule
Is Active: Si
Event: Ticket Assigned
Conditions: Ninguna
Actions:
Change Folder -> Assigned
Send email to ticket owner
Cerrar ticket despues de 72 horas sin respuesta
Si no se recibe respuesta en 72 horas, el ticket se cierra automaticamente.
Tipo: Workflow Rule
Is Active: Si
Event: Cron Every Hour
Conditions:
Status Equals Waiting for Customer
Hours Since Last Reply Greater Than 72
Actions: Set Status -> Closed
Script: Enrutar y priorizar segun dominio de correo del cliente
Enrutar clientes empresariales a soporte dedicado y establecer alta prioridad.
Tipo: Workflow Rule
Is Active: Si
Event: New Ticket
Conditions: Ninguna
Actions: Run Script
```javascript
if (ticket.customer && ticket.customer.email) {
var domain = ticket.customer.email.split("@")[1];
if (domain === "enterprise.com" || domain === "bigcorp.com") {
ticket.priority = "High";
ticket.department = "Enterprise Support";
ticket.tags = ["enterprise", "priority"];
}
}
```
Script: Auto-categorizar tickets por palabras clave del asunto
Categorizar automaticamente tickets y establecer campos personalizados segun el contenido del asunto.
Tipo: Workflow Rule
Is Active: Si
Event: New Ticket
Conditions: Ninguna
Actions: Run Script
```javascript
var subject = ticket.subject.toLowerCase();
if (subject.includes("refund") || subject.includes("return")) {
ticket.department = "Billing";
ticket.category = "refund_request";
} else if (subject.includes("password") || subject.includes("login")) {
ticket.department = "Technical Support";
ticket.category = "account_access";
} else if (subject.includes("order") || subject.includes("shipping")) {
ticket.department = "Orders";
ticket.category = "order_inquiry";
}
```
Script: Escalar segun analisis de contenido del mensaje
Detectar palabras clave urgentes en mensajes y auto-escalar tickets.
Tipo: Workflow Rule
Is Active: Si
Event: New Customer Reply
Conditions: Ninguna
Actions: Run Script
```javascript
if (message && message.body_text) {
var body = message.body_text.toLowerCase();
var urgentKeywords = ["asap", "urgent", "critical", "down", "outage", "emergency"];
for (var i = 0; i < urgentKeywords.length; i++) {
if (body.includes(urgentKeywords[i])) {
ticket.priority = "High";
ticket.tags = ticket.tags.concat(["escalated"]);
break;
}
}
}
```