케이스 스터디
CASE STUDY — 마케팅

콘텐츠 발행 파이프라인 — 자동화되는 채널과, 안 되는 채널을 구분하는 법

도입 미디어 / 콘텐츠구축 5일
NotionPostgres채널 발행 APIDiscord

한 편의 글을 블로그, 인스타, 뉴스레터에 각각 다시 올렸습니다. 채널마다 형식을 맞추고, 링크를 정리하고, 발행 후 반응을 따로 기록하는 일이 반복됐습니다.

한 번의 승인, 모든 채널

Notion에서 '승인' 상태가 되는 순간 워크플로우가 시작됩니다. 채널별 형식에 맞춰 콘텐츠를 변환·발행하고, 완료를 팀 채널에 알린 뒤, 결과 데이터를 한곳으로 모읍니다.

content-pipeline.workflowLIVE
NTNotion 승인PL채널 분기PB동시 발행DC팀 알림

먼저 짚고 갈 것 — 모든 채널이 자동 발행되지는 않습니다

이 케이스에서 가장 중요한 이야기를 먼저 하겠습니다. 일부 채널은 외부 서비스가 대신 글을 올리는 공개 API를 제공하지 않습니다. 워크플로우를 어떻게 그리든 이 사실은 바뀌지 않습니다. 국내 독자가 가장 먼저 묻는 "네이버 블로그는 되나요?"에 대한 정직한 답은 자동 발행은 안 된다입니다.

  • 자동 발행이 되는 채널 — 자체 블로그(WordPress·Ghost·Webflow 등), 뉴스레터 서비스, 공개 게시 API가 있는 SNS. 이들은 워크플로우가 끝까지 처리합니다.
  • 자동 발행이 안 되는 채널 — 공개 쓰기 API가 없는 플랫폼. 이 워크플로우는 시도조차 하지 않고, 대신 "이 글은 여기에 수동으로 올려주세요"라고 팀 채널에 알립니다.
  • 이 구분을 코드에 명시하는 것이 핵심입니다. 안 되는 채널을 되는 것처럼 그려놓으면, 발행에 실패한 글이 조용히 사라집니다. 소리 없이 누락되는 것이 가장 나쁜 결과입니다.
그래서 Plan Publish Targets 노드 맨 위에 채널 목록이 automated: true | false로 명시돼 있습니다. 여기가 이 워크플로우의 설정 지점입니다. 쓰는 채널만 남기고, 각 채널이 실제로 공개 발행 API를 제공하는지 확인해 표시하세요. 확인 없이 `true`로 두는 것이 이 워크플로우에서 할 수 있는 가장 위험한 일입니다.

승인 게이트는 이미 있습니다 — Notion 상태가 그것입니다

AI가 쓴 초안을 그대로 올리는 것에 대한 거부감은 실제로 존재합니다. *"기계가 알아서 찍어낸 작업물은 서비스 운영자로서 100% 신뢰가 안 간다"*는 반응이 대표적입니다. 이 파이프라인은 그 지점을 우회하지 않습니다.

  • 워크플로우는 `승인` 상태인 글만 가져옵니다. 초안이나 검토중 상태는 아무리 오래 있어도 발행되지 않습니다.
  • 즉, Notion에서 상태를 바꾸는 행위 자체가 승인 게이트입니다. 별도의 승인 시스템을 만들 필요가 없고, 이미 쓰던 도구 안에서 사람이 최종 판단을 합니다.
  • 발행은 '작업'이 아니라 '상태 변경'이 됩니다. 마케터는 만들고 판단하는 일에 집중하고, 옮기는 일만 워크플로우가 합니다.
  • 더 강한 통제가 필요하면 발행 예정 목록을 먼저 팀 채널에 올리고 확인을 받은 뒤 실제 발행하는 2단계로 나눌 수 있습니다.

Notion 데이터베이스 스키마

콘텐츠 DB에 아래 속성이 있어야 합니다. 이름은 바꿔도 되지만, Fetch Approved Posts 노드의 매핑을 함께 바꿔주세요.

