입찰가 값

이 API는 허용 리스트에 있는 파트너와 광고주만 제한적으로 사용할 수 있습니다. 이 API를 사용하려면 Meta 담당자에게 문의하세요.

입찰가 값을 사용하면 광고주는 필요한 타겟 세그먼테이션의 개수를 줄일 수 있습니다. 하나의 타겟 대상으로 단일 광고 세트 내에서 세밀한 입찰 전략을 유지할 수 있기 때문입니다. 예를 들어 광고주는 단일 광고 세트를 만든 다음, 입찰가 값을 사용하여 각각의 최근성 버킷에 다르게 입찰할 수 있습니다.

일반적으로 광고주는 여러 타겟 세그먼트에 다르게 입찰하려고 광고 세트를 만듭니다. 예를 들어 광고주는 3개의 다른 연령대(18~25세, 26~35세, 36~65세)에 해당하는 3개의 광고 세트를 만들 수 있습니다.

주택, 고용 및 신용 광고를 게재하고 미국에 위치하는 광고주 또는 미국을 타게팅하는 광고를 게재하는 광고주는 입찰가를 조정하는 데 사용할 수 있는 타겟 카테고리의 하위 집합과 제한 사항이 다릅니다. 주택, 고용 및 신용 캠페인은 age, gender, locale, home_location, user_bucket 및 유사 custom_audience(유사 타겟에서 파생된 맞춤 타겟)의 타겟 카테고리에 대해 입찰가를 조정할 수 없습니다. 특별 광고 카테고리를 참조하세요.

2023년 1월 30일부터 타사 데이터 카테고리(booking_window, custom_audience(유사 맞춤 타겟 포함), lengthofstay, travelstartdate, travelstartdayofweek, user_recency, user_bucket)가 포함된 입찰가 값을 사용하는 광고는 더 이상 옵트아웃한 사용자에게 게재되지 않습니다.

입찰가 값 모범 사례

  • 복잡한 맞춤 입찰 전략을 사용합니다(수많은 타겟 세그먼트나 광고 세트를 만들 필요 없음). 이런 방법을 사용하면 캠페인의 세그먼트를 과도하게 분할하여 비교적 소규모의 타겟으로 수많은 광고 세트를 만들지 않으면서도 광고 전송 효과를 높일 수 있습니다.
  • 입찰가 값은 목표에 적용되지 않습니다. 입찰가 값은 APP_INSTALLS, CLICKS, LANDING_PAGE_VIEWS, LEAD_GENERATION, OFFSITE_CLICKS, OFFSITE_CONVERSIONS의 최적화에 적용됩니다.
  • 예전에는 3개의 다른 연령대에 대해 3개의 광고 세트를 만들고 각 광고 세트에 대해 개별적으로 입찰할 수 있었습니다. 하나의 광고 세트를 생성하고 입찰 승수를 사용하여 각 나이 집단에 다르게 입찰할 수 있습니다. 입찰 승수는 0.09~1.0입니다.
  • 입찰가 값은 단일 user_groups 키 아래에 지정해야 합니다.

참고: 모든 입찰 전략은 입찰가 값(구체적으로 입찰가 한도, 비용 한도, 최저 비용)이 지원됩니다.

타겟 카테고리 설정

입찰가 값을 사용하여 타겟 카테고리를 정의하고 각 타겟 카테고리에 입찰가 값을 할당할 수 있습니다. 타겟 카테고리는 사용자 인구 통계학적 정보, 사용자 기기, 광고주 맞춤 데이터로 정의됩니다. 주택, 고용 또는 신용 캠페인은 age, gender, locale, home_location, user_bucket 및 유사 custom_audience(유사 타겟에서 파생된 맞춤 타겟)의 타겟 카테고리에 대해 입찰가를 할당할 수 없습니다.

우선순위설명

age

나이 또는 연령대에 따라 다르게 입찰합니다. (주택, 고용 및 신용 캠페인에는 사용할 수 없습니다.)

booking_window

여행 시작까지 남은 일수에 따라 다르게 입찰합니다.

custom_audience

사용자가 속한 custom_audience에 따라 입찰합니다. 이 옵션에서 유사 타겟이 지원됩니다. 단, 주택, 고용 및 신용 캠페인은 제외됩니다.

device_platform

사용자 기기 플랫폼(예: 모바일, 데스크톱)에 따라 다르게 입찰합니다.

gender

성별에 따라 다르게 입찰합니다. (주택, 고용 및 신용 캠페인에는 사용할 수 없습니다.)

home_location

사용자의 home_location에 따라 입찰합니다. 이는 현재 자택의 위치를 나타냅니다. home_location 승수는 도시, 지역, 국가로 나눌 수 있습니다. (주택, 고용 및 신용 캠페인에는 사용할 수 없습니다.)

lengthofstay

여행 시작과 종료 사이의 일수에 따라 입찰합니다.

locale

로캘(예: 영어, 스페인어)에 따라 다르게 입찰합니다. (주택, 고용 및 신용 캠페인에는 사용할 수 없습니다.)

position_type

광고 게재 위치에 따라 입찰합니다(예: facebook_feed, facebook_marketplace, instagram_story).

publisher_platform

publisher_platform(예: facebook, instagram, audience_network, messenger)에 따라 입찰합니다.

travelstartdate

