Posts under category Google

I am looking for a way to get Firebase working in an app built in React Native Expo, so that it gives out some sort of data for Google Ads to use and count as a conversion metric, when someone installs our iOS app by way of clicking on a Google Ad served to them.

It's shocking that Google hasn't made this easier, but there is currently no way of measuring Google Ads Conversions for an App Install campaign, without using Firebase.

I have been working with Google Ads support over the past month, and they have been unable to help me. So according to Google Ads support, the only way to count conversion metrics for iOS installs is to use Firebase embedded in our app to get some data out of the app once it's installed by an end user. Or some other 3rd party tool that they are unable to recommend or support.

Looking at embedding Firebase into how our app is currently architected in React Native Expo seems like a huge overhaul. Any tips or tricks? Has anyone made this work properly with Google Ads iOS app installs campaigns?

The problem is that there is a significant discrepancy between the spending or amount displayed on the transparency page UI and the information provided by BigQuery. For example, in the specific case where I send the screenshot (Ad: https://adstransparency.google.com/advertiser/AR09575383261467639809/creative/CR03209405000446902273?region=MX&topic=political), it shows a spending range of 6k - 7k MXN, which approximates to 375 USD (since BigQuery does not yet support MXN). However, BigQuery reports a maximum spend (spend_range_max_usd) of 100 USD. Below is the specific response for this ad.

Row, Advertiser, Advertiser_Page, Advertiser_URL, Number_of_Political_Ads, gender_targeting, geo_targeting_included, spend_range_min_usd, spend_range_max_usd,

2
PARTIDO ACCIÓN NACIONAL https://adstransparency.google.com/advertiser/AR09575383261467639809?region=MX&political= https://adstransparency.google.com/advertiser/AR09575383261467639809/creative/CR03209405000446902273?region=MX&topic=political 1 Male, Female, Unknown gender Mexico 0 100

Furthermore, this issue is not limited to this particular ad. All spend responses from BigQuery show the same amount, 100 USD, or the relative to the currency.

I was expecting at least a reasonable currency exchange, or perhaps I'm missing something which is causing all the values to return 100 USD.

I wonder if anyone else has had a similar issue.

#standardSQL SELECT   CS.advertiser_name AS Advertiser,   CONCAT("https://adstransparency.google.com/advertiser/", CS.advertiser_id, "?region=MX&political=") AS Advertiser_Page,   CONCAT("https://adstransparency.google.com/advertiser/", CS.advertiser_id, "/creative/", CS.ad_id, "?region=MX&topic=political") AS Advertiser_Page,   COUNT(1) AS Number_of_Political_Ads,   CS.gender_targeting,   CS.geo_targeting_included,   spend_range_min_usd,   spend_range_max_usd, FROM   bigquery-public-data.google_political_ads.creative_stats AS CS WHERE   REGEXP_CONTAINS(CS.gender_targeting, r"Female")   AND REGEXP_CONTAINS(CS.regions, r"MX") GROUP BY   1,   2,   3,   5,   6,   7,   8 ORDER BY   spend_range_max_usd DESC; 

I leave here the diferent data you can get.

[   {     "name": "ad_id",     "mode": "NULLABLE",     "type": "STRING",     "description": "Unique id for a specific election ad.",     "fields": []   },   {     "name": "ad_url",     "mode": "NULLABLE",     "type": "STRING",     "description": "URL to view the election ad in the election Advertising on Google report.",     "fields": []   },   {     "name": "ad_type",     "mode": "NULLABLE",     "type": "STRING",     "description": "The type of the ad. Can be TEXT VIDEO or IMAGE.",     "fields": []   },   {     "name": "regions",     "mode": "NULLABLE",     "type": "STRING",     "description": "The regions that this ad is verified for or were served in.",     "fields": []   },   {     "name": "advertiser_id",     "mode": "NULLABLE",     "type": "STRING",     "description": "ID of the advertiser who purchased the ad.",     "fields": []   },   {     "name": "advertiser_name",     "mode": "NULLABLE",     "type": "STRING",     "description": "Name of advertiser.",     "fields": []   },   {     "name": "ad_campaigns_list",     "mode": "NULLABLE",     "type": "STRING",     "description": "IDs of all election ad campaigns that included the ad.",     "fields": []   },   {     "name": "date_range_start",     "mode": "NULLABLE",     "type": "DATE",     "description": "First day a election ad ran and had an impression.",     "fields": []   },   {     "name": "date_range_end",     "mode": "NULLABLE",     "type": "DATE",     "description": "Most recent day a election ad ran and had an impression.",     "fields": []   },   {     "name": "num_of_days",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Total number of days a election ad ran and had an impression.",     "fields": []   },   {     "name": "impressions",     "mode": "NULLABLE",     "type": "STRING",     "description": "Number of impressions for the election ad. Impressions are grouped into several buckets ≤ 10k 10k-100k 100k-1M 1M-10M > 10M.",     "fields": []   },   {     "name": "first_served_timestamp",     "mode": "NULLABLE",     "type": "TIMESTAMP",     "description": "The timestamp of the earliest impression for this ad.",     "fields": []   },   {     "name": "last_served_timestamp",     "mode": "NULLABLE",     "type": "TIMESTAMP",     "description": "The timestamp of the most recent impression for this ad.",     "fields": []   },   {     "name": "age_targeting",     "mode": "NULLABLE",     "type": "STRING",     "description": "Age ranges included in the ad's targeting",     "fields": []   },   {     "name": "gender_targeting",     "mode": "NULLABLE",     "type": "STRING",     "description": "Genders included in the ad's targeting.",     "fields": []   },   {     "name": "geo_targeting_included",     "mode": "NULLABLE",     "type": "STRING",     "description": "Geographic locations included in the ad's targeting.",     "fields": []   },   {     "name": "geo_targeting_excluded",     "mode": "NULLABLE",     "type": "STRING",     "description": "Geographic locations excluded in the ad's targeting.",     "fields": []   },   {     "name": "spend_range_min_usd",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Lower bound of the amount in USD spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_max_usd",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Upper bound of the amount in USD spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_min_eur",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Lower bound of the amount in EUR spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_max_eur",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Upper bound of the amount in EUR spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_min_inr",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Lower bound of the amount in INR spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_max_inr",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Upper bound of the amount in INR spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_min_bgn",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Lower bound of the amount in BGN spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_max_bgn",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Upper bound of the amount in BGN spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_min_czk",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Lower bound of the amount in CZK spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_max_czk",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Upper bound of the amount in CZK spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_min_dkk",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Lower bound of the amount in DKK spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_max_dkk",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Upper bound of the amount in DKK spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_min_huf",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Lower bound of the amount in HUF spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_max_huf",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Upper bound of the amount in HUF spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_min_pln",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Lower bound of the amount in PLN spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_max_pln",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Upper bound of the amount in PLN spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_min_ron",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Lower bound of the amount in RON spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_max_ron",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Upper bound of the amount in RON spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_min_sek",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Lower bound of the amount in SEK spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_max_sek",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Upper bound of the amount in SEK spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_min_gbp",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Lower bound of the amount in GBP spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_max_gbp",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Upper bound of the amount in GBP spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_min_nzd",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Lower bound of the amount in NZD spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_max_nzd",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Upper bound of the amount in NZD spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_min_ils",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Lower bound of the amount in ILS spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_max_ils",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Upper bound of the amount in ILS spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_min_aud",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Lower bound of the amount in AUD spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_max_aud",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Upper bound of the amount in AUD spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_min_twd",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Lower bound of the amount in TWD spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_max_twd",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Upper bound of the amount in TWD spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_min_brl",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Lower bound of the amount in BRL spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_max_brl",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Upper bound of the amount in BRL spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_min_ars",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Lower bound of the amount in ARS spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_max_ars",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Upper bound of the amount in ARS spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_min_zar",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Lower bound of the amount in ZAR spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_max_zar",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Upper bound of the amount in ZAR spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_min_clp",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Lower bound of the amount in CLP spent by the advertiser on the election ad.",     "fields": []   },   {     "name": "spend_range_max_clp",     "mode": "NULLABLE",     "type": "INTEGER",     "description": "Upper bound of the amount in CLP spent by the advertiser on the election ad.",     "fields": []   } ]``` Thanks in advance! 

What I am doing doing

  • I have the below code where the AD is Displaying
  • I am using google AD-Mob
  • AD is displaying fine

What I am trying to understand

  • onAdImpression() is not triggered when the view is rendered in the screen instead its triggered when I click the AD, GO to the designated AD and return back to the APP where the AD container is present
  • Is it supposed to work this way or onAdImpression() should be triggered as soon as the AD is rendered on the screen
@Composable fun BannerAdView(adUnitId: String) {     val context = LocalContext.current     val adView = remember { AdView(context) }          AndroidView(         factory = {             adView.apply {                 setAdSize(AdSize.BANNER)                 this.adUnitId = adUnitId                 adListener = object : AdListener() {                     override fun onAdLoaded() {                         // Called when an ad is loaded.                     }                     override fun onAdFailedToLoad(error: LoadAdError) {                         // Called when an ad fails to load.                     }                     override fun onAdOpened() {                         // Called when an ad opens an overlay that covers the screen.                     }                     override fun onAdClicked() {                         // Called when an ad is clicked.                     }                     override fun onAdClosed() {                         // Called when the user is about to return to the app after tapping on an ad.                     }                     override fun onAdImpression() {                         // Called when an ad impression is recorded.                         Log.d("AdImpression", "Ad impression recorded")                     }                 }                 loadAd(AdRequest.Builder().build())             }         },         update = {             it.loadAd(AdRequest.Builder().build())         }     ) } 

I am trying to run a google ads tap on singer-io to get data from the GEO_PERFORMANCE_REPORT stream. However, when I run the tap with the appropriate config.json and catalog.json file, the output I get contains STATE objects instead of getting RECORDs. The state itself is not null, which presumably means that it does recognize data for the stream.

config.json (I had to add both customer_ids and login_customer_ids otherwise I was getting an error):

{     "developer_token": "<developer_token>",     "oauth_client_id": "<oauth_client_id>",     "oauth_client_secret": "<oauth_client_secret>",     "refresh_token": "<refresh_token>",     "start_date": "2020-10-01T00:00:00Z",     "end_date": "2020-10-06T00:00:00Z",     "customer_ids": [         {             "customerId": "<customerId>",             "loginCustomerId": "<loginCustomerId>"         }     ],     "login_customer_ids": [         {             "customerId": "<customerId>",             "loginCustomerId": "<loginCustomerId>"         }     ] } 

My catalog file does have "selected": true for all the required streams in the right places. Again, singer is recognizing the data. Just not outputting it.

target.json (ouputting the tap results here):

{     "type": "SCHEMA",     "stream": "geo_performance_report",     "schema": {         [...]     },     "key_properties": [         "_sdc_record_hash"     ] } {     "type": "STATE",     "value": {         "currently_syncing": [             "geo_performance_report",             "<customerId>"         ]     } } {     "type": "STATE",     "value": {         "currently_syncing": [             "geo_performance_report",             "<customerId>"         ],         "bookmarks": {             "geo_performance_report": {                 "<customerId>": {                     "date": "2020-10-01T00:00:00.000000Z"                 }             }         }     } } {     "type": "STATE",     "value": {         "currently_syncing": [             "geo_performance_report",             "<customerId>"         ],         "bookmarks": {             "geo_performance_report": {                 "<customerId>": {                     "date": "2020-10-02T00:00:00.000000Z"                 }             }         }     } } {     "type": "STATE",     "value": {         "currently_syncing": [             "geo_performance_report",             "<customerId>"         ],         "bookmarks": {             "geo_performance_report": {                 "<customerId>": {                     "date": "2020-10-03T00:00:00.000000Z"                 }             }         }     } } [...] 

I am unsure how to fix this issue. There seems to be no documentation or forum on such an issue.

Goal: I am trying to calculate the total spend (cost) of an ad from by Google Ads data that is in BigQuery

Problem: The output of my BQ SQL does not match the output I see in Google Ads reports

Example: In BigQuery, I grab the metrics_cost_micros from AdStats table and divide it by 1m for the time period. This tells me for 'Ad 1' the total cost is $3,625.76 and avg CPC $1.21

SELECT    a.ad_group_ad_ad_name,   SUM(metrics_cost_micros)/ 1000000 AS total_spend,   AVG(metrics_cost_micros)/ 1000000 AS avg_daily_spend,   MAX(metrics_cost_micros)/ 1000000 AS max_spend FROM `[project].google_ads.p_ads_AdStats_xxx` ast LEFT JOIN `[project].google_ads.p_ads_Ad_xxx` a    ON ast.ad_group_ad_ad_id = a.ad_group_ad_ad_id WHERE a.ad_group_ad_ad_name = "Ad 1" GROUP BY ALL 

However, in Google Ads reporting tool, the same ad in the same timeframe has a total cost of $107.53 and avg CPC of $0.38

I thought currency conversion might be an issue, but it doesn't account for the discrepancy