발행일: 2026-10-06(화) 11:44
← 목차로 돌아가기|하루 30분 n8n 시리즈 ② 실무 자동화 레시피 100
RECIPE 087

고객 NPS 설문 자동 발송 → 결과 분석

  • ▸구매/가입 후 일정 기간이 지난 고객에게 NPS 설문 자동 발송
  • ▸설문 응답을 자동 수집하여 점수대별 분류
  • ▸비추천 고객(Detractor)에게 즉시 개인화 대응 이메일 발송

✅사전 준비

  • □고객 DB (구매일/가입일 포함) 접근 권한
  • □NPS 설문 링크 생성 (Typeform, Google Forms 또는 자체 구현)
  • □설문 발송 타이밍 결정 (예: 구매 후 7일)
  • □응답 수집용 웹훅 또는 Sheets 연동 설정

발송 대상 고객 필터링

// Google Sheets에서 고객 목록 읽기 후 Code 노드
const customers = $input.all();
const now = new Date();

return customers.filter(c => {
  const purchaseDate = new Date(c.json.purchase_date);
  const daysSince = Math.floor((now - purchaseDate) / 86400000);
  // 구매 후 7일이 된 고객, 아직 설문 미발송
  return daysSince === 7 && !c.json.nps_sent;
});

NPS 설문 이메일 템플릿

제목: {{ $json.name }}님, 솔직한 피드백을 들려주세요 (1분)

안녕하세요 {{ $json.name }}님,

저희 서비스를 이용하신 지 일주일이 되었습니다.

단 한 가지만 여쭤볼게요:

**친구나 동료에게 저희 서비스를 추천하실 의향이 얼마나 있으신가요?**

0(전혀 없음) ~ 10(매우 높음)

👉 지금 바로 답하기: {{ $json.survey_url }}?email={{ $json.email }}

1분이면 충분합니다. 감사합니다!

NPS 점수 분류 및 대응 (Switch)

// 응답 수신 후 Switch 노드
Node: Switch
Value: {{ $json.nps_score >= 9 ? 'promoter' : $json.nps_score >= 7 ? 'passive' : 'detractor' }}

Case 'promoter' (9-10점): 리뷰 작성 요청 이메일
Case 'passive' (7-8점): 개선 사항 질문 이메일
Case 'detractor' (0-6점): CS팀 즉시 알림 + 사과 이메일
💡 TIPNPS = (추천 고객 비율%) - (비추천 고객 비율%)로 계산됩니다. 응답 데이터를 Sheets에 축적하면 Code 노드로 월별 NPS 트렌드를 자동 계산할 수 있습니다.
⚡

워크플로우 JSON

아래 JSON을 복사해 n8n에 바로 임포트하세요

📥 n8n 임포트 방법
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
{
  "recipeId": "recipe087",
  "title": "구글 폼 + 네이버 폼 응답 통합 집계",
  "chapter": 8,
  "category": "국내 서비스 특화 레시피",
  "difficulty": "⭐⭐",
  "estimatedTime": "30분",
  "usedApps": [
    "Google Sheets",
    "네이버 폼 Webhook"
  ],
  "description": "구글 폼 응답은 기존 구글 시트 연동으로, 네이버 폼 응답은 Webhook으로 n8n에 연결해 양쪽 응답을 동일한 컬럼 구조로 변환하고 하나의 통합 시트에 자동 기록합니다.",
  "nodes": [
    {
      "id": "node1",
      "type": "n8n-nodes-base.googleSheetsTrigger",
      "name": "구글 폼 응답 감지",
      "parameters": {
        "spreadsheetId": "={{$env.GOOGLE_FORM_SHEET_ID}}",
        "sheetName": "설문응답",
        "triggerOn": "rowAdded"
      }
    },
    {
      "id": "node2",
      "type": "n8n-nodes-base.webhook",
      "name": "네이버 폼 Webhook 수신",
      "parameters": {
        "path": "naver-form-response",
        "httpMethod": "POST"
      }
    },
    {
      "id": "node3",
      "type": "n8n-nodes-base.code",
      "name": "구글 폼 응답 정규화",
      "parameters": {
        "jsCode": "return items.map(item => ({\n  json: {\n    source: '구글폼',\n    submittedAt: item.json['타임스탬프'] || new Date().toISOString(),\n    name: item.json['이름'] || '',\n    email: item.json['이메일'] || '',\n    answer1: item.json['질문1'] || '',\n    answer2: item.json['질문2'] || ''\n  }\n}));"
      }
    },
    {
      "id": "node4",
      "type": "n8n-nodes-base.code",
      "name": "네이버 폼 응답 정규화",
      "parameters": {
        "jsCode": "return items.map(item => ({\n  json: {\n    source: '네이버폼',\n    submittedAt: item.json['createdAt'] || new Date().toISOString(),\n    name: item.json['responses']?.find(r => r.questionId === '{{$env.NAVER_NAME_QUESTION_ID}}')?.answer || '',\n    email: item.json['responses']?.find(r => r.questionId === '{{$env.NAVER_EMAIL_QUESTION_ID}}')?.answer || '',\n    answer1: item.json['responses']?.find(r => r.questionId === '{{$env.NAVER_Q1_ID}}')?.answer || '',\n    answer2: item.json['responses']?.find(r => r.questionId === '{{$env.NAVER_Q2_ID}}')?.answer || ''\n  }\n}));"
      }
    },
    {
      "id": "node5",
      "type": "n8n-nodes-base.googleSheets",
      "name": "통합 시트 기록",
      "parameters": {
        "operation": "appendOrUpdate",
        "spreadsheetId": "={{$env.UNIFIED_SURVEY_SHEET_ID}}",
        "sheetName": "통합응답",
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "출처": "={{$json['source']}}",
            "제출시각": "={{$json['submittedAt']}}",
            "이름": "={{$json['name']}}",
            "이메일": "={{$json['email']}}",
            "답변1": "={{$json['answer1']}}",
            "답변2": "={{$json['answer2']}}"
          }
        }
      }
    }
  ],
  "envVariables": {
    "GOOGLE_FORM_SHEET_ID": "구글 폼 연결 Google Sheets ID",
    "UNIFIED_SURVEY_SHEET_ID": "통합 응답 Google Sheets ID",
    "NAVER_NAME_QUESTION_ID": "네이버 폼 이름 질문 ID",
    "NAVER_EMAIL_QUESTION_ID": "네이버 폼 이메일 질문 ID",
    "NAVER_Q1_ID": "네이버 폼 질문1 ID",
    "NAVER_Q2_ID": "네이버 폼 질문2 ID"
  },
  "tips": [
    "네이버 폼의 알림 URL 설정은 네이버 폼 → 설문 설정 → 응답 알림 → Webhook URL 입력에서 할 수 있어요.",
    "질문 수가 많은 경우 정규화 코드에서 questionId 매핑을 추가로 작성해야 해요. QR코드 템플릿에 매핑 예시가 포함되어 있어요.",
    "응답 집계 현황을 주간 단위로 자동 요약해 Slack으로 발송하는 Schedule Trigger를 추가하면 설문 현황을 실시간으로 파악할 수 있어요."
  ],
  "qrUrl": "www.koreaaitimes.com/books/n8n-vol2/recipe087"
}
← 이전 레시피☰ 목차다음 레시피 →