워크플로 규칙
사용자 정의 가능한 워크플로 규칙으로 헬프데스크 프로세스를 자동화하세요. 워크플로 규칙을 사용하면 티켓 속성을 자동으로 업데이트하고, 알림을 보내고, 정의된 이벤트 또는 조건에 따라 특정 작업을 트리거할 수 있습니다. 이 기능은 수동 작업을 줄이고, 일관성을 유지하며, 응답 시간을 단축하는 데 도움이 됩니다.
설치 후 Helpdesk MX는 기본 워크플로 규칙 "상담원 답장 시 상태를 고객 대기 중으로 자동 변경"을 자동으로 생성합니다.
일반 정보

- Rule Name: 규칙의 설명적인 이름을 정의합니다. 명확한 명명은 팀이 각 규칙이 수행하는 작업을 쉽게 식별하는 데 도움이 됩니다.
- Active: 규칙을 활성화하거나 비활성화합니다. 활성 규칙만 이벤트 및 조건이 충족될 때 실행됩니다.
- Event: 규칙을 트리거하는 이벤트를 선택합니다.
- Priority / Sort Order: 규칙의 처리 순서를 지정합니다. 낮은 숫자가 먼저 실행됩니다. 이는 여러 규칙이 동일한 이벤트에 적용될 때 어떤 규칙이 우선하는지 제어하는 데 도움이 됩니다.
- Stop Further Rules Processing: 이 규칙이 적용된 후 우선순위가 낮은 규칙 실행을 중지합니다. 특정 규칙이 이벤트를 완전히 제어하도록 하려는 경우 유용합니다.
이벤트
이벤트는 워크플로 규칙이 평가되는 시기를 정의합니다. 사용 가능한 이벤트는 다음과 같습니다:
- New Ticket — 새 티켓이 생성될 때 트리거됩니다.
- New Customer Reply — 고객이 새 답장을 보낼 때 트리거됩니다.
- New Staff Reply — 상담원이 답장을 게시할 때 트리거됩니다.
- New Third Party Reply — 제3자가 메시지를 보낼 때 트리거됩니다.
- Ticket Assigned — 티켓이 사용자에게 할당될 때 트리거됩니다.
- Ticket Updated — 티켓 필드가 업데이트될 때 트리거됩니다.
- Cron Every Hour — 시스템에서 매시간 트리거되어 시간 기반 작업을 허용합니다.
조건
조건은 워크플로 규칙이 실행되어야 하는 시기를 정의합니다. 하나 또는 여러 조건을 사용하고, ALL/ANY 로직으로 결합하며, 고급 필터링을 위해 중첩 그룹을 생성할 수도 있습니다. 모든 이벤트 발생 시 규칙을 실행하려면 이 섹션을 비워 둡니다.

