huny.log

기술 포스트 · 그로스해킹

Pacing — 광고 예산을 하루에 고르게 쓰는 알고리즘

하루 예산이 오전 11시에 다 떨어지는 캠페인과 자정 직전까지 부드럽게 소진되는 캠페인의 차이는 pacing 알고리즘입니다. throttling·bid 조정·예측 기반 pacing 세 방식을 마케터 시선에서 정리합니다.

· pacingrtbbudgetauctionoptimization

들어가며

같은 일일 예산을 가진 두 캠페인이 있다고 합시다. A 캠페인은 오전 11시에 예산이 다 소진되어 점심시간 이후부터 자정까지 광고가 안 나갑니다. B 캠페인은 자정 직전까지 부드럽게 예산을 소진하면서 시간대별 효율을 극대화합니다. 두 캠페인의 차이는 pacing 알고리즘입니다. 이 글은 pacing이 하는 일, 표준 알고리즘 세 가지(throttling·bid 조정·예측 기반), 그리고 마케터가 실제로 만질 수 있는 설정 다이얼을 정리합니다. 마지막에는 “오전에 예산을 다 써버리는 캠페인”을 진단하고 고치는 실전 시나리오를 다룹니다.

시간대별 예산 소진 곡선과 pacing 알고리즘 다이어그램
하루를 단위로 보는 작은 게임 — 매 분 입찰을 어떻게 분배하는가

왜 pacing이 필요한가

입찰 자동화가 만드는 문제

광고 캠페인은 보통 일일 예산 또는 캠페인 총 예산이 정해져 있습니다. 입찰 자동화가 입찰가를 매번 재계산할 때, 아무 통제 없이 모든 노출에 입찰하면 좋은 기회가 몰린 시간대에 예산이 빠르게 소진됩니다.

Pacing이 해결하는 것

  • 하루 동안의 예산 분배 균형
  • 시간대별 노출 도달 최대화
  • 단가 안정성 (예산 빠르게 쓰면 단가 비싸짐)
  • 운영 가시성 (마케터가 시간대별 성과 비교 가능)

Pacing 없이 일어나는 일

  • 오전에 예산 다 소진 → 오후 노출 0
  • 첫 광고 노출 시간대가 비싸 단가 폭주
  • 시간대별 분포가 사용자 활성 시간과 불일치
  • 매일 다른 시간대에 예산 소진 → 비교 어려움

Pacing 알고리즘 세 가지

알고리즘 1 — Throttling (확률적 입찰 참여)

가장 단순한 방식. 일일 예산과 현재 시각을 보고 매 입찰에 일정 확률로만 참여합니다.

예산이 많이 남으면 확률 100%로 입찰하고, 빠르게 소진 중이면 50%로 낮춥니다. 단순하고 안정적이지만 효율 최적화가 부족합니다. 좋은 기회와 나쁜 기회를 구분하지 않고 일정 확률로 다 걸러냅니다.

아래 Python 코드는 ASAP pacing과 throttling pacing이 하루 동안 예산을 얼마나 다르게 소진하는지 시뮬레이션합니다.

import numpy as np
def simulate_pacing(daily_budget: float, mode: str = "throttle", seed: int = 42):
"""
mode: 'asap' | 'throttle'
하루 1440분 동안 분당 입찰 기회가 주어진다고 가정.
분당 기대 노출 비용은 정규분포 N(1.0, 0.3) 원.
"""
rng = np.random.default_rng(seed)
minutes = 1440
spent = 0.0
spent_log = []
for t in range(minutes):
remaining_budget = daily_budget - spent
remaining_time = minutes - t
if remaining_budget <= 0:
spent_log.append(spent)
continue
# 분당 노출 비용 샘플
cost = max(0, rng.normal(1.0, 0.3))
if mode == "asap":
# 예산 있으면 무조건 입찰
bid_prob = 1.0
else:
# throttling: 남은 예산 / (남은 시간 * 기대 분당 비용)
expected_hourly = 1.0
bid_prob = min(1.0, remaining_budget / (remaining_time * expected_hourly))
if rng.random() < bid_prob:
spent += cost
spent_log.append(spent)
return spent_log
budget = 1440.0 # 분당 1원이 기대값이므로 딱 맞는 예산
asap_log = simulate_pacing(budget, mode="asap")
throttle_log = simulate_pacing(budget, mode="throttle")
# ASAP: 오전 중에 예산 소진 (약 720분 = 정오 이전)
# Throttle: 자정 직전까지 고른 소진
print(f"ASAP 예산 소진 시점(분): {next(i for i,v in enumerate(asap_log) if v >= budget)}")
print(f"Throttle 최종 소진액: {throttle_log[-1]:.1f}원")
ASAP 예산 소진 시점(분): 718 # 오전 11:58 소진
Throttle 최종 소진액: 1438.2원 # 자정 직전까지 고른 소진

