본문으로 건너뛰기
취준생을 위한 n8n 실전 워크플로우 레시피 · 37/44시리즈 보기 →

페이스북 광고 효율, AI가 매일 분석해서 알려주는 n8n 워크플로우 — 시리즈의 마지막 레시피

· 약 9분
Datapopcorn CEO / AI automation educator
이 글과 연결된 글 보기
7편 · 20개 연결
100%
n8n Data Table 처음 써보기 — 트렌드 3개를 합쳐 매일 아침 분석 주제 뽑는 워크플로우페이스북 광고 효율, AI가 매일 분석해서 알려주는 n8n 워크플로우 — 시리즈의 마지막 레시피n8n으로 정적 웹서버 운영하기 — 수료증 발급부터 진위 확인까지, 멱등 처리로 안전하게벡터DB 없이 실시간으로 사이트를 읽는 챗봇 — 경복대학교 안내 챗봇 해부n8n으로 반복업무 자동화 포트폴리오 만들기구글시트에 쌓인 데이터를 인스타그램 카드뉴스로 — n8n 시트 인스타그램 자동발행서브워크플로우를 Tool로 감싸 AI Agent에게 서버 점검시키기 — 그리고 시스템 프롬프트만으로는 부족한 이유

드래그로 이동 · 휠/두 손가락으로 확대 · 방향키로 글 선택 · 0으로 맞춤. 실선: 본문 링크, 점선: 시리즈·주제의 대표 연결.

표시된 글 7편 목록
전체 글 연결 탐색

구글시트에 페이스북 광고비 지출 데이터가 있다면, n8n으로 매일 이 데이터를 읽어 AI Agent에게 세그먼트별 성과를 분석시키고 결과를 시트와 슬랙으로 자동 정리할 수 있습니다. 어떤 연령대·디바이스·크리에이티브 조합이 효율적이고 어디에 예산을 옮겨야 하는지까지, 사람이 표를 눈으로 비교하는 대신 AI가 구조화된 답으로 뽑아줍니다.

이 워크플로우 하나로 보여줄 수 있는 것​

이 편은 시리즈의 마지막 워크플로우이자 "숫자 데이터를 AI에게 분석시켜 판단까지 맡긴다"는 패턴의 완성판입니다. 구글시트 AI 리포트 편에서 매출 데이터를 분석시켰던 것과 뼈대가 같고, 결과를 이미지로 바꿔 전달한다는 점은 제품 영상 생성 편의 "데이터를 다른 매체로 바꾸는" 감각과도 이어집니다. 이 워크플로우 하나로 보여줄 수 있는 역량은 세 가지입니다.

  • AI 구조화 분석 — 자유 텍스트가 아니라 정해진 JSON 스키마로 "고성과/저성과 세그먼트, 인사이트, 추천 액션"을 받아내는 경험
  • 외부 API 체이닝 — AI가 만든 결과를 다른 API(quickchart.io)에 넘겨 이미지로 바꾸는, API 여러 개를 이어 붙이는 경험
  • 원본 캔버스 읽는 눈 — 계획과 실제 구현이 어긋난 지점, 연결되지 않은 채 남은 노드가 유난히 많은 편입니다. connections까지 확인하는 습관을 여기서 연습할 수 있습니다

배경 — 광고 리포트를 매일 눈으로 비교하는 일​

광고를 운영하다 보면 연령대·디바이스·크리에이티브 조합마다 성과가 다르고, 그 차이를 매일 표로 확인해 예산을 옮길지 말지 판단해야 합니다. 캔버스 맨 위 스티키 노트에는 이 워크플로우의 최초 설계가 적혀 있는데, 원래 계획은 IF Node: 효율 조건 필터링 (예: CTR > 3%, CPC < 500)으로 조건에 맞는 캠페인만 걸러내고 Sort / Limit으로 TOP 5를 뽑는, 규칙 기반 구조였습니다.

실제로 만들어진 워크플로우는 이 계획과 다릅니다. 규칙으로 거르는 대신 AI Agent에게 표 전체를 넘기고 "어떤 조합이 좋고 나쁜지, 예산을 어디로 옮길지"까지 판단하게 했습니다. 임계값을 사람이 미리 정해야 하는 규칙 필터와 달리, AI Agent는 데이터를 보고 스스로 기준을 찾아냅니다. 이 워크플로우는 데이터팝콘이 패스트캠퍼스 강의용으로 만들어 둔 것이고, 설치와 기본 노드 설명은 n8n으로 반복업무 자동화 포트폴리오 만들기에 있으니 이 글에서는 워크플로우 자체만 다룹니다.