사용 가능한 필드
다음 필드를 사용하여 조건을 구성할 수 있습니다:
- Subject — 티켓 제목의 단어나 구를 확인합니다.
- Customer Email — 고객의 이메일 주소와 일치시킵니다.
- Customer Name — 고객의 이름을 비교합니다.
- Channel — 특정 소스(예: 이메일, 연락처 양식, API)에서 생성된 티켓을 필터링합니다.
- Department — 티켓에 할당된 현재 부서와 일치시킵니다.
- Department (Before Change) — 업데이트 이벤트 전 부서와 비교할 수 있습니다.
- Folder — 티켓이 현재 속한 폴더를 확인합니다.
- Folder (Before Change) — 마지막 변경 전 폴더를 확인합니다.
- Owner — 할당된 상담원과 일치시킵니다.
- Owner (Before Change) — 업데이트 전 소유자를 비교합니다.
- Priority — 티켓의 현재 우선순위를 확인합니다.
- Priority (Before Change) — 업데이트되기 전 우선순위를 비교합니다.
- Status — 현재 티켓 상태를 확인합니다.
- Status (Before Change) — 이전 상태를 비교합니다.
- Last Message — 최신 메시지의 내용을 확인할 수 있습니다.
- Last Reply By — 마지막으로 답장한 사람(고객, 직원 또는 제3자)을 정의합니다.
- Hours Since Created — 티켓이 생성된 이후 경과한 시간입니다.
- Hours Since Last Reply — 마지막 답장이 작성된 이후 시간입니다.
- Hours Since Updated — 티켓이 마지막으로 수정된 이후 시간입니다.
조건 연산자
각 조건은 다음 연산자 중 하나를 사용하여 값을 비교하는 방법을 정의할 수 있습니다:
- Equals — 필드 값이 지정된 값과 정확히 일치할 때 트리거됩니다.
- Not Equals — 필드 값이 지정된 값과 다를 때 트리거됩니다.
- Greater Than — 값이 지정된 값보다 클 때 트리거됩니다(주로 숫자 또는 시간 필드에 사용).
- Greater Than or Equals — 값이 지정된 값보다 크거나 같을 때 트리거됩니다.
- Less Than — 값이 지정된 값보다 작을 때 트리거됩니다.
- Less Than or Equals — 값이 지정된 값보다 작거나 같을 때 트리거됩니다.
- Between — 값이 두 개의 지정된 숫자 사이에 있을 때 트리거됩니다(시간 기반 조건에 유용).
- Matches Regex — 고급 패턴 일치를 위해 정규식을 사용하여 필드 값을 비교합니다.
- Starts With — 필드가 지정된 텍스트로 시작하는 경우 트리거됩니다.
- Ends With — 필드가 지정된 텍스트로 끝나는 경우 트리거됩니다.
- Is Empty — 필드에 값이 없을 때 트리거됩니다.
- Is Not Empty — 필드에 값이 포함될 때 트리거됩니다.
- Contains — 필드에 지정된 텍스트가 포함될 때 트리거됩니다.
- Does Not Contain — 필드에 지정된 텍스트가 포함되지 않을 때 트리거됩니다.
작업
작업은 모든 조건이 충족되면 발생하는 일을 정의합니다. 단일 규칙 내에서 여러 작업을 결합할 수 있습니다.

