转录 텍스트에서 회의 작업 추출하여 Trello와 동기화
고급
이것은Project Management, AI Summarization분야의자동화 워크플로우로, 18개의 노드를 포함합니다.주로 Form, TrelloTool, FormTrigger, Agent, ExtractFromFile 등의 노드를 사용하며. AI를 사용하여 기록된 텍스트에서 회의 작업을 추출하고 Trello로 동기화합니다
사전 요구사항
- •OpenAI API Key
사용된 노드 (18)
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"id": "ZGNostTBUj8ot9yp",
"meta": {
"instanceId": "46f10f8f90bd424d08d7ec9e92bdd735f336873f2ca9f21d76cc7ac132eeaabd",
"templateCredsSetupCompleted": true
},
"name": "Extract meeting tasks from transcripts and sync with Trello",
"tags": [],
"nodes": [
{
"id": "70515f8f-edd6-4c52-947a-f79cbb7429ef",
"name": "회의록 가져오기",
"type": "n8n-nodes-base.extractFromFile",
"position": [
480,
0
],
"parameters": {
"options": {},
"operation": "text",
"binaryPropertyName": "Transcript_archive"
},
"typeVersion": 1
},
{
"id": "203f05d3-7356-40b9-ad81-248760e72080",
"name": "AI 에이전트",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
944,
0
],
"parameters": {
"text": "=Transcript:\n\n{{ $json.data }}",
"options": {
"systemMessage": "=# Main Agent Instructions\n\nYou are an assistant specialized in meeting analysis.\nYour job is to (1) extract actionable tasks from a meeting transcript, (2) sync each task with Trello via the Trello Sub-Agent, and (3) produce a clear user-facing summary.\n\n## Workflow\n\n1. **Extract Tasks**\n - Identify only clear, actionable tasks.\n - For each task, produce:\n - **title** → short, concise (max ~6 words).\n - **description** → 1–2 sentences explaining the action.\n - **assignee** → person responsible, or `\"undefined\"`.\n - **deadline** → date/time if mentioned, or `\"undefined\"`.\n - **Deduplicate** (merge near-duplicates; keep one canonical task).\n\n2. **Sync with Trello (via Trello Sub-Agent)**\n - For each task, call the **Trello Sub-Agent** with `title`, `description`, `assignee`, `deadline`.\n - The Trello Sub-Agent will:\n - Use **Get Trello Cards** to check for an existing card (case-insensitive, tolerant to small wording changes).\n - If a match exists → return `{ \"status\": \"exists\", \"card_id\": \"<id>\" }`.\n - If no match → create with **Create Trello Card** and return `{ \"status\": \"created\", \"card_id\": \"<id>\" }`.\n\n3. **User-Facing Summary**\n - Write a brief summary (1–3 sentences) describing: total tasks found, how many already existed, how many were created, and any tasks without assignee or deadline.\n - The summary **must be in the user’s language** (if unknown, use English).\n - Keep it concise and non-technical.\n\n4. **Output Format**\n - Return a JSON object with two top-level keys: `summary` and `tasks`.\n\n### JSON Schema\n\n```json\n{\n \"summary\": {\n \"text\": \"string\",\n \"metrics\": {\n \"total_tasks\": \"number\",\n \"existing_cards\": \"number\",\n \"created_cards\": \"number\",\n \"without_assignee\": \"number\",\n \"without_deadline\": \"number\"\n }\n },\n \"tasks\": [\n {\n \"title\": \"string (≤ 6 words)\",\n \"description\": \"string (1–2 sentences)\",\n \"assignee\": \"string | \\\"undefined\\\"\",\n \"deadline\": \"string | \\\"undefined\\\"\",\n \"status\": \"exists | created\",\n \"card_id\": \"string\"\n }\n ]\n}\n````\n\nIf no tasks are found, return:\n\n```json\n{\n \"summary\": {\n \"text\": \"No tasks were found in the transcript.\",\n \"metrics\": {\n \"total_tasks\": 0,\n \"existing_cards\": 0,\n \"created_cards\": 0,\n \"without_assignee\": 0,\n \"without_deadline\": 0\n }\n },\n \"tasks\": []\n}\n```\n\n## Example\n\n**Transcript Excerpt**\n\n> John: I can prepare the financial report by Friday.\n> Maria: I’ll schedule the client meeting.\n\n**Expected Output**\n\n```json\n{\n \"summary\": {\n \"text\": \"Found 2 tasks in the transcript: 1 already existed in Trello and 1 was created. None are missing an assignee; 1 has no deadline.\",\n \"metrics\": {\n \"total_tasks\": 2,\n \"existing_cards\": 1,\n \"created_cards\": 1,\n \"without_assignee\": 0,\n \"without_deadline\": 1\n }\n },\n \"tasks\": [\n {\n \"title\": \"Prepare financial report\",\n \"description\": \"John will compile and deliver the financial report by Friday.\",\n \"assignee\": \"John\",\n \"deadline\": \"Friday\",\n \"status\": \"exists\",\n \"card_id\": \"abc123\"\n },\n {\n \"title\": \"Schedule client meeting\",\n \"description\": \"Maria will arrange a meeting with the client to align next steps.\",\n \"assignee\": \"Maria\",\n \"deadline\": \"undefined\",\n \"status\": \"created\",\n \"card_id\": \"xyz789\"\n }\n ]\n}\n```\n\n## Sub-Agents\n\n## Trello Sync\n\nFor each extracted task:\n1. Call the **Trello Sub-Agent** with `title`, `description`, `assignee`, `deadline`.\n2. Append the sub-agent result to the task:\n - `status`: \"exists\" | \"created\"\n - `card_id`: string\n - optionally `list_id` (when status = \"exists\")\n3. Use these results to build the user-facing `summary.metrics`:\n - `total_tasks`, `existing_cards`, `created_cards`,\n - `without_assignee`, `without_deadline`."
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.2
},
{
"id": "50775259-4478-4445-be0b-03da0b9f796b",
"name": "구조화된 출력 파서",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
1184,
208
],
"parameters": {
"jsonSchemaExample": "{\n \"summary\": {\n \"text\": \"Found 2 tasks in the transcript: 1 already existed in Trello and 1 was created. None are missing an assignee; 1 has no deadline.\",\n \"metrics\": {\n \"total_tasks\": 2,\n \"existing_cards\": 1,\n \"created_cards\": 1,\n \"without_assignee\": 0,\n \"without_deadline\": 1\n }\n },\n \"tasks\": [\n {\n \"title\": \"Prepare financial report\",\n \"description\": \"John will compile and deliver the financial report by Friday.\",\n \"assignee\": \"John\",\n \"deadline\": \"Friday\",\n \"status\": \"exists\",\n \"card_id\": \"abc123\"\n },\n {\n \"title\": \"Schedule client meeting\",\n \"description\": \"Maria will arrange a meeting with the client to align next steps.\",\n \"assignee\": \"Maria\",\n \"deadline\": \"undefined\",\n \"status\": \"created\",\n \"card_id\": \"xyz789\"\n }\n ]\n}"
},
"typeVersion": 1.3
},
{
"id": "d34e917d-9065-408e-a9ac-f66480118e6f",
"name": "OpenAI 채팅 모델",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
896,
208
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"id": "zwivGqRORUgpjepY",
"name": "OpenAi account"
}
},
"typeVersion": 1.2
},
{
"id": "35a227e0-41e5-4773-8628-a3863e09165b",
"name": "회의록 파일 수신",
"type": "n8n-nodes-base.formTrigger",
"position": [
0,
0
],
"webhookId": "c107cc74-88b8-4620-a825-4f26a4ae24b5",
"parameters": {
"options": {},
"formTitle": "Tasks from meeting",
"formFields": {
"values": [
{
"fieldType": "file",
"fieldLabel": "Transcript archive",
"multipleFiles": false,
"requiredField": true,
"acceptFileTypes": ".txt"
}
]
},
"responseMode": "lastNode",
"formDescription": "Create Trello tasks from a meeting transcript"
},
"typeVersion": 2.3
},
{
"id": "48c38412-ae7d-40cb-be25-dd6ff989938e",
"name": "Trello 에이전트",
"type": "@n8n/n8n-nodes-langchain.agentTool",
"position": [
1008,
448
],
"parameters": {
"text": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Prompt__User_Message_', `Trello task`, 'string') }}",
"options": {
"systemMessage": "=# Trello Sub-Agent Instructions\n\nYou manage Trello syncing for tasks.\nTools available:\n- **Get many lists in Trello**\n- **Get all cards in a list in Trello**\n- **Create a card in Trello** (targets a single preconfigured default list)\n\n## Input\nTask JSON:\n- `title` (string, required)\n- `description` (string, required)\n- `assignee` (string | \"undefined\")\n- `deadline` (string | \"undefined\")\n\n## Board-wide Duplicate Check (title AND description)\n1. Call **Get many lists in Trello** and collect all `list_id`s.\n2. For each list, call **Get all cards in a list in Trello**.\n3. For each card, compare:\n - Incoming `title` ↔ card `name`\n - Incoming `description` ↔ card `desc`\n\n### Normalization\n- Lowercase, trim, collapse multiple spaces.\n- Strip punctuation and emojis.\n- Normalize common accents/diacritics.\n- Optional: drop very common stopwords (e.g., “the”, “a”, “of”, “para”, “de”).\n\n### Match Criteria (declare duplicate if ANY holds)\n- **Exact title match** (normalized) **AND** description **highly similar** (≥ 0.80 token overlap or near-exact).\n- **High title similarity** (≥ 0.90) **AND** **high description similarity** (≥ 0.80).\n- **Exact description match** (normalized) **AND** title **highly similar** (≥ 0.90).\n\n> If multiple candidates match, choose the **highest combined similarity** (title_sim * 0.6 + desc_sim * 0.4).\n\n4. If a duplicate is found **anywhere on the board**, **do not create** a card. Return:\n```json\n{ \"status\": \"exists\", \"card_id\": \"<existing_card_id>\", \"list_id\": \"<existing_list_id>\" }\n````\n\n## Create (only if NO duplicate found)\n\n* Call **Create a card in Trello** with:\n\n * `name` = `title`\n * `desc` = `description`\n * Add `assignee` / `deadline` if the tool supports these fields.\n* Return:\n\n```json\n{ \"status\": \"created\", \"card_id\": \"<new_card_id>\", \"created_in_default_list\": true }\n```\n\n## Output (always one object)\n\n* Duplicate:\n\n```json\n{ \"status\": \"exists\", \"card_id\": \"<id>\", \"list_id\": \"<list_id>\" }\n```\n\n* Created:\n\n```json\n{ \"status\": \"created\", \"card_id\": \"<id>\", \"created_in_default_list\": true }\n```\n\n* Error:\n\n```json\n{ \"status\": \"error\", \"message\": \"Reason...\" }\n```\n\n## Notes\n\n* Be conservative: one card per unique task.\n* Prefer NOT creating when in doubt (high similarity)."
},
"hasOutputParser": true,
"toolDescription": "Responsible for syncing tasks with Trello. It checks if a card already exists for a given task and creates one if it doesn’t, ensuring no duplicates are added"
},
"typeVersion": 2.2
},
{
"id": "40527286-8a51-4ac0-ba33-b41a6da83cf9",
"name": "구조화된 출력 파서1",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
1696,
656
],
"parameters": {
"schemaType": "manual",
"inputSchema": "{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"title\": \"Trello Sub-Agent Output\",\n \"type\": \"object\",\n \"properties\": {\n \"status\": {\n \"type\": \"string\",\n \"enum\": [\"exists\", \"created\", \"error\"],\n \"description\": \"Result of the Trello sync check.\"\n },\n \"card_id\": {\n \"type\": \"string\",\n \"description\": \"ID of the Trello card (if exists or created).\"\n },\n \"list_id\": {\n \"type\": \"string\",\n \"description\": \"ID of the list where the card already exists (only when status = 'exists').\"\n },\n \"created_in_default_list\": {\n \"type\": \"boolean\",\n \"description\": \"True if a new card was created in the default list (only when status = 'created').\"\n },\n \"message\": {\n \"type\": \"string\",\n \"description\": \"Error message if status = 'error'.\"\n }\n },\n \"required\": [\"status\"],\n \"additionalProperties\": false\n}"
},
"typeVersion": 1.3
},
{
"id": "b3f6f705-03f8-4aca-a320-e2a2d6f969a3",
"name": "OpenAI 채팅 모델1",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
976,
656
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"id": "zwivGqRORUgpjepY",
"name": "OpenAi account"
}
},
"typeVersion": 1.2
},
{
"id": "4b687b0d-c314-4bed-801e-81ab8d77927c",
"name": "Trello에 카드 생성",
"type": "n8n-nodes-base.trelloTool",
"position": [
1136,
656
],
"parameters": {
"name": "={{ $fromAI('taskTitle') }}",
"listId": "Specific List ID",
"description": "={{ $fromAI('taskDescription') }}",
"additionalFields": {}
},
"credentials": {
"trelloApi": {
"id": "vOKxrsBgkMdaWH6Q",
"name": "Trello account"
}
},
"typeVersion": 1
},
{
"id": "f6e13596-4b3d-4fa5-a2d7-f5bf15656e97",
"name": "Trello에서 여러 목록 가져오기",
"type": "n8n-nodes-base.trelloTool",
"position": [
1312,
656
],
"parameters": {
"id": "Your Board ID",
"resource": "list",
"operation": "getAll",
"returnAll": true,
"additionalFields": {}
},
"credentials": {
"trelloApi": {
"id": "vOKxrsBgkMdaWH6Q",
"name": "Trello account"
}
},
"typeVersion": 1
},
{
"id": "e031ecda-c0d0-4668-afcc-bd2268ac65c8",
"name": "Trello에서 목록의 모든 카드 가져오기",
"type": "n8n-nodes-base.trelloTool",
"position": [
1488,
656
],
"parameters": {
"id": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('List_ID', ``, 'string') }}",
"resource": "list",
"operation": "getCards",
"returnAll": true,
"additionalFields": {
"fields": "name, desc"
}
},
"credentials": {
"trelloApi": {
"id": "vOKxrsBgkMdaWH6Q",
"name": "Trello account"
}
},
"typeVersion": 1
},
{
"id": "cd442a7c-0f53-4993-aa9c-139ccdf0d183",
"name": "폼 응답",
"type": "n8n-nodes-base.form",
"position": [
1632,
0
],
"webhookId": "e1dd99fd-57e6-4699-a6d9-bd83191fc864",
"parameters": {
"options": {},
"operation": "completion",
"completionTitle": "Graded transcripts and tasks created in Trello",
"completionMessage": "={{ $json.output.summary.text }}"
},
"typeVersion": 2.3
},
{
"id": "d667ead8-0892-4e2d-8662-06bd7f55e24b",
"name": "스티키 노트",
"type": "n8n-nodes-base.stickyNote",
"position": [
-96,
-688
],
"parameters": {
"color": 6,
"width": 1920,
"height": 496,
"content": "## Extract meeting tasks and sync with Trello\n\nThis workflow processes a meeting transcript (uploaded as a .txt file), extracts actionable tasks using AI, and syncs them with Trello.\n\n### What it does\n- Receive a transcript file from a form\n- Extract clear tasks with title, description, assignee, and deadline\n- Check Trello for duplicates (by title + description across all lists)\n- If duplicate exists → return existing card ID\n- If not → create a new card in the default Trello list\n- Generate a user-friendly summary of the results\n\n### Who is it for\nTeams who want to turn meeting notes into actionable Trello tasks automatically.\n\n### Requirements\n- Trello account with credentials set up\n- OpenAI (or other LLM) credentials"
},
"typeVersion": 1
},
{
"id": "f7c2888b-dbda-4e5a-bde0-2948016216a5",
"name": "스티키 노트2",
"type": "n8n-nodes-base.stickyNote",
"position": [
384,
-144
],
"parameters": {
"width": 304,
"height": 304,
"content": "**Get Transcription node**\n\n> Extracts raw text from the uploaded transcript file.\n"
},
"typeVersion": 1
},
{
"id": "6753c318-fef9-4558-bc3b-63e50dedfc17",
"name": "스티키 노트3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-96,
-144
],
"parameters": {
"width": 304,
"height": 304,
"content": "**Form Trigger node**\n\n> Receives the transcript file (.txt) from the user."
},
"typeVersion": 1
},
{
"id": "6ba8dc96-1c09-4874-a8ce-d74b9f94d749",
"name": "스티키 노트1",
"type": "n8n-nodes-base.stickyNote",
"position": [
784,
-144
],
"parameters": {
"color": 3,
"width": 560,
"height": 496,
"content": "**AI Agent node**\n\n> Main agent that extracts tasks, checks duplicates via Trello Sub-Agent, and builds the JSON output (summary + tasks).\n"
},
"typeVersion": 1
},
{
"id": "a63d8b4f-8077-402e-9a52-acb167af2298",
"name": "스티키 노트4",
"type": "n8n-nodes-base.stickyNote",
"position": [
368,
384
],
"parameters": {
"color": 5,
"width": 1456,
"height": 432,
"content": "**Trello Agent node**\n\n> Sub-agent responsible for Trello sync.\n> Uses “Get many lists” + “Get all cards in a list” to check duplicates (title + description).\n> Creates a new card only if no duplicate exists.\n\n**Create card / Get lists / Get cards nodes**\n\n> Trello API tools used by the sub-agent:\n\n* **Get many lists** → get all list IDs in the board\n* **Get all cards in a list** → fetch existing cards with `name` + `desc`\n* **Create a card** → add a task card in the preconfigured default list\n\n**Structured Output Parser nodes**\n\n> Parse the AI agent outputs into structured JSON (tasks, summary, Trello status)."
},
"typeVersion": 1
},
{
"id": "fdb32427-0adc-4d40-a616-93b32981aae0",
"name": "스티키 노트5",
"type": "n8n-nodes-base.stickyNote",
"position": [
1520,
-144
],
"parameters": {
"width": 304,
"height": 304,
"content": "**Respond to Form node**\n\n> Returns a final confirmation message to the user with the summary (tasks created vs. already existing)."
},
"typeVersion": 1
}
],
"active": true,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "3bc1df01-1881-41f8-92ff-6de105bfc690",
"connections": {
"203f05d3-7356-40b9-ad81-248760e72080": {
"main": [
[
{
"node": "cd442a7c-0f53-4993-aa9c-139ccdf0d183",
"type": "main",
"index": 0
}
]
]
},
"48c38412-ae7d-40cb-be25-dd6ff989938e": {
"ai_tool": [
[
{
"node": "203f05d3-7356-40b9-ad81-248760e72080",
"type": "ai_tool",
"index": 0
}
]
]
},
"70515f8f-edd6-4c52-947a-f79cbb7429ef": {
"main": [
[
{
"node": "203f05d3-7356-40b9-ad81-248760e72080",
"type": "main",
"index": 0
}
]
]
},
"d34e917d-9065-408e-a9ac-f66480118e6f": {
"ai_languageModel": [
[
{
"node": "203f05d3-7356-40b9-ad81-248760e72080",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"b3f6f705-03f8-4aca-a320-e2a2d6f969a3": {
"ai_languageModel": [
[
{
"node": "48c38412-ae7d-40cb-be25-dd6ff989938e",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"4b687b0d-c314-4bed-801e-81ab8d77927c": {
"ai_tool": [
[
{
"node": "48c38412-ae7d-40cb-be25-dd6ff989938e",
"type": "ai_tool",
"index": 0
}
]
]
},
"35a227e0-41e5-4773-8628-a3863e09165b": {
"main": [
[
{
"node": "70515f8f-edd6-4c52-947a-f79cbb7429ef",
"type": "main",
"index": 0
}
]
]
},
"f6e13596-4b3d-4fa5-a2d7-f5bf15656e97": {
"ai_tool": [
[
{
"node": "48c38412-ae7d-40cb-be25-dd6ff989938e",
"type": "ai_tool",
"index": 0
}
]
]
},
"50775259-4478-4445-be0b-03da0b9f796b": {
"ai_outputParser": [
[
{
"node": "203f05d3-7356-40b9-ad81-248760e72080",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"40527286-8a51-4ac0-ba33-b41a6da83cf9": {
"ai_outputParser": [
[
{
"node": "48c38412-ae7d-40cb-be25-dd6ff989938e",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"e031ecda-c0d0-4668-afcc-bd2268ac65c8": {
"ai_tool": [
[
{
"node": "48c38412-ae7d-40cb-be25-dd6ff989938e",
"type": "ai_tool",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
고급 - 프로젝트 관리, AI 요약
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
Google Meet 월간 인적 자원 Q&A
AI 질문 클러스터링 및 Google 캘린더 연동을 통한 인사 Q&A 회의 자동화
Set
Form
Merge
+
Set
Form
Merge
26 노드Gabriel Santos
인사
HireMind – AI 기반 이력서 지능형 처리 워크플로우
HR AI 이력서 선별 및 평가: GPT-4 및 Google Workspace
If
Code
Slack
+
If
Code
Slack
26 노드Trung Tran
인사
[astro/nextjs] 글/게시물에 카테고리/태그 할당
OpenAI GPT-4, GitHub, Google Sheets로 Astro/Next.js 블로그 게시물 자동 분류
Code
Form
Merge
+
Code
Form
Merge
29 노드Piotr Sikora
콘텐츠 제작
30초 내 고객 온보딩 AI 시스템
GPT-4, Google Drive, ClickUp, Slack을 사용한 고객 온보딩 자동화
Set
Gmail
Slack
+
Set
Gmail
Slack
18 노드Muhammad Bello
프로젝트 관리
GPT-4o, GoHighLevel, Google Drive, Slack, Gmail을 사용한 고객 온보딩 자동화
GPT-4o, GoHighLevel, Google Drive, Slack, Gmail을 사용한 고객 온보딩 자동화
Set
Gmail
Slack
+
Set
Gmail
Slack
17 노드Adam Crafts
AI 요약
GPT-4o-mini, Asana, Slack, Google Drive, Gmail을 사용한 고객 온보딩 자동화
GPT-4o-mini, Asana, Slack, Google Drive, Gmail을 사용한 고객 온보딩 자동화
Set
Asana
Gmail
+
Set
Asana
Gmail
19 노드Adam Crafts
AI 요약
워크플로우 정보
난이도
고급
노드 수18
카테고리2
노드 유형9
저자
Gabriel Santos
@gabrielhmsantosEnthusiastic developer passionate about automation and system integration. I work mainly with Python, RPA, and N8N, building workflows and custom solutions to optimize processes and connect platforms. Always learning, sharing, and exploring new ways to automate smarter.
외부 링크
n8n.io에서 보기 →
이 워크플로우 공유