구조 — Trigger / Task / Target​

  • Trigger — 스케줄 트리거(주기는 캔버스에 명시된 값 없이 기본값으로 남아 있습니다)
  • Task — 시트 읽기 → 지표 계산 → 날짜·조건으로 좁히기 → 세그먼트별 평균 집계 → AI Agent 분석
  • Target — 구글시트 세 개(Performance, Insight, Recommendation)에 나눠 적재, 슬랙에 요약 전송

캔버스에는 이 흐름과 별개로 Facebook Trigger, Facebook Lead Ads Trigger, Facebook Graph API 노드가 떠 있습니다. 이름 그대로 페이스북에서 직접 데이터를 받아오는 자리인데, connections를 보면 셋 다 본 흐름에 연결돼 있지 않습니다. 지금 도는 데이터 소스는 미리 만들어 둔 구글시트이고, 이 세 노드는 실시간 연동을 붙일 자리를 그려둔 스케치에 가깝습니다.

만들기​

1. 데이터 소스 — 페이스북 광고 데이터를 직접 받으려면​

이 워크플로우처럼 시트에 미리 옮겨둔 데이터로 시작해도 되지만, 페이스북에서 직접 가져오려면 몇 단계가 더 필요합니다. Meta for Developers에서 앱 유형을 Business로 만들고, n8n 공식 문서에 따라 Facebook Graph API credential에 액세스 토큰을 연결합니다. 광고 성과(ads_read) 권한을 운영 규모로 쓰려면 Meta 심사가 필요한데, Meta 공식 안내에 따르면 2026년 5월부터 기준이 최근 15일 500회 호출·오류율 15% 미만으로 완화됐습니다(2026년 8월 기준). 심사가 부담스럽다면 이 워크플로우처럼 광고 관리자에서 내려받은 리포트를 시트에 붙여넣는 방식으로 먼저 만들고, 나중에 이 자리를 Facebook Graph API 노드로 바꾸는 순서를 권합니다.

2. Schedule Trigger → Google Sheets — 데이터 읽기​

Schedule Trigger 뒤에 Google Sheets 노드를 두고 Operation 없이(기본값인 읽기 동작으로) 광고비 지출 시트를 읽습니다. 시트에는 날짜, 제품, 오디언스 유형, 크리에이티브 형태, 디바이스, 연령대와 함께 spends(광고비), impressions(노출), clicks(클릭) 같은 원시 지표가 들어 있습니다.

3. Code — CTR·CPC·CPM 계산​

Code 노드가 원시 지표로 세 효율 지표를 계산합니다.

return items.map(item => {
const clicks = item.json['clicks'];
const impressions = item.json['impressions'];
const cost = item.json['spends'];
item.json['CTR'] = (clicks / impressions) * 100 || 0;
item.json['CPC'] = (cost / clicks) || 0;
item.json['CPM'] = (cost / (impressions / 1000)) || 0;
return item;
});

분모가 0이면 결과가 NaN이 되는데, 뒤에 || 0을 붙여 0으로 떨어지게 방어했습니다. 클릭 없는 캠페인이 섞여 있어도 워크플로우가 멈추지 않는 이유입니다.

4. Filter, Summarize, Aggregate — 세그먼트별로 정리해서 한 덩어리로​

Filter 노드는 Date가 특정 날짜와 같은 행만 남기고, Summarize 노드는 날짜·연령대·디바이스로 묶어 spends, CTR, CPC, CPM의 평균을 냅니다. Aggregate 노드(Aggregate All Item Data)는 이 결과 전체를 아이템 하나의 data 필드로 합칩니다. 표 전체가 한 아이템에 담겨야 다음 AI Agent가 캠페인 전체를 한 번에 비교할 수 있고, 그래서 AI Agent의 입력이 {{ $json.data }}입니다.

5. AI Agent + Structured Output Parser — 세그먼트 분석시키기​

