Google Ads Asset-based Ad Extensions

Quick look at adoption

8 min, 1577 words

Categories: PPC

In another post, I write about plotting charts in blog posts generated by static site generator Zola. Here I apply the technique to look at Google Ads performance data. Nothing sophisticated. I just want to follow the daily impressions trend for Asset-based Ad Extensions since the start of 2022 as mandated auto migration begins.

Csv data used is available here and here

Getting Data

Google's schedule for auto migration starts with Sitelinks, Callout, and Structured Snippets on Jan 10th, 2022. The second batch starts on Apr 8th and includes Call, App, Hotel Callout, and Price extensions. Since customers can also self-migrate ahead of time, it would be interesting to see the real traffic shift from Feeditem to Asset-based with respect to each Ad Extension type.

I use a tool called mccfind (one of my Rust learning projects) to grab extension level daily traffic via below GAQL. Query is applied across ~1000 Google Ads accounts. Results are aggregated by Date and Extension Type, and saved as plain text in CSV format.

mccfind -q asset_field_type_view_ytd --groupby "asset_field_type_view.field_type" --groupby "segments.date"  -o all_asset_field_type_view_ytd.csv

GAQL to get YTD traffic across all Asset-based Ad Extension Types

	SELECT 
	  asset_field_type_view.field_type, 
	  segments.date,
	  metrics.impressions, 
	  metrics.clicks, 
	  metrics.cost_micros,
	  customer.currency_code  
	FROM asset_field_type_view 
	WHERE 
	  segments.year IN (2022)
	  AND metrics.impressions > 1
	ORDER BY 
	  asset_field_type_view.field_type, segments.date

Output file is cleaned up a bit to remove extra " quotation marks in the date column and . periods from header names (e.g. from segments.date to just date).

$ cat all_asset_field_type_view_ytd.csv | sed 's/[a-z_]*\.//g' | sed 's/"//g' > all_asset_field_type_view_ytd_cleaned.csv

Here's a peek at the cleaned up csv . Please note that the cost column isn't summed up correctly since it's aggregated without currency conversion.

a peek of all_asset_field_type_view_ytd_cleaned.csv

field_type,date,impressions_sum_sum,clicks_sum_sum,cost_micros_sum_sum
Call,2022-02-11,63,2,139000000
Call,2022-02-12,63,4,242000000
Call,2022-02-14,95,7,301000000
Call,2022-02-15,93,5,326000000
Call,2022-02-16,404,8,196000000
Call,2022-02-17,443,13,460000000
Call,2022-02-18,454,10,274000000
Call,2022-02-19,467,7,177000000
Call,2022-02-20,355,7,171000000

Asset-based Traffic by Extension Type

Ad Extensions are extra advertisement material that appear next to Ads. They help reinforce branding or product niche, but may not be clicked on. Hence, lets look at daily total impressions as opposed to clicks or cost.

Here's the code to visualize daily impressions trend from csv above using vega-lite.

vega-lite specs

\{% vega_chart(id="vis") %\}

    // Assign the specification to a local variable vlSpec.
    var vlSpec = {
        "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
        "width": 450,
        "height": 300,
        "data": {"url": "/all_asset_field_type_view_ytd_cleaned.csv"},
        "mark": {
            "type": "bar",
            "tooltip": true
        },
        "encoding": {
            "x": {
                "field": "date",
                "type": "temporal",
                "bin": false, 
                "sort": "x"
            },
            "y": {
                "field": "impressions_sum_sum",
                "type": "quantitative",
            },
            "color": {"field": "field_type", "type": "nominal"},
        }
    };

    // Embed the visualization in the container with id `vis`
    vegaEmbed('#vis', vlSpec).then(function(result) {
    // Access the Vega view instance (https://vega.github.io/vega/docs/api/view/) as result.view
    }).catch(console.error);

\{% end %\}

YTD Daily Impressions by Asset-based Extension Type

From the plot, it's clear that most of the traffic comes from Callout and Sitelinks Extensions. Structured Snippets has a minor share and rest of the extension types don't even show up.

In terms of migration dates, compared to original announced migration date of Jan 10th, 2022, Asset-based traffic doesn't start to increase significantly until after Feb 9th, reaching a plateau around Feb 17th.

Tracking State of Asset-based Migration

To track how much of Ad Extensions traffic is migrated to Asset-based, lets plot YTD Daily Impressions from both Asset-based and Feeditem.

First step is to download Feeditem traffic via this GAQL.

mccfind -q feed_placeholder_view_ytd --groupby "feed_placeholder_view.placeholder_type" --groupby "segments.date"  -o all_feed_placeholder_view_ytd.csv

