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: 워크플로우를 통해 이메일 보내기
description: 워크플로우 액션을 사용해 개인화된 이메일을 자동으로 보냅니다.
---
CRM에서 특정 이벤트가 발생하면 자동으로 이메일을 보냅니다—신규 연락처 환영, 기회 팔로업, 팀원 알림 등.
## 사전 준비
워크플로우에서 이메일을 보내기 전에:
1. **설정 → 계정**에서 이메일 계정을 연결하세요
2. 계정에 발송 권한이 활성화되어 있는지 확인하세요
## 기본 이메일 워크플로우
### 예시: 신규 연락처 환영 이메일
**목표**: CRM에 새 연락처가 추가되면 환영 이메일을 보냅니다.
**설정**:
1. **워크플로우 생성**: **설정 → 워크플로우**로 이동하여 **+ 새 워크플로우**를 클릭하세요
2. **트리거 추가**: **레코드가 생성됨** → **People**를 선택하세요
3. **이메일 보내기 액션 추가**:
* 액션을 추가하려면 \*\*+\*\*를 클릭하세요
* **이메일 보내기**를 선택하세요
* 이메일을 구성하세요:
| 필드 | 값 |
| --------- | -------------------------------------- |
| **받는 사람** | `{{trigger.object.email}}` |
| **제목** | `{{Your Company Name}}에 오신 것을 환영합니다` |
| **본문** | `Hi {{trigger.object.firstName}}, ...` |
4. **테스트 및 활성화**: 샘플 레코드로 테스트한 다음 활성화하세요
## 이메일에서 변수 사용
`{{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
```
### 트리거에서 사용 가능한 변수
| 트리거 유형 | 공통 변수 |
| ---------------- | -------------------------------------- |
| **레코드 생성/업데이트됨** | `{{trigger.object.fieldName}}` |
| **수동** | `{{trigger.selectedRecord.fieldName}}` |
| **Webhook** | `{{trigger.body.fieldName}}` |
## 고급: 조건부 이메일
### 예시: 리드 소스에 따라 다른 이메일
**목표**: 리드의 유입 경로에 따라 서로 다른 환영 이메일을 보냅니다.
**설정**:
1. **트리거**: 레코드가 생성됨 (People)
2. **필터 액션 추가**:
* 조건: `{{trigger.object.source}}`가 "Website"와 같음
* 참이면 → 웹사이트 환영 이메일로 계속
3. **다른 소스를 위한 분기**:
* 서로 다른 소스에 대해 병렬 분기를 만드세요
* 각 분기에는 자체 이메일 보내기 액션이 있습니다
## 여러 수신자에게 이메일 보내기
### 예시: 거래 성사 시 팀에 알림
**목표**: 기회가 성사되면 영업 담당자와 해당 관리자에게 이메일을 보냅니다.
**설정**:
1. **트리거**: 레코드가 업데이트됨 (기회, 단계 = "Closed Won")
2. **레코드 검색**: 기회 소유자의 관리자를 찾으세요
3. **이메일 보내기 #1**: 기회 소유자에게
* 받는 사람: `{{trigger.object.owner.email}}`
* 제목: `Congratulations on closing {{trigger.object.name}}!`
4. **이메일 보내기 #2**: 관리자에게
* 받는 사람: `{{searchRecords.manager.email}}`
* 제목: `Deal Won: {{trigger.object.name}}`
## 예약된 후속 이메일
### 예시: 회의 3일 후 팔로업
**목표**: 회의가 기록된 후 3일 뒤에 팔로업 이메일을 보냅니다.
**설정**:
1. **트리거**: 레코드가 생성됨 (활동, 유형 = "회의")
2. **지연 액션**: 3일 대기
3. **이메일 보내기**:
* 받는 사람: 회의 참석자
* 제목: 우리의 대화에 대한 후속 안내
* 본문: 트리거에서 회의 세부 정보를 참조하세요
## 이메일 첨부 파일
워크플로우에서 발송되는 이메일에 파일을 첨부할 수 있습니다. 첨부 파일은 워크플로우를 구성할 때 업로드하는 정적 파일입니다.
### 첨부 파일 추가 방법
1. **이메일 보내기** 작업에서 **첨부 파일** 버튼을 클릭합니다
2. 클릭하여 컴퓨터에서 파일을 업로드합니다
3. 이 작업으로 전송되는 모든 이메일에 해당 파일이 첨부됩니다
### 일반적인 사용 사례
| 사용 사례 | 예시 파일 |
| ------------ | --------------- |
| **환영 이메일** | 회사 소개 브로셔(PDF) |
| **온보딩 시퀀스** | 시작 가이드 |
| **영업 후속 조치** | 제품 카탈로그 또는 가격표 |
| **이벤트 확인** | 이벤트 세부 정보 또는 일정 |
<Note>
첨부 파일은 정적입니다—모든 수신자에게 동일한 파일이 전송됩니다. 개인화된 견적서와 같은 동적 문서의 경우 [로직 함수](/l/ko/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty)를 사용하여 파일을 생성하고 첨부합니다.
</Note>
## 모범 사례
### 이메일 콘텐츠
* 제목은 간결하고 관련성 있게 유지하세요
* 수신자 이름으로 개인화하세요
* 명확한 행동 유도를 포함하세요
* 활성화 전에 이메일을 테스트하세요
### 도달률
* 너무 많은 이메일을 너무 빠르게 보내지 마세요
* 전문적인 이메일 서명을 사용하세요
* 스팸 트리거 단어를 피하세요
* 마케팅 이메일에 수신 거부 옵션이 있도록 하세요
### 문제 해결
* 이메일 계정이 연결되어 있고 활성 상태인지 확인하세요
* 수신자 이메일 주소가 유효한지 확인하세요
* 워크플로우 실행 내역에서 오류 메시지를 확인하세요
* 먼저 자신의 이메일 주소로 테스트하세요
## 관련 항목
* [워크플로우 트리거](/l/ko/user-guide/workflows/capabilities/workflow-triggers)
* [워크플로우 액션](/l/ko/user-guide/workflows/capabilities/workflow-actions)

View File

