
Bilindiği üzere, Performance Max kampanyaları, Search, Display, YouTube, Shopping gibi farklı reklam alanlarında gösterim alabilen akıllı alışveriş kampanyalarının yerine gelen bir reklam modelidir.
Ancak bu model, reklamverenlerin yaşadığı iki önemli sorunu çözüme ulaştırma konusunda yetersiz kalmaktadır.
Birinci sorun, hangi reklam alanına ne kadar harcama yapıldığını ve hangi reklam alanından ne kadar dönüşüm getirdiğini gösterememektir.
İkinci sorun ise, search reklam alanında hangi anahtar kelimelerde gösterim ve tıklama alındığını, ve yanı sıra hangi anahtar kelimelerin dönüşüm sağladığını göstermemektedir.
İşte bu sorunlar çözüm getirecek ve maksimum performans kampanyalarınızı analiz etmenizi kolaylaştıracak 2 Google komutu‘nu sizlerle paylaşıyoruz.
Script 1: PMax Reklam Alanı ve Öğe Grubu Performans Raporu
Bu script sayesinde, Maksimum Performans kampanyalarınızın reklam alanı ve öğe grupları performanslarını ayrıntılı bir şekilde analiz edebilirsiniz. Dönüşüm, dönüşüm değeri, harcama, ROAS gibi kritik verilere erişebilirsiniz. Bu sayede hangi reklam alanının veya öğe grubunun daha iyi performans gösterdiğini gözlemleyebilirsiniz.
Script 2: PMax Arama Terimi Performans Raporu
İkinci script ise, her Maksimum Performans kampanyası için ayrı ayrı arama terimi raporları almanızı sağlar. Bu raporlar sayesinde her kampanyanın hangi anahtar kelimelerde gösterim aldığını, hangi anahtar kelimelerin tıklama ve dönüşüm sağladığını belirleyebilirsiniz. Bu bilgi, anahtar kelime stratejinizi daha iyi optimize etmenize yardımcı olur.
Sonuç olarak, Maksimum Performans kampanyalarının eksikliklerini gidermek ve daha etkili sonuçlar elde etmek adına bu iki performance max scripts’ini kullanabilirsiniz. Bu sayede reklam harcamalarınızı daha verimli bir şekilde yönetebilir, hangi reklam alanı veya anahtar kelimelerin daha iyi performans gösterdiğini net bir şekilde gözlemleyebilirsiniz.
Script 1
// Bu linki kopyalayın: https://docs.google.com/spreadsheets/d/1aGOBOLNUjEIwwlYuS0D3fcIimRnzGdLSJxVd9rHOQ0E/copy
function main() {
let ss = SpreadsheetApp.openByUrl(”); // kopyaladığınız dosyanın linkini (”) arasına yapıştırın.
let zombieDays = 366 // Geriye dönük kaç günlük veri üzerinden 0 tıklamaya sahip ürünleri raporlamak istiyorsunuz?
let prodDays = 181 // Geriye dönük kaç günlük veri üzerinden ürün raporlamak istiyorsunuz?
// Bu satırın altındaki hiçbir kodu değiştirmeyin ——————————————————————————
// define query elements. wrap with spaces for safety
let impr = ‘ metrics.impressions ‘;
let clicks = ‘ metrics.clicks ‘;
let cost = ‘ metrics.cost_micros ‘;
let conv = ‘ metrics.conversions ‘;
let value = ‘ metrics.conversions_value ‘;
let allConv = ‘ metrics.all_conversions ‘;
let allValue = ‘ metrics.all_conversions_value ‘;
let views = ‘ metrics.video_views ‘;
let cpv = ‘ metrics.average_cpv ‘;
let segDate = ‘ segments.date ‘;
let prodTitle = ‘ segments.product_title ‘;
let prodID = ‘ segments.product_item_id ‘;
let prodC0 = ‘ segments.product_custom_attribute0 ‘;
let prodC1 = ‘ segments.product_custom_attribute1 ‘;
let prodC2 = ‘ segments.product_custom_attribute2 ‘;
let prodC3 = ‘ segments.product_custom_attribute3 ‘;
let prodC4 = ‘ segments.product_custom_attribute4 ‘;
let prodT1 = ‘ segments.product_type_l1 ‘;
let prodT2 = ‘ segments.product_type_l2 ‘;
let prodT3 = ‘ segments.product_type_l3 ‘;
let prodT4 = ‘ segments.product_type_l4 ‘;
let prodT5 = ‘ segments.product_type_l5 ‘;
let campName = ‘ campaign.name ‘;
let chType = ‘ campaign.advertising_channel_type ‘;
let adgName = ‘ ad_group.name ‘;
let adStatus = ‘ ad_group_ad.status ‘;
let adPerf = ‘ ad_group_ad_asset_view.performance_label ‘;
let adType = ‘ ad_group_ad_asset_view.field_type ‘;
let aIdAsset = ‘ asset.resource_name ‘;
let aId = ‘ asset.id ‘;
let assetType = ‘ asset.type ‘;
let aFinalUrl = ‘ asset.final_urls ‘;
let assetName = ‘ asset.name ‘;
let assetText = ‘ asset.text_asset.text ‘;
let assetSource = ‘ asset.source ‘ ;
let adUrl = ‘ asset.image_asset.full_size.url ‘;
let ytTitle = ‘ asset.youtube_video_asset.youtube_video_title ‘;
let ytId = ‘ asset.youtube_video_asset.youtube_video_id ‘;
let agId = ‘ asset_group.id ‘;
let assetFtype = ‘ asset_group_asset.field_type ‘;
let adPmaxPerf = ‘ asset_group_asset.performance_label ‘;
let agStrength = ‘ asset_group.ad_strength ‘;
let agStatus = ‘ asset_group.status ‘;
let asgName = ‘ asset_group.name ‘;
let lgType = ‘ asset_group_listing_group_filter.type ‘;
let aIdCamp = ‘ segments.asset_interaction_target.asset ‘;
let interAsset = ‘ segments.asset_interaction_target.interaction_on_this_asset ‘;
let pMaxOnly = ‘ AND campaign.advertising_channel_type = “PERFORMANCE_MAX” ‘;
let searchOnly = ‘ AND campaign.advertising_channel_type = “SEARCH” ‘;
let agFilter = ‘ AND asset_group_listing_group_filter.type != “SUBDIVISION” ‘;
let adgEnabled = ‘ AND ad_group.status = “ENABLED” AND campaign.status = “ENABLED” AND ad_group_ad.status = “ENABLED” ‘;
let asgEnabled = ‘ asset_group.status = “ENABLED” AND campaign.status = “ENABLED” ‘;
let notInter = ‘ AND segments.asset_interaction_target.interaction_on_this_asset != “TRUE” ‘;
let inter = ‘ AND segments.asset_interaction_target.interaction_on_this_asset = “TRUE” ‘;
let date07 = ‘ segments.date DURING LAST_7_DAYS ‘;
let date30 = ‘ segments.date DURING LAST_30_DAYS ‘;
let order = ‘ ORDER BY campaign.name ‘;
let orderImpr = ‘ ORDER BY metrics.impressions DESC ‘;
// Date stuff
let MILLIS_PER_DAY = 1000 * 60 * 60 * 24;
let now = new Date();
let from = new Date(now.getTime() – zombieDays * MILLIS_PER_DAY); // xx days in the past – default 366
let prod180 = new Date(now.getTime() – prodDays * MILLIS_PER_DAY); // xx days in the past – default 181
let to = new Date(now.getTime() – 1 * MILLIS_PER_DAY); // yesterday
let timeZone = AdsApp.currentAccount().getTimeZone();
let zombieRange = ‘ segments.date BETWEEN “‘ + Utilities.formatDate(from, timeZone, ‘yyyy-MM-dd’) + ‘” AND “‘ + Utilities.formatDate(to, timeZone, ‘yyyy-MM-dd’) + ‘”‘
let prodDate = ‘ segments.date BETWEEN “‘ + Utilities.formatDate(prod180, timeZone, ‘yyyy-MM-dd’) + ‘” AND “‘ + Utilities.formatDate(to, timeZone, ‘yyyy-MM-dd’) + ‘”‘
// build queries
let cd = [segDate, campName, cost, conv, value, views, cpv, impr, clicks, chType] // campaign by day
let campQuery = ‘SELECT ‘ + cd.join(‘,’) +
‘ FROM campaign ‘ +
‘ WHERE ‘ + date30 + pMaxOnly + order ;
let dv = [segDate, campName, aIdCamp, cost, conv, value, views, cpv, impr, chType, interAsset] // inter by day
let dvQuery = ‘SELECT ‘ + dv.join(‘,’) +
‘ FROM campaign ‘ +
‘ WHERE ‘ + date30 + pMaxOnly + notInter + order ;
let p = [campName, prodTitle, cost, conv, value, impr, chType,prodID,prodC0,prodC1,prodC2,prodC3,prodC4] // product totals
let pQuery = ‘SELECT ‘ + p.join(‘,’) +
‘ FROM shopping_performance_view ‘ +
‘ WHERE ‘ + date30 + pMaxOnly + order ;
let p180Query = ‘SELECT ‘ + p.join(‘,’) +
‘ FROM shopping_performance_view ‘ +
‘ WHERE ‘ + prodDate + pMaxOnly + order ;
let ag = [segDate, campName, asgName, agStrength, agStatus, lgType, impr, clicks, cost, conv, value] // asset group by day
let agQuery = ‘SELECT ‘ + ag.join(‘,’) +
‘ FROM asset_group_product_group_view ‘ +
‘ WHERE ‘ + date30 + agFilter ;
let assets = [aId, aFinalUrl, assetSource, assetType, ytTitle, ytId, assetText, aIdAsset, assetName] // names, IDs, URLs for all ad assets in account
let assetQuery = ‘SELECT ‘ + assets.join(‘,’) +
‘ FROM asset ‘ ;
let ads = [campName, asgName, agId, aIdAsset, assetFtype, adPmaxPerf, agStrength, agStatus, assetSource] // pMax ads
let adsQuery = ‘SELECT ‘ + ads.join(‘,’) +
‘ FROM asset_group_asset ‘ ;
let zombies = [prodID, clicks, impr, prodTitle] // zombie (0click) products – last xx days, set xx days at top of script
let zQuery = ‘SELECT ‘ + zombies.join(‘,’) +
‘ FROM shopping_performance_view ‘ +
‘ WHERE metrics.clicks < 1 AND ‘ + zombieRange + orderImpr ;
// call report function to pull data & push it to the named tabs in the sheet
runReport(campQuery, ss.getSheetByName(‘r_camp’));
runReport(dvQuery, ss.getSheetByName(‘r_dv’));
runReport(pQuery, ss.getSheetByName(‘r_prod_t’));
runReport(p180Query, ss.getSheetByName(‘r_prod_t_180’));
runReport(agQuery, ss.getSheetByName(‘r_ag’));
runReport(assetQuery, ss.getSheetByName(‘r_allads’));
runReport(adsQuery, ss.getSheetByName(‘r_ads’));
runReport(zQuery, ss.getSheetByName(‘zombies’));
} // end main
// query & export report data to named sheet
function runReport(q,sh) {
const report = AdsApp.report(q);
report.exportToSheet(sh);
}
Script 2
var config = {
LOG : false,
// Geriye dönük kaç günlük veri incelemek istiyorsanız parantez içerisindeki sayıyı değiştirin
DATE_RANGE: last_n_days(30),
// Boş bir Google E-Tablo URL’ini “” arasına ekleyin
SPREADSHEET_URL : “”
}
////////////////////////////////////////////////////////////////////
function main() {
var spreadsheet = SpreadsheetApp.openByUrl(config.SPREADSHEET_URL);
let campaignIterator = AdsApp
.performanceMaxCampaigns()
.withCondition(“campaign.status = ENABLED”)
.get();
while(campaignIterator.hasNext()){
let campaign = campaignIterator.next();
let query = AdsApp.report(
“SELECT campaign_search_term_insight.category_label, metrics.clicks, metrics.impressions, metrics.conversions, metrics.conversions_value ” +
“FROM campaign_search_term_insight ” +
“WHERE campaign_search_term_insight.campaign_id = ‘” + campaign.getId() + “‘ ” +
“AND segments.date BETWEEN ‘” + config.DATE_RANGE.split(‘,’)[0] + “‘ AND ‘” + config.DATE_RANGE.split(‘,’)[1] + “‘ ” +
“ORDER BY metrics.impressions DESC”
);
if(config.LOG === true){
Logger.log(“Report ” + campaign.getName() + ” contains ” + query.rows().totalNumEntities() + ” rows.”);
}
let sheet = checkTab(spreadsheet, campaign.getName());
query.exportToSheet(sheet);
} // campaignIterator
}
////////////////////////////////////////////////////////////////////
function checkTab(file, tabName){
if(SpreadsheetApp.openById(file.getId()).getSheetByName(tabName)){
var tab = SpreadsheetApp.openById(file.getId()).getSheetByName(tabName);
if(config.LOG === true){
Logger.log(“Selected tab ” + tabName);
}
} else {
var tab = SpreadsheetApp.openById(file.getId()).insertSheet(tabName);
if(config.LOG === true){
Logger.log(“Created tab ” + tabName);
}
}
// Remove default tab in Dutch
if(SpreadsheetApp.openById(file.getId()).getSheetByName(“Blad1”)){
var defaultSheet = SpreadsheetApp.openById(file.getId()).getSheetByName(“Blad1”)
SpreadsheetApp.openById(file.getId()).deleteSheet(defaultSheet);
}
// Remove default tab in English
if(SpreadsheetApp.openById(file.getId()).getSheetByName(“Sheet1”)){
var defaultSheet = SpreadsheetApp.openById(file.getId()).getSheetByName(“Sheet1”)
SpreadsheetApp.openById(file.getId()).deleteSheet(defaultSheet);
}
return tab;
} // function checkTab
////////////////////////////////////////////////////////////////////
function last_n_days(n) {
var from = new Date(), to = new Date();
to.setUTCDate(from.getUTCDate() – n);
from.setUTCDate(from.getUTCDate() – 1);
return google_date_range(from, to);
} // function last_n_days()
////////////////////////////////////////////////////////////////////
function google_date_range(from, to) {
function google_format(date) {
var date_array = [date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate()];
if (date_array[1] < 10) date_array[1] = ‘0’ + date_array[1];
if (date_array[2] < 10) date_array[2] = ‘0’ + date_array[2];
return date_array.join(”);
}
var inverse = (from > to);
from = google_format(from);
to = google_format(to);
var result = [from, to];
if (inverse) {
result = [to, from];
}
return result.join(‘,’);
} // function google_date_range()