Skip to main content

Meta 광고 복제

기존 캠페인·광고세트·광고를 복제하면서 지정한 값만 덮어쓰는 노드입니다.


설명

반복 업무를 그대로 자동화하는 노드입니다. 광고를 처음부터 만드는 대신 잘 돌아가는 캠페인을 복제하고 이름·타겟·소재만 바꿉니다.

조회해서 다시 등록하는 방식과 다릅니다. 재등록은 우리가 읽지 않는 설정을 전부 잃지만, 복제는 Meta가 우리가 모르는 필드까지 전부 그대로 옮깁니다.

이 노드는 값을 조립하지 않습니다

입력 데이터셋의 컬럼 이름이 곧 Meta Graph API 파라미터 이름이고, 셀 값이 곧 요청 본문입니다.

노드가 하는 일은 두 가지뿐입니다 — 컬럼을 어느 엔드포인트로 보낼지 가르고, 복제 결과 ID를 다음 호출에 이어주는 것.

그래서 Meta가 파라미터를 추가해도 노드를 고칠 필요가 없습니다. 반대로 노드가 대신 판단해주지도 않습니다. Meta 문서에 있는 값을 그대로 넣으면 그대로 나갑니다.


포트 구성

입력 포트

  • 데이터셋 (필수): 무엇을 어떻게 복제할지 담은 데이터. 이 노드는 속성으로 값을 받지 않으므로 입력이 반드시 필요합니다.

출력 포트

  • 데이터셋: 입력 행에 결과 ID 컬럼 3개가 추가된 복제 결과

속성

액세스 토큰과 광고 계정 두 가지뿐입니다. 토큰을 입력하면 광고 계정 드롭다운이 자동으로 채워집니다.

발급 절차와 보안 주의사항은 Meta 광고 문서와 같습니다.

토큰은 캔버스에 평문으로 저장됩니다

입력란은 화면에서 •••• 로 가려지지만 값 자체는 캔버스 데이터에 그대로 저장되고 실행 이력에도 사본이 남습니다. 시스템 사용자 토큰을 최소 권한(ads_management)으로 발급해 쓰세요.


입력 컬럼

컬럼 이름 규칙 — <엔드포인트>.<파라미터>

점 앞은 어느 API 호출인지, 점 뒤는 Meta 파라미터 이름 그대로입니다.

컬럼보내는 곳
source_id복제할 원본 ID (필수) — POST /{여기}/copies
levelcampaign / adset / ad (선택) — 응답 검증용
copies.*POST /{source_id}/copies 의 본문
campaign.*POST /{복제된 캠페인 ID}
adset.*POST /{복제된 광고세트 ID}
ad.*POST /{복제된 광고 ID}

점이 없는 컬럼은 전부 무시합니다. 조회 노드의 출력이나 담당자 메모가 같은 데이터셋에 섞여 있어도 Meta로 새어나가지 않습니다.

값 규칙

넣는 값나가는 값
PAUSED문자열 그대로
50000문자열 그대로 (Meta가 해석)
true / falseMeta가 받는 "true" / "false"
{"age_min":35,...}JSON으로 파싱해서 전달
["HOUSING"]배열도 동일
빈 칸보내지 않음 — 원본이 유지됩니다

객체나 배열은 JSON 문자열로 넣습니다. 형식이 깨져 있으면 Meta에 보내기 전에 컬럼 이름과 함께 오류로 알려줍니다.

자주 쓰는 파라미터

Meta 문서를 그대로 따르므로 아래는 전체 목록이 아니라 시작점입니다.

컬럼설명
copies.deep_copytrue 면 하위 광고세트·광고까지 함께 복제 — 단 총 개체 2개까지 (동기 복사 한도 참고)
copies.status_optionPAUSED / ACTIVE / INHERITED_FROM_SOURCE
copies.rename_options{"rename_prefix":"[복제] ","rename_strategy":"ONLY_TOP_LEVEL_RENAME"}
copies.campaign_id광고세트 복제 시 넣을 캠페인
campaign.name / adset.name / ad.name레벨별 새 이름
adset.targeting타겟 스펙 전체
adset.daily_budget일 예산
ad.creative소재 스펙 전체

