{
  "name": "공유용 - n8n Cloud 사용자 초대 자동화 (다운로드용)",
  "nodes": [
    {
      "parameters": {
        "content": "# 공유용 워크플로우 사용 가이드\n\n이 워크플로우는 n8n Cloud 워크스페이스에 사용자를 초대하는 유즈케이스 예제입니다.\n신청 폼 → 초대 API → 신청 정보 저장 → Discord 알림 순서로 동작합니다.\n\n## 실행 전 필수 설정\n1. **2) 사용자 초대 API (설정 필요)**\n   - URL의 YOUR_N8N_HOST를 내 n8n Cloud 호스트로 교체합니다.\n   - POST /api/v1/users 형식은 사용하는 n8n API 문서를 확인합니다.\n   - API 키는 Credential 또는 Secret에 저장하고 화면·JSON·블로그에 직접 입력하지 않습니다.\n2. **3) 신청 정보 저장 (테이블명 설정)**\n   - Data Table 모드가 By Name입니다.\n   - n8n-cloud-invitations 테이블을 만들거나 내 테이블명으로 바꿉니다.\n   - name, user_id, email 컬럼을 준비합니다.\n3. **Discord 초대 완료 알림**\n   - 공유본에는 가짜 자리표시자 Credential만 연결되어 있습니다.\n   - 내 Discord Webhook Credential로 교체한 뒤 메시지를 확인합니다.\n\n## 테스트 순서\n1. 먼저 테스트용 이메일을 준비합니다.\n2. HTTP Request URL과 Credential을 설정합니다.\n3. Data Table과 Discord Credential을 설정합니다.\n4. Test URL로 폼 입력을 확인합니다.\n5. API 호출 대상과 역할을 검토한 뒤 Execute step을 사용합니다.\n6. 성공 로그, Data Table 행, Discord 메시지를 각각 확인합니다.\n7. 검증이 끝난 뒤에만 Publish와 Production URL을 사용합니다.\n\n## 보안·개인정보 주의\n- 공유본에는 운영 API 키, Discord Webhook, 실제 테이블명, 실제 신청자 정보가 없어야 합니다.\n- 기존 키가 외부에 노출됐다면 즉시 폐기하고 재발급합니다.\n- 실제 사용자 초대는 외부 시스템 상태를 변경하므로 테스트 계정으로 먼저 검증합니다.\n- 폼 공개 전 이메일 형식, 허용 도메인, 중복 신청, 스팸 방지를 추가합니다.\n\n## 커스터마이징 포인트\n- 폼 필드: name, email\n- 초대 역할: HTTP Request JSON의 role\n- 저장 컬럼: name, user_id, email\n- 알림 문구: Discord 노드의 Message\n- 저장·알림이 필요 없으면 해당 노드를 비활성화하거나 삭제합니다.\n\n이 워크플로우는 실행·Publish하지 않은 공유용 템플릿입니다.",
        "width": 320
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -272,
        112
      ],
      "id": "bb034230-0bcc-4ac7-9619-3bb25e77529b",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "authentication": "webhook",
        "content": "n8n Cloud 초대 완료: {{ $json.user.email }}\n초대 대상에게 메일이 발송되었는지 확인하세요.",
        "options": {}
      },
      "type": "n8n-nodes-base.discord",
      "typeVersion": 2,
      "position": [
        208,
        448
      ],
      "id": "cfc8d041-a687-4eb4-8448-4c6511756a03",
      "name": "Discord 초대 완료 알림",
      "webhookId": "1c5a5f02-f99f-41d5-be6c-b5488a59ef2e",
      "credentials": {
        "discordWebhookApi": {
          "id": "sE53t5iUV8hs5ddn",
          "name": "Discord Webhook account 4"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://YOUR_N8N_HOST.n8n.cloud/api/v1/users",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": []
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "=[\n  {\n    \"email\": \"{{ $json.email }}\",\n    \"role\": \"global:member\"\n  }\n]",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        -16,
        352
      ],
      "id": "fbd5de9e-0125-4690-8bdc-87fc1709a8c5",
      "name": "2) 사용자 초대 API (설정 필요)"
    },
    {
      "parameters": {
        "formTitle": "n8n Cloud 사용자 초대 신청서 (공유용)",
        "formDescription": "이름과 이메일을 입력하면 초대 API를 호출합니다. 실행 전 HTTP Request, Data Table, Discord 설정을 본인 환경에 맞게 바꿔주세요.",
        "formFields": {
          "values": [
            {
              "fieldLabel": "name"
            },
            {
              "fieldLabel": "email",
              "fieldType": "email",
              "requiredField": true
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.formTrigger",
      "typeVersion": 2.3,
      "position": [
        -240,
        352
      ],
      "id": "76453fd7-1945-4c8e-a826-224cd3d41634",
      "name": "1) 신청 폼 (이름·이메일)",
      "webhookId": "5ae8dcf3-94c2-41bb-bec7-b455a7cad133"
    },
    {
      "parameters": {
        "dataTableId": {
          "__rl": true,
          "value": "n8n-cloud-invitations",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "user_id": "={{ $json.user.id }}",
            "email": "={{ $json.user.email }}",
            "name": "={{ $('1) 신청 폼 (이름·이메일)').item.json.name }}"
          },
          "matchingColumns": [],
          "schema": [
            {
              "id": "name",
              "displayName": "name",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "user_id",
              "displayName": "user_id",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "email",
              "displayName": "email",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.dataTable",
      "typeVersion": 1.1,
      "position": [
        208,
        256
      ],
      "id": "944f17e4-1817-4ae9-bcd0-616f772f638c",
      "name": "3) 신청 정보 저장 (테이블명 설정)"
    },
    {
      "parameters": {
        "content": "## 1) 신청 폼 설정\n\n- 입력 필드명은 **name**, **email**을 유지해야 뒤 노드 표현식이 그대로 동작합니다.\n- Form Title과 Description은 서비스 목적에 맞게 바꿉니다.\n- 공개 전 이메일 형식, 허용 도메인, 중복 신청 방지를 추가합니다.\n- 테스트할 때는 Test URL과 테스트용 이메일만 사용합니다.\n- 실제 운영 URL은 검증이 끝난 뒤 Publish 후 사용합니다."
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        32,
        272
      ],
      "typeVersion": 1,
      "id": "d7a236ad-b430-4603-a48f-db51205a41ab",
      "name": "Sticky Note1"
    },
    {
      "parameters": {
        "content": "## 2) 사용자 초대 API 설정\n\n- URL의 **YOUR_N8N_HOST**를 내 n8n Cloud 호스트로 교체합니다.\n- API 키는 HTTP Header에 직접 적지 말고 Credential 또는 Secret으로 관리합니다.\n- Body의 email 표현식은 폼의 email 필드와 연결됩니다.\n- role은 워크스페이스 정책에 맞게 member 등으로 조정합니다.\n- 실제 초대 전에 테스트용 이메일로 API 응답과 사용자 ID를 확인합니다."
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        32,
        272
      ],
      "typeVersion": 1,
      "id": "b888f74f-c7f4-4178-9e1c-75914cee12d5",
      "name": "Sticky Note2"
    },
    {
      "parameters": {
        "content": "## 3) 저장·알림 설정\n\n- Data Table은 **By Name**으로 설정되어 있습니다.\n- n8n-cloud-invitations 테이블과 name, user_id, email 컬럼을 준비합니다.\n- Discord 노드는 공유용 가짜 Credential입니다. 내 Webhook Credential로 교체합니다.\n- 알림 문구는 Message 필드에서 바꿀 수 있습니다.\n- 저장이나 알림을 사용하지 않으면 해당 노드를 비활성화한 뒤 API 성공 여부만 먼저 테스트합니다."
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        32,
        272
      ],
      "typeVersion": 1,
      "id": "02bbea80-177f-4d3b-af48-d1b8d4d019d8",
      "name": "Sticky Note3"
    }
  ],
  "pinData": {},
  "connections": {
    "2) 사용자 초대 API (설정 필요)": {
      "main": [
        [
          {
            "node": "3) 신청 정보 저장 (테이블명 설정)",
            "type": "main",
            "index": 0
          },
          {
            "node": "Discord 초대 완료 알림",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1) 신청 폼 (이름·이메일)": {
      "main": [
        [
          {
            "node": "2) 사용자 초대 API (설정 필요)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3) 신청 정보 저장 (테이블명 설정)": {
      "main": [
        []
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "binaryMode": "separate",
    "callerPolicy": "workflowsFromSameOwner",
    "availableInMCP": false,
    "errorWorkflow": "qOTeu8iZJisagojZ"
  },
  "versionId": "6d721d12-e38f-4640-9d18-43cd5c11aa9b",
  "meta": {
    "templateCredsSetupCompleted": true,
    "instanceId": "0c3df53d06f8e98b76dce975edff00f3b3bb54cd4a475a425a4806301153f7bf"
  },
  "nodeGroups": [],
  "id": "lNHNwcVmpkbANOG9",
  "tags": [
    {
      "updatedAt": "2025-12-10T08:44:37.325Z",
      "createdAt": "2025-12-10T08:44:37.325Z",
      "id": "GLSyI1pYWfas9OvJ",
      "name": "템플릿"
    },
    {
      "updatedAt": "2025-03-17T13:06:51.837Z",
      "createdAt": "2025-03-17T13:06:51.837Z",
      "id": "XsCEAhVbtmvCRf1q",
      "name": "guide"
    }
  ]
}
