Posts tagged with google-remarketing-audience

My audiences in Google Ads are not populating. Purchases, add to carts... are being tracked but not page views. However, I've checked that my tags are correctly set up through my GTM. The visits are properly reported in GA4. Could you help me please? Thank you

I created audiences in GA4 which I find in Google Ads. But they are populating in GA4 and not in Google Ads, even though they are the same audiences.

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) 

I'm trying to create a remarketing userList add some users into it using the Java implementation for Google Ads Api.

The custom audience creation part looks fine, I can see it created in the Ads plataform, but looks like the users wasn't included into it.

Print screen: Empty custom audience inside google ads plataform

I'm sending a JsonArray with 2000 user as parameter and hashing it inside this function, and used this samples as reference.

I'm not sure if I misunderstood the documentation or if I'm including the userList in a wrong way or anything like that.

    public JsonArray uploadJsonList(String customerId, JsonArray jsonUsers) throws Exception {                List<Member> members = new ArrayList<>();         JsonObject hashedObj = new JsonObject();         JsonArray arrayJsonHashed = new JsonArray();                          for (JsonValue jsonValue : jsonUsers) {                          JsonObject obj = jsonValue.asObject();             hashedObj = new JsonObject();                          //Getting user data             String normalizedEmail = textUtils.toNormalizedString(obj.get("PESSOA_EMAIL1").toString());             String normalizedPhone = textUtils.toNormalizedString(obj.get("PESSOA_CELULAR").toString());              String normalizedId = obj.get("PESSOA_ID").toString();              normalizedId = removeFirstandLast(normalizedId);                      //Hashing user data             hashedObj.add("pessoa_email1", textUtils.toSHA256String(normalizedEmail));             hashedObj.add("pessoa_celular", textUtils.toSHA256String(normalizedPhone));             hashedObj.add("pessoa_id",normalizedId);             arrayJsonHashed.add(hashedObj);                          //Creating a member list             Member member = new Member();             member.setHashedEmail(textUtils.toSHA256String(normalizedEmail));             member.setHashedPhoneNumber(textUtils.toSHA256String(normalizedPhone));             members.add(member);                  }                  //starting ads services         AdWordsServices adWordsServices = new AdWordsServices();         Customer[] customers = getCustomers(adWordsServices, session);         session.setClientCustomerId(customerId);         AdwordsUserListServiceInterface userListService = adWordsServices.get(session, AdwordsUserListServiceInterface.class);                  // Create a user list.         CrmBasedUserList userList = new CrmBasedUserList();         userList.setName("Test Remarketing Custom Audience - " + System.currentTimeMillis());         userList.setDescription("A list of customers that was readed from big query");                  // CRM-based user lists can use a membershipLifeSpan of 10000 to indicate unlimited; otherwise         // normal values apply.         userList.setMembershipLifeSpan(100L);         userList.setUploadKeyType(CustomerMatchUploadKeyType.CONTACT_INFO);                                  // Create operation.         UserListOperation operation = new UserListOperation();         operation.setOperand(userList);         operation.setOperator(Operator.ADD);         // Add user list.         UserListReturnValue result = userListService.mutate(new UserListOperation[]{operation});         // Display user list.         UserList userListAdded = result.getValue(0);         System.out.printf(                 "User list with name '%s' and ID %d was added.%n",                 userListAdded.getName(), userListAdded.getId());         // Get user list ID.         Long userListId = userListAdded.getId();         // Create operation to add members to the user list based on email addresses.         MutateMembersOperation mutateMembersOperation = new MutateMembersOperation();         MutateMembersOperand operand = new MutateMembersOperand();         operand.setUserListId(userListId);         operand.setMembersList(members.toArray(new Member[members.size()]));                     mutateMembersOperation.setOperand(operand);         mutateMembersOperation.setOperator(Operator.ADD);                  // Add members to the user list based on email addresses.         MutateMembersReturnValue mutateMembersResult =                 userListService.mutateMembers(new MutateMembersOperation[]{mutateMembersOperation});         // Display results.         // Reminder: it may take several hours for the list to be populated with members.         for (UserList userListResult : mutateMembersResult.getUserLists()) {             System.out.printf(                     "%d email addresses were uploaded to user list with name '%s' and ID %d "                             + "and are scheduled for review.%n",                             members.size(), userListResult.getName(), userListResult.getId());         }                          return arrayJsonHashed;     } 

I just added a Remarketing event snippet for a dynamic remarketing campaign to product pages in my store. here is an example of the code rendered on the page:

<script async="" src="https://www.googletagmanager.com/gtag/js?id=AW-XXXXXXXXX"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'AW-XXXXXXXXX'); </script> <script>  gtag('event', 'page_view', {  'send_to': 'AW-XXXXXXXXX',  'google_business_vertical' : 'retail',  'id' : 'YYYYYYYYYY',                        // Google Merchant Center ID  'ecomm_pagetype': 'product',  'ecomm_prodid': 'zzzzzzzzzzzzzz',  'ecomm_totalvalue': '255.00'  }); </script> 

This looks correct to me, but Google Tag Assistant extension says there's an error:


When I click 'Requests' and go to the 2nd one, it shows the following meta data:

which again, looks correct to me.

Also, when I go Google Ads --> Audience Manager --> Audience Sources --> Google Ads Tag, it tells me there's an issue: Issue: ecomm_prodid never received

This is very confusing since ​ecomm_prodid is present and has a vale in the meta data above. I'm not sure what else I could be doing wrong. If anyone can help troubleshooting or sees something wrong to begin with, I'd be most appreciative.

The scripts are being added to the tag of a Shopify theme... in case that matters.

Thanks!!