전체 파라미터는 Meta 문서를 참고하세요 — 캠페인 · 광고세트 · 광고


안 준 값은 원본이 유지됩니다

복제는 Meta가 원본을 통째로 옮기는 것이라, 컬럼을 비워두면 그 설정은 원본 그대로입니다. 타겟만 바꾸는 행과 이름만 바꾸는 행을 한 데이터셋에 섞을 수 있습니다.

adset.targeting 은 전체를 보내야 합니다

Meta는 광고세트 타겟을 수정할 때 보낸 값으로 전체를 대체합니다. 이 노드는 값을 조립하지 않으므로 병합해주지 않습니다.

{"age_min": 35} 만 보내면 아래가 전부 사라집니다.

  • 노출 위치 — Facebook 피드·릴스·Marketplace·프로필, Instagram 피드·탐색·프로필, Threads 피드
  • 관심사·행동 타겟, 제외 타겟
  • 언어, 기기(모바일/데스크톱)
  • 어드밴티지 타겟 설정

나이만 바꾸고 싶다면 원본 전체를 받아서 그 값만 고쳐 넣으세요.

[Meta 광고] 조회 / 광고세트 (원본 타겟 JSON 포함 켜기)
→ targeting__raw 컬럼에 전체 스펙이 들어옵니다
→ [데이터 변환] age_min 만 고쳐서 adset.targeting 컬럼으로
→ [Meta 광고 복제]

타겟을 안 바꿀 거라면 adset.targeting 컬럼 자체를 비워두세요 — 원본이 그대로 유지됩니다.

ad.creative 도 같습니다

소재를 보내면 Meta는 새로 만들 뿐 원본과 병합하지 않습니다. 게시 주체(페이지·Instagram 계정), 배치별 소재 규칙(asset_feed_spec), 소재 자동 개선 설정(degrees_of_freedom_spec)이 지정하지 않으면 사라집니다.

원본 소재를 먼저 조회해서 바꿀 부분만 고쳐 넣으세요. 배치별 소재를 바꿀 때는 copies.creative_parametersasset_feed_spec 전체(자산 + asset_customization_rules)를 담아 보냅니다.


하위까지 복제하기 — 동기 복사 한도

Meta는 복제 호출 한 번이 만드는 개체(캠페인·광고세트·광고 합산)를 총 3개 미만, 즉 최대 2개로 제한합니다(실API 확인, 2026-08-06). 그래서 1 캠페인 : 1 광고세트 : 1 광고 구조에서 캠페인에 copies.deep_copy=true 를 주면 3개가 되어 항상 이 오류가 납니다:

복사 요청이 너무 많음: … 한 번에 복사할 수 있는 광고, 광고 세트, 캠페인의 최대 총 개수는 3개 미만입니다.

해결은 층별 복제입니다. 캠페인은 캠페인만 복제하고(1개), 광고세트를 deep_copy 로 새 캠페인에 이어 붙입니다(광고세트+광고 = 2개, 한도 안):

[Meta 광고 복제 ①] 캠페인만
source_id=원본 캠페인, campaign.name=새 이름 → _meta_copied_campaign_id
[데이터 변환] copies.campaign_id ← _meta_copied_campaign_id
[Meta 광고 복제 ②] 광고세트+광고
source_id=원본 광고세트, copies.deep_copy=true,
copies.campaign_id=①의 결과, adset.targeting=...

deep_copy 응답에는 ad_object_ids 로 새 하위 ID가 오고, 노드는 그 ID로 adset.* / ad.* 를 이어 붙입니다. adset.* 컬럼이 있는데 광고세트가 복제되지 않았으면 실행 전에 알려줍니다.

1 캠페인 : 1 광고세트 : 1 광고를 전제합니다

하위가 여러 개인 캠페인을 deep_copy 하면 응답에 광고세트·광고가 여럿 옵니다. 이때는 첫 번째만 사용하고 로그로 알립니다adset.* 컬럼 하나로는 어느 것을 가리키는지 정할 수 없기 때문입니다.


결과 컬럼과 재실행

