Posts under category Google

Hello wonderful person!

I've followed this guide to import google ads campaign info to a BigQuery database.

My goal is to create a simple query that can be stored as a view and accessed from Data Studio to make a report. But some fields like AverageCpm are always set to 0.

I also have a data studio report made using google ads as source for reference and I can access all the campaigns from the google ads platform.

Here is the query I'm working on:

SELECT   c.ExternalCustomerId,   c.CampaignName as name,   c.CampaignStatus,   cs.date as dia,   SUM(cs.Impressions) AS Impressions,   SUM(cs.Interactions) AS Interactions,   AVG(cs.AverageCpm)  AS CPM,   SUM(cs.Cost)  AS Cost FROM   `<DB>.google_ads.Campaign_<ACCOUNT_ID>` c LEFT JOIN   `<DB>.google_ads.CampaignStats_<ACCOUNT_ID>` cs ON   (c.CampaignId = cs.CampaignId    AND cs._DATA_DATE BETWEEN    DATE_ADD(CURRENT_DATE(), INTERVAL -80 DAY) AND DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY)) WHERE   c._DATA_DATE = c._LATEST_DATE   and c.CampaignName = 'THE_NAME_OF_MY_CAMPAIGN' GROUP BY   1, 2, 3 , 4 ORDER BY   CampaignName, dia 

The field Impressions, returns with a value that is consistent with my reference datastudio report and the info I see in google ads stats, so I feel I'm in the right track.

My problem is that some fields like CampaignStats.AverageCpm , CampaignStats.Cost are always 0.

For example, the query:

Select * from `<DB>.google_ads.p_CampaignStats_<ACCOUNT_ID>` where AverageCpm >0; 

Returns with no results.

I'm thinking permission problems? But I have administrator access to all the company's accounts.

Database is backfilled correctly.

I've tried generating a new dataset: Same problem and I don't see if there is a way to configure how google makes the imports.

What else could it be? What else can I do?

Thank you very very much!

I'm using google adwords api to create campaigns and ads. I keep getting this error :Unauthorized CREATE operation in invoking a service's mutate method. I'm using a manager account. I tried with a test account and it was working but with my manager account it doesnt. PS : My developer token has a basic access.

 const client = new GoogleAdsApi({   client_id: req.headers["client_id"],   client_secret: req.headers["client_secret"],   developer_token: req.headers["developer_token"], }); const customer = client.Customer({   customer_id: req.headers["customer_id"],   refresh_token: req.headers["refresh_token"], });   const ad_group_ad = [     {       ad: {         responsive_display_ad: {           accent_color: req.body.pubGads.couleurs_perso,           main_color: req.body.pubGads.couleurs_perso,           marketing_images: marketing_images_tab.map((element) => {             return {               asset: element,             };           }),           square_logo_images: square_logo_images_tab.map((element) => {             return {               asset: element,             };           }),           square_marketing_images: square_marketing_images_tab.map(             (element) => {               return {                 asset: element,               };             }           ),           headlines: headlinesTab.map((element) => {             return {               text: element,             };           }),           long_headline: {             text: req.body.pubGads.titre_long,           },           descriptions: descriptionsTab.map((element) => {             return {               text: element,             };           }),           business_name: req.body.pubGads.nom_entreprise,           call_to_action_text: req.body.pubGads.texte_incitation,         },         final_urls: req.body.pubGads.url_finale.split(","),       },       ad_group: adGroupResults.results[0].resource_name,       status: enums.AdGroupAdStatus.PAUSED,     },   ];   const ad_group_ad_result = await customer.adGroupAds.create(ad_group_ad); 

I am using Google Ads to get some traffic to my website.

I am tracking the conversions through Google Analytics

I can see my conversions on Google Analytics, but Google Ads is not counting any conversion

Here the goal configuration

The 36 conversions Which I have from Google are traffic through Google Ads and not organic. But on my Google Ads dashboard, I have 0 conversions.

The website is built with react, which could be a little tricky sometimes with tags, and Google Analytics is loaded through Google Tag Manager. I do not think the problem is coming from GTM configuration as we do have the conversions on Google Analytics