title              제목 (텍스트)
status             상태 (선택) — 초안 | 검토중 | 승인 | 발행완료
channels           발행 채널 (다중 선택) — wordpress, newsletter, x, naver_blog ...
publish_at         발행 예정일 (날짜, 선택사항)
og_image           대표 이미지 (파일, 선택사항)
body               본문 (페이지 내용)
channels다중 선택으로 두는 것이 핵심입니다. 글마다 어디에 나갈지가 달라지므로, 워크플로우에 채널을 고정하지 말고 글이 스스로 목적지를 들고 있게 만드세요. 그래야 채널이 늘어나도 워크플로우를 고치지 않습니다.

중복 발행을 어떻게 막나

10분마다 도는 워크플로우에서 가장 위험한 것은 같은 글을 두 번 올리는 것입니다. 발행 기록을 (글, 채널) 단위로 남기는 것으로 해결합니다.

CREATE TABLE IF NOT EXISTS content_publications (
  page_id      text        NOT NULL,
  channel      text        NOT NULL,
  published_at timestamptz NOT NULL DEFAULT now(),
  status       text        NOT NULL DEFAULT 'published',
  PRIMARY KEY (page_id, channel)
);

글 단위가 아니라 (글, 채널) 단위인 것이 중요합니다. 블로그는 성공했는데 뉴스레터가 실패한 경우, 다음 실행에서 뉴스레터만 다시 시도합니다. 글 단위로 기록하면 재시도할 때 블로그에 중복 발행됩니다.

필요한 것

  • n8n — 자체 호스팅 또는 Cloud.
  • Postgres 데이터베이스 하나 — 발행 기록 테이블 하나.
  • Notion(또는 쓰고 계신 콘텐츠 도구) 접근 권한 — 승인 상태의 글을 조회할 수 있어야 합니다. Notion이 아니어도 됩니다. '승인 상태의 글 목록'을 API로 줄 수 있는 도구면 무엇이든 첫 노드만 바꾸면 됩니다.
  • 발행할 채널의 API 자격증명 — 자동 발행하려는 채널 각각. 먼저 각 채널이 공개 발행 API를 제공하는지부터 확인하세요.
  • 팀 알림용 웹훅 URL — Discord 또는 Slack.

수집 지표 — 무엇을, 언제 모으나

"결과 데이터를 모은다"도 구체적이어야 합니다. 이 파이프라인이 남기는 것은 발행 사실이고, 성과 지표는 별도 주기로 수집합니다.

  • 발행 시점에 남기는 것page_id, channel, published_at, 발행된 URL. 이건 워크플로우가 자동으로 기록합니다.
  • 나중에 모으는 것 — 채널별 조회수·반응·유입. 발행 직후에는 0이므로 의미가 없습니다. 발행 후 7일 시점에 한 번 수집하는 별도 워크플로우를 두는 편이 실용적입니다.
  • 유입 추적 — 발행 URL에 UTM 파라미터를 붙이세요. 이걸 안 하면 어느 채널이 트래픽을 만들었는지 나중에 알 수 없습니다. 채널명을 utm_source, 콘텐츠 슬러그를 utm_content로 두는 것이 기본형입니다.
  • 비교 기준 — 절대 조회수보다 채널별 발행 대비 유입 비율이 의사결정에 쓰입니다. 조회수가 큰 채널이 반드시 전환이 좋은 채널은 아닙니다.
⬇︎ 워크플로우 다운로드 (content-pipeline.json)
Postgres 자격증명 하나와 발행 기록 테이블이면 채널 분기·중복 방지·수동 채널 핸드오프가 그대로 돕니다. 콘텐츠 조회 노드와 채널별 발행 노드는 각자 환경에 맞게 채우세요.
검증 범위를 정확히 밝힙니다. 채널 분기 로직은 Node.js에서 6개 시나리오로 실행해 확인했습니다 — 자동 채널과 수동 채널이 섞인 글이 각각 발행 대상과 핸드오프로 분리되는 것, 이미 발행된 채널을 건너뛰고 남은 채널만 재시도하는 것(부분 실패 재실행), 모든 채널이 발행 완료된 글이 아무 작업도 만들지 않는 것, 채널 미지정·알 수 없는 채널·page_id나 제목 누락이 각각 문제로 표시되는 것, 그리고 할 일이 전혀 없을 때 빈 배열을 반환해 알림이 가지 않는 것까지 전부 통과했습니다. 노드 타입·버전은 기존 배포 워크플로우와 동일한 조합입니다. 확인하지 않은 것: 실제 Notion API 연동, 실제 채널 발행, 실제 Discord 게시. 그리고 개별 플랫폼의 공개 API 제공 여부는 수시로 바뀌므로, 워크플로우의 `CHANNELS` 목록은 참고용 초기값일 뿐 착수 전 각 채널의 최신 개발자 문서로 직접 확인하셔야 합니다. 마지막 검증: 2026-08-15.

