Bắt đầu

Hãy làm theo các bước sau đây để tạo quảng cáo đầu tiên thông qua API Marketing.

Trước khi bắt đầu

Bạn nên làm quen với API Đồ thịCấu trúc chiến dịch quảng cáo của Facebook. Khi đã sẵn sàng bắt đầu thực hiện lệnh gọi, bạn cần có:

Sau đó, bạn có thể bắt đầu. Hãy nhớ xem những cách làm thông dụng tốt nhất để sử dụng API Marketing.

Bước 1: Tạo chiến dịch

Để bắt đầu quy trình này, bạn cần tạo một đối tượng chiến dịch mới từ lớp Campaign. Ở giai đoạn này, bạn cần đặt mục tiêu cho quảng cáo. Đây sẽ là mục tiêu chung của chiến dịch. Ban đầu, bạn nên tạo chiến dịch PAUSED để không bị tính phí trong quá trình thử nghiệm.

curl -X POST \ -F 'name="My campaign"' \ -F 'objective="OUTCOME_TRAFFIC"' \ -F 'status="PAUSED"' \ -F 'special_ad_categories=[]' \ -F 'access_token=<ACCESS_TOKEN>' \ https://graph.facebook.com/v21.0/act_<AD_ACCOUNT_ID>/campaigns
'use strict'; const bizSdk = require('facebook-nodejs-business-sdk'); const AdAccount = bizSdk.AdAccount; const Campaign = bizSdk.Campaign; 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 campaign', 'objective' : 'OUTCOME_TRAFFIC', 'status' : 'PAUSED', 'special_ad_categories' : [], }; const campaigns = (new AdAccount(id)).createCampaign( fields, params ); logApiCallResult('campaigns api call complete.', campaigns);
require __DIR__ . '/vendor/autoload.php'; use FacebookAds\Object\AdAccount; use FacebookAds\Object\Campaign; 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 campaign', 'objective' => 'OUTCOME_TRAFFIC', 'status' => 'PAUSED', 'special_ad_categories' => array(), ); echo json_encode((new AdAccount($id))->createCampaign( $fields, $params )->exportAllData(), JSON_PRETTY_PRINT);
from facebook_business.adobjects.adaccount import AdAccount from facebook_business.adobjects.campaign import Campaign 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 campaign', 'objective': 'OUTCOME_TRAFFIC', 'status': 'PAUSED', 'special_ad_categories': [], } print AdAccount(id).create_campaign( 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).createCampaign() .setName(\"My campaign\") .setObjective(Campaign.EnumObjective.VALUE_OUTCOME_TRAFFIC) .setStatus(Campaign.EnumStatus.VALUE_PAUSED) .setParam(\"special_ad_categories\", \"[]\") .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) campaigns = ad_account.campaigns.create({ name: 'My campaign', objective: 'OUTCOME_TRAFFIC', status: 'PAUSED', special_ad_categories: [], })

Khi thành công, chúng tôi sẽ trả về ID của chiến dịch quảng cáo bạn mới tạo. Hãy nhớ lưu lại ID này. Bạn cũng có thể xác minh chiến dịch mình đã tạo trong trình quản lý quảng cáo.

Tài nguyên:

Bước 2: Xác định tùy chọn nhắm mục tiêu

Trước khi chuyển sang quy trình tạo nhóm quảng cáo, bạn cần xác định đối tượng mục tiêu của mình. Ở bước tiếp theo, bạn cần tạo nhóm quảng cáo và chỉ định các thuộc tính cho đối tượng đó.

Bạn có quá nhiều tùy chọn nhắm mục tiêu. Trong ví dụ dưới đây, chúng tôi sử dụng phương thức tìm kiếm nhắm mục tiêu để tìm các giá trị xác định trước mà bạn có thể dùng để thiết lập đối tượng.

Trước tiên, hãy tìm các quốc gia được hỗ trợ có từ "united":

