RECIPE 056
고객 리뷰 자동 수집 → 감정 분석 → 대시보드
- ▸Google Maps / Naver 플레이스 리뷰 주기적 수집
- ▸OpenAI API로 리뷰 감정(긍정/부정/중립) 자동 분류
- ▸부정 리뷰 발생 시 담당자에게 즉시 알림
✅사전 준비
- □Google Places API 키 발급 (https://console.cloud.google.com)
- □OpenAI API 키 준비
- □Google Sheets 결과 저장용 스프레드시트 생성
- □Slack 또는 이메일 알림 채널 설정
Google Places 리뷰 수집
Node: HTTP Request
Method: GET
URL: https://maps.googleapis.com/maps/api/place/details/json
Query Parameters:
place_id: YOUR_PLACE_ID
fields: reviews,rating
language: ko
key: YOUR_GOOGLE_API_KEYOpenAI 감정 분석 프롬프트
모델: gpt-4o-mini
System: 당신은 고객 리뷰 감정 분석 전문가입니다.
리뷰를 읽고 다음 JSON 형식으로만 응답하세요:
{"sentiment": "긍정|부정|중립", "score": 0.0~1.0, "summary": "한 줄 요약"}
User: 다음 리뷰를 분석해주세요:
{{ $json.text }}부정 리뷰 필터 (IF 노드)
Condition: {{ JSON.parse($json.choices[0].message.content).sentiment }} == '부정'
또는
Condition: {{ JSON.parse($json.choices[0].message.content).score }} < 0.3⚠️ 주의Google Places API는 최근 5개 리뷰만 반환합니다. 더 많은 리뷰가 필요하면 서드파티 스크레이핑 서비스를 활용하거나, 자체 리뷰 수집 폼을 운영하는 것을 권장합니다.
⚡
워크플로우 JSON
아래 JSON을 복사해 n8n에 바로 임포트하세요
📥 n8n 임포트 방법
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
{
"recipeId": "recipe056",
"title": "주간 업무 현황 자동 수집 & 리포트",
"chapter": 5,
"category": "HR & 조직 운영 자동화",
"difficulty": "⭐⭐",
"estimatedTime": "35분",
"usedApps": [
"Slack",
"Google Sheets"
],
"description": "매주 금요일 오후 4시에 각 팀원에게 Slack DM으로 주간 업무 요약 입력을 요청하고, 응답 내용을 Google Sheets에 자동 기록한 뒤 오후 5시에 취합된 내용을 팀장에게 요약 발송합니다.",
"nodes": [
{
"id": "trigger_request",
"type": "trigger",
"service": "Schedule",
"name": "매주 금요일 오후 4시",
"config": {
"interval": "weekly",
"dayOfWeek": "friday",
"time": "16:00"
}
},
{
"id": "get_team_members",
"type": "action",
"service": "Google Sheets",
"name": "팀원 목록 조회",
"config": {
"operation": "readRows",
"spreadsheetId": "{{$env.HR_SHEET_ID}}",
"sheetName": "직원명단",
"columns": [
"이름",
"슬랙ID",
"팀"
]
}
},
{
"id": "loop_members",
"type": "action",
"service": "SplitInBatches",
"name": "팀원별 DM 발송",
"config": {
"batchSize": 1
}
},
{
"id": "send_dm_request",
"type": "action",
"service": "Slack",
"name": "주간 업무 입력 DM",
"config": {
"operation": "sendDM",
"userId": "{{$json['슬랙ID']}}",
"message": "📝 {{$json['이름']}}님, 이번 주 업무 요약을 이 채널에 입력해 주세요!\n\n아래 형식으로 작성해 주시면 됩니다:\n\n✅ 완료한 업무:\n🔄 진행 중인 업무:\n⚠️ 이슈/블로커:\n📌 다음 주 계획:\n\n입력 기한: 오늘 오후 5시까지"
}
},
{
"id": "trigger_collect",
"type": "trigger",
"service": "Schedule",
"name": "매주 금요일 오후 5시 수집",
"config": {
"interval": "weekly",
"dayOfWeek": "friday",
"time": "17:00"
}
},
{
"id": "trigger_slack_message",
"type": "trigger",
"service": "Slack",
"name": "Slack DM 응답 수신",
"config": {
"event": "message",
"channelType": "im"
}
},
{
"id": "record_report",
"type": "action",
"service": "Google Sheets",
"name": "주간 보고 시트 기록",
"config": {
"operation": "appendRow",
"spreadsheetId": "{{$env.WEEKLY_REPORT_SHEET_ID}}",
"sheetName": "주간보고",
"row": {
"주차": "{{$now.format('YYYY년 WW주')}}",
"날짜": "{{$now.format('YYYY-MM-DD')}}",
"작성자": "{{$json['user_name']}}",
"내용": "{{$json['text']}}"
}
}
},
{
"id": "react_check",
"type": "action",
"service": "Slack",
"name": "접수 완료 이모지 반응",
"config": {
"operation": "addReaction",
"channel": "{{$json['channel']}}",
"timestamp": "{{$json['ts']}}",
"emoji": "white_check_mark"
}
},
{
"id": "trigger_summary",
"type": "trigger",
"service": "Schedule",
"name": "매주 금요일 오후 5시 10분 요약 발송",
"config": {
"interval": "weekly",
"dayOfWeek": "friday",
"time": "17:10"
}
},
{
"id": "get_this_week_reports",
"type": "action",
"service": "Google Sheets",
"name": "이번 주 보고 취합",
"config": {
"operation": "readRows",
"spreadsheetId": "{{$env.WEEKLY_REPORT_SHEET_ID}}",
"sheetName": "주간보고",
"filters": {
"주차": "{{$now.format('YYYY년 WW주')}}"
}
}
},
{
"id": "send_summary_to_manager",
"type": "action",
"service": "Slack",
"name": "팀장에게 주간 요약 발송",
"config": {
"operation": "sendDM",
"userId": "{{$env.MANAGER_SLACK_ID}}",
"message": "📊 {{$now.format('YYYY년 WW주')}} 팀 주간 업무 현황\n\n{{$items().map(r => `👤 ${r.json['작성자']}\n${r.json['내용']}\n`).join('\n---\n')}}\n\n👉 전체 시트 보기: {{$env.WEEKLY_REPORT_SHEET_URL}}"
}
}
],
"edges": [
{
"from": "trigger_request",
"to": "get_team_members"
},
{
"from": "get_team_members",
"to": "loop_members"
},
{
"from": "loop_members",
"to": "send_dm_request"
},
{
"from": "trigger_slack_message",
"to": "record_report"
},
{
"from": "record_report",
"to": "react_check"
},
{
"from": "trigger_summary",
"to": "get_this_week_reports"
},
{
"from": "get_this_week_reports",
"to": "send_summary_to_manager"
}
],
"tips": [
"Slack DM 트리거는 n8n의 Slack Trigger 노드에서 'message' 이벤트와 'im' 채널 타입을 선택하면 DM 메시지를 감지할 수 있어요.",
"미응답 팀원 목록을 자동으로 파악해 리마인더 DM을 보내려면 오후 4시 30분에 시트와 대조하는 추가 워크플로우를 만들어보세요.",
"부서별로 팀원을 그룹핑하여 팀장에게 부서별 요약을 전달하면 조직 규모가 커져도 효율적으로 운영할 수 있어요."
],
"qrUrl": "www.koreaaitimes.com/books/n8n-vol2/recipe056"
}