여행 시작 날짜에 따라 다르게 입찰합니다(예: 20181231은 2018년 12월 31일).

travelstartdayofweek

여행이 시작되는 요일에 따라 입찰합니다(예: 0은 월요일, 6은 일요일).

user_bucket

광고주의 픽셀 실행 또는 앱 이벤트에 정의된 user_bucket 값에 따라 입찰합니다. user_bucket 필드는 0~100까지 정수로 표현된 선택적 매개변수입니다. (주택, 고용 및 신용 캠페인에는 사용할 수 없습니다.)

user_device

user_device(예: iPhone)에 따라 입찰합니다. user_device를 참조하세요.

user_os

user_os(예: iOS, Android)에 따라 입찰합니다.

user_recency

사용자가 사이트나 앱을 마지막으로 방문한 시점에 따라 입찰합니다.

age

연령대에 따라 사용자를 그룹화합니다(예: 18-25, 26-35). 예를 들어 입찰가가 최대 USD 5인 광고 세트의 경우, 사용자 나이가 18~25세이면 USD 2.5를 입찰하고, 사용자 나이가 26~40세이면 USD 3.5를 입찰하고, 그 외에 나머지 사용자는 USD 5를 입찰합니다. 참고: 기본값은 선택 사항입니다. 1.0을 승수로 적용할 수 있습니다.

{
    "user_groups": {
      "age": {
        "18-25": 0.5,
        "26-40": 0.7,
        "default": 1.0
      }
    }
}

booking_window

가능한 분석 데이터 값에는 1 이상의 모든 정수가 포함됩니다. 예를 들어 1-3, 4-9 등입니다.

curl -X POST \ 
  -F 'bid_adjustments=
     {"user_groups":{"booking_window":{"event_sources":["123456789"],"1-2":0.1,"3-5":0.2,"default":0.5}}}' \ 
  -F 'access_token='$access_token \ 
  https://graph.facebook.com/<API_VERSION>/<ad_set_id>

여행 승수 예시도 참조하세요.

custom_audience

2023년 1월 30일부터 타사 데이터 카테고리(booking_window, custom_audience(유사 맞춤 타겟 포함), lengthofstay, travelstartdate, travelstartdayofweek, user_recency, user_bucket)가 포함된 입찰가 값을 사용하는 광고는 더 이상 옵트아웃한 사용자에게 게재되지 않습니다.

맞춤 타겟에 따라 입찰가를 조정할 수 있습니다.

curl -X POST \ 
  -F 'bid_adjustments=
     {"user_groups":{"custom_audience":{"<CUSTOM_AUDIENCE_ID>":0.8, "<CUSTOM_AUDIENCE_ID>":1.0, "default":0.5}}}' \ 
  -F 'access_token='$access_token \ 
  https://graph.facebook.com/<API_VERSION>/<ad_set_id>

device_platform

가능한 분석 데이터 값은 다음과 같습니다.

  • mobile
  • desktop

{
  "user_groups": {
    "device_platform": {
      "mobile": 0.7,
      "desktop": 0.9
    }
  }
}

gender

성별에 따라 사용자를 그룹화합니다.

{
  "user_groups": {
    "gender": {
      "male": 0.5,
      "female": 0.7,
      "default": 1.0
    }
  }
}

home_location

가능한 분석 데이터 값은 다음과 같습니다.

  • city id
  • region id
  • 2자리 국가 코드

검색 API에서 city idregion id를 찾을 수 있습니다. 그래프 API 탐색기 또는 터미널에서 쿼리할 수 있습니다.

참고:defaultcities, regions 또는 countries가 아니라 home_location에서만 설정할 수 있습니다.

{
  "user_groups": {
    "home_location": {
      "cities": {
         "2420605": 0.2
      },
      "regions": {
         "3847": 0.5
      },
      "countries": {
         "US": 0.2
      },
      "default": 0.8
     }
  }
}

length_of_stay

가능한 분석 데이터 값에는 1 이상의 모든 정수가 포함됩니다. 예를 들어 “1-3”, “4-9” 등입니다.

curl -X POST \ 
  -F 'bid_adjustments=
  {"user_groups":{"length_of_stay":{"event_sources":["123456789"],"1-2":0.1,"3-     5":0.2,"default":0.5}}}' \ 
  -F 'access_token='$access_token \ 
  https://graph.facebook.com/<API_VERSION>/<ad_set_id>

여행 승수 예시도 참조하세요.

locale

로캘 또는 로캘 그룹 ID(예: 미국 영어는 6, 독일은 5)를 사용할 수 있습니다.

타게팅 검색, 로캘에서 type=adlocale로 로캘 ID를 찾을 수 있습니다. 예를 들면 다음과 같습니다.

{
  "user_groups": {
    "locale": {
      6: 0.8,
      5: 0.3
    }
  }
}

position_type

이 카테고리는 타게팅 API의 위치 옵션과 유사합니다. 가능한 분석 데이터 값은 다음과 같습니다.

노출 위치

Facebook 피드

facebook_feed

Facebook Marketplace

facebook_marketplace

Facebook 동영상 피드

facebook_suggested_video

Facebook 오른쪽 칼럼

facebook_right_hand_column

Facebook 비즈니스 둘러보기

facebook_biz_disco_feed

Instagram 피드

instagram_stream

Instagram 프로필 피드

instagram_profile_feed