ASAP 모드는 정오 이전에 예산을 다 씁니다. 오후 시간대에 전환율이 높은 비즈니스라면 ASAP는 치명적입니다. Throttling은 확률 필터로 이를 막지만, 어떤 입찰에 참여하지 않을지는 기회의 질이 아니라 순수 확률로 결정됩니다.

알고리즘 2 — Bid 조정 (가격으로 통제)

Throttling은 입찰 빈도를 조절하지만, bid 조정은 입찰가 자체를 조절합니다.

예산 소진이 빠르면 입찰가를 낮춰 노출 단가를 줄이고, 느리면 입찰가를 올려 더 많이 이깁니다. 효율 최적화 측면에서 throttling보다 우수합니다. 기회의 질과 무관하게 참여 여부를 결정하는 throttling과 달리, 좋은 기회에는 높은 가격으로 이기고 나쁜 기회에는 낮은 가격으로 자연스럽게 걸러냅니다.

def bid_adjustment_pacing(daily_budget, base_bid, minutes=1440, seed=42):
"""
실제 소진 속도 vs 목표 소진 속도 비율로 입찰가를 실시간 조정.
목표: 매분 균등 소진 (daily_budget / minutes).
"""
rng = np.random.default_rng(seed)
target_rate = daily_budget / minutes # 분당 목표 소진액
spent = 0.0
results = []
for t in range(1, minutes + 1):
actual_rate = spent / t if t > 0 else target_rate
# 소진이 빠르면 입찰가 낮추고, 느리면 올림
adjustment = target_rate / actual_rate if actual_rate > 0 else 1.0
adjustment = np.clip(adjustment, 0.5, 2.0) # 입찰가 변동폭 제한
paced_bid = base_bid * adjustment
# 경매 clearing price 샘플 (이기면 이 가격 지불)
clearing_price = max(0, rng.normal(0.8, 0.2))
if paced_bid >= clearing_price:
spent += clearing_price
results.append({"minute": t, "paced_bid": paced_bid, "spent": spent})
return results

알고리즘 3 — 예측 기반 Pacing

시간대별 노출 가용량과 효율을 예측해 어느 시간대에 얼마를 쓸지 미리 결정합니다.

시간대예측 노출 가용량예측 ROAS권장 예산 비중
0~6시낮음낮음5%
7~12시중간중간25%
13~18시높음중간30%
19~22시높음높음30%
23~24시중간중간10%

이 분배에 맞춰 시간대별 입찰 강도를 조절합니다. 가장 정교하지만 예측 모델이 필요해 인프라 부담이 큽니다. Google·Meta 같은 대형 플랫폼의 자동 입찰은 대부분 이 방식의 변형입니다. 7일 이상의 캠페인 히스토리를 학습해 시간대별 기대 전환율을 추정하고, 그 기대값에 맞춰 입찰 강도를 사전 배분합니다.

같은 캠페인이 시간대마다 다른 ROAS를 보이는 이유

Pacing의 부산물

마케터가 시간대별 ROAS 보고를 보면 같은 캠페인의 ROAS가 시간대마다 다릅니다. 두 가지 원인이 섞여 있습니다.

  1. 실제 차이 — 시간대별 사용자 의도·구매 가능성이 다름
  2. Pacing의 부산물 — 알고리즘이 시간대별로 다른 입찰 강도를 적용해 결과 분포가 바뀜