사용 가능한 작업은 다음과 같습니다:
- Set Status — 티켓의 상태를 업데이트합니다.
- Set Priority — 우선순위 수준을 변경합니다.
- Set Department — 티켓을 다른 부서에 재할당합니다.
- Set Owner — 특정 상담원에게 할당합니다.
- Change Folder — 티켓을 특정 폴더로 이동합니다.
- Add Tags — 분류를 위한 태그를 추가합니다.
- Remove Tags — 티켓에서 기존 태그를 삭제합니다.
- Send Email — 지정된 수신자에게 이메일 알림을 보냅니다.
- Run Script — 고급 자동화를 위해 사용자 정의 JavaScript 코드를 실행합니다.
이메일 전송 작업
Send Email 작업을 사용하면 규칙이 트리거될 때 자동화된 이메일 알림을 보낼 수 있습니다. 이는 팀 구성원에게 알리거나, 고객에게 알리거나, 외부 당사자와 소통하는 데 유용합니다.
사용 가능한 옵션:
- Send to ticket owner — 할당된 상담원에게 알립니다.
- Send to all department users — 티켓 부서의 모든 구성원에게 알립니다.
- Send to customer — 고객에게 업데이트를 알립니다.
- Send to other addresses — 사용자 정의 이메일 주소를 지정합니다.
- Email Subject — 이메일 제목 줄을 정의합니다(Liquid 템플릿 변수 지원).
- Email Body — 이메일 내용을 작성합니다(Liquid 템플릿 변수 지원).
- Include attachments — 마지막 메시지의 파일을 첨부합니다.
템플릿 변수
Email Subject 및 Email Body 필드에서 Liquid 템플릿 변수를 사용하여 티켓, 고객 및 메시지 정보를 동적으로 삽입할 수 있습니다.
티켓 변수:
| 변수 | 설명 |
|---|---|
{{ ticket.code }} | 티켓 코드(예: T-001) |
{{ ticket.subject }} | 티켓 제목 줄 |
{{ ticket.created_at }} | 티켓 생성 타임스탬프 |
{{ ticket.updated_at }} | 마지막 업데이트 타임스탬프 |
{{ ticket.customer_name }} | 고객 전체 이름 |
{{ ticket.customer_email }} | 고객 이메일 주소 |
{{ ticket.admin_url }} | 관리 패널의 티켓 직접 링크 |
{{ ticket.admin_last_message_text }} | 마지막 상담원 답장 본문(일반 텍스트) |
{{ ticket.admin_last_message_html }} | 마지막 상담원 답장 본문(HTML) |
{{ ticket.customer_last_message_text }} | 마지막 고객 답장 본문(일반 텍스트) |
{{ ticket.customer_last_message_html }} | 마지막 고객 답장 본문(HTML) |
소유자/할당자 변수:
| 변수 | 설명 |
|---|---|
{{ owner.firstname }} | 할당된 상담원의 이름 |
{{ owner.lastname }} | 할당된 상담원의 성 |
{{ owner.email }} | 할당된 상담원의 이메일 |
{{ owner.fullname }} | 할당된 상담원의 전체 이름 |
{{ owner.is_admin }} | 소유자가 관리자인지 여부 |
부서 변수:
| 변수 | 설명 |
|---|---|
{{ department.name }} | 부서 이름 |
{{ department.sender_name }} | 부서 발신자 이름 |
메시지 변수(메시지 이벤트에 의해 트리거될 때):
| 변수 | 설명 |
|---|---|
{{ message.body_text }} | 메시지 내용(일반 텍스트) |
{{ message.body_html }} | 메시지 내용(HTML) |
{{ message.type }} | 메시지 유형 |
{{ message.created_at }} | 메시지 생성 타임스탬프 |
날짜/시간 변수:
| 변수 | 설명 |
|---|---|
{{ now }} | 현재 타임스탬프(RFC3339) |
{{ date }} | 현재 날짜(YYYY-MM-DD) |
{{ time }} | 현재 시간(HH:MM:SS) |
{{ year }} | 현재 년도 |
예제 이메일 템플릿:
제목: 티켓 #{{ ticket.code }}에 새 답장
안녕하세요 {{ owner.firstname }},
고객이 티켓 "{{ ticket.subject }}"에 답장했습니다.
고객: {{ ticket.customer_name }} ({{ ticket.customer_email }})
마지막 메시지:
{{ ticket.customer_last_message_text }}
티켓 보기: {{ ticket.admin_url }}
스크립트 실행 작업
Run Script 작업을 사용하면 사용자 정의 JavaScript 코드를 실행하여 간단한 필드 할당을 넘어서는 복잡한 자동화 로직을 구현할 수 있습니다. 스크립트는 티켓 데이터를 읽고, 조건부 결정을 내리며, 여러 필드를 한 번에 업데이트할 수 있습니다.
사용 가능한 티켓 속성(읽기):
| 속성 | 설명 |
|---|---|
ticket.id | 티켓 고유 식별자 |
ticket.subject | 티켓 제목 줄 |
ticket.folder | 현재 폴더(INBOX, ASSIGNED, SPAM 등) |
ticket.tags | 태그 배열 |
ticket.status | id, code 및 name이 있는 객체 |
ticket.priority | id 및 name이 있는 객체 |
ticket.department | id 및 name이 있는 객체 |
ticket.owner | id, email, firstname, lastname이 있는 객체 |
ticket.customer | id, email, firstname, lastname, name이 있는 객체 |
ticket.<custom_field_code> | 코드별 사용자 정의 필드 값 |
사용 가능한 티켓 속성(쓰기):
| 속성 | 예상 값 |
|---|---|
ticket.status | 상태 코드(문자열) 또는 상태 ID |
ticket.priority | 우선순위 이름(문자열) 또는 우선순위 ID |
ticket.department | 부서 이름(문자열) 또는 부서 ID |
ticket.owner | 사용자 이메일(문자열) 또는 사용자 ID |
ticket.folder | 폴더 이름: "INBOX", "ASSIGNED", "SPAM", "ARCHIVE" |
ticket.tags | 태그 문자열 배열 |
ticket.<custom_field_code> | 사용자 정의 필드 유형과 일치하는 값 |
헬퍼 함수:
| 함수 | 반환 |
|---|---|
getStatuses() | 사용 가능한 모든 상태의 배열 |
getPriorities() | 사용 가능한 모든 우선순위의 배열 |
getDepartments() | 사용 가능한 모든 부서의 배열 |
getUsers() | 사용 가능한 모든 사용자의 배열 |
fetch(url, options) | 외부 API에 HTTP 요청 |
메시지 컨텍스트(규칙이 메시지 이벤트에 의해 트리거될 때 사용 가능):
| 속성 | 설명 |
|---|---|
message.id | 메시지 고유 식별자 |
message.body_text | 메시지 내용(일반 텍스트) |
message.body_html | 메시지 내용(HTML) |
message.createdAt | 메시지 생성 타임스탬프 |
스크립트 예:
// 제목 키워드를 기반으로 우선순위 설정
if (ticket.subject.toLowerCase().includes("urgent")) {
ticket.priority = "High";
}
// 내용을 기반으로 티켓을 부서로 라우팅
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";
}
// VIP 고객 처리
if (ticket.customer && ticket.customer.email.endsWith("@enterprise.com")) {
ticket.priority = "High";
ticket.tags = ["vip", "enterprise"];
}
// 사용자 정의 필드 값 설정
ticket.order_id = "12345";
ticket.vip_customer = true;
ticket.order_amount = 99.99;
// 외부 API에서 고객 데이터를 가져와서 티켓 업데이트
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";
}
}
중요 참고 사항:
- 스크립트는 무한 루프를 방지하기 위해 10초 시간 초과가 있습니다.
- 잘못된 필드 값(존재하지 않는 상태, 우선순위 등)은 우아하게 무시됩니다.
- 스크립트 오류는 다른 규칙이나 시스템 충돌에 영향을 주지 않습니다.
- 사용자 정의 필드는 이름이 아닌 코드로 참조됩니다.
알림
규칙이 실행될 때 자동화된 이메일 알림을 보내 모든 관계자에게 정보를 제공할 수 있습니다.

