Regarding Google AdWords:

  1. Does their data contain details of the person/user who is generating the clicks/impressions? Such as employer, organization?
  2. Is there a way to see the geography of clicks/impressions?

Thank you! Ashish

I develop a page with login for Whatsapp API Cloud following those steps:

https://developers.facebook.com/docs/whatsapp/embedded-signup/pre-filled-data

<script>   window.fbAsyncInit = function () {     FB.init({       appId: "XXXXXXX",       cookie:   true, // enable cookies       autoLogAppEvents: true,       xfbml: true,       version: "v15.0",     });   };   // Load the JavaScript SDK asynchronously   (function (d, s, id) {     var js,       fjs = d.getElementsByTagName(s)[0];     if (d.getElementById(id)) return;     js = d.createElement(s);     js.id = id;     js.src = "https://connect.facebook.net/en_US/sdk.js";     fjs.parentNode.insertBefore(js, fjs);   })(document, "script", "facebook-jssdk");   // Facebook Login with JavaScript SDK   function launchWhatsAppSignup() {     // Launch Facebook login     FB.login(       function (response) {         if (response.authResponse) {           const accessToken = response.authResponse.accessToken;           console.log(accessToken);           //Use this token to call the debug_token API and get the shared WABA's ID           fetch(             `https://graph.facebook.com/v15.0/debug_token?input_token=${accessToken}&access_token=EAARzkHctTewBABQoSZA3gDI36fFBO1ZCW1DV4uW3eUMZClzbZBB8wvmpFNhrShuZA2ej4oZAxxXD0md0vZAkr4NQ6ZBzOzNsK9QMjz0bz3xEzSKQ0BDQU9qD2DoZA3XwGDGyAyAssqgEkGM9iUSmj6CspwPUWwIVuByJdOxtKV4dSNG1Fm44hTWgQ`           )             .then((response) => response.json())             .then((data) => console.log(data));         } else {           console.log("User cancelled login or did not fully authorize.");         }       },       {         scope: "business_management,whatsapp_business_management",         extras: {           feature: "whatsapp_embedded_signup",           setup: {             // ... // Prefilled data can go here           },         },       }     );   } </script> <script async  crossorigin="anonymous" src="https://connect.facebook.net/en_US/sdk.js"></script> <button   onclick="launchWhatsAppSignup()"   style="     background-color: #1877f2;     border: 0;     border-radius: 4px;     color: #fff;     cursor: pointer;     font-family: Helvetica, Arial, sans-serif;     font-size: 16px;     font-weight: bold;     height: 40px;     padding: 0 24px;   " >   Login with Facebook </button> 

But the problem is whatsapp shows in pop-up: You don't have any WhatsApp Business Accounts.

and tell me to create an WhatsApp Business Accounts, that i already have in my bussiness account linked with my whatsapp bussiness number.

I am building something to sort and add values from an API response. I ended up going with an interesting structure, and I just want to make sure there's nothing inherently wrong with it.

from collections import defaultdict # Helps create a unique nested default dict object # for code readability def dict_counter():     return defaultdict(lambda: 0) # Creates the nested defaultdict object ad_data = defaultdict(dict_counter) # Sorts each instance into its channel, and # adds the dict values incrimentally for ad in example:        # Collects channel and metrics     channel = ad['ad_group']['type_']     metrics = dict(         impressions= int(ad['metrics']['impressions']),         clicks     = int(ad['metrics']['clicks']),         cost       = int(ad['metrics']['cost_micros'])     )          # Adds the variables     ad_data[channel]['impressions'] += metrics['impressions']     ad_data[channel]['clicks'] += metrics['clicks']     ad_data[channel]['cost'] += metrics['cost'] 

The output is as desired. Again, I just want to make sure I'm not reinventing the wheel or doing something really inefficient here.

defaultdict(<function __main__.dict_counter()>,             {'DISPLAY_STANDARD': defaultdict(<function __main__.dict_counter.<locals>.<lambda>()>,                          {'impressions': 14, 'clicks': 4, 'cost': 9}),              'SEARCH_STANDARD': defaultdict(<function __main__.dict_counter.<locals>.<lambda>()>,                          {'impressions': 6, 'clicks': 2, 'cost': 4})}) 

Here's what my input data would look like:

example = [     {         'campaign':          {             'resource_name': 'customers/12345/campaigns/12345',             'status': 'ENABLED',             'name': 'test_campaign_2'         },         'ad_group': {             'resource_name': 'customers/12345/adGroups/12345',             'type_': 'DISPLAY_STANDARD'},         'metrics': {             'clicks': '1', 'cost_micros': '3', 'impressions': '5'         },         'ad_group_ad': {             'resource_name': 'customers/12345/adGroupAds/12345~12345',             'ad': {                 'resource_name': 'customers/12345/ads/12345'             }         }     },     {         'campaign':          {             'resource_name': 'customers/12345/campaigns/12345',             'status': 'ENABLED',             'name': 'test_campaign_2'         },         'ad_group': {             'resource_name': 'customers/12345/adGroups/12345',             'type_': 'SEARCH_STANDARD'},         'metrics': {             'clicks': '2', 'cost_micros': '4', 'impressions': '6'         },         'ad_group_ad': {             'resource_name': 'customers/12345/adGroupAds/12345~12345',             'ad': {                 'resource_name': 'customers/12345/ads/12345'             }         }     },     {         'campaign':          {             'resource_name': 'customers/12345/campaigns/12345',             'status': 'ENABLED',             'name': 'test_campaign_2'         },         'ad_group': {             'resource_name': 'customers/12345/adGroups/12345',             'type_': 'DISPLAY_STANDARD'},         'metrics': {             'clicks': '3', 'cost_micros': '6', 'impressions': '9'         },         'ad_group_ad': {             'resource_name': 'customers/12345/adGroupAds/12345~12345',             'ad': {                 'resource_name': 'customers/12345/ads/12345'             }         }     } ] 

Thanks!

I have set it up adsupport, adservices, iad frameworks and more, but still no conversions on Google Ads as a conversion.

Google ads takes first_open but no subscription_convert or renew...

Any idea?

I have tried it with different ad accounts but no difference.

  1. Does anybody know after how much time or how many requests does refresh token expires in Google ads API? I created refresh token here https://developers.google.com/oauthplayground.
  2. Does anyone know what is the impersonated email in server account in Google ads API? I created server account in Google cloud project. If I run python code with Service Account configuration with generated json_key_file_path and same impersonated_email as my email account with which I created project then I get an error google.auth.exceptions.RefreshError: ('unauthorized_client: Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested.', {'error': 'unauthorized_client', 'error_description': 'Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested.'}). If I put for impersonated_email client_email that I got from generated jon file I get an error: User in the cookie is not a valid Ads user.