GAQL to download Feeditem traffic for all Ad Extensions

	SELECT
	  feed_placeholder_view.placeholder_type,
	  segments.date,
	  metrics.impressions,
	  metrics.clicks,
	  metrics.cost_micros,
	  customer.currency_code
	FROM feed_placeholder_view
	WHERE
	  segments.year IN (2022) 
	  AND metrics.impressions > 1
	ORDER BY 
	  feed_placeholder_view.placeholder_type, segments.date

To combine Feeditem and Asset-based Sitelinks traffic into a single plot, the two csv files need to be combined. A new category column indicates a row as either Feeditem or Asset-based.

$ echo "category,type,date,impressions,clicks,cost_micros" > combined_ad_extensions_ytd.csv
$ cat all_feed_placeholder_view_ytd.csv | grep -v "metrics" | awk '{print "Feeditem,"$0}' | sed 's/"//g' >> combined_ad_extensions_ytd.csv
$ cat all_asset_field_type_view_ytd.csv | grep -v "metrics" | awk '{print "Asset,"$0}' | sed 's/"//g' >> combined_ad_extensions_ytd.csv

Here's a peak at Sitelinks data from the combined csv. It's interesting that Asset-based Sitelinks already has some, albeit tiny, traffic since Jan 1st, 2022. Some customers started early.

a peak at combined_ad_extensions_ytd.csv for Sitelinks

category,type,date,impressions,clicks,cost_micros
Feeditem,Sitelink,2022-01-01,11984164,1247627,11275573051411
Feeditem,Sitelink,2022-01-02,11298841,1350908,13249915791348
Feeditem,Sitelink,2022-01-03,9621194,1338908,15113704485461
Feeditem,Sitelink,2022-01-04,9561097,1338991,13247847465453
Feeditem,Sitelink,2022-01-05,10302409,1348804,13158450989466
Feeditem,Sitelink,2022-01-06,10447048,1346719,13202233194666
Feeditem,Sitelink,2022-01-07,12585345,1696935,14326800925566
Feeditem,Sitelink,2022-01-08,13678997,1905887,15711076632489
Feeditem,Sitelink,2022-01-09,12428273,1730375,13905504607638
Feeditem,Sitelink,2022-01-10,11331500,1538280,13773025337350
...
Asset,Sitelink,2022-01-01,22510,2195,29762250000
Asset,Sitelink,2022-01-02,30870,3028,39394490000
Asset,Sitelink,2022-01-03,34893,3235,49813430000
Asset,Sitelink,2022-01-04,36100,3536,51433320000
Asset,Sitelink,2022-01-05,35080,3254,45976660000
Asset,Sitelink,2022-01-06,35026,3119,43464980000
Asset,Sitelink,2022-01-07,34720,3141,47812650000
Asset,Sitelink,2022-01-08,25587,2217,30435260000
Asset,Sitelink,2022-01-09,33713,2974,32842240000
Asset,Sitelink,2022-01-10,43669,3985,48636830000

To create a second plot on same page, we use vis2 as the container name instead. Notice the added filter in transform step to only load the Sitelink extension type.

\{% vega_chart(id="vis2") %\}

    // Assign the specification to a local variable vlSpec.
    var vlSpec = {
        "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
        "width": 450,
        "height": 300,
        "data": {"url": "/combined_ad_extensions_ytd.csv"},
        "transform": [
            {"filter": {"field": "type", "oneOf": ["Sitelink"]}}
        ],
        "mark": {
            "type": "bar",
            "tooltip": true
        },
        "encoding": {
            "x": {
                "field": "date",
                "type": "temporal",
                "bin": false, 
                "sort": "x"
            },
            "y": {
                "field": "impressions",
                "type": "quantitative",
            },
            "color": {"field": "category", "type": "nominal"},
        }
    };

    // Embed the visualization in the container with id `vis`
    vegaEmbed('#vis2', vlSpec).then(function(result) {
    // Access the Vega view instance (https://vega.github.io/vega/docs/api/view/) as result.view
    }).catch(console.error);

\{% end %\}

YTD Daily Impressions for Sitelinks

Similarly, for Callout Extensions:

YTD Daily Impressions for Callout

And for Structured Snippet:

YTD Daily Impressions for Structured Snippet

And finally for Promotion Extension:

YTD Daily Impressions for Promotion Extension

Summary

Visualizing the daily impression changes across Asset-based Ad Extension migration reveals a number of trends:

  • Some customers have Asset-based impressions since Jan 1st, 2022 to experiement with the new format
  • Bulk of Sitelinks, Callout, and Structured Snippet traffic shifts to Asset-based around Feb 17th, 2022
  • As of Apr 12, ~10% of trafficking Ad Extensions are still in Feeditem form
  • Towards the end of March, a downward trend appears across most of the extension types. Unclear if related to migration to Asset-based
  • Promotion Extension shows a very different periodic traffic pattern, with larger percentage still in Feeditem category