Instagram 둘러보기

instagram_explore

Instagram 둘러보기 홈

instagram_explore_home

Messenger 받은 메시지함

messenger_messenger_home

Instagram 스토리

instagram_story

Facebook 스토리

facebook_story

Messenger 스토리

messenger_story

Instagram 릴스

instagram_reels

Facebook 릴스

facebook_facebook_reels

Facebook 인스트림 동영상

facebook_instream_video

Facebook 릴스 광고

facebook_facebook_reels_overlay

Facebook 검색 결과

facebook_search

Instagram 검색 결과

instagram_ig_search

Messenger 홍보 메시지

지원되지 않음

Audience Network 네이티브, 배너 및 전면 광고

audience_network_classic

Audience Network 보상형 동영상

audience_network_rewarded_video

Audience Network 인스트림 동영상

지원되지 않음

{
  "user_groups": {
    "position_type":{
        "facebook_feed":0.9,
        "messenger_messenger_home":0.7,
        "instagram_stream":0.8,
        "audience_network_classic":0.5,
        "default":0.4
    }
  }
}

publisher_platform

가능한 분석 데이터 값은 다음과 같습니다.

  • facebook
  • instagram
  • audience_network
  • messenger

{
  "user_groups": {
    "publisher_platform": {
      "facebook": 0.7,
      "instagram": 0.9,
      "default": 1.0 // We'll apply bid multiplier 1.0 if no default is specified anyway
    }
  }
}

travel_start_date

가능한 분석 데이터 값에는 _yyyymmdd_-_yyyymmdd_ 형식의 모든 데이터 범위가 포함됩니다.

curl -X POST \ 
  -F 'bid_adjustments=
     {"user_groups":{"travel_start_date":{"event_sources":["123456789"],"20180901-20181001":0.2,"default":0.9}}}' \ 
  -F 'access_token='$access_token \ 
  https://graph.facebook.com/<API_VERSION>/<ad_set_id>

여행 승수 예시도 참조하세요.

travel_start_day_of_week

가능한 분석 데이터 값에는 0~6 사이의 모든 정수가 포함됩니다(예: 0은 월요일, 6은 일요일).

curl -X POST \ 
  -F 'bid_adjustments=
  {"user_groups":{"travel_start_day_of_week":{"event_sources":        ["123456789"],"0":0.1,"2":0.2,"6":0.3,"default":0.9}}}' \ 
  -F 'access_token='$access_token \ 
  https://graph.facebook.com/<API_VERSION>/<ad_set_id>

여행 승수 예시도 참조하세요.

user_bucket

자신의 사용자 분류 기술의 결과를 Facebook으로 보낼 수 있습니다. 그런 다음, 픽셀 실행 또는 앱 이벤트에서 추가적 user_bucket 매개변수를 전송합니다. 사용자 버킷은 0~100 사이의 정수입니다.

다음과 같은 형식으로 사용자 버킷 그룹 정의를 지정합니다.

  • event_sources - 추적하려는 픽셀 실행 또는 앱 이벤트 소스입니다.
  • event_retention - 선택 사항. 이전 user_bucket 값을 무시하는 시간(초)입니다.
  • events_dedup_mode - 선택 사항. 단일 이벤트 소스에서 동일한 사용자에게 다른 user_bucket 값을 전송할 때 사용할 user_bucket 값을 나타내는 플래그입니다. 기본값은 latest입니다.
  • event_source_preference - 선택 사항. 여러 이벤트 소스에서 동일한 사용자에게 다른 user_bucket 값을 전송할 때 사용할 user_bucket을 나타내는 플래그입니다. 기본값은 latest입니다.

{
  "user_groups": {
   "user_bucket": {
      "event_sources": [<pixel_id>,<app_id>,...],
      "event_retention": 604800, // optional, exclude old events
      
      //optional, useful when multiple event sources have user_bucket
      "events_dedup_mode": "max"|"min"|"latest",
      
      //optional, dedup user_bucket values sent from one single event source
      "event_source_preference": "max"|"min"|"latest",
      
      "1":0.7, // these are the bid multipliers
      "2":1.0,
     }
  }
}

user_device

가능한 분석 데이터 값은 다음과 같습니다.

  • iPad
  • iPhone

다른 사용 가능한 값은 타게팅 검색 API에서 type=adTargetingCategoryclass=user_device로 확인하세요.

{
  "user_groups": {
    "user_device": {
      "iPad": 0.7,
      "iPhone": 0.9,
      "default": 1.0
    }
  }
}

curl
  -F 'name=Test BM Adset '$(date +%s) \
  -F 'bid_amount=3000' \
  -F 'billing_event=IMPRESSIONS' \
  -F 'optimization_goal=OFFSITE_CONVERSIONS' \
  -F 'daily_budget=15000' \
  -F 'campaign_id=23843038336220329' \
  -F 'promoted_object={"product_set_id":"267888283975766"}' \
  -F 'targeting={
     "geo_locations": {"countries":["AQ"]},
     "dynamic_audience_ids": ["23842885952670329"],
     "publisher_platforms": ["facebook"]
    }' \
  -F 'bid_adjustments={"user_groups":{"user_device": {"iPad": 0.7, "iPhone": 0.9, "default": 1.0}}}' \
  -F 'status=PAUSED' \
  -F 'access_token='$access_token \
  https://graph.facebook.com/<API_VERSION>/act_1653439931385336/adsets