It's been more than a week and I haven't been to figure out where I'm going wrong.
I'm trying to use a keyword planner and getting a continuous Authentication error. I have my test manager account and have created a google test ads account from that. I have also my client_id, client_secret, and refresh_token from console.developer.google.com
I'm using a developer token from the production account which is not verified.
Thanks in advance.
Here is the error Message:

 Your default encoding, cp1252, is not UTF-8. Please run this script with UTF-8 encoding to avoid errors. Error summary: {'faultMessage': "[QuotaCheckError.INVALID_TOKEN_HEADER @ ; trigger:'New developers must use the Google Ads API.']", 'requestId': 'foobar', 'serviceName': 'TrafficEstimatorService', 'methodName': 'get', 'operations': '1', 'responseTime': '83'} Traceback (most recent call last):   File "env\lib\site-packages\googleads\common.py", line 984, in MakeSoapRequest      return soap_service_method(   File "env\lib\site-packages\zeep\proxy.py", line 46, in __call__     return self._proxy._binding.send(   File "env\lib\site-packages\zeep\wsdl\bindings\soap.py", line 135, in send          return self.process_reply(client, operation_obj, response)  File "env\lib\site-packages\zeep\wsdl\bindings\soap.py", line 229, in process_reply     return self.process_error(doc, operation)   File "env\lib\site-packages\zeep\wsdl\bindings\soap.py", line 329, in process_error     raise Fault( zeep.exceptions.Fault: [QuotaCheckError.INVALID_TOKEN_HEADER @ ; trigger:'New developers must use the Google Ads API.']      During handling of the above exception, another exception occurred: Traceback (most recent call last):   File "test.py", line 181, in <module>     main(adwords_client)   File "test.py", line 97, in main     estimates = traffic_estimator_service.get(selector)          File "env\lib\site-packages\googleads\common.py", line 996, in MakeSoapRequest      raise googleads.errors.GoogleAdsServerFault( googleads.errors.GoogleAdsServerFault: [QuotaCheckError.INVALID_TOKEN_HEADER @ ; trigger:'New developers must use the Google Ads API.'] 

Here is my google ads file:

adwords: # AdWordsClient configurations   developer_token: mydevtoken1234   client_customer_id: 123-123-123   validate_only: False   client_id: myclientId.apps.googleusercontent.com   client_secret: myclientsecret   refresh_token: myrefreshtoken # AdManagerClient configurations ad_manager:   developer_token: EZ-x_JXs6mtX6tDO_8VauA   application_name: get-keyword-ideas   # path_to_private_key_file: INSERT_PATH_TO_JSON_KEY_FILE_HERE   client_id: myclientId.apps.googleusercontent.com   client_secret: myclientsecret   refresh_token: myrefreshtoken 

And Here is my Python code for trafficEstimator

#!/usr/bin/env python # # Copyright 2016 Google Inc. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # #      http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """This example retrieves keyword traffic estimates. The LoadFromStorage method is pulling credentials and properties from a "googleads.yaml" file. By default, it looks for this file in your home directory. For more information, see the "Caching authentication information" section of our README. """ from googleads import adwords def main(client):   # Initialize appropriate service.   traffic_estimator_service = client.GetService(       'TrafficEstimatorService', version='v201809')   # Construct selector object and retrieve traffic estimates.   keywords = [       {'text': 'mars cruise', 'matchType': 'BROAD'},       {'text': 'cheap cruise', 'matchType': 'PHRASE'},       {'text': 'cruise', 'matchType': 'EXACT'}   ]   negative_keywords = [       {'text': 'moon walk', 'matchType': 'BROAD'}   ]   keyword_estimate_requests = []   for keyword in keywords:     keyword_estimate_requests.append({         'keyword': {             'xsi_type': 'Keyword',             'matchType': keyword['matchType'],             'text': keyword['text']         }     })   for keyword in negative_keywords:     keyword_estimate_requests.append({         'keyword': {             'xsi_type': 'Keyword',             'matchType': keyword['matchType'],             'text': keyword['text']         },         'isNegative': 'true'     })   # Create ad group estimate requests.   adgroup_estimate_requests = [{       'keywordEstimateRequests': keyword_estimate_requests,       'maxCpc': {           'xsi_type': 'Money',           'microAmount': '1000000'       }   }]   # Create campaign estimate requests.   campaign_estimate_requests = [{       'adGroupEstimateRequests': adgroup_estimate_requests,       'criteria': [           {               'xsi_type': 'Location',               'id': '2840'  # United States.           },           {               'xsi_type': 'Language',               'id': '1000'  # English.           }       ],   }]   # Create the selector.   selector = {       'campaignEstimateRequests': campaign_estimate_requests,   }   # Optional: Request a list of campaign-level estimates segmented by   # platform.   selector['platformEstimateRequested'] = True   # Get traffic estimates.   estimates = traffic_estimator_service.get(selector)   campaign_estimate = estimates['campaignEstimates'][0]   # Display the campaign level estimates segmented by platform.   if 'platformEstimates' in campaign_estimate:     platform_template = ('Results for the platform with ID: "%d" and name: '                          '"%s".')     for platform_estimate in campaign_estimate['platformEstimates']:       platform = platform_estimate['platform']       DisplayEstimate(platform_template % (platform['id'],                                            platform['platformName']),                       platform_estimate['minEstimate'],                       platform_estimate['maxEstimate'])   # Display the keyword estimates.   if 'adGroupEstimates' in campaign_estimate:     ad_group_estimate = campaign_estimate['adGroupEstimates'][0]     if 'keywordEstimates' in ad_group_estimate:       keyword_estimates = ad_group_estimate['keywordEstimates']       keyword_template = ('Results for the keyword with text "%s" and match '                           'type "%s":')       keyword_estimates_and_requests = zip(keyword_estimates,                                            keyword_estimate_requests)       for keyword_tuple in keyword_estimates_and_requests:         if keyword_tuple[1].get('isNegative', False):           continue         keyword = keyword_tuple[1]['keyword']         keyword_estimate = keyword_tuple[0]         DisplayEstimate(keyword_template % (keyword['text'],                                             keyword['matchType']),                         keyword_estimate['min'], keyword_estimate['max']) def _CalculateMean(min_est, max_est):   if min_est and max_est:     return (float(min_est) + float(max_est)) / 2.0   else:     return None def _FormatMean(mean):   if mean:     return '%.2f' % mean   else:     return 'N/A' def DisplayEstimate(message, min_estimate, max_estimate):   """Displays mean average cpc, position, clicks, and total cost for estimate.   Args:     message: str message to display for the given estimate.     min_estimate: zeep.objects.StatsEstimate containing a minimum estimate from the       TrafficEstimatorService response.     max_estimate: zeep.objects.StatsEstimate containing a maximum estimate from the       TrafficEstimatorService response.   """   # Find the mean of the min and max values.   mean_avg_cpc = (_CalculateMean(min_estimate['averageCpc']['microAmount'],                                  max_estimate['averageCpc']['microAmount'])                   if 'averageCpc' in min_estimate                   and min_estimate['averageCpc'] else None)   mean_avg_pos = (_CalculateMean(min_estimate['averagePosition'],                                  max_estimate['averagePosition'])                   if 'averagePosition' in min_estimate                   and min_estimate['averagePosition'] else None)   mean_clicks = _CalculateMean(min_estimate['clicksPerDay'],                                max_estimate['clicksPerDay'])   mean_total_cost = _CalculateMean(min_estimate['totalCost']['microAmount'],                                    max_estimate['totalCost']['microAmount'])   print(message)   print('  Estimated average CPC: %s' % _FormatMean(mean_avg_cpc))   print('  Estimated ad position: %s' % _FormatMean(mean_avg_pos))   print('  Estimated daily clicks: %s' % _FormatMean(mean_clicks))   print('  Estimated daily cost: %s' % _FormatMean(mean_total_cost)) if __name__ == '__main__':   # Initialize client object.   adwords_client = adwords.AdWordsClient.LoadFromStorage('googleads.yaml')   main(adwords_client)