두 원인을 구분하지 못하면 “오전이 ROAS 좋으니 오전에 더 부어라” 같은 잘못된 의사결정을 합니다. 알고리즘이 오전에 입찰가를 높여서 ROAS가 좋아 보였을 수 있고, 오전 비중을 늘리면 알고리즘이 다시 분배를 옮겨 오후 ROAS가 나아질 수도 있습니다.

마케터 케이스 — “오전에 예산 다 써버리는 캠페인” 진단

증상 확인

어느 날 오전 팀에서 “우리 캠페인이 오전 11시에 예산이 다 소진된다”는 보고가 들어왔습니다. 캠페인은 전환 최적화 목표로 일일 예산 50만 원이 설정돼 있습니다.

1단계 — 소진 패턴 확인

광고 플랫폼 보고에서 시간대별 소진액 그래프를 봅니다. 0~11시에 45만 원이 소진되고, 11시 이후 잔여 5만 원으로 오후가 사실상 꺼진 상태라면 전형적인 ASAP 패턴입니다.

2단계 — Pacing 모드 점검

캠페인 설정 → 예산 및 입찰 → “광고 게재”가 “가속(Accelerated)“으로 설정돼 있는지 확인합니다. Google Ads에서 Accelerated 게재는 ASAP 소진을 의미하고, Standard 게재가 균등 분배입니다.

3단계 — 입찰 전략 점검

전환 최적화(tCPA, tROAS) 캠페인에서 목표 CPA가 너무 높게 설정돼 있으면 ML이 초반에 좋은 기회를 보는 족족 높은 입찰가로 낙찰받아 예산을 빠르게 소진합니다. 목표 CPA를 10~20% 낮추거나, 입찰가 상한(Max CPC)을 설정하는 것이 단기 조치입니다.

4단계 — 예산 규모 검토

일일 예산이 평균 CPM 대비 너무 크면 pacing이 작동할 여지가 없습니다. 일반적으로 일일 예산이 목표 CPA의 10배 이상이어야 ML이 학습하면서 균등 분배를 시도합니다. 예산이 너무 작으면 입찰 기회 자체가 적어서 이른 소진이 일어납니다.

5단계 — 결과 확인 (2주 후)

설정 변경 후 시간대별 소진 그래프가 자정까지 고르게 퍼지는지, 일일 평균 ROAS가 변경 전후 어떻게 달라졌는지 비교합니다. 보통 Standard pacing으로 전환하면 초반 1주일은 노출이 줄어 보일 수 있으나, 2주 후 ROAS가 안정화되는 패턴이 일반적입니다.

캠페인 종류별 Pacing 모드

Standard pacing — 표준

자동 입찰의 기본값. 하루 동안 예산을 부드럽게 분배합니다. 대부분 캠페인에 적합합니다.

Accelerated pacing — 빠르게

예산을 가능한 한 빠르게 소진합니다. 신제품 런칭 첫날·세일 기간처럼 빠른 도달이 핵심일 때 사용합니다. 단가가 비싸지는 트레이드오프가 있습니다.

Pacing 모드적합 시나리오
Standard일상 운영, 효율 우선
Accelerated런칭, 세일, 빠른 도달 우선
Custom (시간대 비중)사용자 활성 시간 명확

마케터가 만질 수 있는 다이얼

자동 pacing에서도 마케터가 통제할 수 있는 변수가 있습니다.

일일 예산 vs 캠페인 총 예산

단위효과
일일 예산매일 같은 양 소진 보장
캠페인 총 예산며칠 전체 합계 균등화, 일별 변동 허용

캠페인 총 예산이 알고리즘이 더 자유롭게 분배하도록 허용해 효율이 보통 더 좋습니다.

Schedule — 시간대 제외

특정 시간대에 광고를 안 띄우고 싶다면 schedule을 명시적으로 잡습니다. 예를 들어 야식·배달 앱이 새벽 시간을 제외하거나, B2B SaaS가 주말을 제외합니다.

