📝 이 글은 해당 세션 전에 사전 준비 & 프리모템(premortem)을 하면서 작성되었습니다.
본 글은 3편 시리즈의 2편입니다. 1편: 클로드 코드 + 에어브릿지 MCP × API 자동화 청사진 · 3편: 통합 안 된 매체 비용도 에어브릿지 대시보드에
TL;DR
- 블로그 글 1편을 발행하고 나면, 콘텐츠 마케터는 보통 카카오톡 공유용 링크 1개, 메일 뉴스레터용 링크 1개, SMS 캠페인용 링크 1개, 인스타그램 바이오용 링크 1개, 페이스북 공유용 링크 1개, 그리고 OG 이미지 1장을 만들기 위해 30분에서 2시간을 씁니다.
- 이 수작업 반복을
(클로드 코드 에이전트) → (GPT image-2 OG 생성) → (에어브릿지 REST API 트래킹 링크 N개 발급) → (에어브릿지 MCP 검증) → (슬랙 보고)순으로 묶으면 30분이 30초로 줄어듭니다. - 핵심은 에어브릿지 MCP만으로는 트래킹 링크 발급이 안 된다는 점. 발급은 에어브릿지 REST API의 일이고, 검증은 에어브릿지 MCP의 일입니다. 둘은 다른 책임을 가집니다.
- 네이밍 컨벤션, 오탈자, 트래킹 누락 점검도 같은 에이전트가 사전 검증합니다. 마케터는 최종 발행 승인만 누릅니다 — 1편에서 다룬 Human-in-the-Loop 디자인 원칙을 그대로 적용합니다.
📤 이 글 한 번에 공유하기 — 클로드 코드 + 에어브릿지 REST API + GPT image로 즉석 발급한 트래킹 링크입니다. 채널blog_share, 캠페인claude-code-og-image-airbridge-tracking-link-blog-automation_202604_blog_share, OG 이미지는 GPT Image 2 (high, 1536×1024). 클릭은 에어브릿지 actuals 리포트에 그대로 집계됩니다.

1. 고질병을 다시 본다
저희 팀이 1편에서 정리한 8개 고질병 중, 콘텐츠 마케터가 매주 가장 많이 부딪히는 조합은 다음 셋입니다.
- 고질병 1 — 리포트 빌드·해석·공유의 일부분: "이 글이 어디서 가장 많이 읽혔는지" 측정하려면 채널별 링크가 분리돼야 함.
- 고질병 2 — 광고 매체 비교: "채널별 ROAS 측정"의 전제는 캠페인이 정확하게 분리돼 있어야 함.
- 고질병 8 — 네이밍 컨벤션 정합성 검수: 링크 수십 개 만들다 보면 오탈자, 트래킹 누락, 컨벤션 위반이 필연.
세 고질병의 공통 뿌리는 "링크 1개 만드는 데 컨벤션 + 오탈자 + 어트리뷰션 + OG 메타 + 호스팅을 동시에 챙겨야 한다" 입니다. 사람은 멀티태스킹을 못합니다. 그러나 LLM 에이전트는 합니다.
2. 자동화 흐름 한눈에

블로그 발행 (Ghost webhook 또는 cron)
│
▼
[ 에이전트 1 — 메타 분석 ]
- title, description, hero image, 주제 키워드 추출
│
▼
[ 에이전트 2 — OG 이미지 생성 ]
- GPT image-2로 시리즈 일관성 있는 이미지 1장
- Ghost asset 또는 외부 호스트에 업로드, 영구 URL 확보
│
▼
[ 에이전트 3 — 캠페인 네이밍 생성 ]
- 컨벤션: {slug}_{YYYYMM}_{channel}
- 오탈자·금지어·중복 검증
│
▼
[ 에어브릿지 REST API ] POST /v1/tracking-links × N
- 채널별로 N개 발급 (kakao, sms, email, instagram, facebook, etc.)
- 각 링크에 동일 OG 이미지·타이틀·설명 임베드
│
▼
[ 에어브릿지 MCP ] get_tracking_link으로 N개 검증
- createdBy: API 확인
- ogTag, deeplinkUrl, fallbackPaths 검증
│
▼
[ 슬랙 + 노션 보고 ]
- 슬랙 캔버스에 N개 링크 + OG 미리보기 + 14일 후 ROAS 리포트 예약
3. 1단계 — 블로그 메타 추출 + OG 이미지 생성