curl
  -F 'name=Test BM Adset '$(date +%s) \
  -F 'bid_amount=3000' \
  -F 'billing_event=IMPRESSIONS' \
  -F 'optimization_goal=OFFSITE_CONVERSIONS' \
  -F 'daily_budget=15000' \
  -F 'campaign_id=23843038336220329' \
  -F 'promoted_object={"product_set_id":"267888283975766"}' \
  -F 'targeting={
     "geo_locations": {"countries":["AQ"]},
     "dynamic_audience_ids": ["23842885952670329"],
     "publisher_platforms": ["facebook"]
     }' \
  -F 'bid_adjustments={"user_groups":{"user_device": {"iPad": 0.7, "iPhone": 0.9, "default": 1.0}}}' \
  -F 'status=PAUSED' \
  -F 'access_token='$access_token \
   https://graph.facebook.com/<API_VERSION>/act_1653439931385336/adsets
   {"id":"23843038339320329"}

curl
  -F 'access_token='$access_token \
  https://graph.facebook.com/VERSION/ID?fields=bid_adjustments
  {"bid_adjustments":{"user_groups":"{\"user_device\":    {\"default\":1,\"iPad\":0.7,\"iPhone\":0.9}}"},"id":"ID"}

고급 예시도 참조하세요.

user_group_weight_spec

가능한 분석 데이터 값은 다음과 같습니다.

  • age
  • gender
  • device_platform
  • publisher_platform
  • user_device
  • user_os

고급 예시도 참조하세요.

- user_group_weight_spec은 JSON 구조이며, 다음과 같은 형식입니다.

{
  <BREAKDOWN_NAME>: {
    <BREAKDOWN_VALUE_1>: <WEIGHT_VALUE> OR <NESTED_USER_GROUP_WEIGHT_SPEC>,
    <BREAKDOWN_VALUE_2>: <WEIGHT_VALUE> OR <NESTED_USER_GROUP_WEIGHT_SPEC>,
    <BREAKDOWN_VALUE_3>: <WEIGHT_VALUE> OR <NESTED_USER_GROUP_WEIGHT_SPEC>,
    ...
    "default": <WEIGHT_VALUE> OR <NESTED_USER_GROUP_WEIGHT_SPEC>, // optional, if not specified, we'll use 1.0
  }
}
{
  "age": {
    "18-25": 0.7,
    "26-35": {
      "gender": {
        "male": 0.9,
        "female": 1.0
      }
    },
    "default": 0.85
  }
}

* For users between the ages of 18 and 25, we apply bid multiplier 0.7.
* For male users between the ages of 26 and 35, we apply bid multiplier 0.9.
* For female users between the ages of 26 and 35, we apply bid multiplier 1.0.
* For all other users, we apply bid multiplier 0.85.

분석 데이터 값은 정수 나이 범위입니다. 예를 들어 18~25세는 최소 나이가 18세이고, 범위는 서로 중첩되지 않습니다.

{
  "user_groups": {
    "age": {
      "18-25": 0.7,
      "30-40": 1.0,
      "default": 0.3
    }
  }
}

고급 예시

> curl 
    -F 'bid_adjustments={"user_groups":{"user_device":{"iPad":0.3,"iPhone":{"user_os":{"Android":0.3,"iOS":{"age":{"18-35":0.3,"35-45":0.4}}}}}}}' -F access_token=$token https://graph.intern.facebook.com/v2.12/6089875504114
{"success":true}%
> curl -G 
   -d access_token=$token https://graph.intern.facebook.com/v2.12/6089875504114\?  fields\=bid_adjustments
{"bid_adjustments":{"user_groups":"{\"user_device\":{\"iPad\":0.3,\"iPhone\":{\"user_os\":{\"Android\":0.3,\"iOS\":{\"age\":{\"18-35\":0.3,\"35-45\":0.4}}}}}}"},"id":"6089875504114"}%

여행 승수 예시

curl -X POST \
  -F 'bid_adjustments={"user_groups":{"travel_start_day_of_week":{"event_sources":["1862565504034757"],"1":0.1,"3":0.1,"default":0.9}}}' \
  -F 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/<API_VERSION>/<ADSET_ID>

  Length of Stay 'bid_adjustments={"user_groups":{"length_of_stay":{"event_sources":["1862565504034757"],"1-2":0.1,"3-7":0.2,"default":0.5}}}'
  Booking window 'bid_adjustments={"user_groups":{"booking_window":{"event_sources":["1862565504034757"],"1-2":0.1,"3-7":0.2,"default":0.5}}}'
  Travel start date: 'bid_adjustments={"user_groups":{"travel_start_date":{"event_sources":["1862565504034757"],"20180918-20190101":0.1,"default":0.5}}}'
  Day of week: 'bid_adjustments={"user_groups":{"travel_start_day_of_week":{"event_sources":["1862565504034757"],"1":0.1,"2":0.1,"0":0.2,"default":0.5}}}'

user_os

가능한 분석 데이터 값은 다음과 같습니다.

  • iOS
  • Windows

다른 사용 가능한 값은 타게팅 검색 API에서 type=adTargetingCategoryclass=user_os로 확인하세요.

현재 지원되는 값은 다음과 같습니다.

  • Android
  • Windows
  • Windows Phone
  • iOS