curl -G \
  -d 'location_types=["country"]' \
  -d 'type=adgeolocation' \
  -d 'q=united' \
  -d 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v<API_VERSION>/search

Open In Graph API ExplorerOpen In Postman

Sau đó, chúng tôi có thể tìm sở thích có từ "movie":

curl -G \
  -d 'type=adinterest' \
  -d 'q=movie' \
  -d 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v<API_VERSION>/search

Dựa trên các giá trị được trả về từ những lệnh gọi ở trên, chúng tôi biết rằng mình có thể tạo một đối tượng gồm những người ở Hoa Kỳ quan tâm đến phim ảnh. Quy cách nhắm mục tiêu sẽ có dạng như sau:

targeting={ 
    "geo_locations": {"countries":["US"]}, 
    "interests": [{id: 6003139266461, 'name': 'Movies'}]
}

Bước 3: Tạo nhóm quảng cáo rồi xác định ngân sách, phương thức lập hóa đơn, tùy chọn tối ưu hóa và khoảng thời gian

Nhóm quảng cáo là một nhóm gồm các quảng cáo có chung dữ liệu về ngân sách hàng ngày hoặc ngân sách trọn đời, lịch chạy, phương thức lập hóa đơn, tùy chọn tối ưu hóa, cũng như tùy chọn nhắm mục tiêu. Ở bước này, bạn cần tạo một đối tượng mới từ lớp AdSet và chỉ định:

  • Khoảng thời gian: Khoảng thời gian sẽ chạy quảng cáo. Hãy đặt khoảng thời gian này bằng cách chọn start_timeend_time.
  • Ngân sách: Số tiền bạn muốn chi tiêu. Hãy sử dụng daily_budget hoặc lifetime_budget.
  • Tối ưu hóa: Kết quả bạn muốn đạt được khi chạy quảng cáo. Hãy thiết lập bằng cách chọn optimization_goal.
  • Lập hóa đơn: Cách bạn muốn thanh toán. Hãy sử dụng billing_event.
  • Giá thầu: Giá trị bạn đặt khi sự kiện tối ưu hóa diễn ra. Hãy sử dụng trường bid_amount.
  • Nhắm mục tiêu: Hãy sử dụng quy cách nhắm mục tiêu đã tạo ở Bước 2.

Để tạo nhóm quảng cáo, bạn cũng cần có ID chiến dịch quảng cáo đã lưu ở Bước 1:

