구글시트 매출 데이터, AI가 매일 인사이트 리포트로 — 수작업 보고서에서 벗어나는 n8n 워크플로우
이 글과 연결된 글 보기
드래그로 이동 · 휠/두 손가락으로 확대 · 방향키로 글 선택 · 0으로 맞춤. 실선: 본문 링크, 점선: 시리즈·주제의 대표 연결.표시된 글 7편 목록
구글시트에 영업팀과 마케팅팀이 채워 넣는 매출·광고 데이터가 있다면, n8n으로 이걸 매일 아침 AI 에이전트에게 넘겨 핵심 지표 요약과 실행 제언이 담긴 인사이트 리포트를 이메일로 받아볼 수 있습니다. 이 워크플로우의 핵심은 시트의 숫자를 가공 없이 그대로 AI에게 넘기고, 무엇을 요약하고 어떤 형식으로 답할지는 시스템 프롬프트로 촘촘하게 지시하는 데 있습니다.
이 워크플로우 하나로 보여줄 수 있는 것
면접에서 "반복 리포트 자동화 해봤어요"라고 말하면 "무슨 데이터로, 뭘 만들었는데요?"가 따라옵니다. 이 워크플로우는 그 질문에 이렇게 답하게 해줍니다. "영업·마케팅 시트 두 개를 매일 하나로 합쳐서 AI에게 넘기고, 경영진이 바로 읽을 수 있는 HTML 인사이트 리포트를 이메일로 자동 발송하게 만들었습니다."
짧은 문장 안에 네 가지 역량이 들어 있습니다.
- 데이터 결합 — 서로 다른 시트 두 개를 공통 컬럼(날짜) 기준으로 하나의 분석 단위로 합쳐본 경험
- 프롬프트로 리포트 설계 — 데이터는 가공하지 않고 그대로 넘기되, 무엇을 요약할지·어떤 기준으로 비교할지·어떤 섹션으로 나눌지를 시스템 프롬프트로 지시해본 경험
- 출력 형식까지 지시 — AI의 답을 자유 문장이 아니라 "이메일에 바로 붙여넣을 수 있는 HTML"로 못 박아본 경험
- 정기 발송 — 완성된 리포트를 사람이 아니라 워크플로우가 스케줄대로 이메일함에 넣게 만든 경험
이 중 두 번째가 가장 옮겨 쓰기 좋은 기술입니다. 시트를 미리 요약하거나 계산해서 AI에게 주는 대신, 원본 데이터를 통째로 넘기고 "무엇을 뽑아 어떻게 구조화할지"는 프롬프트 쪽에서 통제합니다. 소스만 바꾸면 재고 현황, 신규 가입자 수, 서버 에러 로그처럼 매일 쌓이는 어떤 반복 데이터에도 같은 구조가 그대로 적용됩니다.
배경 — 두 시트를 열어 눈으로 정리하던 일
이 워크플로우는 데이터팝콘 n8n 인스턴스에 있는 것으로, 파일명에 교육 플랫폼 "구름"이 붙어 있습니다. 캔버스 스티키 노트에는 목적이 이렇게 적혀 있습니다. "수작업 보고서 작별! 매일 아침 AI가 데이터를 분석해 요약 리포트를 발송합니다." 영업팀과 마케팅팀이 각자의 시트에 매출·광고 데이터를 채워 넣으면, 담당자는 그 둘을 열어 눈으로 훑고 머릿속으로 흐름을 정리해 보고서를 씁니다. 이 워크플로우는 그 정리 과정을 매일 자동으로 돌립니다.
경제지표 리포트 편과 방향이 비슷해 보이지만 데이터의 출처가 다릅니다. 그 편은 공공데이터포털 API를 매일 호출해 외부 데이터를 가져왔고, 여기서는 API가 아니라 사람이 손으로 채워 넣는 구글시트가 출처입니다. API는 스키마가 고정돼 있지만, 사람이 채우는 시트는 컬럼이 늘거나 날짜 표기가 흔들리기 쉬워서 다루는 문제 자체가 다릅니다. CS 이메일 자동응답 편이 들어오는 메일을 분류해 답장을 만드는 흐름이었다면, 이 편은 반대로 내부 데이터를 밖으로 요약해 내보내는 흐름입니다.
설치나 기본 노드 설명은 n8n으로 반복업무 자동화 포트폴리오 만들기에 정리돼 있으니, 이 글에서는 워크플로우 자체만 다룹니다.
구조 — Trigger / Task / Target
- Trigger — 평일 오전 8시 스케줄
- Task — 매출 시트 읽기 + 마케팅 시트 읽기 → 날짜 기준 병합 → 전체를 아이템 하나로 집계 → AI가 5개 섹션 구조의 HTML 리포트 작성
- Target — Gmail로 리포트 발송
만들기
0. 시트 준비 — 두 탭에 공통 "날짜" 컬럼
같은 문서 안에 sales, marketing 두 시트 탭을 둡니다. 컬럼 구성은 자유롭지만(매출, 판매량, 광고비, ROAS 등), 두 탭 모두 "날짜" 컬럼이 있어야 하고 표기 형식이 일치해야 합니다. 뒤에서 이 컬럼을 기준으로 두 시트를 합치는데, "2026-08-01"과 "8/1"처럼 형식이 다르면 매칭되지 않습니다.
1. Schedule Trigger — 평일 오전 8시
Trigger Interval을 Weeks로, Trigger at Days를 월~금으로, Trigger at Hour를 8로 둡니다. 이 워크플로우는 같은 이름으로 export가 두 개 있는데, 하나는 이 설정 그대로고 다른 하나는 이 노드가 아직 "분" 단위 옵션에 값을 채우지 않은 상태로 남아 있습니다. 실습 때는 위 설정으로 채우고 시작하면 됩니다.
2. Google Sheets 두 개 — 매출과 마케팅을 각각 읽기
Google Sheets 노드 두 개를 Trigger에서 나란히 연결합니다. 둘 다 같은 문서를 가리키되 Operation은 Get Row(s), 시트 이름만 하나는 sales, 하나는 marketing으로 다르게 고릅니다. 두 노드 모두 Trigger에서 동시에 실행되어 각자 다음 Merge 노드의 입력 0번, 입력 1번으로 들어갑니다.
3. Merge — 날짜 기준으로 하나로 합치기
Merge 노드에서 Mode를 Combine으로, Combine By를 Matching Fields로 두고 매칭 필드에 날짜를 넣습니다. 두 입력에서 "날짜" 값이 같은 행끼리 하나의 아이템으로 묶입니다. 매출 시트의 8월 1일 행과 마케팅 시트의 8월 1일 행이 만나 하나가 되는 식입니다. 값이 정확히 일치해야 매칭되므로, 0단계에서 날짜 형식을 맞춰두는 게 중요합니다.
4. Aggregate — 전체를 아이템 하나로
Aggregate 노드에서 Aggregate를 All Item Data로 둡니다. Merge를 통과한 행 전체가 아이템 하나로 뭉쳐지고, 그 안의 data라는 배열 필드에 원래 행들이 그대로 들어갑니다. 다음 AI Agent 노드는 이 배열 하나만 받으면 됩니다.
5. AI Agent — 무엇을 요약할지는 프롬프트가 정합니다
AI Agent 노드의 Prompt를 Define으로 두고, Text에 {{ $json.data.toJsonString() }}을 넣습니다. Merge와 Aggregate를 거쳐 하나로 뭉친 데이터 전체가 가공 없이 문자열 그대로 프롬프트에 들어갑니다. 이 워크플로우가 하는 일은 데이터를 미리 정리하는 게 아니라, 그 데이터로 무엇을 해야 하는지를 System Message로 촘촘히 지시하는 쪽입니다. 원본 시스템 프롬프트를 발췌하면 이렇습니다.
# Role
당신은 비즈니스 성과를 극대화하고 경영진에게 핵심 인사이트를 제공하는 전문 비즈니스 분석가(Business Analyst)입니다.
# Task
제공된 데이터를 분석하여 경영진을 위한 포괄적인 주간 인사이트 보고서를 작성하세요.
# Report Structure & Requirements
보고서는 반드시 다음 5가지 섹션으로 구성하세요:
1. 주요 성과 지표(KPI) 요약
- 총 매출·판매량·전환율·객단가 등 핵심 지표, 전주 대비(WoW) 변화율 포함
2. 트렌드 및 패턴
- 전주 대비 변화, 계절적 추세, 특이한 상승/하락 패턴
3. 최고 성과 요인 (Top Performers)
4. 우려 사항 (Areas of Concern)
- 성과 저조 지표, 잠재적 리스크 및 주의 필요 사항
5. 실행 가능한 제언 (Actionable Recommendations)
- 경영진이 즉시 실행할 수 있는 구체적인 개선 방안 3~5가지
원시 숫자만 보고는 "KPI 요약", "특이사항", "액션 아이템" 같은 구분이 저절로 생기지 않습니다. 이 5개 섹션 구조와 "전주 대비 변화율을 포함하라"는 지시가 그 구분을 만듭니다. 프롬프트 뒷부분에는 출력 형식 지시도 이어집니다. "이메일 뉴스레터용 HTML 형식으로 작성하라"는 요구부터 인라인 CSS, 테이블 기반 레이아웃까지 못박아 둔 덕분에, AI Agent의 출력(output 필드)은 손댈 필요 없이 바로 이메일 본문에 넣을 수 있는 완성된 HTML입니다. Chat Model에는 원하는 LLM 하나를 연결합니다. 활성 상태인 export에는 OpenAI의 gpt-4.1-mini가 붙어 있습니다.
6. Gmail — 완성된 HTML을 그대로 보내기
Send a message 노드의 받는사람에 리포트를 받을 이메일 주소를 넣고(예: [email protected]), 제목에 Daily Sales & Marketing Insights Report - {{ $now.format('yyyy-MM-dd') }}를, 본문에 {{ $json.output }}을 넣습니다. AI Agent가 이미 완성된 HTML을 만들어주므로 본문에 그대로 붙여넣으면 됩니다. 다만 Gmail 노드의 Email Type이 HTML로 돼 있는지는 직접 확인하세요. 원본의 옵션 값은 비워져 있어(기본값 그대로) 실습 환경에 따라 태그가 그대로 노출될 수 있습니다.
원본 export 두 개에 남아 있는 흔적
같은 워크플로우 이름으로 export 파일이 두 개 있습니다. 만든 시각(export의 createdAt)이 앞선 쪽은 지금 이 글이 다룬 평일 오전 8시 스케줄과 OpenAI의 gpt-4.1-mini 모델을 쓰고, Active 상태로 남아 있습니다. 그보다 뒤에 만든 쪽은 스티키 노트가 Trigger·Task1·Task2·Task3·Target 다섯 칸으로 더 자세히 나뉘어 있는데(위 3T 구조를 이 노트에서 그대로 가져왔습니다), Schedule Trigger는 "분" 단위 옵션값이 비어 있고 Chat Model은 OpenRouter의 alibaba/tongyi-deepresearch-30b-a3b로 바뀌어 있으며 Active 상태는 아닙니다. 어느 쪽이 최종본인지는 export만으로 알 수 없지만, 직접 만들 때는 트리거와 모델을 하나로 정해서 시작하면 됩니다.
프롬프트와 트리거 사이에도 눈에 띄는 불일치가 있습니다. 워크플로우 이름과 이메일 제목은 "Daily(매일)"인데, System Message는 "주간 인사이트 보고서"를 요구하고 지표 비교 기준도 "전주 대비(WoW)"로 고정해 두었습니다. 원본 그대로 쓰면 리포트는 매일 08시에 오는데 그 안의 문구와 비교 기준은 일주일 단위 감각으로 쓰여 있는 셈입니다. 직접 만든다면 스케줄을 주 1회로 옮기거나, 프롬프트의 비교 기준을 "전일 대비"로 고쳐서 둘을 맞추는 걸 권합니다.
한계
- 날짜 불일치 시 누락 — Merge가 "날짜" 값이 정확히 같은 행만 묶으므로, 한쪽 시트에만 있는 날짜의 행은 리포트에서 빠질 수 있습니다.
- 트리거와 프롬프트의 주기 불일치 — 위에서 다룬 대로 "매일" 발송인데 프롬프트는 "주간·전주 대비" 기준입니다. 직접 만들 때 반드시 맞춰야 합니다.
- 결측치·오타 그대로 요약 — 데이터를 가공 없이 그대로 넘기기 때문에, 시트에 빈 칸이나 오타가 있으면 AI가 그 상태 그대로 해석해 리포트에 반영합니다.
- 수신자 하나로 고정 — Gmail 노드의 받는사람은 필드 하나입니다. 여러 명에게 보내려면 콤마로 이메일을 나열하거나, 팀 전체가 보는 슬랙 채널로 바꾸는 방법을 고려해야 합니다.
포트폴리오·면접 포인트
이 워크플로우의 뼈대는 "스케줄로 데이터를 모으고 → 하나로 합치고 → 무엇을 뽑을지 프롬프트로 지시하고 → 정기 채널로 보낸다"입니다. 매출·마케팅 대신 재고 현황 시트, 신규 가입자 명단, 서버 에러 로그를 넣어도 같은 구조가 그대로 동작합니다. 발송 채널도 이메일 대신 슬랙으로 바꾸면 됩니다. 포트폴리오에는 자신이 실제로 매일 확인하는 반복 데이터를 골라, 시스템 프롬프트에 어떤 섹션·비교 기준을 넣었는지까지 캡처해두면 좋습니다.
면접에서 "왜 데이터를 정리하지 않고 AI에게 그대로 넘겼나요?"라는 질문이 오면, 정리·계산은 LLM이 프롬프트만으로도 처리할 수 있는 일이고, 실제로 손이 많이 가는 부분은 "어떤 지표를, 어떤 기준으로, 어떤 형식으로" 뽑을지를 지시하는 프롬프트 설계라는 점을 답하면 됩니다. 이 워크플로우에서 발견한 트리거-프롬프트 주기 불일치를 고쳐본 경험을 덧붙이면, 원본을 그대로 베끼지 않고 검토했다는 인상을 줄 수 있습니다.
다음 액션
다음 편에서는 구내식당 식단표 사진을 AI가 분석해 알림을 보내는 워크플로우로 넘어갑니다. 입력이 시트의 숫자에서 사진 한 장으로 바뀌지만, "정기적으로 데이터를 모으고 AI에게 넘겨 사람이 바로 쓸 결과로 만든다"는 뼈대는 이 편과 같습니다.