@@ -0,0 +1,88 @@
---
title: 워크플로우에서 분기 사용
description: 분기가 어떻게 작동하는지와 어떤 경로가 실행될지 제어하는 방법을 이해하세요.
---
## 분기 작동 방식
워크플로우 편집기에서 단일 노드에서 여러 경로(분기)를 만들 수 있습니다. 이를 통해 서로 다른 결과를 갖는 복잡한 자동화를 구축할 수 있습니다.
**중요**: 워크플로우가 실행될 때, **기본적으로 모든 분기가 병렬로 실행됩니다**. 한 분기를 다른 분기보다 선택하는 내장된 "if/else" 로직은 없습니다—모든 경로가 동시에 실행됩니다.
## 어떤 분기가 실행될지 제어하기
특정 조건에 따라 하나의 분기만 실행하려면, **각 분기의 시작 부분에 필터 노드를 추가하세요**.
### 예시 설정
1. 단일 노드에서 여러 분기로 워크플로우를 생성하세요
2. 각 분기의 첫 단계로 **필터** 노드를 추가하세요
3. 각 필터에 조건을 설정하여 해당 분기를 언제 계속할지 결정하세요
4. 필터 조건을 충족하는 분기만 진행됩니다
### 필터 작동 방식
* 필터 조건이 **충족되면**: 분기가 계속 실행됩니다
* 필터 조건이 **충족되지 않으면**: 분기는 필터 노드에서 중지됩니다
이렇게 하면 데이터에 따라 해당되는 분기만 실행되는 조건부 로직이 사실상 만들어집니다.
## 예시: 거래 규모별 라우팅
**시나리오**: 거래가 마감되면 거래 규모에 따라 다른 알림을 보냅니다.
1. **트리거**: 기회가 업데이트됨 (단계 = Closed Won)
2. **분기 1**: 금액 > $10,000에 대한 필터 → Slack 메시지를 #big-deals에 보내기
3. **분기 2**: 금액 ≤ $10,000에 대한 필터 → 영업 관리자에게 이메일 보내기
두 분기 모두 시작되지만, 거래 금액과 일치하는 분기만 필터를 통과해 계속됩니다.
## 분기 생성
<Note>
기존 단계에서 새 분기를 만들려면 해당 단계의 **+** 버튼을 클릭하고 액션을 추가하세요. \*\*+\*\*를 여러 번 클릭하여 여러 분기를 추가할 수 있습니다.
</Note>
1. 워크플로우 편집기에서 분기를 만들고자 하는 단계를 선택하세요
2. 액션을 추가하려면 **+** 버튼을 클릭하세요
3. 이렇게 하면 하나의 분기가 생성됩니다
4. 같은 단계에서 \*\*+\*\*를 다시 클릭하여 추가 분기를 만드세요
5. 각 분기는 자체 액션 시퀀스를 가질 수 있습니다
## 분기를 다시 병합하기
병렬 분기가 작업을 완료한 후, 다시 하나의 경로로 병합할 수 있습니다:
1. 분기된 액션을 완료하세요
2. 모든 분기 이후에 실행되어야 하는 새 단계를 추가하세요
3. 각 분기의 마지막 단계에서 이 새 단계로 연결선을 드래그하세요
4. 병합된 단계는 연결된 모든 분기가 완료될 때까지 대기한 후 실행됩니다
### 예시: 처리 후 알림
```
Trigger
│
├── Branch A: Update Customer Record
│
└── Branch B: Create Support Ticket
↘ ↙
Merged Step: Send Confirmation Email
```
확인 이메일은 고객 업데이트와 티켓 생성이 모두 완료된 후에만 전송됩니다.
## 모범 사례
* 조건부 실행을 원할 때는 분기 시작에서 항상 **필터 노드**를 사용하세요
* 중복 액션을 피하려면 분기 조건을 **서로 배타적**으로 유지하세요
* 올바른 분기가 실행되는지 확인하기 위해 다양한 데이터로 워크플로우를 테스트하세요
* **분기 단계의 이름을 바꾸어** 각 경로가 무엇을 하는지 명확히 알 수 있도록 설명적으로 지정하세요
* 병렬 처리 후 최종 액션이 필요할 때는 **분기를 병합**하세요
## 관련 항목
* [워크플로우 FAQ](/l/ko/user-guide/workflows/how-tos/need-more-help/workflows-faq) — 병렬 실행에 대한 답변
* [워크플로우 액션](/l/ko/user-guide/workflows/capabilities/workflow-actions) — 분기에서 사용할 수 있는 액션

View File