curl -X POST \ -F 'name="My Reach Ad Set"' \ -F 'optimization_goal="REACH"' \ -F 'billing_event="IMPRESSIONS"' \ -F 'bid_amount=2' \ -F 'daily_budget=1000' \ -F 'campaign_id="<AD_CAMPAIGN_ID>"' \ -F 'targeting={ "geo_locations": { "countries": [ "US" ] }, "facebook_positions": [ "feed" ] }' \ -F 'status="PAUSED"' \ -F 'promoted_object={ "page_id": "<PAGE_ID>" }' \ -F 'access_token=<ACCESS_TOKEN>' \ https://graph.facebook.com/v21.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 Reach Ad Set', 'optimization_goal' : 'REACH', 'billing_event' : 'IMPRESSIONS', 'bid_amount' : '2', 'daily_budget' : '1000', 'campaign_id' : '<adCampaignLinkClicksID>', 'targeting' : {'geo_locations':{'countries':['US']},'facebook_positions':['feed']}, 'status' : 'PAUSED', 'promoted_object' : {'page_id':'<pageID>'}, }; 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 Reach Ad Set', 'optimization_goal' => 'REACH', 'billing_event' => 'IMPRESSIONS', 'bid_amount' => '2', 'daily_budget' => '1000', 'campaign_id' => '<adCampaignLinkClicksID>', 'targeting' => array('geo_locations' => array('countries' => array('US')),'facebook_positions' => array('feed')), 'status' => 'PAUSED', 'promoted_object' => array('page_id' => '<pageID>'), ); 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 Reach Ad Set', 'optimization_goal': 'REACH', 'billing_event': 'IMPRESSIONS', 'bid_amount': '2', 'daily_budget': '1000', 'campaign_id': '<adCampaignLinkClicksID>', 'targeting': {'geo_locations':{'countries':['US']},'facebook_positions':['feed']}, 'status': 'PAUSED', 'promoted_object': {'page_id':'<pageID>'}, } 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 Reach Ad Set\") .setOptimizationGoal(AdSet.EnumOptimizationGoal.VALUE_REACH) .setBillingEvent(AdSet.EnumBillingEvent.VALUE_IMPRESSIONS) .setBidAmount(2L) .setDailyBudget(1000L) .setCampaignId(\"<adCampaignLinkClicksID>\") .setTargeting( new Targeting() .setFieldFacebookPositions(Arrays.asList(\"feed\")) .setFieldGeoLocations( new TargetingGeoLocation() .setFieldCountries(Arrays.asList(\"US\")) ) ) .setStatus(AdSet.EnumStatus.VALUE_PAUSED) .setPromotedObject(\"{\\"page_id\\":\\"<pageID>\\"}\") .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 Reach Ad Set', optimization_goal: 'REACH', billing_event: 'IMPRESSIONS', bid_amount: '2', daily_budget: '1000', campaign_id: '<adCampaignLinkClicksID>', targeting: {'geo_locations':{'countries':['US']},'facebook_positions':['feed']}, status: 'PAUSED', promoted_object: {'page_id':'<pageID>'}, })

Bạn nên tạo một nhóm quảng cáo có trạng thái PAUSED để tránh bị tính phí trong quá trình thử nghiệm.

Bước 4: Cung cấp nội dung quảng cáo

Tài liệu tham khảo

Ở bước này, bạn sẽ sử dụng đối tượng AdCreative để cung cấp các thành phần trực quan cho quảng cáo của mình. Mục tiêu của bạn sẽ quyết định việc bạn cần cung cấp thông tin nào, nhưng thông thường là các thuộc tính sau:

  • Hình ảnh và video
  • Tiêu đề và nội dung mô tả
  • Liên kết
  • Nút kêu gọi hành động

Tùy thuộc vào mục tiêu, bạn có thể phải cung cấp các trường nâng cao. Ví dụ: quảng cáo cho ứng dụng iOS thì cần có URL của cửa hàng ứng dụng.

Bạn có thể xác định nội dung là nội dung thuộc một nhóm quảng cáo hoặc nội dung độc lập. Dù trong trường hợp nào, chúng tôi vẫn lưu trữ nội dung quảng cáo của bạn trong thư viện nội dung của tài khoản quảng cáo để bạn dùng trong quảng cáo.

Ví dụ

Ví dụ dưới đây minh họa cách cung cấp hình ảnh và tạo đối tượng AdCreative.

Trước tiên, hãy tạo đối tượng AdImage từ file hình ảnh:

curl \
  -F 'filename=@<IMAGE_PATH>' \
  -F 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v<API_VERSION>/act_<AD_ACCOUNT_ID>/adimages

Sau đó, hãy sử dụng hash hình ảnh để tạo AdCreative:

curl -X POST \
  -F 'name="Sample Creative"' \
  -F 'object_story_spec={
       "page_id": "<PAGE_ID>",
       "link_data": {
         "image_hash": "<IMAGE_HASH>",
         "link": "https://facebook.com/<PAGE_ID>",
         "message": "try it out"
       }
     }' \
  -F 'degrees_of_freedom_spec={
      "creative_features_spec": {
        "standard_enhancements": {
          "enroll_status": "OPT_IN"
        }
      }
    }' \
  -F 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v<API_VERSION>/act_<AD_ACCOUNT_ID>/adcreatives

