Google Ads (AdWords Search)
Install click and impression tags to your off-Facebook media so that you can get a more complete picture of your conversion path. Then, import mapping data to make your dashboards and reports easy to understand. For example, with cost mapping, you can see return on ad spend (ROAS) and cost metrics.
In Facebook Attribution:
- Go to Settings, then click Ad Platforms.
- Click Add a Platform.
- Select Google Ads (AdWords Search) from the list, then click Choose.
- Follow the onscreen instructions to navigate to the platform, install the tags, and set up the campaign mapping and cost mapping import. You can also reference the instructions below.
Install Tags
Install dynamic tags at the advertiser level to automatically capture click and impression data for all of your campaigns. If you choose to track individual campaigns, you'll need to install the tags manually on each new campaign.
If you need to track custom parameters like Creative ID, tags can be customized during tag creation in Facebook Attribution. If you choose to add them later, you'll have to reinstall your tags.
Note: Search platforms can only contain one placement per campaign. Learn more about tag limitations.
Note: The click tag provided by Facebook is compatible with parallel tracking in Google Ads.
Note: If you have an existing template, you'll need to chain, or concatenate, the click tags together. Facebook-provided click tags are auto-enabled to redirect to other templates that are third party redirects. The final chained click tag would appear like the example below. Please use the URL preview functionality to ensure the chaining of templates works.
https://ad.atdmt.com/s/go;adv=1111111111111;c.a=12345;p.a=12345; a.a=12345;qpb=1;cache=12345;?h=https://my.existing.clicktag.com/...
- In the Tracking template field, paste the Facebook-provided click tag.
- Click TEST to ensure the tag is set up correctly.
- After verifying that the tag is working correctly, click Save.
Import Mapping and Cost Data
Import mapping data to make your dashboards and reports easy to understand. With campaign mapping, you can see campaign and placement names instead of ID numbers. With cost mapping, you can see return on ad spend (ROAS) and cost metrics.
Automated Import (Recommended)
- Go to Google Ads.
- From the navigation menu at the top right, click Tools.
- Under Bulk Actions, click Scripts.
- Click + to create a new script. Enter a name for the script.
- In the field that opens, paste the Facebook-provided script.
- Google Ads Manager Account (MCC)
// Comma-separated list of recipients. Comment out to not send any emails. var RECIPIENT_EMAIL = 'mapping+
+ @atlas.facebook.com, cost+ + @atlas.facebook.com'; function main() { var accountSelector = MccApp.accounts(); accountSelector.executeInParallel("processIndividualAccount"); } function processIndividualAccount() { Logger.log('Starting search report generation for account - ' + AdWordsApp.currentAccount().getCustomerId ()); processCampaigns('search'); processCampaigns('shopping'); } function processCampaigns(type) { Logger.log('Processing ' + type + ' campaigns'); var MILLIS_PER_DAY = 1000 * 60 * 60 * 24; // Headers var csv = 'Date, Keyword, Campaign ID, Campaign, Ad group ID, Ad group, Impressions, Clicks, Cost, Timezone'; var report; var campaign_ids_map = {}; if (type == 'search') { // Generate report var report = AdWordsApp.report( 'SELECT Criteria, CampaignId, CampaignName, CampaignStatus, AdGroupId, AdGroupName, AdGroupStatus, Impressions, Clicks, AverageCpc ' + 'FROM KEYWORDS_PERFORMANCE_REPORT ' + 'WHERE CampaignStatus=ENABLED and AdGroupStatus=ENABLED ' + 'DURING YESTERDAY'); var search_campaigns = AdWordsApp.campaigns().withCondition("AdvertisingChannelType = SEARCH").get(); while (search_campaigns.hasNext()) { var search_campaign = search_campaigns.next(); campaign_ids_map[search_campaign.getName()] = search_campaign.getId(); } } else if (type == 'shopping') { // Generate report var report = AdWordsApp.report( 'SELECT CampaignId, CampaignName, CampaignStatus, AdGroupId, AdGroupName, AdGroupStatus, Impressions, Clicks, AverageCpc ' + 'FROM SHOPPING_PERFORMANCE_REPORT ' + 'WHERE CampaignStatus=ENABLED and AdGroupStatus=ENABLED ' + 'DURING YESTERDAY'); var shopping_campaigns = AdWordsApp.shoppingCampaigns().get(); while (shopping_campaigns.hasNext()) { var shopping_campaign = shopping_campaigns.next(); campaign_ids_map[shopping_campaign.getName()] = shopping_campaign.getId(); } } var rows = report.rows(); var now = new Date(); var timeZone = AdWordsApp.currentAccount().getTimeZone(); var yesterday = Utilities.formatDate(new Date(now.getTime() - MILLIS_PER_DAY), timeZone, 'MM/dd/yyyy'); var hasValidRows = false; while (rows.hasNext()) { var row = rows.next(); var keyWordName = ''; if (type == 'search') { keyWordName = row['Criteria']; keyWordName = keyWordName.replace(/,/g,''); } var campaignName = row['CampaignName']; campaignName = campaignName.replace(/,/g,''); var campaignId = row['CampaignId']; if (campaign_ids_map[campaignName] == undefined) { continue; } var adGroupId = row['AdGroupId']; var adGroupName = row['AdGroupName']; adGroupName = adGroupName.replace(/,/g,''); var clicks = row['Clicks']; var impressions = row['Impressions']; var cpc = row['AverageCpc']; cpc = cpc.replace(/,/g,''); var cost = cpc * clicks; var result = [yesterday, keyWordName, campaignId, campaignName, adGroupId, adGroupName, impressions, clicks, cost, timeZone]; hasValidRows = true; csv += '
' + result.join(','); } if(RECIPIENT_EMAIL && hasValidRows == true) { var reportName = 'adwords_'+ type + '_report_' + AdWordsApp.currentAccount().getCustomerId(); var compressedCSV = Utilities.zip([Utilities.newBlob(csv,'application/octet-stream').setName(reportName + '.csv')], reportName +'.zip'); MailApp.sendEmail( RECIPIENT_EMAIL, 'Adwords search performance report', '', {attachments:compressedCSV} ); } } - Google Ads Account
// Comma-separated list of recipients. Comment out to not send any emails. var RECIPIENT_EMAIL = 'mapping+
+ @atlas.facebook.com, cost+ + @atlas.facebook.com'; function main() { Logger.log('Starting search report generation'); processCampaigns('search'); processCampaigns('shopping'); } function processCampaigns(type) { Logger.log('Processing ' + type + ' campaigns'); var MILLIS_PER_DAY = 1000 * 60 * 60 * 24; // Headers var csv = 'Date, Keyword, Campaign ID, Campaign, Ad group ID, Ad group, Impressions, Clicks, Cost, Timezone'; var report; var campaign_ids_map = {}; if (type == 'search') { // Generate report var report = AdWordsApp.report( 'SELECT Criteria, CampaignId, CampaignName, CampaignStatus, AdGroupId, AdGroupName, AdGroupStatus, Impressions, Clicks, AverageCpc ' + 'FROM KEYWORDS_PERFORMANCE_REPORT ' + 'WHERE CampaignStatus=ENABLED and AdGroupStatus=ENABLED ' + 'DURING YESTERDAY'); var search_campaigns = AdWordsApp.campaigns().withCondition("AdvertisingChannelType = SEARCH").get(); while (search_campaigns.hasNext()) { var search_campaign = search_campaigns.next(); campaign_ids_map[search_campaign.getName()] = search_campaign.getId(); } } else if (type == 'shopping') { // Generate report var report = AdWordsApp.report( 'SELECT CampaignId, CampaignName, CampaignStatus, AdGroupId, AdGroupName, AdGroupStatus, Impressions, Clicks, AverageCpc ' + 'FROM SHOPPING_PERFORMANCE_REPORT ' + 'WHERE CampaignStatus=ENABLED and AdGroupStatus=ENABLED ' + 'DURING YESTERDAY'); var shopping_campaigns = AdWordsApp.shoppingCampaigns().get(); while (shopping_campaigns.hasNext()) { var shopping_campaign = shopping_campaigns.next(); campaign_ids_map[shopping_campaign.getName()] = shopping_campaign.getId(); } } var rows = report.rows(); var now = new Date(); var timeZone = AdWordsApp.currentAccount().getTimeZone(); var yesterday = Utilities.formatDate(new Date(now.getTime() - MILLIS_PER_DAY), timeZone, 'MM/dd/yyyy'); var hasValidRows = false; while (rows.hasNext()) { var row = rows.next(); var keyWordName = ''; if (type == 'search') { keyWordName = row['Criteria']; keyWordName = keyWordName.replace(/,/g,''); } var campaignName = row['CampaignName']; campaignName = campaignName.replace(/,/g,''); var campaignId = row['CampaignId']; if (campaign_ids_map[campaignName] == undefined) { continue; } var adGroupId = row['AdGroupId']; var adGroupName = row['AdGroupName']; adGroupName = adGroupName.replace(/,/g,''); var clicks = row['Clicks']; var impressions = row['Impressions']; var cpc = row['AverageCpc']; cpc = cpc.replace(/,/g,''); var cost = cpc * clicks; var result = [yesterday, keyWordName, campaignId, campaignName, adGroupId, adGroupName, impressions, clicks, cost, timeZone]; hasValidRows = true; csv += '
' + result.join(','); } if(RECIPIENT_EMAIL && hasValidRows == true) { var reportName = 'adwords_'+ type + '_report_' + AdWordsApp.currentAccount().getCustomerId(); var compressedCSV = Utilities.zip([Utilities.newBlob(csv,'application/octet-stream').setName(reportName + '.csv')], reportName +'.zip'); MailApp.sendEmail( RECIPIENT_EMAIL, 'Adwords search performance report', '', {attachments:compressedCSV} ); } } - Click Preview to verify that the script is valid. If you're prompted for permission to run the script, click Authorize Now.
- Click Save, then click Close.
- Hover over the Frequency column to the right of the script you created to edit the frequency.
- Select Daily and 6:00 AM local time. Click Save.
- Go to Google Ads.
- From the navigation menu at the top right, click Tools.
- Under Bulk Actions, click Scripts.
- Click + to create a new script. Enter a name for the script.
- In the field that opens, paste the Facebook-provided script.
- Google Ads Manager Account (MCC)
// Comma-separated list of recipients. Comment out to not send any emails. var RECIPIENT_EMAIL = 'mapping+
+ @atlas.facebook.com'; function main() { var accountSelector = MccApp.accounts(); accountSelector.executeInParallel("processIndividualAccount"); } function processIndividualAccount() { Logger.log('Starting search report generation for account - ' + AdWordsApp.currentAccount().getName()); processCampaigns('search'); processCampaigns('shopping'); } function processCampaigns(type) { Logger.log('Processing ' + type + ' campaigns'); var MILLIS_PER_DAY = 1000 * 60 * 60 * 24; // Headers var csv = 'Date, Keyword, Campaign ID, Campaign, Ad group ID, Ad group, Impressions, Clicks, Timezone'; var report; var campaign_ids_map = {}; if (type == 'search') { // Generate report var report = AdWordsApp.report( 'SELECT Criteria, CampaignId, CampaignName, CampaignStatus, AdGroupId, AdGroupName, AdGroupStatus, Impressions, Clicks ' + 'FROM KEYWORDS_PERFORMANCE_REPORT ' + 'WHERE CampaignStatus=ENABLED and AdGroupStatus=ENABLED ' + 'DURING YESTERDAY'); var search_campaigns = AdWordsApp.campaigns().withCondition("AdvertisingChannelType = SEARCH").get(); while (search_campaigns.hasNext()) { var search_campaign = search_campaigns.next(); campaign_ids_map[search_campaign.getName()] = search_campaign.getId(); } } else if (type == 'shopping') { // Generate report var report = AdWordsApp.report( 'SELECT CampaignId, CampaignName, CampaignStatus, AdGroupId, AdGroupName, AdGroupStatus, Impressions, Clicks ' + 'FROM SHOPPING_PERFORMANCE_REPORT ' + 'WHERE CampaignStatus=ENABLED and AdGroupStatus=ENABLED ' + 'DURING YESTERDAY'); var shopping_campaigns = AdWordsApp.shoppingCampaigns().get(); while (shopping_campaigns.hasNext()) { var shopping_campaign = shopping_campaigns.next(); campaign_ids_map[shopping_campaign.getName()] = shopping_campaign.getId(); } } var rows = report.rows(); var now = new Date(); var timeZone = AdWordsApp.currentAccount().getTimeZone(); var yesterday = Utilities.formatDate(new Date(now.getTime() - MILLIS_PER_DAY), timeZone, 'MM/dd/yyyy'); var hasValidRows = false; while (rows.hasNext()) { var row = rows.next(); var keyWordName = ''; if (type == 'search') { keyWordName = row['Criteria']; keyWordName = keyWordName.replace(/,/g,''); } var campaignName = row['CampaignName']; campaignName = campaignName.replace(/,/g,''); var campaignId = row['CampaignId']; if (campaign_ids_map[campaignName] == undefined) { continue; } var adGroupId = row['AdGroupId']; var adGroupName = row['AdGroupName']; adGroupName = adGroupName.replace(/,/g,''); var clicks = row['Clicks']; var impressions = row['Impressions']; var result = [yesterday, keyWordName, campaignId, campaignName, adGroupId, adGroupName, impressions, clicks, timeZone]; hasValidRows = true; csv += '
' + result.join(','); } if(RECIPIENT_EMAIL && hasValidRows == true) { var reportName = 'adwords_'+ type + '_report_' + AdWordsApp.currentAccount().getCustomerId(); var compressedCSV = Utilities.zip([Utilities.newBlob(csv,'application/octet-stream').setName(reportName + '.csv')], reportName +'.zip'); MailApp.sendEmail( RECIPIENT_EMAIL, 'Adwords search performance report', '', {attachments:compressedCSV} ); } } - Google Ads Account
// Comma-separated list of recipients. Comment out to not send any emails. var RECIPIENT_EMAIL = 'mapping+
+ @atlas.facebook.com'; function main() { Logger.log('Starting search report generation'); processCampaigns('search'); processCampaigns('shopping'); } function processCampaigns(type) { Logger.log('Processing ' + type + ' campaigns'); var MILLIS_PER_DAY = 1000 * 60 * 60 * 24; // Headers var csv = 'Date, Keyword, Campaign ID, Campaign, Ad group ID, Ad group, Impressions, Clicks, Timezone'; var report; var campaign_ids_map = {}; if (type == 'search') { // Generate report var report = AdWordsApp.report( 'SELECT Criteria, CampaignId, CampaignName, CampaignStatus, AdGroupId, AdGroupName, AdGroupStatus, Impressions, Clicks ' + 'FROM KEYWORDS_PERFORMANCE_REPORT ' + 'WHERE CampaignStatus=ENABLED and AdGroupStatus=ENABLED ' + 'DURING YESTERDAY'); var search_campaigns = AdWordsApp.campaigns().withCondition("AdvertisingChannelType = SEARCH").get(); while (search_campaigns.hasNext()) { var search_campaign = search_campaigns.next(); campaign_ids_map[search_campaign.getName()] = search_campaign.getId(); } } else if (type == 'shopping') { // Generate report var report = AdWordsApp.report( 'SELECT CampaignId, CampaignName, CampaignStatus, AdGroupId, AdGroupName, AdGroupStatus, Impressions, Clicks ' + 'FROM SHOPPING_PERFORMANCE_REPORT ' + 'WHERE CampaignStatus=ENABLED and AdGroupStatus=ENABLED ' + 'DURING YESTERDAY'); var shopping_campaigns = AdWordsApp.shoppingCampaigns().get(); while (shopping_campaigns.hasNext()) { var shopping_campaign = shopping_campaigns.next(); campaign_ids_map[shopping_campaign.getName()] = shopping_campaign.getId(); } } var rows = report.rows(); var now = new Date(); var timeZone = AdWordsApp.currentAccount().getTimeZone(); var yesterday = Utilities.formatDate(new Date(now.getTime() - MILLIS_PER_DAY), timeZone, 'MM/dd/yyyy'); var hasValidRows = false; while (rows.hasNext()) { var row = rows.next(); var keyWordName = ''; if (type == 'search') { keyWordName = row['Criteria']; keyWordName = keyWordName.replace(/,/g,''); } var campaignName = row['CampaignName']; campaignName = campaignName.replace(/,/g,''); var campaignId = row['CampaignId']; if (campaign_ids_map[campaignName] == undefined) { continue; } var adGroupId = row['AdGroupId']; var adGroupName = row['AdGroupName']; adGroupName = adGroupName.replace(/,/g,''); var clicks = row['Clicks']; var impressions = row['Impressions']; var result = [yesterday, keyWordName, campaignId, campaignName, adGroupId, adGroupName, impressions, clicks, timeZone]; hasValidRows = true; csv += '
' + result.join(','); } if(RECIPIENT_EMAIL && hasValidRows == true) { var reportName = 'adwords_'+ type + '_report_' + AdWordsApp.currentAccount().getCustomerId(); var compressedCSV = Utilities.zip([Utilities.newBlob(csv,'application/octet-stream').setName(reportName + '.csv')], reportName +'.zip'); MailApp.sendEmail( RECIPIENT_EMAIL, 'Adwords search performance report', '', {attachments:compressedCSV} ); } } - Click Preview to verify that the script is valid. If you're prompted for permission to run the script, click Authorize Now.
- Click Save, then click Close.
- Hover over the Frequency column to the right of the script you created to edit the frequency.
- Select Daily and 6:00 AM local time. Click Save.
Manual Import
- Go to Google Ads.
- From the navigation menu at the top right, click Tools.
- Under Bulk Actions, click Scripts.
- Click + to create a new script. Enter a name for the script.
- In the field that opens, paste the Facebook-provided script.
- In the second line of the script, replace RECIPIENT EMAIL with the email address where you'd like to receive the report. Be sure to leave the single quotation marks around the email address exactly as they appear in the script.
- Google Ads Manager Account (MCC)
// Comma-separated list of recipients. Comment out to not send any emails. var RECIPIENT_EMAIL = '[RECIPIENT EMAIL]'; function main() { var accountSelector = MccApp.accounts(); accountSelector.executeInParallel("processIndividualAccount"); } function processIndividualAccount() { Logger.log('Starting search report generation for account - ' + AdWordsApp.currentAccount().getName()); processCampaigns('search'); processCampaigns('shopping'); } function processCampaigns(type) { Logger.log('Processing ' + type + ' campaigns'); var MILLIS_PER_DAY = 1000 * 60 * 60 * 24; // Headers var csv = 'Date, Keyword, Campaign ID, Campaign, Ad group ID, Ad group, Impressions, Clicks, Cost, Timezone'; var report; var campaign_ids_map = {}; if (type == 'search') { // Generate report var report = AdWordsApp.report( 'SELECT Criteria, CampaignId, CampaignName, CampaignStatus, AdGroupId, AdGroupName, AdGroupStatus, Impressions, Clicks, AverageCpc ' + 'FROM KEYWORDS_PERFORMANCE_REPORT ' + 'WHERE CampaignStatus=ENABLED and AdGroupStatus=ENABLED ' + 'DURING YESTERDAY'); var search_campaigns = AdWordsApp.campaigns().withCondition("AdvertisingChannelType = SEARCH").get(); while (search_campaigns.hasNext()) { var search_campaign = search_campaigns.next(); campaign_ids_map[search_campaign.getName()] = search_campaign.getId(); } } else if (type == 'shopping') { // Generate report var report = AdWordsApp.report( 'SELECT CampaignId, CampaignName, CampaignStatus, AdGroupId, AdGroupName, AdGroupStatus, Impressions, Clicks, AverageCpc ' + 'FROM SHOPPING_PERFORMANCE_REPORT ' + 'WHERE CampaignStatus=ENABLED and AdGroupStatus=ENABLED ' + 'DURING YESTERDAY'); var shopping_campaigns = AdWordsApp.shoppingCampaigns().get(); while (shopping_campaigns.hasNext()) { var shopping_campaign = shopping_campaigns.next(); campaign_ids_map[shopping_campaign.getName()] = shopping_campaign.getId(); } } var rows = report.rows(); var now = new Date(); var timeZone = AdWordsApp.currentAccount().getTimeZone(); var yesterday = Utilities.formatDate(new Date(now.getTime() - MILLIS_PER_DAY), timeZone, 'MM/dd/yyyy'); var hasValidRows = false; while (rows.hasNext()) { var row = rows.next(); var keyWordName = ''; if (type == 'search') { keyWordName = row['Criteria']; keyWordName = keyWordName.replace(/,/g,''); } var campaignName = row['CampaignName']; campaignName = campaignName.replace(/,/g,''); var campaignId = row['CampaignId']; if (campaign_ids_map[campaignName] == undefined) { continue; } var adGroupId = row['AdGroupId']; var adGroupName = row['AdGroupName']; adGroupName = adGroupName.replace(/,/g,''); var clicks = row['Clicks']; var impressions = row['Impressions']; var cpc = row['AverageCpc']; cpc = cpc.replace(/,/g,''); var cost = cpc * clicks; var result = [yesterday, keyWordName, campaignId, campaignName, adGroupId, adGroupName, impressions, clicks, cost, timeZone]; hasValidRows = true; csv += '
' + result.join(','); } if(RECIPIENT_EMAIL && hasValidRows == true) { var reportName = 'adwords_'+ type + '_report_' + AdWordsApp.currentAccount().getCustomerId(); var compressedCSV = Utilities.zip([Utilities.newBlob(csv,'application/octet-stream').setName(reportName + '.csv')], reportName +'.zip'); MailApp.sendEmail( RECIPIENT_EMAIL, 'Adwords search performance report', '', {attachments:compressedCSV} ); } } - Google Ads Account
// Comma-separated list of recipients. Comment out to not send any emails. var RECIPIENT_EMAIL = '[RECIPIENT EMAIL]'; function main() { Logger.log('Starting search report generation'); processCampaigns('search'); processCampaigns('shopping'); } function processCampaigns(type) { Logger.log('Processing ' + type + ' campaigns'); var MILLIS_PER_DAY = 1000 * 60 * 60 * 24; // Headers var csv = 'Date, Keyword, Campaign ID, Campaign, Ad group ID, Ad group, Impressions, Clicks, Cost, Timezone'; var report; var campaign_ids_map = {}; if (type == 'search') { // Generate report var report = AdWordsApp.report( 'SELECT Criteria, CampaignId, CampaignName, CampaignStatus, AdGroupId, AdGroupName, AdGroupStatus, Impressions, Clicks, AverageCpc ' + 'FROM KEYWORDS_PERFORMANCE_REPORT ' + 'WHERE CampaignStatus=ENABLED and AdGroupStatus=ENABLED ' + 'DURING YESTERDAY'); var search_campaigns = AdWordsApp.campaigns().withCondition("AdvertisingChannelType = SEARCH").get(); while (search_campaigns.hasNext()) { var search_campaign = search_campaigns.next(); campaign_ids_map[search_campaign.getName()] = search_campaign.getId(); } } else if (type == 'shopping') { // Generate report var report = AdWordsApp.report( 'SELECT CampaignId, CampaignName, CampaignStatus, AdGroupId, AdGroupName, AdGroupStatus, Impressions, Clicks, AverageCpc ' + 'FROM SHOPPING_PERFORMANCE_REPORT ' + 'WHERE CampaignStatus=ENABLED and AdGroupStatus=ENABLED ' + 'DURING YESTERDAY'); var shopping_campaigns = AdWordsApp.shoppingCampaigns().get(); while (shopping_campaigns.hasNext()) { var shopping_campaign = shopping_campaigns.next(); campaign_ids_map[shopping_campaign.getName()] = shopping_campaign.getId(); } } var rows = report.rows(); var now = new Date(); var timeZone = AdWordsApp.currentAccount().getTimeZone(); var yesterday = Utilities.formatDate(new Date(now.getTime() - MILLIS_PER_DAY), timeZone, 'MM/dd/yyyy'); var hasValidRows = false; while (rows.hasNext()) { var row = rows.next(); var keyWordName = ''; if (type == 'search') { keyWordName = row['Criteria']; keyWordName = keyWordName.replace(/,/g,''); } var campaignName = row['CampaignName']; campaignName = campaignName.replace(/,/g,''); var campaignId = row['CampaignId']; if (campaign_ids_map[campaignName] == undefined) { continue; } var adGroupId = row['AdGroupId']; var adGroupName = row['AdGroupName']; adGroupName = adGroupName.replace(/,/g,''); var clicks = row['Clicks']; var impressions = row['Impressions']; var cpc = row['AverageCpc']; cpc = cpc.replace(/,/g,''); var cost = cpc * clicks; var result = [yesterday, keyWordName, campaignId, campaignName, adGroupId, adGroupName, impressions, clicks, cost, timeZone]; hasValidRows = true; csv += '
' + result.join(','); } if(RECIPIENT_EMAIL && hasValidRows == true) { var reportName = 'adwords_'+ type + '_report_' + AdWordsApp.currentAccount().getCustomerId(); var compressedCSV = Utilities.zip([Utilities.newBlob(csv,'application/octet-stream').setName(reportName + '.csv')], reportName +'.zip'); MailApp.sendEmail( RECIPIENT_EMAIL, 'Adwords search performance report', '', {attachments:compressedCSV} ); } } - Click Preview to verify that the script is valid. If you're prompted for permission to run the script, click Authorize Now.
- Click Save, then click Close.
- Hover over the Frequency column to the right of the script you created to edit the frequency.
- Select Daily and 6:00 AM local time. Click Save.
Each time you add or rename a campaign, placement or ad set, you'll need to manually import mapping data. We recommend importing at least once a week to maintain consistency.
In Facebook Attribution:
- Go to Settings, then click Ad platforms.
- Click on the name of the platform that you're importing mapping for to view more details.
- In the Platform section, click Import > Mapping data.
- Upload your report that contains the mapping data.

