본문으로 건너뛰기
YoonRain
업무 일지 · No. 008

제가 병목이 되는 구조를 걷어내고 각자 셀프로 돌게 했습니다

YoonRain읽는 시간 2분데이터회고
목차

광고 데이터를 뽑는 일도, UTM 링크를 만드는 일도 저를 거쳐 갔습니다. 제가 바쁘면 다른 사람의 일이 멈추는 구조였어요.

도구부터 바꿨습니다

9월 8일에 구글·메타·네이버 광고를 MCP로 연결해서 CSV를 손으로 뽑던 일을 없앴어요. 네이버 검색 도구는 8월 27일에 공식 API가 없다는 걸 확인하고, 화면 뒤 데이터를 직접 쟀습니다. 이걸 바탕으로 만든 조회 도구는 10월 28일 팀에 배포했어요.

UTM은 규칙과 도구로 체계를 잡았습니다

UTM은 규칙 문서와 공용 시트, 링크를 만드는 MCP 세 가지로 체계를 잡았습니다. 10월 16일에 작성자 교육을 했고 19일에 광고 링크를 새 규칙으로 바꿨어요. 29일에는 권한을 나누려고 실행 코드를 시트에서 떼어 별도 서버로 옮겼습니다.

링크는 각자 만듭니다

한 홍보 건에서 “링크를 만들어 드린다”는 초안이 나왔는데, 이건 제가 돌려놨어요. 그때 한 말이 “알아서 utm 생성하고 콘텐츠만 잘 집어넣어라가 맞지”였습니다. 그 뒤로는 고정값과 규칙만 넘기고 링크는 각 담당자가 직접 만들어요.

규칙만 넘겨도 되는 이유는 생성 도구가 규칙 밖의 값을 막아 주기 때문입니다. 핵심만 줄이면 이런 함수예요. 허용 값은 예시입니다.

// 담당자가 직접 쓰는 UTM 생성 규칙 (허용 값은 예시)
const RULES = {
  source: ["naver", "google", "meta", "newsletter"],
  medium: ["cpc", "paid_social", "email", "referral"],
};

function buildUtm(url, { source, medium, campaign, content }) {
  if (!RULES.source.includes(source)) throw new Error(`허용되지 않은 source: ${source}`);
  if (!RULES.medium.includes(medium)) throw new Error(`허용되지 않은 medium: ${medium}`);
  const u = new URL(url);
  u.searchParams.set("utm_source", source);
  u.searchParams.set("utm_medium", medium);
  u.searchParams.set("utm_campaign", campaign.trim().toLowerCase().replace(/\s+/g, "_"));
  if (content) u.searchParams.set("utm_content", content);
  return u.toString();
}

buildUtm("https://example.com/event", {
  source: "newsletter",
  medium: "email",
  campaign: "2026 11 webinar",
});
// → https://example.com/event?utm_source=newsletter&utm_medium=email&utm_campaign=2026_11_webinar

허용 값 밖이면 링크가 아예 안 만들어집니다. 그래서 여러 사람이 각자 만들어도 같은 체계로 들어와요.

글쓴이YoonRain

이력 보기