3-1. 블로그 메타 추출
Ghost CMS를 쓴다면 /ghost/api/admin/posts/:id로 글 본문·메타를 받을 수 있습니다. WordPress라면 REST API, Sanity·Contentful은 GraphQL. 어느 CMS든 LLM에 보낼 입력은 다음 5가지입니다.
- 제목
- 발행 슬러그
- 메타 디스크립션 (없으면 LLM이 본문 첫 단락에서 추출)
- 핵심 키워드 (없으면 LLM이 본문에서 5개 추출)
- hero image URL (있으면 OG 이미지의 시각 톤 참조용)
3-2. OG 이미지 생성
OpenAI 이미지 생성 모델은 브랜드 톤이 일관된 시리즈 이미지를 다음 시스템 프롬프트로 잘 만듭니다. 2026년 4월 현재 공식 GA 모델은 gpt-image-1, 차기 gpt-image-2(스냅샷 gpt-image-2-2026-04-21)는 출시되는 시점에 교체하면 됩니다. 이 문단의 코드는 모델명만 바꾸면 그대로 동작합니다. 프롬프트가 곧 새 코드 라는 카파시의 Software 3.0 관점을 OG 생성에 그대로 적용한 사례입니다.
// (가상 코드 — 실제 키와 호스팅은 조직 환경에 맞춤)
const ogPrompt = `
시리즈: 리텐션 인사이트
주제: ${title}
키워드: ${keywords.join(", ")}
스타일:
- 모바일에서도 가독 좋은 큰 타이포 (Pretendard, 24-32px 헤더 기준)
- 한국어 제목 명확하게 1줄, 부제 1줄까지
- 배경: 단색 + 1개 추상 그래픽 요소
- 색: 브랜드 모노크롬 (네이비 #0F1B2C / 라이트 #F4F6FA)
- 워터마크: 우측 하단 retn.kr
크기: 1200x630 (OG 표준)
`;
const res = await openai.images.generate({
model: "gpt-image-1", // 2026-04 GA. 차기 gpt-image-2 출시 시 한 줄 교체.
prompt: ogPrompt,
size: "1536x1024", // OG는 후처리로 1200x630 크롭
output_format: "png",
n: 1,
quality: "high"
});
const imageBuffer = Buffer.from(res.data[0].b64_json, "base64");
생성한 이미지는 Ghost CMS의 asset endpoint(/ghost/api/admin/images/upload)에 업로드해 영구 URL을 확보합니다. Ghost를 쓰지 않는다면 R2·S3·Bunny Stream 등 사내 자산 저장소에 올립니다.
⚠️ 유의 — 외부 LLM 게이트웨이에 원본 이미지 자체가 캐싱될 수 있습니다. 민감한 브랜드 자산이 들어간 hero image는 OG 생성 입력으로 주제 키워드만 보내는 편이 안전합니다.
💡 회사 컨텍스트 RAG 주입 — 우리 브랜드의 톤 가이드, 컬러 시스템, 타이포 가이드, 워터마크 룰을 사내 wiki·노션의 단일 문서로 정리해 두면, 에이전트가 OG 생성 직전에 그 문서를 RAG로 끌어와 시리즈 일관성 있는 이미지를 만듭니다. 1편 §5에서 정리한 회사별 컨텍스트의 4축 중 보고 대상별 톤·템플릿에 해당하는 영역입니다. 한 번 문서화해 두면 매주 발행되는 글마다 디자이너의 손을 거치지 않고도 일관된 OG가 나옵니다.
4. 2단계 — 캠페인 네이밍 + 컨벤션 검증
4-1. 컨벤션 룰 (예시)
캠페인: {slug}_{YYYYMM}_{channel}
- slug: 영문 소문자, 하이픈, 60자 이내
- channel: kakao, sms, email, instagram, facebook, web_share, qr_offline, partner_xxx
- ad_group: {channel}_{audience_segment}
- ad_creative: {channel}_{creative_type}_{variant}
4-2. LLM 에이전트가 수행하는 사전 검증
- 오탈자 검증: 슬러그·캠페인 이름이 표준 사전 단어 또는 자주 쓰는 약어와 Levenshtein 거리 1~2 이내인 경우 알림 (e.g.
retetnion,recovery_capain등) - 금지어 검증: 회사 내부 코드네임, 미공개 제품명, 경쟁사명이 들어가 있으면 차단
- 중복 검증: 같은 슬러그의 같은 채널·같은 월 캠페인이 이미 발급돼 있는지 MCP
list_tracking_links로 사전 조회. 중복이면 발급 차단 또는_v2접미사 자동 부여 - 링크 라우팅 누락 검증: deeplink URL의
path부분이 실제 앱에 존재하는 라우팅인지, 웹 fallback URL이 200 응답을 주는지 사전 fetch
4-3. Human-in-the-loop 지점
이 검증을 통과하면 자동 발급. 실패하면 슬랙 채널 #growth-tracking-link-review에 멘션과 함께 사람 승인 버튼 (Slack interactive message). 마케터는 30초 안에 결정.
5. 3단계 — REST API로 트래킹 링크 N개 발급
채널 N개에 대해 동일 OG 메타와 브랜딩을 적용해 일괄 발급하는 패턴입니다.
const channels = [
{ name: "kakao", isReengagement: "OFF" },
{ name: "sms", isReengagement: "OFF" },
{ name: "email", isReengagement: "OFF" },
{ name: "instagram", isReengagement: "ON-FALSE" }, // UA 캠페인
{ name: "facebook", isReengagement: "ON-FALSE" },
{ name: "owned_blog_share", isReengagement: "OFF" }
];
const results = await Promise.all(channels.map(async (ch) => {
const payload = {
channel: ch.name,
campaignParams: {
campaign: `${slug}_${yyyymm}_${ch.name}`,
ad_group: `${ch.name}_default`,
ad_creative: `${ch.name}_og`
},
isReengagement: ch.isReengagement,
deeplinkUrl: `myapp://blog/${slug}`,
fallbackPaths: {
ios: `https://retn.kr/blog/${slug}?utm_source=${ch.name}`,
android: `https://retn.kr/blog/${slug}?utm_source=${ch.name}`,
desktop: `https://retn.kr/blog/${slug}?utm_source=${ch.name}`
},
ogTag: {
title,
description,
imageUrl: ogImageUrl
}
};
const res = await fetch("https://api.airbridge.io/v1/tracking-links", {
method: "POST",
headers: {
"Authorization": `Bearer ${TRACKING_LINK_API_TOKEN}`,
"Content-Type": "application/json",
"Accept-Language": "ko"
},
body: JSON.stringify(payload)
});
return { channel: ch.name, response: await res.json() };
}));
발급에 Tracking Link API Token을 권장합니다. 일반 API Token보다 권한이 좁아 만의 하나 노출되어도 피해 범위가 한정적입니다(트래킹 링크 발급 외 작업 불가).
(가상 코드 명시) 위 코드는 동작 원리 설명용입니다.slug,yyyymm,title,description,ogImageUrl,TRACKING_LINK_API_TOKEN은 실제 운영 환경에서 안전하게 주입해야 합니다.
6. 4단계 — MCP로 발급 검증
발급이 끝나면 그 자리에서 MCP로 검증합니다. 같은 호출 컨텍스트에서 생성과 검증을 분리하는 게 핵심입니다.
// MCP는 클라이언트(예: Claude Desktop, Claude Code, n8n LLM 노드)에서
// 자연어로 호출되거나, MCP 클라이언트 SDK로 직접 호출.
//
// 검증 항목 예시:
// - createdBy: "API" — REST API 발급자 추적
// - ogTag.imageUrl == 우리가 보낸 OG URL인가
// - deeplinkParams.deeplinkData.deeplinkUrl == 우리가 보낸 path인가
// - fallbackPaths == https 200 응답
// - 오탈자 LLM 재검증 (slug 안에 의도하지 않은 문자열 없는가)
검증 통과 → 슬랙·노션 자동 게시. 실패 → 마케터에게 사유 정리해 알림.
7. 5단계 — Routines로 정기 자동화
이 흐름을 매일 09:00에 자동으로 트리거하면 어제 발행된 글이 오늘 출근 전에 자산화 됩니다.
// 의사 코드
schedule.cron("0 9 * * *", async () => {
const yesterdayPosts = await ghostApi.posts.browse({
filter: `published_at:>${dayjs().subtract(1, "day").startOf("day").toISOString()}`
});
for (const post of yesterdayPosts) {
await runAgent("blog-to-tracking-links", { postId: post.id });
}
});
루틴 도구로는 다음 중 한 가지를 권합니다.
- Anthropic Claude Code Routines — 클로드 코드 환경 안에서 cron 또는 트리거 기반으로 작업 시퀀스를 정기 실행. 토큰·컨텍스트가 같은 에이전트에 묶여 있어 가장 단순.
- Anthropic Managed Agents — 사람이 위에서 제안 → 검증 → 승인 → 실행을 분리해 운영하는 모드. 발급처럼 돌이킬 수 없는 행동에 적합.
- n8n + LLM 노드 — 비개발자 친화, GUI로 흐름 수정 가능. Ghost 뉴스레터 자동화 사례에서 같은 패턴을 확인할 수 있습니다.
- Cloudflare Workers + Cron Triggers — 서버리스, 코드로 관리.
- OpenAI Assistants의 scheduled runs — 단일 LLM 콘솔 안에서 관리.
8. 결과 — 이 글을 위해 실제로 발급한 6개 트래킹 링크
이 글 자체를 데모 입력으로 두고 위 흐름을 끝까지 돌렸습니다. 본 글의 OG 이미지는 클로드 코드 ✕ OpenAI gpt-image-1 (high quality, 1536×1024) 로 생성한 결과이고, 6개 트래킹 링크는 에어브릿지 REST API로 발급한 뒤 에어브릿지 MCP로 검증한 진짜 측정 데이터 (가상 시연이 아님) 입니다.
8-1. 입력 메타
- 제목: 클로드 코드로 OG 이미지 만들고, 에어브릿지 API로 트래킹 링크 N개 발급한다
- 슬러그:
claude-code-og-image-airbridge-tracking-link-blog-automation - 캠페인 네이밍 컨벤션:
{slug}_{YYYYMM}_{channel}→ 예:..._202604_email_newsletter - OG 이미지: 본 글 상단에 표시된 Part 2 / 3 커버 (
/content/images/2026/04/og-part2-tracking-links.png) - Deeplink URL (앱):
ablog://blog/spring-sale-2026(가상 데모 path) - Web fallback:
https://retn.kr/{slug}/?utm_source={channel}
8-2. 발급된 6개 트래킹 링크 (2026-04-29 KST 17:06 발급)
| 채널 | channelType | Tracking Link ID | 캠페인 | 클릭 URL (베이스) |
|---|---|---|---|---|
kakao |
integrated | 490490245 | ..._202604_kakao |
https://abr.ge/@demokr/kakao |
sms_internal |
custom | 490490251 | ..._202604_sms_internal |
https://demokr.ab180.co/@demokr/sms_internal |
email_newsletter |
custom | 490490250 | ..._202604_email_newsletter |
https://demokr.ab180.co/@demokr/email_newsletter |
instagram_organic |
custom | 490490248 | ..._202604_instagram_organic |
https://demokr.ab180.co/@demokr/instagram_organic |
facebook_organic |
custom | 490490246 | ..._202604_facebook_organic |
https://demokr.ab180.co/@demokr/facebook_organic |
owned_blog_share |
custom | 490490249 | ..._202604_owned_blog_share |
https://demokr.ab180.co/@demokr/owned_blog_share |
참고 —kakao는 에어브릿지 integrated channel 이라 단축 도메인abr.ge로 발급. 나머지 5개는 custom channel 이라demokr.ab180.co도메인으로 발급.
8-3. MCP 검증 결과 (샘플 1건 — email_newsletter)
get_tracking_link(link_id=490490250) 호출 응답에서 핵심 필드만:
| 필드 | 값 |
|---|---|
createdBy |
"API" ← REST API 발급자 추적 마커 |
email |
simpson.sim@retn.kr ← 토큰 소유자 자동 기록 |
channelName |
email_newsletter |
campaign |
claude-code-og-image-airbridge-tracking-link-blog-automation_202604_email_newsletter |
adGroup |
email_newsletter_default |
adCreative |
email_newsletter_og |
deeplinkParams.deeplinkData.deeplinkUrl |
ablog://blog/spring-sale-2026 |
deeplinkParams.fallbackData.ios / .android / .desktop |
https://retn.kr/.../?utm_source=email_newsletter |
ogTag.title |
클로드 코드로 OG 이미지 만들고, 에어브릿지 API로 트래킹 링크 N개 발급한다 |
ogTag.imageUrl |
https://retn.kr/content/images/2026/04/og-part2-tracking-links.png |
modifiable |
true ← 사후 PATCH로 routing/og-tag 수정 가능 |
shortUrl |
https://demokr.ab180.co/oa2r5f ← 사용자 친화 단축 URL |
6개 모두 동일한 패턴으로 검증 통과 — createdBy=API, ogTag 4필드, deeplinkUrl + 3개 fallback, campaign 컨벤션.
8-4. 사이클 타임
- 6개 채널 병렬 발급: 1초 미만 (실측 6개 호출 동시 처리)
- 채널당 평균 응답: 약 200~400ms
- MCP 단일 검증: 약 300ms
- 전체 파이프라인 (메타 추출 → OG 생성 → 6개 발급 → 검증) — 대부분의 시간이 OG 이미지 생성에 소요. gpt-image-1 quality: high로 1장 약 35초.
참고 — 위 수치는 본 글 발행 직전 실측한 진짜 측정값 입니다 (가상 데이터 아님). 단, 사용자별 네트워크·OpenAI 모델 부하·에어브릿지 베타 서버 부하에 따라 달라질 수 있습니다.
8-5. 비용
- 가장 큰 비용 항목은 OG 이미지 1장. gpt-image-1 high quality 1장 약 USD $0.04~$0.08 수준. standard quality로 떨어뜨리면 약 $0.02. 시리즈 일관성을 포기하지 않으면서 비용을 줄이려면 프롬프트 + 시드 고정 전략 권장.
- 트래킹 링크 발급은 에어브릿지 플랜 한도 내에서 무료. rate limit은 50 link/sec 이라 6개 정도는 여유.
9. 도입 시 주의사항
- 토큰 분리 — Tracking Link API Token만으로 발급. 일반 API Token은 reporting·setup 용도. 토큰 노출 시 영향 범위가 다릅니다.
- OG 이미지 크기·해상도 — 카카오는 1200×630 비율, 인스타 스토리는 1080×1920, 메일 인박스 미리보기는 800×600 권장. 멀티 사이즈 자동 생성을 권합니다.
- deeplink URL 검증 — 앱이 해당 path로 라우팅이 등록되어 있는지 사전에 SDK 트러블슈팅 도구로 검증. 등록 안 된 path로 발급하면 사용자가 빈 화면을 봅니다.
ON-FALSEvsOFF— UA 캠페인이라면 reengagement를 ON-FALSE로. 잘못 설정하면 기존 사용자의 어트리뷰션이 새 캠페인으로 잘못 잡힐 수 있습니다.
10. 다음 편 예고
3편은 통합 안 된 매체 비용을 다룹니다. 인플루언서 마케팅, 자체 SMS, 오프라인 행사처럼 에어브릿지에 공식 연동이 없는 채널의 비용·노출·클릭을 Google Sheet로 관리하면, 매일 새벽 자동으로 CSV 변환 → 에어브릿지 API multipart upload → 에어브릿지 MCP가 actuals 리포트로 검증 → 슬랙 보고. 고질병 5·1을 동시에 해소하는 구조입니다. 3편 바로가기
마치며
콘텐츠 마케터의 "발행 후 30분 수작업 반복" 은 의지로 풀리지 않습니다. 컨벤션을 강요하는 사규로도, 워크플로 매니저로도 풀리지 않습니다. 멀티태스킹은 LLM에게 맡기고, 사람은 의사결정만 남기세요. 우리 팀이 그리는 AI Augmentation의 한 단면입니다.
질문은 retn.kr/contact 또는 LinkedIn DM 환영합니다.
📚 더 읽어보기
- 클로드 코드 + 에어브릿지 MCP × API 자동화 청사진 (1/3)
- 통합 안 된 매체 비용도 에어브릿지 대시보드에 — Self-Serve Cost Upload (3/3)
- 메타 광고 MCP로 3년치 광고 데이터 분석
- 블로그 키워드 리서치 자동화 — 네이버 검색광고 MCP 오픈소스
- 완벽한 도구를 기다리지 마세요 — AI 시대, 나만의 OS를 만드는 법
- 비개발자의 Claude Code 삽질기 — 그로스 전문가가 2주 만에 엔지니어링까지
참고 - Airbridge, Create Tracking Link (REST): https://help.airbridge.io/en/references/tracking-link.md - OpenAI, Images Generations API (gpt-image-1GA /gpt-image-2차기): https://platform.openai.com/docs/api-reference/images - Ghost, Admin API — Posts: https://ghost.org/docs/admin-api/#posts