For reporting accuracy, we recommend importing cost data at least once a week.
In Facebook Attribution:
- Go to Settings, then click Ad platforms.
- Click on the name of the platform that you're importing cost data for to view more details.
- In the Platform section, click Import > Cost data.
- Upload your report that contains the cost data.

Troubleshooting
The AdWords script to set up a recurring report for automated mapping and cost import in Facebook Attribution may time out for some AdWords accounts due to a 30-minute maximum execution time limit for AdWords scripts. Learn more at https://developers.google.com/adwords/scripts/docs/limits.
The script's execution time is dependent on the number of AdWords accounts (if running the MCC script) and the number of entities within an AdWords account.
If you're experiencing this issue, you may reduce the number of entities to be processed in the script. The following examples provide ways of modifying the provided scripts:
Google AdWords (Search)
- Original: 'WHERE CampaignStatus=ENABLED and AdGroupStatus=ENABLED'
- Modified: 'WHERE Impressions > 0 and CampaignStatus=ENABLED and AdGroupStatus=ENABLED'
Google AdWords (Display)
- Original: 'WHERE CampaignStatus=ENABLED'
- Modified: 'WHERE Impressions > 0 and CampaignStatus=ENABLED'
If you still see unmapped campaigns in Facebook Attribution, you can also run a copy of the script to address the condition where 'Impressions = 0'. See the example below:
Google AdWords (Search)
- Original: 'WHERE CampaignStatus=ENABLED and AdGroupStatus=ENABLED'
- Modified: 'WHERE Impressions=0 and CampaignStatus=ENABLED and AdGroupStatus=ENABLED'
* Nguồn: Facebook