Meta 광고
Meta(Facebook) 광고 계정의 캠페인·광고세트·광고·저장된 타겟을 조회하고, 입력 데이터셋으로 캠페인·광고세트·광고를 등록하는 노드입니다.
설명
이 노드는 동작 모드(mode) 와 대상(level) 두 축으로 동작합니다.
| 캠페인 | 광고세트 | 광고 | 저장된 타겟 | |
|---|---|---|---|---|
| 조회(view) | ✅ | ✅ | ✅ | ✅ |
| 등록(create) | ✅ | ✅ | ✅ | ❌ |
조회 결과를 데이터 변환 노드로 가공한 뒤 다시 등록 모드에 연결하면, 조회 → 변환 → 재등록 흐름을 캔버스 안에서 완성할 수 있습니다.
조회해서 다시 등록하면 우리가 읽지 않는 설정이 전부 사라집니다. 실제 광고세트를 측정해보면 값이 들어있는 필드 26개 중 조회가 읽는 것은 13개입니다. bid_strategy, pacing_type, targeting_optimization_types 같은 것들이 안 읽히고, 재등록하면 조용히 기본값으로 리셋됩니다.
기존 캠페인을 변형해서 늘리는 작업이라면 Meta 광고 복제 노드를 쓰세요. Meta가 우리가 모르는 필드까지 전부 옮기고, 그 위에 바꿀 것만 덮어씁니다.
인증은 액세스 토큰을 노드 속성으로 직접 입력합니다. 별도의 계정 연동(OAuth) 절차가 없습니다.
Meta가 저장된 타겟(Saved Audience)에 대해 생성·수정·삭제 API를 제공하지 않습니다. 조회만 가능합니다.
새 타겟을 만들려면 Meta 광고 관리자에서 직접 만들어야 합니다. 다만 광고세트를 등록할 때 나이대·성별·지역을 직접 지정할 수 있고, 기존 저장된 타겟의 설정을 그대로 재사용할 수도 있습니다 (타겟팅 지정 방법 참고).
액세스 토큰 발급
Meta Marketing API를 호출할 수 있는 장기 토큰이 필요합니다.
- Meta 비즈니스 관리자에서 비즈니스 설정 → 사용자 → 시스템 사용자로 이동합니다
- 시스템 사용자를 추가하고, 대상 광고 계정에 권한을 부여합니다
- 광고를 등록할 거라면 페이지도 함께 할당합니다 (소재의
page_id) - 토큰 생성을 클릭하고 앱을 선택합니다
- 권한으로
ads_management를 선택합니다 (조회만 하면ads_read로 충분) - 만료 기간은 만료 안 함으로 두고, 생성된 토큰을 복사합니다 (한 번만 표시됩니다)
광고 계정 ID는 따로 찾지 않아도 됩니다. 토큰을 입력하면 접근 가능한 광고 계정 목록이 드롭다운에 자동으로 채워집니다.
액세스 토큰 입력란은 화면에서 •••• 로 가려지지만, 값 자체는 캔버스 데이터에 그대로 저장되며 노드를 실행할 때마다 실행 이력에도 사본이 남습니다. 캔버스를 공유받은 사용자는 토큰을 확인할 수 있고, 나중에 토큰을 교체해도 과거 이력의 옛 토큰은 남습니다.
- 개인 계정 토큰 대신 시스템 사용자 토큰을 사용하세요
- 필요한 최소 권한(
ads_read또는ads_management)만 부여하세요 - 캔버스를 외부와 공유할 때는 토큰을 비우거나 별도 계정의 토큰을 사용하세요
포트 구성
입력 포트
- 데이터셋 (선택): 등록할 데이터. 등록(create) 모드에서만 필요하며, 조회 모드에서는 연결하지 않아도 됩니다.
출력 포트
- 데이터셋:
- 조회 모드 — 조회한 목록
- 등록 모드 — 입력 행에 결과 ID 컬럼(
_meta_campaign_id/_meta_adset_id/_meta_ad_id,_meta_status)이 추가된 등록 결과
속성
액세스 토큰 (accessToken) · 광고 계정 (adAccountId)
토큰을 입력하면 광고 계정 드롭다운이 자동으로 채워집니다. 토큰이 잘못되었거나 권한이 없으면 그 자리에서 오류가 표시되므로, 노드를 실행해보기 전에 문제를 알 수 있습니다. 비활성 상태인 계정은 이름 뒤에 (비활성) 이 붙습니다.
동작 모드 (mode)
- 조회 (view) (기본값) / 등록 (create)
조회 대상 (level)
| 값 | 조회 시 | 등록 시 |
|---|---|---|
| 캠페인 (campaign) (기본값) | 캠페인 목록 | 캠페인 생성 |
| 광고세트 (adset) | 광고세트 목록 + 나이대·성별·지역 | 광고세트 생성 (나이대를 여기서 지정) |
| 광고 (ad) | 광고 목록 | 소재 + 광고 생성 |
| 저장된 타겟 (savedAudience) | 미리 만들어 둔 타겟 설정 | ❌ Meta 미지원 |
상태 필터 (statusFilter) — 조회 모드
전체 (기본값) / 게재 중(ACTIVE) / 일시 중단(PAUSED) / 보관됨(ARCHIVED). 저장된 타겟에는 적용되지 않습니다.
신규 항목 상태 (newAdStatus) — 등록 모드
- 일시 중단 (PAUSED) (기본값, 권장) / 즉시 게재 (ACTIVE)
Meta는 생성 시 ACTIVE 또는 PAUSED만 허용합니다. ACTIVE로 등록하면 심사 통과 직후 게재가 시작되고 실제 광고비가 지출됩니다. 기본값인 PAUSED로 등록한 뒤 광고 관리자에서 확인하고 직접 게재를 시작하는 것을 권장합니다. 워크플로우를 반복 실행하거나 스케줄로 자동 실행하는 경우 특히 주의하세요.
원본 타겟 JSON 포함 (includeRawTargeting)
광고세트·저장된 타겟 조회 시 Meta의 targeting 원본을 targeting__raw 컬럼(JSON)으로 함께 가져옵니다. 광고세트를 등록할 때 이 컬럼을 그대로 연결하면 타겟팅이 손실 없이 재사용됩니다.
최대 행 수 (maxRows)
조회 시 가져올 최대 행 수입니다. 기본값 1000.
조회 결과 컬럼
첫 컬럼은 항상 라운드트립 키입니다 — 등록 모드의 입력으로 그대로 연결할 수 있습니다.
| 대상 | 주요 컬럼 |
|---|---|
| 캠페인 | _meta_campaign_id, name, objective, status, buying_type, 예산, 게재 기간 |
| 광고세트 | _meta_adset_id, name, campaign_id, optimization_goal, billing_event, 예산, age_min, age_max, genders, geo_locations_countries |
| 광고 | _meta_ad_id, name, adset_id, campaign_id, creative_id, status |
| 저장된 타겟 | _meta_saved_audience_id, name, description, age_min, age_max, genders, 지역/관심사/행동, 예상 도달 상·하한, sentence_lines(Meta가 만든 요약 문구) |
광고세트와 저장된 타겟은 같은 컬럼 이름으로 나이대를 배출하므로 두 출력을 그대로 조인·비교할 수 있습니다.
등록 값 입력 방법
등록에 필요한 값은 노드에서 직접 입력하거나 입력 데이터셋의 컬럼으로 넣습니다. 둘 다 있으면 데이터셋 컬럼이 우선합니다.
| 상황 | 방법 |
|---|---|
| 1건만 등록 | 노드 속성만 채우고 실행 (입력 포트 연결 불필요) |
| 여러 건을 한 번에 | 데이터셋 컬럼으로 넣기 |
| 행마다 다른 값 + 공통 값 섞임 | 다른 값은 컬럼으로, 공통 값은 노드 속성으로 한 번만 |
노드 속성은 선택한 대상(level) 에 맞는 것만 표시됩니다. 아래 표의 컬럼명은 데이터셋을 쓸 때의 이름이며, 노드 속성으로 넣을 때는 같은 항목이 한글 라벨로 표시됩니다.
캠페인 등록
| 컬럼 (노드 속성) | 필수 | 설명 |
|---|---|---|
name | ✅ | 캠페인 이름 |
objective | ✅ | OUTCOME_TRAFFIC, OUTCOME_SALES, OUTCOME_AWARENESS 등 |
special_ad_categories | ⬜ | 특수 광고 카테고리. 생략 시 NONE |
daily_budget / lifetime_budget | ⬜ | 예산 (최소 화폐 단위, 원화는 원). 여기에 넣으면 캠페인 예산 최적화(CBO)가 됩니다 |
bid_strategy | ⬜ | LOWEST_COST_WITHOUT_CAP(최고 볼륨), LOWEST_COST_WITH_BID_CAP, COST_CAP 등 |
buying_type, start_time, stop_time | ⬜ | 그대로 전달 |
bid_strategy 도 같이 정하세요LOWEST_COST_WITH_BID_CAP 이나 COST_CAP 으로 잡히면 하위 광고세트마다 bid_amount 를 요구해서 광고세트 등록이 막힙니다. 입찰가 한도를 쓸 게 아니라면 LOWEST_COST_WITHOUT_CAP 으로 지정해두는 편이 안전합니다.
광고세트 등록
| 컬럼 (노드 속성) | 필수 | 설명 |
|---|---|---|
name | ✅ | 광고세트 이름 |
campaign_id | ✅ | 소속 캠페인. _meta_campaign_id 컬럼도 그대로 인정되므로 캠페인 노드 출력을 바로 연결하면 됩니다 |
billing_event | ✅ | IMPRESSIONS, LINK_CLICKS 등 |
optimization_goal | ✅ | LINK_CLICKS, REACH, OFFSITE_CONVERSIONS 등 |
daily_budget / lifetime_budget | 캠페인에 따라 | 아래 설명 참고 |
promoted_object | 목표에 따라 | 전환 최적화(OFFSITE_CONVERSIONS) 시 필수. {"pixel_id": "123", "custom_event_type": "PURCHASE"} 형태의 JSON |
countries | 타겟팅 필수 | 대상 국가 (KR, KR, JP) |
age_min / age_max | ⬜ | 나이대 |
genders | ⬜ | male / female / all |
advantage_audience | ⬜ | 어드밴티지 타겟(자동 확장). 기본값 0(사용 안 함), 1이면 켜짐 |
custom_audience_ids | ⬜ | 커스텀 오디언스 ID (쉼표 구분) |
targeting__raw | 타겟팅 대안 | 타겟팅 스펙 JSON. 있으면 위 개별 컬럼 대신 이것이 우선합니다 |
bid_amount, start_time, end_time | ⬜ | 그대로 전달 |
Meta는 양쪽에 예산이 있으면 거부합니다 — "광고 세트 예산 또는 캠페인 예산만 설정할 수 있습니다".
- 캠페인에 예산이 있으면(캠페인 예산 최적화, CBO) 광고세트에는 넣지 마세요
- 캠페인에 예산이 없으면 광고세트에
daily_budget또는lifetime_budget중 하나가 필요합니다
어느 쪽이 맞는지는 캠페인 설정에 달려 있어 노드가 미리 판단하지 않습니다. 잘못 넣으면 Meta의 오류 메시지가 그대로 표시됩니다.
Meta가 광고세트 생성 시 이 플래그를 필수로 요구합니다. 노드가 기본값 0(사용 안 함)으로 항상 채워 보내므로 따로 신경 쓸 필요는 없습니다.
0을 기본으로 둔 이유는 지정한 타겟을 그대로 지키기 위해서입니다. 1이면 Meta가 성과가 나올 것 같은 대상으로 타겟을 넓힙니다. targeting__raw로 기존 설정을 재사용할 때 원본에 값이 있으면 그 값을 유지합니다.
나이대를 지정하는 두 가지 방법:
- 직접 지정 —
countries+age_min/age_max/genders컬럼을 채웁니다 - 저장된 타겟 재사용 —
level=savedAudience+includeRawTargeting으로 조회한 뒤, 나온targeting__raw컬럼을 광고세트 등록 입력에 그대로 연결합니다
Meta는 광고세트에 저장된 타겟을 ID로 연결하는 방법을 제공하지 않습니다. 그래서 타겟팅 스펙 자체를 복사하는 방식(targeting__raw)을 씁니다. 이렇게 만든 광고세트는 원본 저장된 타겟과 연결이 유지되지 않으므로, 나중에 저장된 타겟을 수정해도 이미 만든 광고세트에는 반영되지 않습니다.
광고 등록
| 컬럼 (노드 속성) | 필수 | 설명 |
|---|---|---|
name | ✅ | 광고 이름 (제목이 아닙니다) |
adset_id | ✅ | 소속 광고세트. _meta_adset_id 컬럼도 그대로 인정되므로 광고세트 노드 출력을 바로 연결하면 됩니다 |
page_id | ✅ | 소재를 게시할 Facebook 페이지 ID |
link | ✅ | 랜딩 URL |
message | ✅ | 본문 문구 |
headline | ⬜ | 광고 제목 |
description, caption | ⬜ | 설명 / 표시 URL 문구 |
image_hash 또는 picture | ⬜ | 이미지 해시 또는 이미지 URL |
call_to_action_type | ⬜ | LEARN_MORE, SHOP_NOW 등 |
name 과 headline 을 혼동하지 마세요name은 광고 관리자에 표시되는 관리용 이름, headline은 사용자에게 보이는 광고 제목입니다.
image_hash 와 picture 는 함께 쓸 수 없습니다Meta가 상호 배타로 규정합니다. 같은 행에 둘 다 값이 있으면 실행 전에 오류로 안내합니다. 둘 다 비워 두면 Meta가 link 의 페이지에서 이미지를 자동으로 가져옵니다.
사용 방법
조회
- 노드를 캔버스에 추가하고 액세스 토큰을 입력합니다
- 채워진 드롭다운에서 광고 계정을 선택합니다
- 조회 대상을 고르고 실행하기를 클릭합니다
한 건만 빠르게 등록하기
- 동작 모드를 등록, 대상을 원하는 레벨로 바꿉니다
- 노드에 나타나는 속성(이름·목표·예산·나이대 등)을 채웁니다
- 실행하기 — 입력 포트를 연결하지 않아도 됩니다
캠페인 → 광고세트 → 광고 만들기
세 단계를 각각의 노드로 이어 붙입니다. 앞 단계가 배출한 _meta_*_id 를 다음 단계가 그대로 인정하므로 컬럼명을 바꾸는 중간 노드가 필요 없습니다. 다음 단계에 필요한 컬럼만 추가하면 됩니다.
[데이터 만들기] name, objective
→ [Meta 광고] 등록 / 캠페인 → _meta_campaign_id 배출
→ [데이터 변환] 광고세트용 컬럼 추가 (billing_event, optimization_goal, daily_budget, countries, age_min, age_max)
→ [Meta 광고] 등록 / 광고세트 → _meta_adset_id 배출
→ [데이터 변환] 광고용 컬럼 추가 (page_id, link, message, headline, picture)
→ [Meta 광고] 등록 / 광고 → _meta_ad_id 배출
앞 단계의 컬럼이 그대로 따라가기 때문에, 데이터 변환 노드에서 두 가지를 손봐야 합니다.
name— 세 레벨이 모두 이 컬럼을 쓰므로 그 단계에 맞는 이름으로 바꿔주세요daily_budget/lifetime_budget— 캠페인에 예산을 넣었다면 광고세트로 넘기기 전에 빼야 합니다. 안 빼면 예산이 양쪽에 들어가 Meta가 거부합니다
저장된 타겟의 나이대를 그대로 쓰기
[Meta 광고] 조회 / 저장된 타겟 (원본 타겟 JSON 포함 켜기)
→ targeting__raw 컬럼
→ [데이터 변환] name·campaign_id·billing_event·optimization_goal·daily_budget 컬럼 추가
→ [Meta 광고] 등록 / 광고세트
주의사항
Meta가 계정 단위 생성 한도를 별도로 적용하고, 광고는 행당 2번의 API 호출(소재 + 광고)이 발생합니다. 100행을 초과하면 오류로 안내하므로 데이터를 나눠서 실행하세요.
등록은 행 순서대로 진행되며 오류가 나면 그 지점에서 멈춥니다. 이미 등록된 이전 행은 남아 있습니다. 오류 메시지에 몇 번째 행에서 멈췄는지 표시되므로, 데이터를 수정한 뒤 남은 행만 다시 실행하세요.
광고 등록에서 소재는 만들어졌지만 광고 생성이 실패한 경우, 사용되지 않은 소재가 계정에 남습니다. 과금되지는 않으며 실행 로그의 소재 ID로 광고 관리자에서 정리할 수 있습니다.
Meta의 ID는 18자리(120249405806820238)라 숫자 타입으로는 정확히 담기지 않습니다. 스프레드시트나 CSV에서 숫자로 읽히면 뒷자리가 바뀌어 다른 광고를 가리키게 됩니다.
노드가 이 경우를 감지해 실행 전에 오류로 알려주므로 잘못된 대상에 등록되는 일은 없습니다. 안내가 뜨면 해당 컬럼을 문자열(텍스트) 타입으로 바꿔주세요. 조회 모드가 배출하는 _meta_*_id 컬럼은 항상 문자열이라 그대로 이어 쓰면 안전합니다.
계정에 해당 항목이 없는 것입니다. 예를 들어 캠페인과 광고세트만 만들어 둔 계정에서 조회 대상을 광고로 두면 0행이 나옵니다. 조회 대상을 바꿔서 확인해보세요.
Meta는 광고 계정 단위로 API 호출 한도를 적용합니다. 한도에 걸리면 노드가 자동으로 잠시 기다린 뒤 재시도하며, 회복까지 오래 걸리면 "약 N분 후 다시 시도해주세요" 안내와 함께 종료합니다.