AI Agent(OpenAI gpt-4o-mini 연결)의 시스템 프롬프트는 마케팅 분석가 역할과 지표 정의를 길게 설명한 뒤, 마지막에 실제로 시킬 일을 다섯 줄로 못 박습니다.

1. 각 타겟 조합(연령대, 디바이스, 오디언스, 크리에이티브 형태) 별로 CTR, CPC, CVR을 계산하십시오.
2. 전체 데이터에서 상위 성과 세그먼트를 기준으로 효율적인 광고 타겟 세그먼트를 제안하십시오.
3. 타겟별 성과 차이를 비교분석하여, 어떤 조합이 가장 높은 전환율을 보였는지 명확히 기술하십시오.
4. 저성과 세그먼트는 어떤 특징이 있는지 식별하고, 제거 또는 개선 제안을 작성하십시오.
5. 향후 어떤 타겟 세그먼트에 예산을 집중할지 전략을 도출하십시오.

이 지시가 자유 문장으로만 끝나면 다음 노드가 결과를 시트 컬럼에 나눠 넣을 수 없습니다. 그래서 Structured Output Parser가 출력 형식을 강제합니다. 스키마를 줄이면 이런 모양입니다.

{
"high_performance_segments": [{ "age": "string", "device": "string", "CTR": "float", "CPC": "float" }],
"low_performance_segments": [{ "age": "string", "device": "string", "CTR": "float", "CPC": "float" }],
"insights": [{ "summary": "string", "evidence": "string" }],
"recommendations": {
"budget_focus_segments": [{ "age": "string", "device": "string" }],
"segments_to_pause_or_optimize": [{ "age": "string", "reason": "string" }]
}
}

네 갈래로 나뉜 이 구조가 다음 단계에서 그대로 시트 컬럼과 슬랙 메시지의 뼈대가 됩니다.

6. SplitOut → 시트 3개와 슬랙​

네 개의 SplitOut 노드가 AI Agent 출력을 각 배열로 풀어냅니다. 고성과·저성과 세그먼트는 Performance 시트 하나에 함께 쌓이고, insights는 Insight 시트로, recommendations는 Recommendation 시트로 각각 append됩니다. AI Agent 출력은 이와 별개로 슬랙 노드에도 바로 연결됩니다.

7. 보너스 — 챗봇이 스스로 차트를 그리게 만들기​

같은 캔버스에 별도의 챗봇 흐름이 하나 더 있습니다. 채팅으로 질문받는 AI Agent2에 "차트를 생성해줘"라고 부탁하면, generate_a_chart라는 도구가 같은 워크플로우를 스스로 다시 실행합니다(Execute Workflow Trigger로 자기 자신을 호출하는 서브워크플로우 패턴입니다). 이 재실행 경로에서 OpenAI에 "이 요청에 맞는 Chart.js 정의를 JSON으로 만들어달라"고 구조화 출력으로 요청하고, 결과를 quickchart.io의 /chart/create 엔드포인트에 그대로 넘깁니다.

POST https://quickchart.io/chart/create
Body: { "chart": { "type": "bar", "data": { ... } } }
Response: { "success": true, "url": "https://quickchart.io/chart/render/..." }

응답으로 받은 url이 렌더링된 차트 이미지 주소입니다. 이 시리즈에서 quickchart.io를 쓰는 건 포켓몬 데이터 분석 편에 이어 두 번째인데, 그 편은 차트 스펙을 직접 코드로 짜서 GET 방식 URL에 실었다면 이 편은 스펙 자체를 AI에게 만들게 하고 POST 방식 /chart/create로 넘긴다는 점이 다릅니다. 공식 문서에 이 요청·응답 형식이 나와 있고, 무료 티어는 공식 가격 페이지 기준 월 1,000장까지입니다(2026년 8월 기준). 다만 이 챗봇 도구는 매일 도는 본 흐름과는 연결돼 있지 않아, 광고 분석 결과에 차트를 붙이려면 AI Agent 출력을 이 도구의 입력으로 이어주는 작업이 따로 필요합니다.

원본 캔버스에 남아 있는 흔적​

이 편은 계획과 결과물 사이의 간극이 유난히 잘 보이는 캔버스입니다. 최초 스티키 노트의 설계에는 Sort / Limit: TOP 5 캠페인 추출과 Slack / Gmail: 자동 요약 전송이 적혀 있지만, 실제로는 순위 추출 없이 AI Agent가 전체를 판단하고 저장 대상도 시트 세 개로 늘었습니다.

