RECIPE 043
VIP 고객 문의 → 즉시 에스컬레이션
- ▸Webhook으로 고객 문의를 수신해 OpenAI로 1차 답변을 자동 생성할 수 있다
- ▸FAQ 데이터베이스를 참조해 정확도 높은 답변을 만들 수 있다
- ▸생성된 답변을 담당자 검토 후 발송하는 승인 플로우를 구현할 수 있다
✅사전 준비
- □OpenAI API 자격증명 연결 완료
- □Google Sheets에 FAQ 데이터베이스 구축 (질문 유형 / 답변 템플릿 / 담당팀)
- □Gmail 또는 Slack 자격증명 연결 완료 (담당자 검토 알림용)
- □고객 문의 수신 채널 결정 (Webhook / Gmail / Typeform)
FAQ 컨텍스트 주입 — Code 노드
const faqs = $('Google Sheets').all().map(i => i.json);
const inquiry = $('Webhook').first().json.message;
// 관련 FAQ 상위 3개 추출 (키워드 매칭)
const relevant = faqs
.filter(f => inquiry.includes(f.키워드) || f.키워드.split(',').some(k => inquiry.includes(k.trim())))
.slice(0, 3)
.map(f => `Q: ${f.질문}\nA: ${f.답변}`)
.join('\n\n');
return [{ json: { inquiry, faqContext: relevant || '관련 FAQ 없음' } }];1차 답변 생성 — OpenAI 프롬프트
Model: gpt-4o-mini
System:
너는 친절한 고객 서비스 담당자야.
아래 FAQ를 참고해서 고객 문의에 답변해줘.
답변은 공손하고 명확하게, 3~5문장으로 작성해.
모르면 '담당자에게 연결해드리겠습니다'라고 답변해.
FAQ 참고 자료:
{{ $json.faqContext }}
User:
고객 문의: {{ $json.inquiry }}담당자 검토 요청 — Slack 메시지
📬 *고객 문의 1차 답변 검토 요청*
*문의 내용:*
{{ $json.inquiry }}
*AI 초안:*
{{ $json.draftReply }}
승인하려면 아래 링크에서 발송하세요:
{{ $json.approveUrl }}💡 TIP승인 플로우는 n8n의 Wait 노드(Webhook 재수신 대기)를 활용하면 구현할 수 있어요. 담당자가 승인 버튼 클릭 시 Webhook URL로 신호가 오면 Wait가 해제되어 이메일이 발송됩니다.
⚡
워크플로우 JSON
아래 JSON을 복사해 n8n에 바로 임포트하세요
📥 n8n 임포트 방법
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
{
"recipeId": "recipe043",
"title": "VIP 고객 문의 → 즉시 에스컬레이션",
"chapter": 4,
"category": "고객 응대 자동화",
"difficulty": "⭐⭐",
"estimatedTime": "30분",
"usedApps": [
"Gmail",
"Google Sheets",
"Slack"
],
"description": "VIP 고객 이메일 명단을 구글 시트로 관리하고, 해당 고객의 문의 이메일이 수신되는 즉시 팀장 Slack DM에 이메일 전문과 함께 긴급 알림을 보냅니다.",
"nodes": [
{
"id": "trigger_gmail",
"type": "trigger",
"service": "Gmail",
"name": "새 이메일 감지",
"config": {
"event": "messageReceived",
"pollInterval": "every 5 minutes",
"filters": {
"to": "{{$env.SUPPORT_EMAIL}}"
}
}
},
{
"id": "read_vip_list",
"type": "action",
"service": "Google Sheets",
"name": "VIP 명단 조회",
"config": {
"operation": "readRows",
"spreadsheetId": "{{$env.VIP_SHEET_ID}}",
"sheetName": "VIP고객목록",
"columns": [
"이메일",
"고객명",
"등급",
"담당자슬랙ID"
]
}
},
{
"id": "check_vip",
"type": "condition",
"service": "IF",
"name": "VIP 여부 확인",
"config": {
"condition": "{{$node['read_vip_list'].json.map(row => row['이메일']).includes($json['from']['value'][0]['address'])}}"
}
},
{
"id": "notify_manager",
"type": "action",
"service": "Slack",
"name": "팀장 즉시 알림",
"config": {
"operation": "sendDM",
"userId": "{{$env.MANAGER_SLACK_ID}}",
"message": "⭐ VIP 고객 문의 도착!\n\n👤 고객명: {{$node['check_vip'].json['고객명']}}\n📧 이메일: {{$json['from']['value'][0]['address']}}\n📌 제목: {{$json['subject']}}\n\n💬 내용 요약:\n{{$json['text'].slice(0, 300)}}...\n\n👉 즉시 확인 부탁드립니다!"
}
},
{
"id": "no_action",
"type": "noOp",
"name": "일반 고객 — 스킵",
"config": {}
}
],
"edges": [
{
"from": "trigger_gmail",
"to": "read_vip_list"
},
{
"from": "read_vip_list",
"to": "check_vip"
},
{
"from": "check_vip",
"to": "notify_manager",
"branch": "true"
},
{
"from": "check_vip",
"to": "no_action",
"branch": "false"
}
],
"tips": [
"VIP 명단 시트는 '이메일' 열을 기준으로 검색하므로 이메일 주소를 정확히 입력해두세요.",
"담당자가 여러 명일 경우 VIP 시트에 '담당자슬랙ID' 열을 추가하고 해당 담당자에게 직접 DM을 보낼 수 있어요.",
"알림 메시지에 Zendesk 또는 구글 시트 티켓 링크를 함께 첨부하면 팀장이 바로 상황을 파악할 수 있어요."
],
"qrUrl": "www.koreaaitimes.com/books/n8n-vol2/recipe043"
}