@@ -0,0 +1,183 @@
---
title: Iterator 사용
description: 레코드 배열을 순회하여 각 항목에 대해 작업을 수행합니다.
---
Iterator를 사용하면 레코드 배열을 반복하면서 각 항목에 대해 작업을 수행할 수 있습니다. 이는 Search Records가 반환하거나 웹훅으로 수신한 여러 레코드를 처리해야 하는 워크플로우에 필수적입니다.
## Iterator 사용 시기
| 시나리오 | 예시 |
| ------------ | -------------------- |
| **검색 결과 처리** | 찾은 각 사람에게 이메일 보내기 |
| **웹훅 배열 처리** | 각 항목에 대해 순서대로 레코드 생성 |
| **대량 업데이트** | 계산된 값으로 여러 레코드를 업데이트 |
| **알림** | 이벤트에 대해 여러 사람에게 알림 |
## Iterator 이해하기
Iterator는 입력으로 **배열**을 필요로 합니다. 그다음:
1. 배열에서 첫 번째 항목을 가져옵니다
2. 해당 항목으로 Iterator 내부의 모든 액션을 실행합니다
3. 다음 항목으로 이동합니다
4. 모든 항목이 처리될 때까지 반복합니다
### 반복할 배열 선택하기
대부분의 배열 소스(레코드 검색, 웹훅 배열 필드, 일괄 수동 트리거)는 변수 선택기에서 직접 선택할 수 있습니다.
**Code** 또는 **Logic Function** 단계가 *최상위 배열*을 반환하면, 그 출력은 변수 선택기에서 인덱스가 매겨진 항목들(`0`, `1`, `2`, …)로 표시됩니다. 배열 전체를 순회하려면 해당 단계에서 **Whole list** 옵션을 선택하세요. 그러면 Iterator가 목록에서 각 항목의 구조를 자동으로 추론합니다.
## 기본 설정
### 예시: 검색 결과의 모든 사람에게 이메일 보내기
**목표**: 특정 회사의 모든 연락처를 찾아 각 사람에게 개인화된 이메일을 보냅니다.
### 1단계: 레코드 검색
1. **레코드 검색** 액션을 추가합니다
2. 오브젝트: **People**
3. 필터: Company가 "Acme Inc"와 같음
4. 이렇게 하면 사람들의 배열이 반환됩니다
### 2단계: 결과 존재 여부 확인
1. **필터** 액션을 추가합니다
2. 조건: `{{searchRecords.length}}`가 0보다 큼
3. 이렇게 하면 결과가 비어 있을 때 발생하는 Iterator 오류를 방지합니다
### 3단계: 이터레이터 추가
1. **Iterator** 액션을 추가합니다
2. 배열 입력: `{{searchRecords}}` 선택
3. 이렇게 하면 루프가 생성됩니다
### 4단계: Iterator 내부에 액션 추가
Iterator 아래에 배치된 액션은 각 항목에 대해 실행됩니다:
1. Iterator 내부에 **Send Email** 액션을 추가합니다
2. 받는 사람: `{{iterator.currentItem.email}}`
3. 제목: 안녕하세요 `{{iterator.currentItem.firstName}}`!
4. 본문: 현재 항목의 필드를 사용한 개인화 메시지
### 결과
Search Records가 5명의 사람을 반환하면, Iterator는 다음을 수행합니다:
* 사람 1에게 이메일을 보냅니다
* 사람 2에게 이메일을 보냅니다
* ... 5명 모두에 대해 계속 진행합니다
## 현재 항목 데이터에 접근하기
Iterator 내부에서 현재 레코드에 접근하려면 `{{iterator.currentItem}}`를 사용하세요:
| 변수 | 설명 |
| --------------------------------------- | ------------------- |
| `{{iterator.currentItem}}` | 현재 레코드 객체 전체 |
| `{{iterator.currentItem.id}}` | 레코드 ID |
| `{{iterator.currentItem.email}}` | 이메일 필드 |
| `{{iterator.currentItem.company.name}}` | 연관된 회사 이름 |
| `{{iterator.index}}` | 배열에서의 현재 위치(0부터 시작) |
변수 선택기에서 현재 항목의 특정 필드로 들어가거나, **Use the whole item**을 선택해 현재 항목 전체(`{{iterator.currentItem}}`)를 참조할 수 있습니다. 전체 항목을 선택하면, 필드를 하나씩 다시 구성하는 대신 전체 레코드를 그대로 후속 단계로 전달하고자 할 때 유용합니다.
## 일반적인 패턴
### 여러 레코드 업데이트
**목표**: 기한이 지난 모든 작업을 "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
```
### 배열에서 레코드 생성
**목표**: 웹훅이 여러 항목이 있는 주문을 수신하면 각 항목에 대해 레코드를 생성
```
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}}
```
### 루프 내부 조건부 처리
**목표**: 유효한 이메일이 있는 연락처에게만 이메일 보내기
```
1. Search Records (People)
2. Iterator (searchRecords)
└── Filter (currentItem.email is not empty)
└── Send Email
- To: {{iterator.currentItem.email}}
```
## 문제 해결
### "Iterator는 배열을 필요로 합니다"
**원인**: 배열이 아닌 단일 레코드를 전달했습니다.
**해결 방법**: 단일 레코드가 아니라 Search Records의 결과 또는 배열 필드를 전달했는지 확인하세요.
```
✅ Correct: {{searchRecords}}
❌ Wrong: {{searchRecords[0]}}
```
### Iterator가 실행되지 않음
**원인**: 배열이 비어 있습니다.
**해결 방법**: 배열 길이를 확인하기 위해 Iterator 앞에 Filter를 추가하세요:
```
Filter: {{searchRecords.length}} > 0
```
### 액션이 너무 많이 실행됨
**원인**: Search Records가 예상보다 많은 레코드를 반환했습니다.
**해결 방법**:
* Search Records에 더 구체적인 필터를 추가하세요
* Search Records에 한도를 설정하세요(최대 200)
* 추가 조건을 위해 Iterator 내부에 Filter를 추가하세요
## 성능 고려 사항
* **크레딧 사용량**: 각 반복은 해당 액션 실행에 크레딧을 소모합니다
* **시간**: 큰 배열일수록 처리에 더 오래 걸립니다
* **제한**: 매우 큰 작업은 배치 처리하는 것을 고려하세요
* **요청 제한**: 반복이 많으면 외부 API 호출이 요청 제한에 걸릴 수 있습니다
## 모범 사례
1. 오류를 피하려면 Iterator 전에 **항상 배열 길이를 확인하세요**
2. 모든 항목을 처리할 필요가 없는 경우 **루프 내부에 필터를 추가하세요**
3. 순회 대상을 설명하도록 **Iterator 단계의 이름을 바꾸세요**
4. **작은 배열로 테스트하세요** 대용량 데이터를 처리하기 전에
5. 반복이 예상대로 완료되는지 확인하려면 **워크플로우 실행을 모니터링하세요**
## 관련 항목
* [워크플로우 액션](/l/ko/user-guide/workflows/capabilities/workflow-actions)
* [브랜치 사용 방법](/l/ko/user-guide/workflows/capabilities/use-branches-in-workflows)
* [워크플로우 FAQ](/l/ko/user-guide/workflows/how-tos/need-more-help/workflows-faq)

View File

@@ -0,0 +1,332 @@
---
title: 워크플로우 액션
description: Twenty 워크플로에서 사용할 수 있는 동작에 대해 알아보세요.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
## 동작 소개
트리거가 발생한 후의 동작 정의. 여러 동작을 서로 연결해 복잡한 자동화를 구축할 수 있습니다.
<Tip>
* 변수 선택기(`(x+)` 아이콘)을 클릭하여 이전 단계의 사용 가능한 데이터를 탐색하세요.
* 어떤 입력 필드 위에 마우스를 올려두면 변수가 어느 단계에서 왔는지 확인할 수 있습니다 — 동일한 필드(예: ID)가 여러 이전 단계에 존재하는 경우 유용합니다.
* 유지 관리를 쉽게 하려면 각 동작에 설명적인 이름을 지정하세요.
</Tip>
## 레코드 동작
<img src="/images/user-guide/workflows/workflow_actions.png" style={{width:'100%'}} />
### 레코드 생성
선택된 객체에 새 레코드 추가.
**구성**:
* 대상 객체 선택
* 필수 및 선택 필드 작성
* 이전 단계의 데이터를 사용하거나 값을 수동으로 입력하여 필드를 채우세요.
**출력**: 새로 생성된 레코드 데이터는 다음 단계에서 사용 가능.
### 레코드 업데이트
선택된 객체에서 기존 레코드 수정.
<img src="/images/user-guide/workflows/update_record.png" style={{width:'100%'}} />
**구성**:
* 대상 객체 선택
* 업데이트할 특정 레코드 선택.
* 사용 가능한 모든 레코드를 표시하는 드롭다운 메뉴에서 고정된 레코드를 선택할 수도 있습니다.
* 또는 `(x+)`를 사용해 이전 단계에서 찾은 레코드를 지정하여 레코드를 동적으로 선택하도록 할 수 있습니다. 이 단계에서는 서로 다른 기준으로 레코드를 검색할 수 없습니다. 아직 레코드를 식별하지 못한 경우, 이 `Update Record` 단계 전에 `Search Record` 단계를 추가하세요.
* 수정할 필드 선택 및 새 값 입력
**출력**: 업데이트된 레코드 데이터는 다음 단계에서 사용 가능.
### 레코드 삭제
선택된 객체에서 레코드를 제거.
**구성**:
* 대상 객체 선택
* 삭제할 특정 레코드 선택
**출력**: 삭제된 레코드 데이터는 다음 단계에서 사용 가능.
### 레코드 검색
필터 조건을 사용하여 선택된 객체 내에서 레코드 찾기.
**구성**:
* 검색할 객체 선택
* 결과 범위를 좁히기 위한 필터 기준 설정
* 정렬 및 제한 구성
**출력**: 매칭된 레코드를 반환하여 다음 단계에서 사용 가능.
<Note>
**제한**: Search Records는 최대 **200개 레코드**를 반환합니다. 더 많이 처리해야 하는 경우, 결과를 줄이기 위해 특정 필터를 추가하거나 예약된 워크플로를 사용해 배치로 처리하세요.
</Note>
**모범 사례**: Search Records 이후 [분기](/l/ko/user-guide/workflows/capabilities/workflow-branches)를 사용하여 "발견됨" vs "찾을 수 없음" 시나리오를 처리하세요.
### 레코드 업서트
일치 기준에 따라 새 레코드를 생성하거나 기존 레코드를 업데이트합니다. 레코드가 이미 존재하는지 확실하지 않을 때 유용합니다.
<img src="/images/user-guide/workflows/upsert_double_identifier.png" style={{width:'100%'}} />
**구성**:
* 대상 객체 선택
* 일치에 사용할 수 있는 필드를 확인하세요: People에는 이메일, Companies에는 도메인, 모든 오브젝트에는 ID, 또는 고유(Unique)로 표시된 임의의 필드. 아래 항목 중 최소 하나는 채워야 합니다.
* 필드 값을 입력하세요. 고유 식별자 중 최소 하나는 반드시 입력하세요.
<Note>
**고유 식별자를 하나만 추가하면 일치가 더 잘 작동하는 경우가 많습니다.** 예를 들어 아래 스크린샷은 도메인을 기준으로 회사를 일치시킵니다. ID가 반드시 필요한 것은 아닙니다.
</Note>
<img src="/images/user-guide/workflows/upsert_simple_identifier.png" style={{width:'100%'}} />
* 이전 단계의 데이터를 사용하여 필드 채우기
**작동 원리**:
1. 조건에 맞는 레코드를 검색합니다
2. 찾으면 → 기존 레코드를 업데이트합니다
3. 찾지 못하면 → 새 레코드를 생성합니다
**출력**: 생성되었거나 업데이트된 레코드 데이터를 이후 단계에서 사용할 수 있습니다.
## 플로우 작업
### 반복자
**이전 단계에서 반환된 레코드 배열을 반복 처리**하여 각 레코드에 대해 개별적으로 작업을 수행할 수 있습니다.
**구성**:
* 이전 단계의 레코드 배열을 선택합니다(예: Search Records 결과, 대량 사용이 가능한 수동 트리거, 코드 노드). Code 또는 Logic Function 단계가 최상위 배열을 반환하는 경우, **Whole list** 옵션을 선택하여 전체 출력에 대해 루프를 실행합니다.
* 반복 내에서 각 레코드에 대해 수행할 액션 정의.
<Note>
- 이터레이터 내에 여러 작업을 추가할 수 있습니다.
- 이터레이터 내부에 분기를 사용할 때, 각 분기의 마지막 단계가 루프를 닫도록 이터레이터로 다시 연결되는지 확인하세요.
</Note>
* `Current Item` 필드에 접근: 현재 처리 중인 레코드의 필드를 사용하려면 **Iterator** 단계에서 **Current item**을 선택하세요. 해당 레코드에서 사용 가능한 필드 목록이 표시되며, 이후 작업에서 사용하도록 선택할 수 있습니다. **Use the whole item**을 선택하여 현재 항목 전체를 다운스트림 단계로 전달할 수도 있습니다.
<VimeoEmbed videoId="1146577247" title="동영상 시연" />
### 필터
지정한 조건에 따라 레코드를 필터링하여 기준을 충족하는 레코드만 통과시킵니다.
**구성**:
* 필터링할 레코드를 선택합니다
* 필터 조건 및 기준 정의
* 다음 단계로 전달할 레코드 구성
<Note>
1. **출력**: 필터 노드는 데이터를 반환하지 않으며 게이트 역할을 합니다. 조건을 충족하면 워크플로우가 계속됩니다. 그렇지 않으면 해당 분기에서 워크플로우가 중지됩니다.
2. 숫자 필드에서 `IS` 연산자를 사용할 수 있습니다. 이는 `EQUAL`과 동일하게 동작합니다.
</Note>
### 지연
지정한 기간 또는 특정 날짜/시간까지 워크플로우 실행을 일시 중지합니다.
**지연 유형**:
| 유형 | 설명 |
| --------- | --------------------------- |
| **기간** | 지정한 시간(일, 시간, 분, 초)만큼 기다립니다 |
| **예약 날짜** | 특정 날짜와 시간까지 기다립니다 |
**기간 설정**:
* 일, 시간, 분 및/또는 초를 설정합니다
* 여러 단위를 조합할 수 있습니다(예: 2일 4시간).
**예약 날짜 설정**:
* 날짜와 시간을 선택합니다
* 이전 단계의 날짜 필드를 참조할 수 있습니다(예: 회의 3일 후에 후속 조치).
**사용 사례**:
* 후속 이메일을 보내기 전에 24시간 대기
* 영업 기회의 마감일까지 일시 중지
* 영업시간에 작업을 예약
<Note>
예약 날짜는 과거일 수 없습니다. 이전 단계의 날짜 필드를 사용했고 그 날짜가 이미 지났다면, 워크플로우가 실패합니다.
</Note>
**제한 및 크레딧**:
* **최대 기간 제한 없음**—분, 일, 주 또는 그 이상으로 지연을 설정할 수 있습니다
* 지속 시간과 무관하게 Delay 노드가 실행될 때 **크레딧 1개가 소모됩니다**
* 대기 중에는 **크레딧이 소모되지 않습니다**—5분 지연과 5일 지연의 비용은 동일합니다
## 커뮤니케이션 작업
### 이메일 보내기
워크플로우에서 이메일 전송. 템플릿이 있는 그룹 이메일에 적합합니다. 이메일은 사용자의 메일함에서 보내는 이메일과 동일하게 보입니다.
풍부한 서식이 필요한 뉴스레터나 자동 이메일 시퀀스에는 적합하지 않습니다.
**필수 조건**: 설정 > 계정에 이메일 계정 추가
**구성**:
* 발신 이메일 계정을 선택합니다
<Note>
자신의 Twenty 계정과 동기화된 메일함에서만 이메일을 보낼 수 있습니다. 다른 팀원의 메일함(예: 계정 소유자의 이메일)에서 보내는 기능은 향후 지원 예정입니다.
</Note>
이후 모든 단계에서 개인화를 위해 이전 단계의 변수를 참조할 수 있습니다.
* 수신자 이메일 주소 입력.
<Note>
현재는 수신자를 한 명만 지정할 수 있습니다.
</Note>
* 제목 설정.
* 메시지 본문 작성. 링크 서식 지정, 번호 매기기 목록 및 글머리 기호 목록 생성, 첨부 파일 추가가 가능합니다.
<Note>
현재는 HTML 서명을 추가할 수 없습니다.
</Note>
### 양식
워크플로우 실행 중에 양식을 표시하여 사용자 입력을 수집합니다. 이 응답은 이후 단계에서 입력을 기반으로 레코드 생성, 이메일 전송 또는 기타 작업 수행에 사용할 수 있습니다.
<Warning>
**양식은 수동 트리거 전용으로 설계되었습니다**. 다른 트리거 (레코드 생성, 업데이트 등)와 함께하는 워크플로우의 경우, 형식은 워크플로우 실행 인터페이스를 통해서만 접근 가능하여 기대와 달라짐. 2026년 자동 워크플로우에서 양식을 적절히 지원하기 위한 알림 센터가 출시될 예정입니다.
</Warning>
**구성**:
* 사용자가 입력해야 할 필드를 구성합니다. 각 필드에 대해 다음을 선택합니다
* 텍스트, 숫자, 날짜, 지정된 레코드, 선택 필드 중 유형 모든 오브젝트의 필드를 선택하여 사용할 수 있습니다.
* 라벨
* `Placeholder` 아래의 기본값(선택 사항)
* 양식 제목 편집
**출력**: 양식 응답은 다음 단계에서 사용 가능.
**예시**: "Quick Lead" 워크플로우는 모든 워크스페이스에서 기본으로 제공되며, 명령 메뉴 `Cmd+K` 어디에서나 사용할 수 있습니다.
**양식 작성 방법**:
* 명령 메뉴 `Cmd+K`에서 수동 워크플로우를 트리거하세요
* 사이드 패널에 표시된 양식을 작성하고 `Submit`을 클릭하세요.
<Note>
필드를 필수로 지정할 수 없습니다.
</Note>
<VimeoEmbed videoId="1147277989" title="동영상 시연" />
## 통합 작업
### 코드
워크플로우 내에서 사용자 정의 JavaScript를 실행합니다.
백그라운드에서는 각 Code 액션이 자체 **logic function**으로 지원됩니다. 이는 Twenty 플랫폼에서 실행되는 서버 측 TypeScript 함수입니다. Code 액션을 추가하면 Twenty가 해당 단계에 대한 전용 logic function을 생성하고 편집기를 인라인으로 노출하므로, 작성한 코드는 워크플로와 함께 존재하게 됩니다.
**구성**:
* 이전 단계의 변수에 접근. 변수 이름을 동적으로 편집할 수 있습니다.
<VimeoEmbed videoId="1147281795" title="동영상 시연" />
* 에디터에서 자바스크립트 코드 작성
* 다음 단계에서 사용할 변수를 반환
* 해당 단계에서 코드를 직접 테스트하세요
<Note>
코드에서 외부 API 키를 사용해야 하는 경우, 함수 본문에 직접 입력해야 합니다. 다른 곳에서 API 키를 구성한 뒤 로직 함수에서 참조할 수는 없습니다.
</Note>
<Tip>
**배열을 다루고 있나요?** 외부 시스템이나 이전 단계에서 전달된 배열이 문자열로 올 수 있습니다. 해결 방법은 [Code 액션에서 배열 처리하기](/l/ko/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)를 참조하세요.
</Tip>
<Tip>
코드 편집기 오른쪽 상단의 사각형 아이콘을 클릭하여 전체 화면으로 표시하세요 — 기본 편집기 너비가 제한되어 있어 유용합니다.
</Tip>
#### 워크플로 간에 logic function 재사용하기
인라인 Code 액션은 단발성 로직에는 유용하지만, 그 안의 코드는 해당 단일 단계에만 속합니다. 여러 워크플로 전반에서 동일한 로직을 공유하거나 앱에서 버전 관리되는 소스로 유지하려면, 각 Code 액션에 코드를 복사해 붙여넣는 대신 **재사용 가능한 logic function**을 정의하세요.
logic function은 앱에서 한 번(`defineLogicFunction`을 사용해) 정의되고, `workflowActionTriggerSettings`를 추가하여 워크플로 빌더에 노출됩니다. 앱이 설치되면, 해당 함수는 기본 제공 액션과 함께 워크플로 빌더에서 자체 액션으로 표시됩니다. 이를 선택하면 선언한 입력 스키마에서 렌더링된 입력 필드(다른 액션과 마찬가지로 변수 선택기 포함)가 표시되고, 인라인 JavaScript 없이 공유 코드를 실행합니다.
| | Code 액션 | 재사용 가능한 logic function |
| -------------- | ----------------------- | ------------------------ |
| **코드가 위치하는 곳** | 인라인 편집기, 단일 워크플로 단계에 연결 | 앱에서 정의되고, 소스 관리에서 버전 관리됨 |
| **재사용성** | 단계별로 복사해 붙여넣기 | 모든 워크플로에서 액션으로 추가 |
| **입력값** | 편집기에서 연결된 변수들 | 선언한 입력 스키마에서 렌더링된 필드 |
| **적합한 용도** | 빠른, 워크플로 전용 로직 | 여러 워크플로 전반에서 사용하는 공유 로직 |
둘 다 동일한 logic function 런타임에서 실행되므로, 인라인으로 프로토타이핑한 Code 액션은 최소한의 변경으로 재사용 가능한 logic function으로 승격할 수 있습니다.
<Tip>
logic function 정의 및 워크플로 빌더에 노출하는 방법에 대한 개발자용 레퍼런스는 [Logic Functions](/l/ko/developers/extend/apps/logic/logic-functions)를 참고하세요. 특히 **Exposing a function as an AI tool or workflow action** 섹션과 `workflowActionTriggerSettings`를 확인하세요.
</Tip>
### HTTP 요청
워크플로우의 일부로 외부 API에 요청을 보냅니다.
<img src="/images/user-guide/workflows/http_action.png" style={{width:'100%'}} />
**구성**:
* API 엔드포인트 URL 입력. 이전 단계의 매개변수를 사용할 수 있습니다.
* HTTP 메소드 선택 (GET, POST, PUT, PATCH, DELETE)
* 필수 헤더 및 값 추가
* 구조 미리보기를 위한 샘플 응답 제공
## AI 작업
### AI 에이전트 - 곧 제공 예정
워크플로우 내에서 AI 에이전트를 실행하여 지능형 작업을 수행합니다.
**구성**:
* **Agent**: 기존 AI 에이전트를 선택하거나 기본 에이전트를 사용합니다
* **Prompt**: AI 에이전트에 대한 지시문을 작성합니다
* 프롬프트에서 이전 단계의 변수를 참조합니다.
**AI 에이전트가 할 수 있는 일**:
* 데이터를 분석하고 요약합니다
* 레코드를 분류하거나 범주화합니다
* 텍스트 콘텐츠를 생성합니다
* 데이터를 기반으로 의사결정을 내립니다
* 도구를 사용하여 CRM 데이터와 상호작용합니다
**출력**: AI 에이전트의 응답을 이후 단계에서 사용할 수 있습니다. 에이전트에 구조화된 출력 스키마가 있는 경우 응답은 해당 형식을 따릅니다.
<Note>
AI 에이전트 작업은 사용된 AI 모델에 따라 워크플로우 크레딧을 소모합니다. 자세한 내용은 [워크플로우 크레딧](/l/ko/user-guide/workflows/capabilities/workflow-credits)을 참조하세요.
</Note>
<Note>
AI 에이전트는 역할 기반 권한을 준수합니다. **설정 → 멤버 → 역할**에서 에이전트에 특정 역할을 할당해 액세스할 수 있는 데이터를 제어할 수 있습니다. 자세한 내용은 [권한](/l/ko/user-guide/permissions-access/capabilities/permissions)을 참조하세요.
</Note>

View File

@@ -0,0 +1,64 @@
---
title: 워크플로우 분기
description: 워크플로우에서 병렬 경로와 조건부 로직을 생성하세요.
---
분기는 워크플로우를 여러 경로로 나누어 데이터에 따라 동시에 또는 조건부로 실행할 수 있게 해줍니다.
<img src="/images/user-guide/workflows/branches.png" style={{width:'100%'}} />
## 분기가 작동하는 방식
단일 노드에서 여러 연결을 만들면 각 경로가 분기가 됩니다. 기본적으로 **모든 분기는 병렬로 실행**되며—서로를 기다리지 않습니다.
## 분기 만들기
### 새 분기 추가
1. 워크플로우의 **메인 캔버스**(기존 노드가 아닌 곳)를 마우스 오른쪽 버튼으로 클릭하세요
2. **노드 추가**를 클릭하세요
3. 새 분기를 위한 노드 유형을 선택하세요
4. 이전 단계의 하단에서 이 새 작업의 상단으로 화살표를 드래그하세요
5. 같은 노드에서 더 많은 분기를 추가하려면 이 과정을 반복하세요
<Note>
각 분기는 독립적입니다. 분기를 추가해도 해당 노드의 다른 기존 경로에는 영향을 주지 않습니다.
</Note>
### 시각적 레이아웃
분기는 워크플로우 편집기에서 병렬 경로로 표시됩니다. 실행에 영향을 주지 않고 노드를 드래그하여 시각적 레이아웃을 재배치할 수 있습니다.
## 조건부 분기
모든 분기가 기본적으로 실행되므로, 실제로 어떤 경로를 실행할지 제어하려면 **Filter** 노드를 사용하세요:
| 분기 | 필터 조건 | 작업 |
| -- | --------- | ---------- |
| A | 단계 = "성공" | 축하 이메일 보내기 |
| B | 단계 = "실패" | 후속 작업 생성 |
| C | 단계 = "협상" | 관리자에게 알리기 |
1. 트리거 또는 작업에서 분기를 만드세요
2. 각 분기의 첫 단계로 **Filter** 노드를 추가하세요
3. 각 필터를 상호 배타적인 조건으로 구성하세요
4. 각 필터 뒤에 작업을 추가하세요
필터 조건을 충족하는 분기만 실행을 계속합니다.
## 분기 병합
**분기는 자동으로 병합되지 않습니다.** 각 분기는 끝날 때까지 독립적으로 실행됩니다. 처리 방식은 전적으로 유연합니다:
* **옵션 1: 분기를 분리된 상태로 유지**\n 각 분기는 후속 작업을 독립적으로 처리합니다. 분기가 합쳐질 필요가 없을 때 가장 간단한 접근 방식입니다.
* **옵션 2: 분기를 수동으로 병합**\n 워크플로우를 만들 때 여러 분기를 동일한 다운스트림 작업에 수동으로 연결할 수 있습니다. 각 분기의 끝에서 공통 노드로 화살표를 드래그하기만 하면 됩니다.
<Note>
실행을 일시 중지하려면 [Delay](/l/ko/user-guide/workflows/capabilities/workflow-actions#delay) 노드를 사용할 수 있지만, 현재는 "다른 분기가 끝날 때까지" 대기하도록 설정할 수 없습니다.
</Note>
## 관련 항목
* [워크플로우에서 분기 사용하는 방법](/l/ko/user-guide/workflows/capabilities/use-branches-in-workflows) - 단계별 가이드
* [워크플로우 작업](/l/ko/user-guide/workflows/capabilities/workflow-actions) - Filter를 포함한 사용 가능한 작업

View File

@@ -0,0 +1,75 @@
---
title: 워크플로우 크레딧
description: 워크플로우 크레딧 소모 및 관리 이해하기.
---
워크플로우 크레딧은 Twenty에서 자동화를 지원합니다. 작동 방식을 이해하면 비용을 최적화하고 자동화 예산을 효과적으로 관리할 수 있습니다.
## 크레딧 할당
워크플로우 크레딧은 요금제 티어가 아니라 청구 주기에 따라 할당됩니다:
| 청구 주기 | 크레딧 |
| --------- | --------- |
| **월간 구독** | 매월 5 크레딧 |
| **연간 구독** | 매년 50 크레딧 |
<Note>
표준 자동화에는 매월 5 크레딧이면 넉넉합니다. 대부분의 팀은 일반적인 워크플로우 사용으로 이 한도를 초과하지 않습니다. 추가 크레딧은 주로 고급 Code 작업 및 AI 기반 워크플로우에 필요합니다.
</Note>
## 크레딧 소비 방식 이해
워크플로우가 실행될 때 크레딧이 소모되며, 생성할 때는 아닙니다. 각 워크플로우 동작은 그 복잡성에 따라 크레딧을 소모합니다:
### 동작 유형별 크레딧 소비
* **기본 내부 작업**: 크레딧 소모량 매우 낮음
* 레코드 검색
* 레코드 생성
* 레코드 업데이트
* 레코드 삭제
* 양식 작업
* **복잡한 작업**: 높은 크레딧 소비
* 코드 작업 (JavaScript 실행)
* 외부 서비스로의 HTTP 요청
* **AI 기능**: 크레딧 소모량 높음
* AI 에이전트 작업은 사용된 AI 모델에 따라 워크플로우 크레딧을 소모합니다
* 더 복잡한 프롬프트와 더 긴 출력은 더 많은 크레딧을 사용합니다
* **Delay 작업**: 최소한의 크레딧 소모
* Delay 노드는 실행될 때 **크레딧 1개**를 소모합니다
* 대기 기간 동안에는 **크레딧이 소모되지 않습니다**
* 5분 지연은 5일 지연과 같은 크레딧이 소모됩니다
### 실시간 차감
워크플로우가 실행될 때 크레딧이 실시간으로 차감됩니다. 이는 다음을 의미합니다:
* 초안 워크플로우는 크레딧을 소모하지 않습니다
* 활성화된 실행 중인 워크플로우만 크레딧 할당을 사용합니다
* 실패한 워크플로우도 완료된 단계에 대해 크레딧을 소모합니다
## 크레딧 관리
### 크레딧 사용량 확인
1. **설정 → 결제**로 이동
2. 현재 크레딧 소비량과 잔액 확인
3. 사용 패턴을 모니터링하여 워크플로우 최적화
### 추가 크레딧 구입
플랜 할당을 초과하는 추가 크레딧이 필요한 경우:
1. **설정 → 결제**로 이동
2. 추가 크레딧 구매 옵션을 클릭합니다. 다양한 크기의 패키지가 제공됩니다.
3. 크레딧이 현재 잔액에 추가됩니다
## 모범 사례
* **배치 처리**: 대량 작업 및 이터레이터 작업을 효율적으로 사용하여 개별 작업 호출을 줄이세요
* **수동 트리거 최적화**: 수동 트리거의 경우, 한 번의 워크플로우 실행에서 여러 레코드를 처리하려면 `Bulk` 가용성을 선택하세요
* 효율성을 위한 코드 작업 최적화

View File

@@ -0,0 +1,93 @@
---
title: Workflow 실행들
description: 워크플로우 실행을 모니터링하고 관리합니다.
---
## 실행에 대하여
**실행**은 워크플로우 실행의 기록입니다. 레코드 이벤트, 일정, 수동 작업 또는 웹훅 등으로 워크플로우가 트리거될 때마다 새 실행이 생성됩니다.
## 실행 보기
### 워크플로우 편집기에서
1. 모니터링하려는 워크플로우를 엽니다
2. 오른쪽의 **실행** 패널을 클릭합니다
3. 최근 실행과 해당 상태 목록을 확인합니다
### 워크플로우 실행 보기에서
1. 사이드바에서 **워크플로우 실행**으로 이동합니다
2. 모든 워크플로우의 실행을 확인합니다
3. 상태, 워크플로우 또는 날짜로 필터링합니다
## 실행 상태
| 상태 | 설명 |
| -------- | --------------------------------------------- |
| **실행 중** | 워크플로우가 현재 실행 중입니다 |
| **완료됨** | 워크플로우가 성공적으로 완료되었습니다 |
| **실패** | 워크플로우에서 오류가 발생하여 중지되었습니다 |
| **대기 중** | 워크플로우가 일시 중지되었습니다(예: Delay 액션 대기 또는 양식 제출 대기) |
## 실행 세부정보
임의의 실행을 클릭하면 다음을 확인할 수 있습니다:
* **상태**: 실행의 현재 상태
* **시작 시각**: 실행이 시작된 시점
* **소요 시간**: 실행에 걸린 시간
* **트리거 데이터**: 워크플로우를 시작시킨 입력값
* **단계 출력**: 각 단계에서 반환된 데이터
* **오류 메시지**: 실행이 실패한 경우 어떤 문제가 있었는지
## 단계별 실행
각 실행에는 워크플로우의 진행 상황이 표시됩니다:
1. 성공적으로 완료된 단계를 확인합니다
2. 실패가 발생한 위치를 파악합니다
3. 단계 간에 전달된 데이터를 확인합니다
4. 단계 입력과 출력을 확인하여 문제를 디버깅합니다
## 오류 처리
실행이 실패한 경우:
1. 실패한 실행을 엽니다
2. 실패를 유발한 단계를 찾습니다
3. 오류 메시지에서 세부정보를 확인합니다
일반적인 문제:
* 필수 필드 누락
* 잘못된 데이터 형식
* 외부 API 오류
* 권한 문제
## 워크플로우 재실행
실행이 실패한 경우 다음을 수행할 수 있습니다:
* 근본 원인을 수정하고 다음 트리거를 기다립니다
* 수동 워크플로우의 경우 동일한 데이터 또는 업데이트된 데이터로 다시 트리거합니다
* 향후 실패를 방지하기 위해 워크플로우 논리를 점검합니다
## 성능 팁
### 실행 기록 관리
* 실행은 이력 참고를 위해 보관됩니다
* 매우 오래된 실행은 자동으로 보관될 수 있습니다
* 기록을 유지해야 하는 경우 실행 데이터를 내보냅니다
### 모니터링 모범 사례
* 새 워크플로우를 활성화한 후 실행을 정기적으로 확인합니다
* 실패한 실행을 검토하여 패턴을 파악합니다
## 관련 항목
* [워크플로우 트리거](/l/ko/user-guide/workflows/capabilities/workflow-triggers)
* [워크플로우 액션](/l/ko/user-guide/workflows/capabilities/workflow-actions)
* [워크플로우 문제 해결](/l/ko/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting)

View File

@@ -0,0 +1,137 @@
---
title: 워크플로우 트리거
description: 워크플로우를 시작하는 다양한 트리거에 대해 알아보세요.
---
## 트리거에 대하여
워크플로우는 항상 자동화가 실행되어야 하는 시기를 정의하는 단일 트리거로 시작합니다.
<img src="/images/user-guide/workflows/workflow_triggers.png" style={{width:'100%'}} />
<Tip>
**고급 객체도 지원됩니다!** 표준 CRM 객체(사람, 회사, 영업 기회) 외에도 다음 대상으로 워크플로우를 트리거하고 작업을 수행할 수 있습니다:
* 워크스페이스 구성원
* 캘린더 이벤트
* 메시지(이메일)
* 작업, 노트 및 기타 많은 시스템 객체
이렇게 하면 캘린더 이벤트가 생성될 때 팀 구성원에게 알림을 보내거나, 수신 이메일을 자동으로 처리하는 등의 강력한 자동화를 구현할 수 있습니다.
</Tip>
## 레코드 생성됨
선택한 객체(사람, 회사, 기회 또는 기타 사용자 정의 객체)에 새 레코드가 생성될 때 워크플로우를 시작합니다.
**구성**: 새 레코드를 모니터링할 객체 유형을 선택합니다.
<Note>
* 이 트리거는 CSV, 메일박스 및 캘린더 동기화 또는 API로 생성된 레코드에 적합합니다.
* **수동으로 생성된 레코드에는 권장되지 않습니다**: 이 트리거를 사용하면 레코드가 생성되는 즉시 워크플로우가 시작됩니다. Twenty UI는 실시간 자동 저장을 제공하므로(레코드를 저장하기 위한 별도의 편집 모드와 검증 단계가 없습니다), 사용자가 모든 필드를 입력하기 전에 워크플로우가 트리거됩니다.
수동으로 생성된 레코드에서 이 워크플로우를 트리거하려면, 대신 트리거 `Record is created or updated`를 사용하는 것이 좋습니다.
</Note>
## 레코드 업데이트됨
기존 레코드에 변경 사항이 있을 때 워크플로우를 시작합니다.
**구성**:
* 객체 유형을 선택합니다
* 변경 사항을 모니터링할 필드를 선택적으로 지정
## 레코드 업데이트 또는 생성됨
선택한 객체에서 레코드가 생성되거나 업데이트될 때 워크플로우를 시작합니다.
**중요한 이유**: 이 트리거는 다양한 방식으로 생성된 레코드가 서로 다르게 동작하기 때문에 특히 유용합니다:
* **API/CSV 가져오기**: 필드가 즉시 채워진 상태로 레코드가 생성됩니다
* **수동 생성**: 레코드는 먼저 생성되고, 그 후 필드가 추가됩니다
**구성**:
* 모니터링할 객체 유형을 선택
* 변경 사항을 모니터링할 필드를 선택적으로 지정
* 워크플로우는 초기 생성과 모든 후속 업데이트에서 트리거됩니다
## 레코드 삭제됨
객체에서 레코드가 제거될 때 워크플로우를 시작합니다.
**구성**: 삭제를 모니터링할 객체 유형을 선택합니다.
## 수동 트리거
사용자 작업에 의해 트리거될 때 워크플로우가 시작됩니다. 이 트리거는 `Cmd+K` 메뉴를 통해 액세스하거나, 레코드를 선택한 후 상단 내비게이션 바에 표시되는 사용자 정의 버튼을 통해 사용할 수 있습니다.
<img src="/images/user-guide/workflows/add_to_newsletter_button.png" style={{width:'100%'}} />
**가용성 구성**:
워크플로우가 레코드 선택을 어떻게 처리할지 선택합니다:
* **전역**: 이 워크플로우를 트리거하려면 레코드가 필요하지 않습니다. 워크플로우는 어디서든(어떤 객체에서도) 명령 메뉴 `Cmd+K`에서 트리거되며 레코드를 입력으로 사용하지 않습니다.
**Single** 및 **Bulk**에서 선택된 레코드가 워크플로우로 전달됩니다. 이는 특정 객체에 대해 구성되며, 워크플로우를 트리거하기 전에 여러 레코드를 선택할 수 있습니다.
* **Single**: 선택된 레코드 수만큼 워크플로우가 처음부터 끝까지 실행됩니다.
<Note>
**소프트 제한: 분당 100회 실행**. 이를 초과하면 워크플로우는 "Not Started" 상태로 유지되며, 백그라운드 작업에 의해 또는 다른 워크플로우가 대기열에 들어올 때 점진적으로 처리됩니다. 즉, 단일 트리거로 100개가 넘는 레코드를 선택할 수 있으며, 실행이 다소 느려질 뿐입니다.
</Note>
* **Bulk**: 전체 레코드 목록을 입력으로 하여 워크플로우가 한 번 실행됩니다. 이는 워크플로우에 [이터레이터 작업](/l/ko/user-guide/workflows/capabilities/workflow-actions#iterator)이 포함되어야 함을 의미합니다.
<Note>
이 방식은 더 고급이며, 워크플로우 실행 횟수를 최적화하려는 사용자에게 가장 적합합니다.
</Note>
<img src="/images/user-guide/workflows/manual_trigger.png" style={{width:'100%'}} />
**추가 구성**:
* 대상 객체 선택(단일 및 대량 사용 가능)
* 워크플로우 트리거를 위한 명령 아이콘 선택
* 내비게이션 바 배치 구성 (고정 또는 비고정)
**접근 방법**:
* `Cmd+K` 메뉴에서 수동 워크플로우 찾기 및 실행
* 상단 내비게이션 바의 사용자 정의 버튼 (구성된 경우)
## 시간 기반 트리거: 일정에 따라
정의한 일정에 따라 반복적으로 워크플로우를 시작합니다.
**구성**:
* 시간 단위 선택 (분, 시간, 일)
* 값을 입력하거나 고급 스케줄링을 위한 사용자 정의 크론 표현식을 사용
<Note>
**시간대**: 예약된 워크플로우는 **UTC**로 실행됩니다. 일일 일정의 시간을 설정할 때는 로컬 시간을 UTC로 변환하세요.
</Note>
## 외부 트리거: 웹훅
외부 서비스로부터 GET 또는 POST 요청을 수신하면 워크플로우를 시작합니다.
<img src="/images/user-guide/workflows/webhook_trigger.png" style={{width:'100%'}} />
**구성**:
* 워크플로우가 고유한 웹훅 URL을 제공합니다. 이를 복사하여 외부 시스템에서 호출할 엔드포인트로 추가하세요.
* POST 요청의 경우, Twenty가 어떤 데이터를 받을지 알 수 있도록 예상되는 본문 구조를 정의하세요. 이후 워크플로우에서 필요하게 될 수신 필드를 여기에서 추가하세요.
* 인증을 구성합니다(곧 지원 예정).
## 적합한 트리거 선택
| 사용 사례 | 권장 트리거 |
| ---------------- | --------------- |
| 새 리드 처리 필요 | 레코드 생성됨 |
| 데이터 변경 사항 동기화 필요 | 레코드 업데이트됨 |
| 가져오기/수동 데이터 처리 | 레코드 업데이트 또는 생성됨 |
| 삭제 후 정리 | 레코드 삭제됨 |
| 사용자에 의해 시작된 작업 | 수동 실행 |
| 반복 보고서 | 일정에 따라 |
| 외부 통합 | 웹훅 또는 일정에 따라 |

View File

@@ -0,0 +1,84 @@
---
title: Workflow 버전들
description: 워크플로 버전과 초안을 관리합니다.
---
## 버전 정보
워크플로를 활성화할 때마다 새 버전이 생성됩니다. 이를 통해 시간 경과에 따른 변경 사항을 추적하고 필요 시 이전 구성으로 되돌릴 수 있습니다.
## 버전 상태
| 상태 | 설명 |
| --------- | -------------------- |
| **초안** | 편집 중이며 아직 게시되지 않음 |
| **활성** | 트리거에 반응하는 라이브 버전 |
| **비활성화됨** | 이전에 활성화되었지만 수동으로 중지됨 |
| **보관됨** | 기록을 위해 보관된 이전 버전 |
## 초안 작업
활성 워크플로를 편집하면 변경 사항이 **초안**으로 저장됩니다. 업데이트 작업을 하는 동안에도 활성 버전은 계속 실행됩니다.
편집을 마치면 다음을 수행할 수 있습니다:
* **활성화**: 초안을 새 활성 버전으로 게시합니다(이전 버전은 보관됩니다)
* **폐기**: 초안을 삭제하고 현재 활성 버전을 유지합니다
## 버전 히스토리
### 이전 버전 보기
1. 워크플로를 엽니다
2. **버전** 탭을 클릭합니다
3. 타임스탬프와 함께 모든 이전 버전을 확인합니다
### 버전 복원
1. 복원하려는 버전을 찾습니다
2. **초안으로 사용**을 클릭합니다
3. 해당 버전이 새 초안으로 복사됩니다
4. 필요한 업데이트를 수행합니다
5. 준비되면 활성화합니다
## 모범 사례
### 버전 관리
* 운영 환경 준비가 되었을 때만 활성화합니다
* 버전 간에는 의미 있는 변경만 반영합니다
* 워크플로 이름이나 설명의 주요 변경 사항을 문서화합니다
* 활성화하기 전에 초안 모드에서 테스트합니다
### 변경 사항 되돌리기
* 새 버전에서 문제가 발생하면 이전 버전을 복원합니다
* 버전 기록을 사용해 무엇이 변경되었는지 추적합니다
* 복원한 버전은 항상 활성화 전에 테스트합니다
## 일반적인 워크플로
### 빠른 편집
1. 활성 워크플로에 소규모 변경을 적용합니다
2. 초안 모드에서 테스트합니다
3. 새 버전을 활성화합니다
### 대규모 수정
1. 이전 버전을 시작점으로 사용합니다
2. 초안에서 중요한 변경을 수행합니다
3. 모든 시나리오를 철저히 테스트합니다
4. 확신이 서면 활성화합니다
### 롤백
1. 현재 버전의 문제를 식별합니다
2. 기록에서 마지막으로 정상 동작한 버전을 찾습니다
3. **초안으로 사용**을 클릭합니다
4. 활성화하여 이전 동작을 복원합니다
## 관련 항목
* [워크플로 시작하기](/l/ko/user-guide/workflows/overview)
* [워크플로 실행](/l/ko/user-guide/workflows/capabilities/workflow-runs)