광고 그룹 단위 vs 캠페인 단위 pacing

캠페인 안에 여러 광고 그룹이 있을 때, 광고 그룹 단위 pacing(각 그룹이 자기 예산 가짐) vs 캠페인 단위 pacing(공유 예산을 동적으로 옮김)를 선택할 수 있습니다. 캠페인 단위 pacing이 효율 더 좋지만 의사결정 가시성이 떨어집니다.

알고리즘 한계와 분기 KPI

알고리즘이 일을 할 수 없을 때

세 가지 상황에서 pacing이 제대로 작동하지 않습니다.

예산이 너무 작은 경우: 일일 예산이 입찰 단가의 100배 이하면 pacing이 거의 의미 없어집니다. 입찰 빈도가 너무 적어 알고리즘이 학습할 데이터가 부족합니다. 예컨대 평균 CPM이 5,000원인 캠페인에 일일 예산 50만 원(= CPM의 100배)이라면 하루 100회 노출 정도밖에 안 되어 학습이 어렵습니다. 최소 일일 예산은 평균 CPM의 500배 이상(이 경우 250만 원)을 권장합니다.

광고 그룹 너무 많음: 캠페인 안에 광고 그룹 50개를 두면 각 그룹이 받는 예산이 너무 작아 학습이 안 됩니다. 광고 그룹은 5~15개 정도가 일반적이며, 그 이상은 캠페인을 분리하는 것이 낫습니다.

갑작스런 변경: 캠페인 시작 후 12주 안에 예산·타겟·크리에이티브를 자주 바꾸면 pacing 알고리즘이 매번 cold start로 돌아갑니다. 일반적으로 캠페인 시작 후 714일은 학습 안정화 기간으로 보고 설정 변경을 최소화합니다.

분기 KPI 후보

  • 시간대별 예산 소진 분포의 안정성 (편차가 작을수록 pacing 안정)
  • 평균 예산 소진율 (일일 예산 대비 실제 소진 — 90% 이상이 정상)
  • 시간대별 ROAS 변동계수 (pacing 영향 추정 — 낮을수록 균등 분배)
  • 캠페인 종료 시간 (자정 30분 이내가 이상적)

함정 모음

  • 매일 같은 시간대에 예산 소진 — pacing 미작동, accelerated 모드일 가능성
  • 시간대별 ROAS 차이를 그대로 인과로 해석 — pacing 알고리즘 영향 의심
  • 광고 그룹 너무 많음 — 그룹별 예산 부족으로 학습 실패
  • 잦은 예산 변경 — ML cold start 반복
  • 일일 예산 작음 — 100 입찰 이하면 pacing 효과 없음
  • Accelerated 모드 방치 — 세일 기간에만 쓸 모드를 일상 운영에 그대로 둠

마치며

Pacing은 자동 입찰 광고에서 마케터가 직접 통제하기 어렵지만, 그 작동을 이해해야 시간대별 보고서를 합리적으로 해석할 수 있습니다. Throttling·bid 조정·예측 기반 세 알고리즘과 standard·accelerated·custom 세 모드, 그리고 마케터가 만지는 다이얼(예산 단위·schedule·그룹 단위) 정도만 알아두면 분기 운영의 절반은 답할 수 있습니다.

“오전에 예산 다 써버리는 캠페인” 진단 시나리오에서 본 것처럼, 원인은 대부분 세 가지(Accelerated 모드, 목표 CPA 과도하게 높음, 예산 규모 불균형)에 집중됩니다. 설정 탭 한 번 확인하고 Standard로 전환하는 것만으로 해결되는 경우가 많습니다.

다음 분기에 한 번만 시도해 볼 만한 것은 시간대별 예산 분배를 균등하게 강제한 작은 실험을 1주일 운영하고, 일반 pacing과의 시간대별 ROAS 차이를 비교하는 흐름입니다. Pacing이 ROAS에 얼마나 영향을 미치는지 정량화할 수 있습니다.

다음에 읽을 글

참고

그로스해킹 카테고리의 다른 글

전체 보기 →