컬럼내용
_meta_copied_campaign_id복제된 캠페인
_meta_copied_adset_id복제된 광고세트
_meta_copied_ad_id복제된 광고
복제는 멱등하지 않습니다

그냥 다시 돌리면 캠페인이 하나 더 생깁니다.

그래서 결과 컬럼이 채워져 있으면 복제 호출을 건너뜁니다. 실패한 행을 결과 컬럼째 그대로 다시 실행하면 이미 만든 객체를 재사용하고 수정 호출만 다시 보냅니다(수정은 멱등합니다).

행 순서대로 진행하다 오류가 나면 그 지점에서 멈추고, 이미 복제된 이전 행은 남아 있습니다. 오류 메시지에 몇 번째 행인지 표시됩니다.


예제

이름과 타겟만 바꾸기 (층별 2단계)

복제 ① — 캠페인만:

[
{
"source_id": "120249014737860175",
"level": "campaign",
"copies.status_option": "PAUSED",
"campaign.name": "daybarrier_260806_고민하지마리쥬"
}
]

복제 ② — 광고세트+광고를 ①의 캠페인으로 (copies.campaign_id 는 ①의 _meta_copied_campaign_id 를 데이터 변환으로 이어 붙임):

[
{
"source_id": "120249014737860481",
"level": "adset",
"copies.deep_copy": "true",
"copies.campaign_id": "①의 _meta_copied_campaign_id",
"copies.status_option": "PAUSED",
"adset.name": "daybarrier_260806_고민하지마라_전체35+",
"adset.targeting": "{\"age_min\":35,\"age_max\":65,\"geo_locations\":{\"countries\":[\"KR\"]},\"publisher_platforms\":[\"facebook\",\"instagram\"]}",
"ad.name": "daybarrier_260806_고민하지마리쥬_소재A"
}
]

영상까지 바꾸기

노드를 이어 붙입니다.

[데이터 만들기] 영상 URL 목록
→ [Meta 광고 영상 업로드] → _meta_video_id
→ [데이터 변환] copies.creative_parameters 조립
(object_story_spec + asset_feed_spec: 새 video_id·thumbnail_url·문구·배치 규칙)
→ [Meta 광고 복제]

주의사항

한 번에 100행까지

행당 복제 1번 + 레벨별 수정 최대 3번의 API 호출이 발생합니다. 100행을 초과하면 오류로 안내하므로 데이터를 나눠서 실행하세요.

원본에 오류가 있으면 복제도 실패합니다

복제는 원본의 소재를 새로 만들면서 진행됩니다. 원본 광고가 광고 관리자에서 문제 있음(WITH_ISSUES) 상태면 — 예: "크리에이티브를 만드는 중에 내부 오류"(1815479) — 복제도 같은 오류로 실패합니다. Meta가 이 오류를 일시 오류처럼 안내하지만 원본이 고장난 경우 재시도해도 소용없으니, 복제 전에 원본 광고가 정상 게재 가능한 상태인지 확인하세요.

ID 컬럼은 반드시 문자열이어야 합니다

Meta의 ID는 18자리(120249405806820238)라 숫자 타입으로는 정확히 담기지 않습니다. 스프레드시트나 CSV에서 숫자로 읽히면 뒷자리가 바뀌어 다른 광고를 복제하게 됩니다.

노드가 이 경우를 감지해 실행 전에 오류로 알려줍니다. 안내가 뜨면 해당 컬럼을 문자열(텍스트) 타입으로 바꿔주세요.

copies.status_option 을 ACTIVE 로 두면 즉시 과금됩니다

심사 통과 직후 게재가 시작되고 실제 광고비가 지출됩니다. 비워두면 Meta 기본값을 따르므로, PAUSED 를 명시하고 광고 관리자에서 확인한 뒤 직접 게재를 시작하는 것을 권장합니다. 스케줄로 자동 실행하는 경우 특히 주의하세요.

요청 한도(rate limit)

Meta는 광고 계정 단위로 API 호출 한도를 적용합니다. 한도에 걸리면 노드가 자동으로 잠시 기다린 뒤 재시도하며, 회복까지 오래 걸리면 "약 N분 후 다시 시도해주세요" 안내와 함께 종료합니다.