{
  "user_groups": {
    "user_os": {
      "Android": 0.7,
      "iOS": 0.9,
      "default": 1.0
    }
  }
}

iOS14의 영향

웹사이트 전환 캠페인의 입찰 승수가 iOS 정책 변경 사항의 영향을 받나요?

예, iOS 14 변경 사항에서 신호 손실과 식별이 어려운 기여가 발생하여 광고 세트당 신호가 더 적게 발생하게 됩니다. 입찰 가능한 카테고리 대부분이 평소와 마찬가지로 계속 작동하기는 하지만 iOS 14.5 사용자를 타게팅하는 경우 최신성, 맞춤 타겟, user_bucket에 대한 승수가 영향을 받게 됩니다. 이러한 승수는 FB 픽셀이나 전환 API에 측정되는 이벤트에 따라 달라지기 때문입니다. 그 외의 다른 승수는 현장 데이터에서 발생하고 FB 픽셀이나 전환 API를 사용하지 않습니다.

user_recency

픽셀 실행 또는 앱 이벤트가 있었던 시간에 따라 사용자를 그룹화합니다. 추적할 이벤트 소스와 기간을 지정해야 합니다.

이 예시는 86400초 이내에 픽셀 실행 또는 앱 이벤트가 발생했던 사용자에 입찰가 값 1.0을 적용하는 방법을 나타냅니다.

{
  "user_groups": {
    "user_recency": {
      "event_sources": [<pixel_id>,<app_id>,...],
      "0-86400": 1.0,
      "86401-172800": 0.7,
      "default": 0.5
    }
  }
}

폭포수식 다중 분석 데이터

부동 소수점 입찰가 값을 추가적인 분석 데이터 사양으로 바꾸어 여러 분석 데이터로 사용자 그룹을 정의할 수도 있습니다. 예를 들어 광고 세트의 최대 입찰가를 USD 5로 설정하고 아래와 같이 구성합니다.

  • 남자 사용자는 USD 4.5에 입찰
  • 18~25세 여자 사용자는 USD 3.5에 입찰
  • 26~35세 여자 사용자는 USD 4.0에 입찰
  • 그 외에 나머지 사용자는 USD 5.0에 입찰
{
  "user_groups": {
    "gender": {
      "male": 0.9,
      "female": {
        "age": {
          "18-25": 0.7,
          "26-35": 0.8
        }
      }
    }
  }
}

사용 요구 사항

  • 입찰가 값은 0.09~1.0일 수 있습니다.

API 호출

가져오기

curl -G \
  -d 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/<API_VERSION>/<ADSET_ID>?fields=bid_adjustments

업데이트

curl \
  -F 'bid_adjustments={"user_groups":<USER_GROUP_WEIGHT_SPEC>}' \
  -F 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/<API_VERSION>/<PRODUCT_CATALOG_ID>/<ADSET_ID>

광고 세트에 대해 입찰가 값 생성 또는 업데이트

기존 광고 세트를 업데이트하기 위한 샘플 API 호출은 다음과 같습니다. (광고 세트 ID, 액세스 토큰, 이벤트 소스, 원하는 입찰가 값을 변경해야 합니다.)