Open In Graph API ExplorerOpen In Postman

Tiếp theo, hãy xác minh việc bạn tải hình ảnh lên bằng cách chuyển đến Thư viện file phương tiện bên trong trình quản lý quảng cáo.

Lúc này, AdCreative với liên kết của bạn chưa hiển thị trong Trình quản lý quảng cáo. Bạn sẽ nhìn thấy dữ liệu này sau khi đặt quảng cáo. Bạn có thể gỡ lỗi nội dung quảng cáo thông qua Trình khám phá API Đồ thị và chỉ định bất kỳ trường nào bạn muốn đọc:

GET /{my-creative-id} HTTP/1.1
Host: graph.facebook.com/?fields=object_story_spec

Bước 5: Lên lịch phân phối

Cuối cùng, hãy tạo đối tượng Quảng cáo để liên kết AdCreativeAdSet. Hãy đặt status của Adpaused để tránh đặt hàng ngay lúc đó.

curl -X POST \ -F 'name="My Ad"' \ -F 'adset_id="<AD_SET_ID>"' \ -F 'creative={ "creative_id": "<CREATIVE_ID>" }' \ -F 'status="PAUSED"' \ -F 'access_token=<ACCESS_TOKEN>' \ https://graph.facebook.com/v21.0/act_<AD_ACCOUNT_ID>/ads
'use strict'; const bizSdk = require('facebook-nodejs-business-sdk'); const AdAccount = bizSdk.AdAccount; const Ad = bizSdk.Ad; 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 Ad', 'adset_id' : '<adSetID>', 'creative' : {'creative_id':'<adCreativeID>'}, 'status' : 'PAUSED', }; const ads = (new AdAccount(id)).createAd( fields, params ); logApiCallResult('ads api call complete.', ads);
require __DIR__ . '/vendor/autoload.php'; use FacebookAds\Object\AdAccount; use FacebookAds\Object\Ad; 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 Ad', 'adset_id' => '<adSetID>', 'creative' => array('creative_id' => '<adCreativeID>'), 'status' => 'PAUSED', ); echo json_encode((new AdAccount($id))->createAd( $fields, $params )->exportAllData(), JSON_PRETTY_PRINT);
from facebook_business.adobjects.adaccount import AdAccount from facebook_business.adobjects.ad import Ad 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 Ad', 'adset_id': '<adSetID>', 'creative': {'creative_id':'<adCreativeID>'}, 'status': 'PAUSED', } print AdAccount(id).create_ad( 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).createAd() .setName(\"My Ad\") .setAdsetId(<adSetID>L) .setCreative( new AdCreative() .setFieldId(\"<adCreativeID>\") ) .setStatus(Ad.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) ads = ad_account.ads.create({ name: 'My Ad', adset_id: '<adSetID>', creative: {'creative_id':'<adCreativeID>'}, status: 'PAUSED', })

Tiếp theo, hãy xác minh rằng quảng cáo của bạn đã tồn tại trong trình quản lý quảng cáo. Sau đó, nhấp vào chiến dịch bạn vừa tạo, rồi nhấp vào nhóm quảng cáo và quảng cáo.

Khi bạn đã sẵn sàng đặt quảng cáo thông qua API này, hãy đặt trạng thái về active. Trước tiên, quảng cáo sẽ trải qua quy trình xét duyệt quảng cáo và có trạng thái PENDING_REVIEW. Sau khi chúng tôi xét duyệt xong, quảng cáo này sẽ trở về trạng thái ACTIVE.

Sao chép quảng cáo

Ngoài ra, bạn có thể sao chép một quảng cáo, tài sản hoặc chiến dịch hiện có. Nhờ đó, bạn có thể nhanh chóng sao chép chiến dịch để thay đổi cấu hình hoặc tạo nhóm thử nghiệm để nắm rõ thông tin về hiệu quả. Để biết thêm chi tiết, hãy xem: