TL;DR
- 메타 안드로메다 알고리즘에서는 소재 다각화가 성패를 좌우한다
- 수만 개 SKU를 가진 커머스는 카탈로그 광고로 소재를 자동 생성할 수 있다
- 실제 컨설팅 사례: 카탈로그 세팅 최적화로 기존 대비 62% 성과 개선
- 이미지 오버레이 자동화로 비싼 SaaS 없이도 고품질 소재 생산 가능
안드로메다가 요구하는 것: 소재의 양이 아닌 '각도의 다양성'
메타의 안드로메다 알고리즘은 10,000배 확장된 모델 용량으로 실시간 학습을 수행한다. 이 알고리즘이 최고 성능을 내려면 다양한 고객 pain point를 다루는 소재가 필요하다. (안드로메다 알고리즘 상세 가이드)
비슷한 메시지의 크리에이티브 20개보다, 서로 다른 가치 제안을 담은 크리에이티브 6개가 더 많은 학습 신호를 생성한다.
문제는 이렇게 다양한 소재를 계속 만들어내는 것이 쉽지 않다는 점이다. 특히 빠르게 변화하는 커머스 환경에서는 더욱 그렇다.
커머스의 숨은 무기: 수만 개의 SKU
하지만 커머스 비즈니스에게는 특별한 기회가 있다. 이미 보유한 수천, 수만 개의 상품 그 자체가 다양한 소재가 될 수 있다.
- 각 상품은 서로 다른 고객의 니즈를 충족한다
- 각 상품 이미지는 고유한 시각적 소재다
- 가격, 할인율, 재고 등 다이나믹한 정보를 실시간 반영할 수 있다
이것이 바로 메타 카탈로그 광고가 안드로메다 시대에 더욱 중요해진 이유다.
2025-2026 메타 카탈로그 광고 업데이트
메타는 2025년 들어 카탈로그 광고를 대폭 강화했다:
Advantage+ Catalog 진화
- 새로운 audience types: 더 정교한 리타게팅 옵션
- A/B testing 기본 지원: 카탈로그 내에서도 실험 가능
- Privacy-first 옵션: iOS 14+ 대응 강화
AI 자동화 확대
- Advantage+ 자동화 기본값: 신규 캠페인에서 placement, creative, budget 자동 최적화
- AI 기반 상품 하이라이트: 주요 특징을 자동 추출하여 강조
- 브랜드 일관성 자동화: 로고, 폰트, 컬러 자동 적용
캠페인 구조 단순화
- 6개 주요 목표로 통합: Awareness, Traffic, Engagement, Leads, App Promotion, Sales
- Andromeda 알고리즘이 creative 기반으로 타게팅 자동 수행
핵심은: 더 이상 수동 타게팅보다 정확한 상품 데이터와 다양한 크리에이티브를 AI에게 먹이는 것이 중요해졌다.
(출처: Meta Advantage + Catalog ads in 2025, Meta Ads Updates 2025)
실제 사례: 카탈로그 세팅 최적화로 62% 성과 개선
초기 상황: "메타에서는 성과가 나오는데 MMP에서는 안 보여요"
한 커머스 컨설팅 클라이언트가 메타 카탈로그 광고를 운영 중이었다. 메타 대시보드에서는 좋은 성과가 보였지만, 에어브릿지(MMP)에서는 전환이 1/10 수준만 트래킹되고 있었다.
이는 단순한 트래킹 문제가 아니라 실제 성과 측정 불가능 = 최적화 불가능을 의미했다.
문제의 근본 원인
카탈로그 데이터 파일을 분석한 결과, 두 가지 심각한 문제를 발견했다: (이 외에도 다양한 문제가 있었는데, AB180 측에서 공식 문서를 업데이트 예정에 있다)
1. 하드코딩된 링크
{
"id": "product_12345",
"link": "https://airbridge.io/xxxxx?campaign=old_campaign"
}
카탈로그 Data file의 link 필드에 특정 캠페인이 하드코딩되어 있었다.
결과: 신규 카탈로그 캠페인으로 유입된 사용자도 전부 하드코딩된 예전 캠페인으로 어트리뷰션되고 있었다.
2. 웹/앱 딥링크 분기 문제
하드코딩된 에어브릿지 링크에 웹/앱 딥링크 자동 분기 로직이 들어가 있었다.
결과: iOS에서 Universal Link/딥링크 보안 정책 때문에 "이 링크를 열겠습니까?" 시스템 경고가 뜨면서 사용자 이탈 발생.
해결: 필수 데이터 필드 6개 추가
메타 카탈로그는 기본 필드(id, title, description, image_link, link, price) 외에도 앱 딥링크 필드를 제공한다.
이 중에서도 applink.android_url 을 포함한 총 6개의 앱 관련 데이터 필드를 카탈로그에 추가했다:
{
"id": "product_12345",
"link": "https://example.com/product/12345",
"applink.ios_url": "myapp://product/12345",
"applink.ios_app_store_id": "123456789",
"applink.ios_app_name": "MyApp",
"applink.android_url": "myapp://product/12345",
"applink.android_package": "com.example.myapp",
"applink.android_app_name": "MyApp"
}
이렇게 앱 딥링크를 명시적으로 설정하면: - iOS/Android에서 앱이 설치되어 있으면 바로 앱으로 딥링크 - 앱이 없으면 웹 링크로 자동 fallback - MMP에서 정확한 어트리뷰션 추적 가능 - iOS 시스템 경고 없이 자연스러운 전환
성과
카탈로그 필드를 최적화한 결과, 기존에 성과가 좋았던 채널 대비 62% 더 좋은 ROAS를 기록했다.
- MMP 트래킹 정확도: 10% → 95%+
- iOS 이탈률 감소: 시스템 경고 제거로 유입 증가
- 정확한 상품별 성과 측정 가능 → 자동 입찰 최적화 정상 작동
한 걸음 더: 이미지 오버레이로 소재 품질 10배 향상
카탈로그 세팅을 고쳤으니 이제 소재의 질을 높일 차례였다.
문제: 상품 이미지만으로는 부족하다
순수 상품 이미지만 쓰면: - 가격 정보가 없어 클릭률 저조 - 할인율이 눈에 안 띄어 전환율 하락 - 브랜드 아이덴티티 부족
기존 솔루션의 한계: Smartly.io
예전에는 Smartly.io 같은 SaaS를 사용했다. 이 툴은 강력하지만 최소 수백만 원의 월 비용이 든다.
나는 2018년 국내 최초로 인하우스에서 이 솔루션을 구현했고, 2019년 컨설팅할 때 인턴과 함께 빠르게 재구현하여 스펜딩을 수십 배 늘리면서도 더 높은 ROI를 달성한 경험이 있었다.
Antigravity 솔루션: 핵심 기능만 구현
이번에도 같은 접근으로, 클라이언트의 GCP 환경에 맞춰 핵심 기능만 구현했다.
구현 아키텍처 (GCP + Cloud Run)
[매일 정해진 시간 (Cloud Scheduler)]
↓
[Cloud Run 컨테이너 트리거]
↓
[GCS 카탈로그 파일 다운로드]
↓
[새 product_id 감지]
↓
[image_link URL 추출]
↓
[Python Pillow로 오버레이 생성]
- 상품명 (title)
- 상품 설명 (description)
- 할인율 배지
↓
[GCS에 새 이미지 업로드]
↓
[카탈로그 파일의 image_link 업데이트]
핵심 코드 (Python + Pillow)
from PIL import Image, ImageDraw, ImageFont
import requests
from io import BytesIO
def create_overlay(image_url, title, description, discount_rate):
# 원본 이미지 다운로드
response = requests.get(image_url)
img = Image.open(BytesIO(response.content))
# 오버레이 레이어 생성
overlay = Image.new('RGBA', img.size, (255, 255, 255, 0))
draw = ImageDraw.Draw(overlay)
# 할인율 배지 (우측 상단)
if discount_rate > 0:
badge_text = f"{discount_rate}% OFF"
font_badge = ImageFont.truetype("Arial-Bold.ttf", 48)
# 배지 배경
draw.rectangle(
[(img.width - 200, 20), (img.width - 20, 100)],
fill=(255, 59, 48, 230) # 빨간색
)
draw.text(
(img.width - 110, 60),
badge_text,
fill=(255, 255, 255, 255),
font=font_badge,
anchor="mm"
)
# 상품명 + 설명 (하단)
font_title = ImageFont.truetype("Arial-Bold.ttf", 36)
font_desc = ImageFont.truetype("Arial.ttf", 24)
# 반투명 배경
draw.rectangle(
[(0, img.height - 150), (img.width, img.height)],
fill=(0, 0, 0, 180)
)
# 텍스트
draw.text((20, img.height - 120), title, fill=(255, 255, 255, 255), font=font_title)
draw.text((20, img.height - 60), description, fill=(255, 255, 255, 255), font=font_desc)
# 합성
result = Image.alpha_composite(img.convert('RGBA'), overlay)
return result
Cloud Run 배치 프로세스
from google.cloud import storage
import pandas as pd
from datetime import datetime
storage_client = storage.Client()
def daily_catalog_update(request):
"""Cloud Run 엔드포인트 (Cloud Scheduler가 호출)"""
bucket = storage_client.bucket('your-catalog-bucket')
# 1. GCS에서 카탈로그 다운로드
blob = bucket.blob('catalog.csv')
catalog_df = pd.read_csv(blob.download_as_text())
# 2. 기존 처리된 ID 로드
try:
processed_blob = bucket.blob('processed_ids.csv')
processed_ids = set(pd.read_csv(processed_blob.download_as_text())['id'])
except:
processed_ids = set()
# 3. 새 상품 필터링
new_products = catalog_df[~catalog_df['id'].isin(processed_ids)]
print(f"신규 상품 {len(new_products)}개 발견")
# 4. 각 상품 이미지 처리
for idx, row in new_products.iterrows():
try:
# 오버레이 생성
result_img = create_overlay(
image_url=row['image_link'],
title=row['title'],
description=row['description'],
discount_rate=row['discount_rate']
)
# GCS 업로드
img_buffer = BytesIO()
result_img.save(img_buffer, format='PNG')
img_buffer.seek(0)
new_filename = f"overlay_{row['id']}.png"
new_blob = bucket.blob(f'catalog-images/{new_filename}')
new_blob.upload_from_file(img_buffer, content_type='image/png')
# 카탈로그의 image_link 업데이트
new_image_url = f"https://storage.googleapis.com/your-catalog-bucket/catalog-images/{new_filename}"
catalog_df.loc[idx, 'image_link'] = new_image_url
processed_ids.add(row['id'])
except Exception as e:
print(f"오류 (상품 {row['id']}): {str(e)}")
# 5. 업데이트된 카탈로그 저장
updated_blob = bucket.blob('catalog_updated.csv')
updated_blob.upload_from_string(catalog_df.to_csv(index=False), content_type='text/csv')
processed_blob = bucket.blob('processed_ids.csv')
processed_blob.upload_from_string(
pd.DataFrame({'id': list(processed_ids)}).to_csv(index=False),
content_type='text/csv'
)
return {'status': 'success', 'processed': len(new_products)}, 200
구현 결과
- 비용 절감: Smartly.io 수백만원 → GCP + Python 월 10만원 미만
- 처리 속도: 신규 상품 등록 후 24시간 내 카탈로그 광고 자동 반영
- 유연성: 할인율, 재고, 시즌별 배지 등 자유롭게 커스터마이징
- 확장성: 수만 개 SKU도 무리 없이 처리


최근 메타는 4:5 ratio 노출을 테스트 중이다. 이 경우 Crop 되어 짤리거나 하단에 동일 컬러로 이미지를 생성하기 때문에 이상하게 보이는 경우가 있다. additional_image_link 에 4:5 사이즈 이미지를 넣어 보길 권한다
결론: 안드로메다 시대의 커머스 광고 전략
1. 소재 다각화는 선택이 아닌 필수
안드로메다 알고리즘은 다양한 소재를 먹이로 학습한다. 비슷한 메시지 20개보다 다른 가치 제안 6개가 낫다.
2. 커머스는 이미 무기를 갖고 있다
수천, 수만 개의 상품 = 수천, 수만 개의 소재. 카탈로그 광고로 이를 자동화하라.
3. 세팅이 80%다
카탈로그 링크 하나 잘못 세팅하면 전체 성과가 1/10로 떨어져보인다. MMP 연동, 딥링크 구조를 정확히 검증하라.
4. 이미지 품질로 차별화
순수 상품 이미지만으로는 부족하다. 오버레이로 정보를 더하되, 비싼 SaaS 없이도 Python + Pillow로 충분히 구현 가능하다.
5. 측정이 최적화의 시작
메타와 MMP의 수치가 크게 다르다면, 그건 측정 문제가 아니라 세팅 문제다. 먼저 고쳐라.
📞 카탈로그 광고 최적화 무료 상담
실제 클라이언트처럼 62%+ 성과 개선을 달성하고 싶으신가요?
카탈로그 광고 세팅을 함께 점검하고, 최적화 방향을 논의하는 30분 무료 상담을 제공합니다.
상담에서 다루는 내용: - 현재 카탈로그 세팅 진단 (필수 6개 딥링크 필드 체크) - MMP 트래킹 정확도 검증 방법 - 이미지 오버레이 구현 로드맵 - 예상 성과 개선폭 및 우선순위
상담 예약: - 📧 이메일로 문의하기 - 📅 30분 무료 상담 예약
Retention Inc. - 데이터 기반 스타트업 그로스 컨설팅