설정 순서 (30분)

  1. 채널 확인부터 — 발행하려는 채널 각각이 외부에서 글을 올릴 수 있는 공개 API를 제공하는지 개발자 문서로 확인합니다. 이 확인이 이 케이스의 첫 단계입니다.
  2. 테이블 생성 — 위 content_publications SQL을 실행합니다.
  3. Notion DB 정리 — 위 스키마대로 속성을 만들고, channels를 다중 선택으로 둡니다.
  4. Postgres 자격증명 등록 — n8n → Credentials → PostgresTest.
  5. 워크플로우 import — n8n → Workflows → ...Import from File.
  6. 콘텐츠 조회 노드 채우기Fetch Approved Posts 노드에 콘텐츠 DB 조회를 설정하고, 승인 상태로 필터링합니다. 응답을 page_id, title, body, channels[], published_channels[]로 매핑하세요.
  7. CHANNELS 목록 수정Plan Publish Targets 노드 맨 위 목록을 실제 쓰는 채널만 남기고, 1단계 확인 결과대로 automated 값을 정확히 표시합니다.
  8. 발행 노드 채우기 — 자동 채널마다 발행 API를 설정합니다. 채널이 여럿이면 Switch 노드로 분기하세요.
  9. 팀 알림 URL 설정Notify Team 노드에 Discord 또는 Slack 웹훅 URL을 넣습니다.
  10. 수동 채널부터 테스트 — 자동 채널이 없는 글을 하나 승인해 보세요. 발행은 일어나지 않고 "수동 발행 필요" 알림만 떠야 합니다.
  11. 중복 테스트 — 발행이 끝난 글을 그대로 두고 워크플로우를 한 번 더 실행합니다. 아무 일도 일어나지 않아야 합니다. 여기서 두 번 올라가면 발행 기록 매핑이 잘못된 것입니다.
  12. Activate — 10분마다 승인 상태를 확인합니다.

예외 상황이 있으면 어떻게 되나

  • 일부 채널만 실패 — 성공한 채널만 기록되므로, 다음 실행에서 실패한 채널만 재시도합니다. 롤백은 하지 않습니다. 이미 나간 글을 되돌리는 것보다 못 나간 곳에 다시 보내는 편이 안전하기 때문입니다.
  • 공개 API가 없는 채널이 포함된 글 — 자동 채널은 발행되고, 해당 채널은 "수동 발행 필요" 목록에 올라갑니다. 조용히 누락되지 않습니다.
  • 발행 채널이 지정되지 않은 글 — 승인됐는데 channels가 비어 있으면 '확인 필요'로 알립니다. 승인만 하고 채널 선택을 잊는 실수가 실제로 잦습니다.
  • 목록에 없는 채널명 — 오타이거나 새 채널입니다. 발행을 시도하지 않고 '알 수 없는 채널'로 알립니다.
  • 이미지가 없는 글 — 이 워크플로우는 이미지 유무를 강제하지 않습니다. 대표 이미지가 필수인 채널이 있다면 Plan Publish Targets의 검사 항목에 추가하세요.
  • 채널 rate limit — 한 번에 여러 글이 승인되면 짧은 시간에 여러 요청이 나갑니다. 채널이 429를 반환하면 그 건은 기록되지 않으므로 다음 실행에 재시도됩니다. 승인이 몰리는 조직이라면 발행 노드에 지연을 주는 편이 안전합니다.
  • 같은 글을 수정해 다시 발행하고 싶을 때 — 발행 기록이 남아 있어 다시 나가지 않습니다. 의도적으로 재발행하려면 해당 (page_id, channel) 행을 지우세요.
승인 1회
전 채널 발행
0건
중복 발행
명시적
수동 채널 핸드오프
30분
셋업 시간
발행 버튼 하나 누르면 끝이에요. 채널마다 복붙하던 시간이 통째로 사라졌습니다.콘텐츠 매니저

당신의 업무도
여기 들어갈 수 있어요.

가장 반복적인 업무 하나만 알려주세요. 자동화 시나리오를 그려드립니다.