RECIPE 025
월간 마케팅 성과 대시보드 자동 업데이트
- ▸회의록 텍스트에서 OpenAI로 액션아이템을 자동 추출할 수 있다
- ▸추출된 액션아이템을 담당자별로 분류해 Notion에 등록할 수 있다
- ▸담당자에게 Slack DM으로 할일을 자동 전달할 수 있다
✅사전 준비
- □OpenAI API 자격증명 연결 완료
- □Notion 자격증명 연결 완료 (할일 데이터베이스 준비)
- □Slack 자격증명 연결 완료
- □담당자 이름 ↔ Slack User ID 매핑 테이블 준비
- □회의록 입력 방법 결정 (Webhook / Google Docs / Notion 페이지)
액션아이템 추출 — OpenAI 프롬프트
Model: gpt-4o-mini
System: 너는 회의록에서 액션아이템을 추출하는 전문가야.
User:
다음 회의록에서 액션아이템을 추출해서 반드시 아래 JSON 배열 형식으로만 응답해.
[
{ "task": "할일 내용", "assignee": "담당자 이름", "deadline": "YYYY-MM-DD 또는 null" }
]
회의록:
{{ $json.meetingNote }}JSON 파싱 — Code 노드
const raw = $input.first().json.message.content;
// 코드블록 마크다운 제거
const cleaned = raw.replace(/```json|```/g, '').trim();
const items = JSON.parse(cleaned);
return items.map(item => ({ json: item }));담당자 → Slack ID 매핑 — Code 노드
const slackIds = {
'김철수': 'U012ABC',
'이영희': 'U023DEF',
'박지원': 'U034GHI',
};
const assignee = $json.assignee;
const slackId = slackIds[assignee] ?? null;
return [{ json: { ...$json, slackId } }];Slack DM 메시지
To: {{ $json.slackId }}
채널 아닌 DM 발송 시 User 탭에서 ID 입력
메시지:
📋 회의 액션아이템이 배정되었습니다!
할일: {{ $json.task }}
마감: {{ $json.deadline ?? '미정' }}⚠️ 주의OpenAI가 JSON 외 텍스트를 포함해 응답할 수 있습니다. Code 노드에서 JSON.parse 전에 반드시 마크다운 코드블록(```json)을 제거하는 정제 과정을 넣으세요.
⚡
워크플로우 JSON
아래 JSON을 복사해 n8n에 바로 임포트하세요
📥 n8n 임포트 방법
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
{
"name": "recipe025_monthly_marketing_dashboard",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 8 1 * *"
}
]
}
},
"id": "schedule-025-01",
"name": "매월 1일 오전 8시",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.1,
"position": [
200,
400
]
},
{
"parameters": {
"method": "POST",
"url": "https://analyticsdata.googleapis.com/v1beta/properties/{{ $env.GA4_PROPERTY_ID }}:runReport",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"bodyParameters": {
"parameters": [
{
"name": "dateRanges",
"value": "[{\"startDate\": \"30daysAgo\", \"endDate\": \"yesterday\"}]"
},
{
"name": "metrics",
"value": "[{\"name\": \"sessions\"}, {\"name\": \"newUsers\"}]"
}
]
},
"options": {}
},
"id": "http-025-02",
"name": "GA4 월간 트래픽 수집",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
420,
200
]
},
{
"parameters": {
"method": "GET",
"url": "https://us1.api.mailchimp.com/3.0/reports?count=4&sort_field=send_time&sort_dir=DESC",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"options": {}
},
"id": "http-025-03",
"name": "Mailchimp 월간 성과 수집",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
420,
400
]
},
{
"parameters": {
"method": "GET",
"url": "=https://www.googleapis.com/youtube/v3/channels?part=statistics&id={{ $env.YOUTUBE_CHANNEL_ID }}&key={{ $env.YOUTUBE_API_KEY }}",
"options": {}
},
"id": "http-025-04",
"name": "YouTube 월간 성과 수집",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
420,
600
]
},
{
"parameters": {
"mode": "combine",
"combinationMode": "mergeByPosition",
"options": {}
},
"id": "merge-025-05",
"name": "전체 채널 데이터 통합",
"type": "n8n-nodes-base.merge",
"typeVersion": 3,
"position": [
640,
400
]
},
{
"parameters": {
"operation": "appendOrUpdate",
"documentId": {
"value": "={{ $env.MARKETING_DASHBOARD_SHEET_ID }}"
},
"sheetName": {
"value": "monthly"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"month": "={{ $now.minus({months:1}).format('YYYY-MM') }}",
"gaSessions": "={{ $('GA4 월간 트래픽 수집').item.json.rows[0].metricValues[0].value }}",
"gaNewUsers": "={{ $('GA4 월간 트래픽 수집').item.json.rows[0].metricValues[1].value }}",
"youtubeSubscribers": "={{ $('YouTube 월간 성과 수집').item.json.items[0].statistics.subscriberCount }}",
"updatedAt": "={{ $now.format('YYYY-MM-DD HH:mm') }}"
}
},
"options": {
"upsertOptions": {
"upsertKey": "month"
}
}
},
"id": "sheets-025-06",
"name": "대시보드 시트 자동 업데이트",
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.4,
"position": [
860,
400
]
},
{
"parameters": {
"resource": "message",
"operation": "post",
"channel": "#marketing-team",
"text": "=📊 지난달 마케팅 성과 보고서가 준비됐어요!\n기간: {{ $now.minus({months:1}).format('YYYY년 M월') }}\n→ 구글 시트에서 전체 리포트를 확인하세요!"
},
"id": "slack-025-07",
"name": "Slack 완료 알림",
"type": "n8n-nodes-base.slack",
"typeVersion": 2.2,
"position": [
1080,
400
]
}
],
"connections": {
"매월 1일 오전 8시": {
"main": [
[
{
"node": "GA4 월간 트래픽 수집",
"type": "main",
"index": 0
},
{
"node": "Mailchimp 월간 성과 수집",
"type": "main",
"index": 0
},
{
"node": "YouTube 월간 성과 수집",
"type": "main",
"index": 0
}
]
]
},
"GA4 월간 트래픽 수집": {
"main": [
[
{
"node": "전체 채널 데이터 통합",
"type": "main",
"index": 0
}
]
]
},
"Mailchimp 월간 성과 수집": {
"main": [
[
{
"node": "전체 채널 데이터 통합",
"type": "main",
"index": 1
}
]
]
},
"YouTube 월간 성과 수집": {
"main": [
[
{
"node": "전체 채널 데이터 통합",
"type": "main",
"index": 2
}
]
]
},
"전체 채널 데이터 통합": {
"main": [
[
{
"node": "대시보드 시트 자동 업데이트",
"type": "main",
"index": 0
}
]
]
},
"대시보드 시트 자동 업데이트": {
"main": [
[
{
"node": "Slack 완료 알림",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"timezone": "Asia/Seoul"
},
"meta": {
"chapter": 2,
"recipe": "025",
"title": "월간 마케팅 성과 대시보드 자동 업데이트",
"difficulty": "⭐⭐⭐",
"estimatedTime": "60분",
"apps": [
"Google Analytics",
"Mailchimp",
"YouTube API",
"Google Sheets",
"Slack"
]
}
}