curl -X POST \ -F 'bid_adjustments={ "user_groups": { "user_bucket": { "event_sources": [ "<PIXEL_ID>", "<APP_ID>" ], "1": 0.1, "2": 0.2, "3": 0.3, "default": { "gender": { "male": 0.99, "female": 0.12 } } } } }' \ -F 'access_token=<ACCESS_TOKEN>' \ https://graph.facebook.com/v19.0/<AD_SET_ID>/
'use strict'; const bizSdk = require('facebook-nodejs-business-sdk'); const AdSet = bizSdk.AdSet; const access_token = '<ACCESS_TOKEN>'; const app_secret = '<APP_SECRET>'; const app_id = '<APP_ID>'; const id = '<AD_SET_ID>'; const api = bizSdk.FacebookAdsApi.init(access_token); const showDebugingInfo = true; // Setting this to true shows more debugging info. if (showDebugingInfo) { api.setDebug(true); } const logApiCallResult = (apiCallName, data) => { console.log(apiCallName); if (showDebugingInfo) { console.log('Data:' + JSON.stringify(data)); } }; let fields, params; fields = [ ]; params = { 'bid_adjustments' : {'user_groups':{'user_bucket':{'event_sources':['<pixelID>','<appID>'],'1':0.1,'2':0.2,'3':0.3,'default':{'gender':{'male':0.99,'female':0.12}}}}}, }; const sample_code = (new AdSet(id)).update( fields, params ); logApiCallResult('sample_code api call complete.', sample_code);
require __DIR__ . '/vendor/autoload.php'; use FacebookAds\Object\AdSet; use FacebookAds\Api; use FacebookAds\Logger\CurlLogger; $access_token = '<ACCESS_TOKEN>'; $app_secret = '<APP_SECRET>'; $app_id = '<APP_ID>'; $id = '<AD_SET_ID>'; $api = Api::init($app_id, $app_secret, $access_token); $api->setLogger(new CurlLogger()); $fields = array( ); $params = array( 'bid_adjustments' => array('user_groups' => array('user_bucket' => array('event_sources' => array('<pixelID>','<appID>'),'1' => 0.1,'2' => 0.2,'3' => 0.3,'default' => array('gender' => array('male' => 0.99,'female' => 0.12))))), ); echo json_encode((new AdSet($id))->updateSelf( $fields, $params )->exportAllData(), JSON_PRETTY_PRINT);
from facebook_business.adobjects.adset import AdSet from facebook_business.api import FacebookAdsApi access_token = '<ACCESS_TOKEN>' app_secret = '<APP_SECRET>' app_id = '<APP_ID>' id = '<AD_SET_ID>' FacebookAdsApi.init(access_token=access_token) fields = [ ] params = { 'bid_adjustments': {'user_groups':{'user_bucket':{'event_sources':['<pixelID>','<appID>'],'1':0.1,'2':0.2,'3':0.3,'default':{'gender':{'male':0.99,'female':0.12}}}}}, } print AdSet(id).update( fields=fields, params=params, )
import com.facebook.ads.sdk.*; import java.io.File; import java.util.Arrays; public class SAMPLE_CODE_EXAMPLE { public static void main (String args[]) throws APIException { String access_token = \"<ACCESS_TOKEN>\"; String app_secret = \"<APP_SECRET>\"; String app_id = \"<APP_ID>\"; String id = \"<AD_SET_ID>\"; APIContext context = new APIContext(access_token).enableDebug(true); new AdSet(id, context).update() .setBidAdjustments(\"{\\"user_groups\\":{\\"user_bucket\\":{\\"event_sources\\":[\\"<pixelID>\\",\\"<appID>\\"],\\"1\\":0.1,\\"2\\":0.2,\\"3\\":0.3,\\"default\\":{\\"gender\\":{\\"male\\":0.99,\\"female\\":0.12}}}}}\") .execute(); } }
require 'facebook_ads' access_token = '<ACCESS_TOKEN>' app_secret = '<APP_SECRET>' app_id = '<APP_ID>' id = '<AD_SET_ID>' FacebookAds.configure do |config| config.access_token = access_token config.app_secret = app_secret end ad_set = FacebookAds::AdSet.get(id) ad_set.bid_adjustments = {'user_groups':{'user_bucket':{'event_sources':['<pixelID>','<appID>'],'1':0.1,'2':0.2,'3':0.3,'default':{'gender':{'male':0.99,'female':0.12}}}}} ad_set.save

테스트 캠페인 설정

Meta 어카운트 팀 및 측정 잠재 고객과 협력하여 전환 성과 증대나 분할 테스트를 통해 테스트 캠페인을 만듭니다. 성과를 평가하려면 다음 셀을 3가지로 나누어 테스트하는 것이 좋습니다.

  • 셀 1 (대조군 A), 캠페인 1 - 광고 세트 1개, 모든 타게팅된 사용자에 대한 입찰가 1개 포함
  • 셀 2 (대조군 B), 캠페인 2 - 여러 광고 세트, 각 사용자 그룹에 대해 광고 세트 1개 생성(웹사이트/모바일 맞춤 타겟 규칙을 사용하여 픽셀/앱 매개변수에 따라 세그먼트를 나눌 수 있음)
  • 셀 3 (테스트), 캠페인 3 - 광고 세트 1개, 각 사용자 그룹에 다른 입찰가 값 적용 (여기에서 각 사용자 그룹에 조정된 입찰가는 셀 2의 해당 광고 세트에 대한 광고 세트 수준 입찰가와 동일해야 함)

분할 테스트 설정하기

이제 분할 테스트와 대조군을 설정하여 입찰가 값을 사용한 성과를 확인해야 합니다. 테스트는 1~2주간 진행되며 최소 예산이 필요하지 않습니다. 분할 테스트는 다음과 같이 설정합니다.

  • 셀 1, 대조군 A 입찰가 1개가 지정된 광고 세트 1개를 포함해야 하고 타게팅은 모든 user_bucket을 기반으로 해야 합니다.
  • 셀 2, 대조군 B 여러 광고 세트를 포함해야 하고 user_bucket마다 광고 세트를 하나 만들어야 합니다. 각 광고 세트는 별도의 user_bucket과 해당 입찰가를 타게팅해야 합니다. 웹사이트 또는 모바일 맞춤 타겟 규칙을 사용하여 다른 Meta 픽셀 또는 앱 이벤트 매개변수를 기반으로 타겟의 세그먼트를 추가로 만들 수 있습니다. 웹사이트 맞춤 타겟모바일 앱 맞춤 타겟을 참조하세요.
  • 셀 3, 테스트 광고 세트 1개가 포함되고 bid_adjustment 속성을 사용하여 각 user_bucket에 다른 입찰가를 설정합니다. 입찰가 값은 셀 2, 대조군 B의 개별 광고 세트 입찰가와 일치해야 합니다.

자세한 내용은 분할 테스트를 참조하세요.

테스트 캠페인 설정

일반 캠페인과 마찬가지로 광고 캠페인을 설정합니다. Meta 담당자에게 입찰 조정을 설정하는 방법을 문의하세요.

user_groups를 설정하고 각 그룹에 다른 입찰가 값을 설정합니다. 사용자 그룹은 인구 통계학적 특성 속성(예: 나이, 성별)과 특정 속성(예: 사용자 점수, 충성도 프로그램)을 기반으로 합니다. 예를 들면 다음과 같습니다.

{
   "user_bucket":{
      "business_id":253286871795863,
      "1":0.7,
      "2":1.0,
      "3":{
         "gender":{
            "male":1.0,
            "female":0.8
         }
      },
      "default": 0.9
   }
}

이 예시는 다음과 같이 설정합니다.

  • loyalty_program 값이 1인 사용자에게는 입찰가 값 0.7을 적용합니다.
  • loyalty_program 값이 2인 사용자에게는 입찰가 값 1.0을 적용합니다.
  • loyalty_program 값이 3남자에게는 입찰가 값 1.0을 적용합니다.
  • loyalty_program 값이 3여자에게는 입찰가 값 0.8을 적용합니다.
  • loyalty_program 값이 1, 2, 3이 아닌 사용자에게는 입찰가 값 0.9를 적용합니다.
  • 그 외에 나머지 사용자에게는 입찰가 값 1.0을 적용합니다.

이제 광고 캠페인을 만들 수 있습니다.

curl -X POST \ -F 'name="My Adset with bid multiplier"' \ -F 'campaign_id="<AD_CAMPAIGN_ID>"' \ -F 'daily_budget=3000' \ -F 'billing_event="IMPRESSIONS"' \ -F 'optimization_goal="OFFSITE_CONVERSIONS"' \ -F 'bid_amount=500' \ -F 'bid_adjustments={ "user_groups": { "gender": { "male": 0.8, "female": 1 } } }' \ -F 'promoted_object={ "product_set_id": "<PRODUCT_SET_ID>", "custom_event_type": "ADD_TO_CART" }' \ -F 'targeting={ "facebook_positions": [ "feed" ], "geo_locations": { "countries": [ "US" ] } }' \ -F 'status="PAUSED"' \ -F 'access_token=<ACCESS_TOKEN>' \ https://graph.facebook.com/v19.0/act_<AD_ACCOUNT_ID>/adsets
'use strict'; const bizSdk = require('facebook-nodejs-business-sdk'); const AdAccount = bizSdk.AdAccount; const AdSet = bizSdk.AdSet; const access_token = '<ACCESS_TOKEN>'; const app_secret = '<APP_SECRET>'; const app_id = '<APP_ID>'; const id = '<AD_ACCOUNT_ID>'; const api = bizSdk.FacebookAdsApi.init(access_token); const showDebugingInfo = true; // Setting this to true shows more debugging info. if (showDebugingInfo) { api.setDebug(true); } const logApiCallResult = (apiCallName, data) => { console.log(apiCallName); if (showDebugingInfo) { console.log('Data:' + JSON.stringify(data)); } }; let fields, params; fields = [ ]; params = { 'name' : 'My Adset with bid multiplier', 'campaign_id' : '<adCampaignLinkClicksID>', 'daily_budget' : '3000', 'billing_event' : 'IMPRESSIONS', 'optimization_goal' : 'OFFSITE_CONVERSIONS', 'bid_amount' : '500', 'bid_adjustments' : {'user_groups':{'gender':{'male':0.8,'female':1}}}, 'promoted_object' : {'product_set_id':'<productSetID>','custom_event_type':'ADD_TO_CART'}, 'targeting' : {'facebook_positions':['feed'],'geo_locations':{'countries':['US']}}, 'status' : 'PAUSED', }; const adsets = (new AdAccount(id)).createAdSet( fields, params ); logApiCallResult('adsets api call complete.', adsets);
require __DIR__ . '/vendor/autoload.php'; use FacebookAds\Object\AdAccount; use FacebookAds\Object\AdSet; use FacebookAds\Api; use FacebookAds\Logger\CurlLogger; $access_token = '<ACCESS_TOKEN>'; $app_secret = '<APP_SECRET>'; $app_id = '<APP_ID>'; $id = '<AD_ACCOUNT_ID>'; $api = Api::init($app_id, $app_secret, $access_token); $api->setLogger(new CurlLogger()); $fields = array( ); $params = array( 'name' => 'My Adset with bid multiplier', 'campaign_id' => '<adCampaignLinkClicksID>', 'daily_budget' => '3000', 'billing_event' => 'IMPRESSIONS', 'optimization_goal' => 'OFFSITE_CONVERSIONS', 'bid_amount' => '500', 'bid_adjustments' => array('user_groups' => array('gender' => array('male' => 0.8,'female' => 1))), 'promoted_object' => array('product_set_id' => '<productSetID>','custom_event_type' => 'ADD_TO_CART'), 'targeting' => array('facebook_positions' => array('feed'),'geo_locations' => array('countries' => array('US'))), 'status' => 'PAUSED', ); echo json_encode((new AdAccount($id))->createAdSet( $fields, $params )->exportAllData(), JSON_PRETTY_PRINT);
from facebook_business.adobjects.adaccount import AdAccount from facebook_business.adobjects.adset import AdSet from facebook_business.api import FacebookAdsApi access_token = '<ACCESS_TOKEN>' app_secret = '<APP_SECRET>' app_id = '<APP_ID>' id = '<AD_ACCOUNT_ID>' FacebookAdsApi.init(access_token=access_token) fields = [ ] params = { 'name': 'My Adset with bid multiplier', 'campaign_id': '<adCampaignLinkClicksID>', 'daily_budget': '3000', 'billing_event': 'IMPRESSIONS', 'optimization_goal': 'OFFSITE_CONVERSIONS', 'bid_amount': '500', 'bid_adjustments': {'user_groups':{'gender':{'male':0.8,'female':1}}}, 'promoted_object': {'product_set_id':'<productSetID>','custom_event_type':'ADD_TO_CART'}, 'targeting': {'facebook_positions':['feed'],'geo_locations':{'countries':['US']}}, 'status': 'PAUSED', } print AdAccount(id).create_ad_set( fields=fields, params=params, )
import com.facebook.ads.sdk.*; import java.io.File; import java.util.Arrays; public class SAMPLE_CODE_EXAMPLE { public static void main (String args[]) throws APIException { String access_token = \"<ACCESS_TOKEN>\"; String app_secret = \"<APP_SECRET>\"; String app_id = \"<APP_ID>\"; String id = \"<AD_ACCOUNT_ID>\"; APIContext context = new APIContext(access_token).enableDebug(true); new AdAccount(id, context).createAdSet() .setName(\"My Adset with bid multiplier\") .setCampaignId(\"<adCampaignLinkClicksID>\") .setDailyBudget(3000L) .setBillingEvent(AdSet.EnumBillingEvent.VALUE_IMPRESSIONS) .setOptimizationGoal(AdSet.EnumOptimizationGoal.VALUE_OFFSITE_CONVERSIONS) .setBidAmount(500L) .setBidAdjustments(\"{\\"user_groups\\":{\\"gender\\":{\\"male\\":0.8,\\"female\\":1}}}\") .setPromotedObject(\"{\\"product_set_id\\":\\"<productSetID>\\",\\"custom_event_type\\":\\"ADD_TO_CART\\"}\") .setTargeting( new Targeting() .setFieldFacebookPositions(Arrays.asList(\"feed\")) .setFieldGeoLocations( new TargetingGeoLocation() .setFieldCountries(Arrays.asList(\"US\")) ) ) .setStatus(AdSet.EnumStatus.VALUE_PAUSED) .execute(); } }
require 'facebook_ads' access_token = '<ACCESS_TOKEN>' app_secret = '<APP_SECRET>' app_id = '<APP_ID>' id = '<AD_ACCOUNT_ID>' FacebookAds.configure do |config| config.access_token = access_token config.app_secret = app_secret end ad_account = FacebookAds::AdAccount.get(id) adsets = ad_account.adsets.create({ name: 'My Adset with bid multiplier', campaign_id: '<adCampaignLinkClicksID>', daily_budget: '3000', billing_event: 'IMPRESSIONS', optimization_goal: 'OFFSITE_CONVERSIONS', bid_amount: '500', bid_adjustments: {'user_groups':{'gender':{'male':0.8,'female':1}}}, promoted_object: {'product_set_id':'<productSetID>','custom_event_type':'ADD_TO_CART'}, targeting: {'facebook_positions':['feed'],'geo_locations':{'countries':['US']}}, status: 'PAUSED', })

광고 세트를 만들고 나면 API를 통해 광고 세트에 bid_adjustments를 설정합니다. 이 매개변수는 다음과 같이 표시됩니다.

{
  "user_groups": {
    "user_bucket": {
      "event_sources": [<pixel_id>,<app_id>,...],
      "event_source_preference": "max"|"min"|"latest", //optional, useful when multiple event sources have user_bucket
      "events_dedup_mode": "max"|"min"|"latest", //optional, dedup user_bucket values sent from one single event source
      "event_retention": 604800, // optional, exclude old events
      "1":0.7, // these are the bid multipliers
      "2":1.0,
      "default": { // used in the case that we don't have user_bucket for that user
         gender:{ // this is a nested example, but you could just do "default": 1.0,
            "male": {
              home_location: {
                  cities: { // city id, can be found in search API, eg: search?type=adgeolocation&q=Menlo Park&limit=10
                    "2420605": 0.2,
                  },
                  regions: {
                    "3847": 0.5
                  },
                  countries: {
                    "US": 0.2
                  }
                }
              }
            },
            "female": {
              "user_recency": {
                "event_sources": [<pixel_id>,<app_id>,...],
                "0-86400": 0.5,
                "86400-172800": 0.7,
                "default": 0.2
              }
            }
         },
      },
   },
}

현재 Facebook에서는 이 매개변수를 검증하지 않습니다. 광고 세트 ID를 Meta 담당자에게 보내면 직접 확인해 드릴 수 있습니다.

각 이벤트 소스의 경우 해당 사용자에 대해 가장 최근에 수신한 user_bucket을 사용합니다. 하지만 여러 이벤트 소스가 지정되고(예: 픽셀, 앱) 그중 두 개 이상에 user_bucket이 기록되어 있는 경우 이들 전체의 최댓값을 취합니다.

기존 광고 세트를 업데이트하기 위한 호출 예시는 다음과 같습니다. 자신의 광고 세트 ID, 액세스 토큰, 이벤트 소스, 입찰가 값을 입력해야 합니다.

curl -X POST 
  -F access_token=<access_token> \
  -F 'bid_adjustments={"user_groups": {"user_bucket": {"event_sources": [<pixel_id>,  <app_id>,...], "1": 0.1, "2": 0.2, "3": 0.3, "default": {"gender": {"male": 0.99, "female": 0.1}} }} }' \ 
  https://graph.facebook.com/<VERSION>/<ad-set-id>