슬랙 메시지도 짚어둘 부분이 있습니다. 요약 리포트를 보내는 슬랙 노드의 Block Kit 내용을 열어보면, 텍스트가 AI Agent의 실제 출력을 참조하는 표현식이 아니라 "55-64세 + Carousel 조합은 CTR 12.5%…" 같은 문구가 값으로 그대로 박혀 있습니다. Block Kit 형식을 미리 보여주려고 넣어둔 예시 값이라, 지금 상태로 실행하면 광고 데이터가 어떻게 바뀌든 슬랙에는 항상 같은 문구가 갑니다. 직접 만든다면 이 부분을 AI Agent의 구조화 출력 필드로 바꿔 끼우는 작업이 꼭 필요합니다.

챗봇 흐름의 제목도 흔적을 남기고 있습니다. 채팅 트리거의 초기 인사말 노드에는 "패스트캠퍼스 데이터 챗봇"이라는 이름이 붙어 있어, 강의용으로 만든 데이터 질의응답 챗봇을 같은 광고비 시트에 재활용한 것으로 보입니다. 시트 조회 도구, 메모리, 차트 생성 도구가 함께 붙어 "질문하면 답하고, 필요하면 차트도 그려주는" 별도의 작은 에이전트로 동작합니다.

한계​

  • 날짜 필터가 고정값 — Filter 노드가 특정 날짜와 정확히 같은 행만 통과시킵니다. 샘플 데이터에 맞춘 값이라, 매일 새 데이터가 쌓이는 시트에 그대로 쓰면 그날이 지나는 순간 조건에 맞는 행이 없어 워크플로우가 조용히 끝납니다. 어제 날짜를 동적으로 계산하는 표현식으로 바꿔야 합니다.
  • 슬랙 알림이 고정 문구 — 지금 상태로는 AI 분석 결과와 무관하게 같은 메시지가 갑니다.
  • 실시간 페이스북 연동 미완성 — Facebook Graph API 노드는 캔버스에 있지만 연결돼 있지 않아, 매일 시트에 데이터를 직접 채워 넣어야 합니다.
  • 누적만 하고 정리는 없음 — 세 시트 모두 append만 해서, 오래 돌리면 과거 분석 결과가 계속 쌓이기만 합니다.

포트폴리오·면접 포인트​

포트폴리오에는 이 워크플로우를 페이스북 광고가 아닌 다른 숫자 데이터(구글 애즈 리포트, 자사 몰 매출 등)에 붙여본 버전을 넣는 게 좋습니다. Structured Output Parser로 "고성과/저성과/추천" 스키마를 강제하는 구조 자체는 광고 데이터가 아니어도 그대로 재사용됩니다.

면접에서 "왜 규칙 기반 필터 대신 AI Agent로 바꿨나요?"라는 질문에는, 규칙 필터는 임계값을 사람이 미리 정해야 하지만 AI Agent는 데이터 분포를 보고 스스로 좋고 나쁜 세그먼트를 구분해낸다는 점, 그 판단을 Structured Output Parser로 강제된 스키마에 담아야 다음 노드가 안정적으로 처리한다는 점을 답하면 됩니다. 여기에 슬랙 메시지가 고정 문구로 남아 있던 걸 발견해 고친 이야기까지 덧붙이면, 베낀 게 아니라 뜯어보고 고쳤다는 인상을 줍니다.

다음 액션​

여기까지가 이 시리즈의 마지막 워크플로우입니다. 37편을 지나오며 다룬 패턴은 크게 네 갈래였습니다. 조건에 맞으면 알려주는 알림, API·스크래핑으로 데이터를 모으는 수집, OCR·요약·분류에 AI를 붙이는 AI 활용, 도구를 스스로 호출하는 에이전트. 이 편은 그 네 갈래가 한 캔버스 안에 다 들어 있는 편입니다.

어디서부터 시작할지 막막하다면 순서대로 읽을 필요는 없습니다. n8n으로 반복업무 자동화 포트폴리오 만들기로 돌아가 설치와 기본 노드를 먼저 확인한 다음, 지금 자신의 반복 업무와 가장 가까운 패턴을 골라 그 편부터 따라 만들어보시길 권합니다.