블로그 성과 관리는 단순히 “조회수가 늘었나?”를 보는 일이 아닙니다. 어떤 글이 유입을 만들었는지, 유입이 어떤 행동(구독/문의/구매)으로 이어졌는지, 그리고 우리가 반복해야 할 콘텐츠 패턴이 무엇인지까지 파고드는 과정입니다. 문제는 이 모든 지표가 여기저기 흩어져 있다는 것—네이버/티스토리/워드프레스 자체 통계, 구글 애널리틱스(GA4), 서치 콘솔, 링크트래커, 뉴스레터, CRM… 한 화면에서 종합적으로 보지 않으면 방향을 잃기 쉽습니다. 이때 구글 시트는 가장 가벼운 콘텐츠 운영 시스템이 됩니다. 원천 데이터를 표준화해 담고(포스트/날짜/채널/세션/전환), QUERY/SUMIFS로 주·월 집계를 자동화하며, 슬라이서·차트로 회의용 대시보드를 구성하면 됩니다. 여기에 Apps Script와 폼까지 얹으면 작성/발행/홍보/성과를 하나의 루프로 묶어, 매주 “써야 할 글, 꺼야 할 글, 고쳐야 할 글”을 명확하게 보여줄 수 있습니다.
이 글은 처음부터 끝까지 따라 할 수 있도록 ① 설계: 지표·표준·입력 구조 → ② 자동화: 수집·스냅숏·알림 → ③ 분석/대시보드: 퍼널·주간 보고·리라이트 우선순위 순서로 구성했습니다. 복붙 가능한 수식과 템플릿 패턴, 팀 규칙 예시를 풍성하게 담았고, 실제 운영에서 자주 생기는 함정(텍스트 날짜, 채널 라벨 분산, 중복 UTM)의 해결책까지 정리했습니다. 목표는 단 하나, 링크 한 장으로 매주 콘텐츠 의사결정을 끝내는 것입니다.
1) 설계: 지표 정의·표준 라벨·입력 구조로 ‘한 번 입력, 여러 번 활용’
성과 기록은 설계에서 80%가 결정됩니다. 같은 데이터를 넣어도 열 구조, 라벨, 형식이 제각각이면 요약도, 비교도, 자동화도 불가능해집니다. 먼저 무엇을 기록할지, 어떤 표로 정리할 지부터 정리해 봅시다.
① 핵심 지표 정의(콘텐츠 퍼널 중심)
- 노출/클릭: 검색 노출수, 클릭수(서치 콘솔), SNS 클릭(링크트래커/UTM).
- 세션/사용자: GA4 기본. 랜딩 페이지 기준으로 기사별 유입을 봅니다.
- 참여: 평균 체류, 스크롤 깊이(가능하면), 이탈률.
- 전환: 구독, 문의, 다운로드, 회원가입 등 이벤트 수.
- 수익/가치: 광고 RPM, 리드 가치(가중치), 판매액(있다면).
원칙: 포스트(콘텐츠)를 기준 엔티티로 두고, 날짜/채널/소스/캠페인(UTM)을 차원, 노출/클릭/세션/전환/수익을 지표로 분리합니다.
② 탭 구조(역할 분리)
- Posts: 포스트 마스터(슬러그, 제목, 카테고리, 발행일, 상태, 담당, 목표 키워드).
- Logs: 일별 성과 로그(날짜, 포스트 ID, 채널, 소스/미디엄, 세션, 전환, 클릭, 노출, 수익).
- Codes: 코드표(채널/소스/미디엄/카테고리/상태/담당자 등 드롭다운 목록).
- Model: 가공/파생열(월, 주, 퍼널 전환율, TOP-N 플래그).
- Dashboard: KPI 카드, 추세/비중/랭킹 차트, TO-DO 리스트.
③ 포스트 마스터(Posts) 설계
- 열 예시: PostID(고유), URL, Slug, Title, Category, Author, PublishDate, TargetKW, Status(초안/발행/리라이트), Notes.
- Slug 자동 추출(워드프레스 등 URL에서):
=ARRAYFORMULA(IF(B2:B="", "", REGEXEXTRACT(B2:B, "https?://[^/]+/(.+)")))
- Status는 드롭다운 칩(코드표 연결)으로 표준화.
④ 성과 로그(Logs) 설계
- 열 예시: Date(YYYY-MM-DD), PostID, Channel(Organic/SNS/Ads/Newsletter 등), Source, Medium, Sessions, Users, Conversions, Clicks, Impressions, Revenue.
- 날짜는 반드시 날짜 형식으로. 텍스트 날짜 금지.
- 채널/소스/미디엄은 코드표로 드롭다운, 오타를 봉쇄합니다.
⑤ 파생열로 집계에 유리한 표 만들기
=ARRAYFORMULA(IF(ROW(Logs!A:A)=1,"Month", IF(Logs!A:A="",,TEXT(Logs!A:A,"yyyy-mm"))))
=ARRAYFORMULA(IF(ROW(Logs!A:A)=1,"Week", IF(Logs!A:A="",,WEEKNUM(Logs!A:A))))
=ARRAYFORMULA(IF(ROW(Logs!A:A)=1,"ConvRate", IF(Logs!F:F+Logs!G:G=0,, Logs!H:H / Logs!F:F )))
위처럼 월/주/전환율(예시)을 Model 탭에서 자동 계산해 두면 QUERY/피벗이 간단해집니다.
⑥ UTM 표준(채널 분류 규칙)
- utm_source / utm_medium / utm_campaign / utm_content를 미리 표준화하고, 채널 매핑 테이블을 둡니다.
- 예: medium=organic → Channel=Organic, medium=cpc → Ads, source=newsletter → Newsletter 등.
- 시트에서
VLOOKUP
또는XLOOKUP
으로 Source/Medium→Channel을 자동 변환.
⑦ 데이터 유효성·조건부 서식으로 품질 확보
- 유효성: 채널/소스/미디엄/상태/카테고리 드롭다운(코드표 참조), 숫자만 허용 열 지정.
- 조건부 서식 예:
- ConvRate >= 3% → 초록, < 1% → 주황.
- Impressions=0 또는 Sessions=0 → 연노랑 배경(데이터 누락 경고).
⑧ 기본 집계 수식(보고서 뼈대)
- 월 ×채널 집계:
=QUERY(Logs!A:K, "select TEXT(A,'yyyy-mm'), C, sum(F), sum(H) group by TEXT(A,'yyyy-mm'), C order by TEXT(A,'yyyy-mm')", 0)
- 포스트 Top 20(이번 달 세션 기준):
=QUERY(Logs!A:K, "select B, sum(F) where A >= date '"&TEXT(EOMONTH(TODAY(),-1)+1,"yyyy-mm-dd")&"' group by B order by sum(F) desc limit 20", 0)
- 포스트별 전환율:
=QUERY(Logs!A:K, "select B, sum(F), sum(H), sum(H)/sum(F) group by B order by sum(H)/sum(F) desc", 0)
⑨ 설계 체크리스트
- PostID는 고유한가? URL/Slug와 1:1로 매칭되는가?
- 날짜/숫자 형식을 통일했는가? 텍스트 숫자/날짜는 없는가?
- 채널/소스/미디엄 라벨은 코드표로 표준화했는가?
- 월/주/전환율 등 파생열을 자동화했는가?
2) 자동화: 수집 루틴·스냅숏·알림(리라이트/이상치)로 매주 보고를 ‘원클릭’
설계가 끝났다면, 이제 반복을 줄이는 자동화를 얹을 차례입니다. 데이터 수집 루틴을 가볍게 만들고, 주/월 스냅숏을 찍어 “어제 데이터가 변해도 어제의 보고서는 그대로” 남도록 하며, 성과 급등/급락, 리라이트 후보를 자동으로 표시해 주세요.
① 수집 루틴(3가지 경로)
- 수동 CSV 임포트: GA4(탐색/보고서)와 서치콘솔에서 CSV로 내보낸 뒤, Logs에 붙여 넣기. 간단하지만 일관된 헤더가 중요합니다.
- Looker Studio 커넥터 + 스프레드시트 추출: 주기적으로 추출표를 덤프해 Logs로 붙이는 방식.
- Apps Script: 서치 콘솔 API/GA4 API를 사용할 수 있으나, 초보라면 CSV→붙여 넣기부터 안정적으로 운영하는 것을 권장합니다.
② ARRAYFORMULA/QUERY로 자동 집계
- 앞서 만든 파생열과 QUERY 표는 데이터가 추가될 때 자동 확장됩니다.
- 보고서용 표는 Model에 만들고, 대시보드 차트는 이 표를 바라보게 연결합니다.
③ Apps Script로 주간 스냅숏(백업) 저장
function snapshotWeekly() {
const ss = SpreadsheetApp.getActive();
const dash = ss.getSheetByName('Dashboard');
const snap = ss.getSheetByName('Snapshot') || ss.insertSheet('Snapshot');
const week = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'YYYY-"W"ww');
const kpi = dash.getRange('B2:B6').getValues().flat(); // KPI 카드 5개 예시
snap.appendRow([week].concat(kpi).concat(new Date()));
}
주/월이 바뀌더라도 스냅숏이 있으면 “그때의 화면”을 손쉽게 재현할 수 있습니다.
④ 급등/급락·이상치 감지(간단 규칙)
- 전주 대비 세션 증가율:
(일간 데이터 기준, -7일 비교. 주간 집계면 -1주 비교)=ARRAYFORMULA(IF(A2:A="",, (F2:F - OFFSET(F2:F,-7,0)) / OFFSET(F2:F,-7,0) ))
- 이상치 플래그(평균±표준편차):
=ARRAYFORMULA(IF(A2:A="",, IF(F2:F > AVERAGE(F:F)+2*STDEV(F:F),"상승이상", IF(F2:F < AVERAGE(F:F)-2*STDEV(F:F),"하락이상",""))))
- 조건부 서식으로 “상승이상” 파랑, “하락이상” 주황 표시.
⑤ 리라이트 후보 자동 선별
- 규칙 예: 발행일 90일 경과 & 검색 노출은 유지 & 클릭률(CTR) 하락 & 세션↓.
- 서치 콘솔 CTR/노출/클릭을 Logs에 합산해 두고,
=IF(AND(조건들), "리라이트", "")
플래그 열을 만듭니다. - 대시보드에 “리라이트 큐” 리스트를 표로 고정합니다.
⑥ 알림(이메일) — 요약/경보
function mailWeeklyDigest() {
const ss = SpreadsheetApp.getActive();
const model = ss.getSheetByName('Model');
const top = model.getRange('A1:D11').getDisplayValues(); // 예: Top10 표
let html = '<h3>주간 블로그 요약</h3><table border=1 cellspacing=0 cellpadding=6>';
top.forEach(r => html += `<tr><td>${r.join('</td><td>')}</td></tr>`);
html += '</table>';
GmailApp.sendEmail(Session.getActiveUser().getEmail(), '[블로그] 주간 요약', 'HTML 보기 필요', {htmlBody: html});
}
트리거(시간 기반)를 주 1회 설정해 자동 발송되게 하면 회의 준비가 크게 줄어듭니다.
⑦ 수집/자동화 체크리스트
- 헤더는 항상 동일한가(붙여 넣기 실패 방지)?
- 날짜/숫자 형식 깨짐은 없는가? 텍스트 숫자 처리?
- 스냅숏이 주/월 단위로 쌓이고 있는가?
- 리라이트/이상치 플래그가 정상 동작하는가?
3) 분석·대시보드: 퍼널·랭킹·비중·성장·TO-DO로 ‘바로 결정되는’ 화면 만들기
대시보드는 “숫자 모음”이 아니라 “결정의 트리거”여야 합니다. 상단에 KPI, 가운데에 추세/비중, 우측에 랭킹/TO-DO를 배치해 5분 안에 결정을 끝내는 구성을 추천합니다.
① 상단 KPI(3~6개)
- 이번 달: 세션, 전환, 전환율, 신규 포스트 수, 검색 클릭수, 상위 3 채널 비중.
- 전월 대비 증감(화살표/색상)으로 상태를 직관적으로 표시합니다.
② 퍼널(노출→클릭→세션→전환) 시각화
- 서치 콘솔 노출/클릭 + GA4 세션 + 이벤트 전환을 하나의 표로 묶고, 콤보(막대+선) 또는 퍼널 차트로 전환율을 드러냅니다.
- 포스트 그룹(카테고리/토픽 클러스터) 별 퍼널도 추가하면 “어떤 주제가 효율적인지” 보입니다.
③ 채널/소스 비중(도넛/누적 막대)
- 이번 달 세션/전환 기준으로 채널 비중을 도넛으로 표시.
- 지난 6개월 채널 추세는 누적 막대로. 광고 의존도가 과도하면 색으로 경고.
④ 포스트 랭킹(Top/Drop/Rise)
- Top 10: 세션/전환 기준 상위. 타이틀·카테고리·발행일·전환율 표시.
- Rising: 전주 대비 세션 +50% 이상.
- Dropping: 전주 대비 세션 -30% 이하(리라이트 후보).
표는 QUERY
와 SORT
조합으로 자동 생성하고, 조건부 서식으로 상승/하락을 색으로 표시합니다.
⑤ 키워드/검색 쿼리 요약
- 가능하면 쿼리-포스트 매핑 표를 만들어, 포스트별 상위 쿼리 5개와 CTR을 표시합니다.
- CTR 하락/노출 증가 조합은 타이틀/디스크립션 개선 TO-DO로 연결.
⑥ TO-DO 자동 생성(조건 기반)
- 규칙 예시:
- 발행 90일↑ & CTR 하락 & 세션 하락 → 리라이트
- Rising 2주 연속 & 전환율 높음 → 확장 포스트(시리즈)
- 광고 비중 60%↑ & 전환 낮음 → 유기 채널 강화
- TO-DO 표는
=FILTER
로 조건을 만족하는 포스트만 추출, 담당자 칩(@사람)과 마감일을 붙여 운영합니다.
⑦ 회의용 레이아웃 추천
- 상단: KPI 카드 4~6개.
- 좌측: 6개월 세션/전환 추세(선/영역).
- 우측: 채널 비중(도넛), 퍼널(막대+선).
- 하단 좌: Top/Rising/Dropping 표.
- 하단 우: TO-DO(리라이트 큐).
⑧ 함수/표 레시피 모음
- 지난달 대비 증감률:
=IFERROR((이번달 - 지난달) / 지난달, )
- 포스트별 최근 30일 전환율:
=QUERY(Logs!A:K, "select B, sum(H)/sum(F) where A > date '"&TEXT(TODAY()-30,"yyyy-mm-dd")&"' group by B order by sum(H)/sum(F) desc", 0)
- 카테고리별 퍼널(피벗):
=QUERY(Logs!A:K, "select D, sum(J), sum(I), sum(F), sum(H) group by D label sum(J) 'Impr', sum(I) 'Clicks', sum(F) 'Sessions', sum(H) 'Conv'", 0)
⑨ 팀 규칙(운영 표준)
- Logs는 원천 — 수치 직접 수정 금지(정정은 정정행으로).
- 코드표 표준 — 채널/소스/미디엄/카테고리는 드롭다운만.
- 대시보드 보호 — 보기 전용 공유 + 시트/범위 보호.
- 주간 스냅숏 — 월요일 오전 자동 저장.
- TO-DO는 @담당 + 마감 — 댓글/작업으로 추적.
결론: ‘한 장 짜리 시트’로 콘텐츠 의사결정을 빠르게
블로그는 “발행이 목표”가 아닙니다. 의도한 독자를 움직이는가가 목표입니다. 그 판단을 빠르게 해주는 도구가 바로 구글 시트입니다. 이 글에서 정리한 대로 Posts-Logs-Codes-Model-Dashboard로 역할을 분리하고, 날짜/라벨/지표 형식을 표준화하면 어떤 채널에서 가져온 데이터라도 곧바로 합쳐지고 비교됩니다. ARRAYFORMULA/QUERY로 집계를 자동화하고, 주간 스냅숏과 메일 요약, 리라이트/이상치 플래그를 얹으면 매주 회의가 “느낌”이 아니라 데이터에 근거한 액션으로 채워집니다.
오늘은 포스트 마스터를 만들고, Logs에 지난 4주의 핵심 지표(세션/전환/노출/클릭)를 붙여 보세요. 내일은 Model에서 월/주/전환율 파생열을 구성하고, Dashboard에 KPI/추세/랭킹/TO-DO를 배치하세요. 모레는 스냅숏과 주간 요약 메일 트리거를 켭니다. 불과 며칠이면 “무엇을 더 쓰고, 무엇을 고치고, 무엇을 멈출지”가 분명해질 것입니다. 마지막으로 이 원칙을 잊지 마세요. 원천은 사실, 모델은 계산, 대시보드는 결론. 이 질서만 지키면 구글 시트는 가장 가벼운 콘텐츠 운영 시스템이 됩니다.