알림 옵션은 다음과 같습니다:
- Send email to ticket owner — 할당된 상담원에게 알립니다.
- Send email to all department users — 모든 부서 구성원에게 알립니다.
- Send email to customer — 고객에게 변경 사항을 알립니다.
- Send email to other addresses — 외부 수신자에게 전송합니다.
- Email Subject — 제목 줄을 지정합니다.
- Email Body — 이메일 내용을 작성합니다.
- Attach files previously attached to the last message — 컨텍스트를 위해 이전 첨부 파일을 포함합니다.
예제 워크플로 규칙
고객 답장 시 상태 변경
고객이 답장하면 시스템이 자동으로 티켓 상태를 상담원 대기 중으로 변경합니다.
유형: 워크플로 규칙
활성: 예
이벤트: 새 고객 답장
조건: 상태가 닫힘이 아님
작업: 상태 설정 → 상담원 대기 중
제3자의 새 답장
제3자가 메시지를 보내면 시스템이 상태를 상담원 대기 중으로 설정하고 `third_party` 태그를 추가합니다.
유형: 워크플로 규칙
활성: 예
이벤트: 새 제3자 답장
조건: 없음
작업:
상태 설정 → 상담원 대기 중
태그 추가 → third_party
직원에게 티켓 할당됨
티켓이 직원에게 할당되면 할당됨 폴더로 자동으로 이동하고 이메일 알림을 보냅니다.
유형: 워크플로 규칙
활성: 예
이벤트: 티켓 할당됨
조건: 없음
작업:
폴더 변경 → 할당됨
티켓 소유자에게 이메일 전송
답장 없이 72시간 후 티켓 닫기
72시간 내에 답장이 없으면 티켓이 자동으로 닫힙니다.
유형: 워크플로 규칙
활성: 예
이벤트: 매시간 크론
조건:
상태가 고객 대기 중과 같음
마지막 답장 이후 시간이 72보다 큼
작업: 상태 설정 → 닫힘
스크립트: 고객 이메일 도메인을 기반으로 라우팅 및 우선순위 지정
엔터프라이즈 고객을 전담 지원으로 라우팅하고 높은 우선순위를 설정합니다.
유형: 워크플로 규칙
활성: 예
이벤트: 새 티켓
조건: 없음
작업: 스크립트 실행
```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"];
}
}
```
스크립트: 제목 키워드로 티켓 자동 분류
제목 내용을 기반으로 티켓을 자동으로 분류하고 사용자 정의 필드를 설정합니다.
유형: 워크플로 규칙
활성: 예
이벤트: 새 티켓
조건: 없음
작업: 스크립트 실행
```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";
}
```
스크립트: 메시지 내용 분석을 기반으로 에스컬레이션
메시지에서 긴급 키워드를 감지하고 티켓을 자동 에스컬레이션합니다.
유형: 워크플로 규칙
활성: 예
이벤트: 새 고객 답장
조건: 없음
작업: 스크립트 실행
```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;
}
}
}
```