Anatomy of a Google AdSense click


Home
Blog

In this article, I'll take a look at an actual click on a Google ad to see what really happens. Disclaimer : this is a neutral research.

To conduct my research, I only needed a couple of things :

  • a web browser (I chose Firefox but you can take any web browser)
  • a web request recording tool (I chose HtmlFilter, but there are many others)

Choosing a web page of interest

I then picked an arbitrary web site which hosts Google AdSense blocks. The url of the web site is http://wesnerm.blogs.com/, and here is a screen capture of what you see when you visit it :


A web page which happens to host a couple of Google AdSense blocks

 

I have circled in red the AdSense block of interest. Note that the web page has three : two vertical blocks on the left, and one horizontal block at the top of the page :


Our GoogleAdSense block of interest

 

What we are going to do is click on the top horizontal AdSense block (width = 468, height = 60), as depicted here :


Clicking on one ad (Keil.com)

 

Clicking the ad makes us visit Keil.com website. Keil.com has a Google AdWords campaign with a running site-targeted campaign. Keil.com's landing page for the ad is http://www.keil.com/c51/, at least that's what one can deduce from clicking there. Here is what their website looks like :


Keil.com website

 

Recorded click-through

Now that we have seen what happens when a user clicks, let's see the requests produced by the web browser in order to do all of this.

Phase 1 : reaching http://wesnerm.blogs.com/

Here is how to read the sequence below :

  • Each <url> element is a request made by the web browser. The url is defined in the source attribute.
  • To simply view the web page, a number of requests are made either to 1) retrieve images and CSS styles specific to the web page itself 2) call third-party blog monitoring tools (google analytics, blog patrol, typepad) and 3) build the actual Google AdSense blocks (in bold).

  <?xml version="1.0" encoding="UTF-8" ?> 
- <webh4ck>
- <url name="page1" source="http://wesnerm.blogs.com/" method="get">
  <header name="Host" value="wesnerm.blogs.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  </url>
- <url name="page2" source="http://wesnerm.blogs.com/net_undocumented/styles.css" method="get">
  <header name="Host" value="wesnerm.blogs.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="text/css,*/*;q=0.1" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://wesnerm.blogs.com/" /> 
  </url>
- <url name="page3" source="http://wesnerm.blogs.com/.shared/themes/common/base-weblog.css" method="get">
  <header name="Host" value="wesnerm.blogs.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="text/css,*/*;q=0.1" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://wesnerm.blogs.com/net_undocumented/styles.css" /> 
  </url>
- <url name="page4" source="http://wesnerm.blogs.com/.shared/themes/lilia/theme-stevenson.css" method="get">
  <header name="Host" value="wesnerm.blogs.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="text/css,*/*;q=0.1" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://wesnerm.blogs.com/net_undocumented/styles.css" /> 
  </url>
- <url name="page5" source="http://www.google-analytics.com/urchin.js" method="get">
  <header name="Host" value="www.google-analytics.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="*/*" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://wesnerm.blogs.com/" /> 
  </url>
- <url name="page6" source="http://www.google-analytics.com/__utm.gif?utmwv=1&utmn=2082620850&utmsr=1024x768&utmsc=32-bit&utmul=en-us&utmje=1&
utmfl=8.0%20%20r24&utmcn=1&utmdt=Smart%20Software&utmhn=wesnerm.blogs.com&utmr=-&utmp=/&utmac=UA-51244-1&utmcc=" method="get">
  <header name="Host" value="www.google-analytics.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://wesnerm.blogs.com/" /> 
  </url>
- <url name="page7" source="http://wesnerm.blogs.com/.shared/themes/lilia/theme-stevenson/body-bg.gif" method="get">
  <header name="Host" value="wesnerm.blogs.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://wesnerm.blogs.com/.shared/themes/lilia/theme-stevenson.css" /> 
  </url>
- <url name="page8" source="http://pagead2.googlesyndication.com/pagead/show_ads.js" method="get">
  <header name="Host" value="pagead2.googlesyndication.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="*/*" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://wesnerm.blogs.com/" /> 
  </url>
- <url name="page9" source="http://wesnerm.blogs.com/.shared/themes/lilia/theme-stevenson/container-bg.gif" method="get">
  <header name="Host" value="wesnerm.blogs.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://wesnerm.blogs.com/.shared/themes/lilia/theme-stevenson.css" /> 
  </url>
- <url name="page10" source="http://wesnerm.blogs.com/.shared/themes/lilia/theme-stevenson/banner-bg.gif" method="get">
  <header name="Host" value="wesnerm.blogs.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://wesnerm.blogs.com/.shared/themes/lilia/theme-stevenson.css" /> 
  </url>
- <url name="page11" source="http://wesnerm.blogs.com/.shared/themes/lilia/theme-stevenson/column-left-bg.gif" method="get">
  <header name="Host" value="wesnerm.blogs.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://wesnerm.blogs.com/.shared/themes/lilia/theme-stevenson.css" /> 
  </url>
- <url name="page12" source="http://wesnerm.blogs.com/.shared/themes/lilia/theme-stevenson/colitem-header-bg.gif" method="get">
  <header name="Host" value="wesnerm.blogs.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://wesnerm.blogs.com/.shared/themes/lilia/theme-stevenson.css" /> 
  </url>
- <url name="page13" source="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-6379068705570091&dt=1159003441093&lmt=1159003438&
alt_color=ECEBF5&format=120x240_as&output=html&url=http%3A%2F%2Fwesnerm.blogs.com%2F&color_bg=ECEBF5&color_text=6F6F6F&
color_link=0000CC&color_url=008000&color_border=ECEBF5&ad_type=text_image&cc=100&u_h=768&u_w=1024&u_ah=704&u_aw=1024&
u_cd=32&u_tz=120&u_his=1&u_java=true&u_nplug=25&u_nmime=106" method="get">
  <header name="Host" value="pagead2.googlesyndication.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://wesnerm.blogs.com/" /> 
  </url>
- <url name="page14" source="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-6379068705570091&dt=1159003441171&lmt=1159003438&
alt_color=ECEBF5&prev_fmts=120x240_as&format=160x600_as&output=html&url=http%3A%2F%2Fwesnerm.blogs.com%2F&color_bg=ECEBF5&
color_text=6F6F6F&color_link=0000CC&color_url=008000&color_border=ECEBF5&ad_type=text_image&cc=100&u_h=768&u_w=1024&
u_ah=704&u_aw=1024&u_cd=32&u_tz=120&u_his=1&u_java=true&u_nplug=25&u_nmime=106" method="get">
  <header name="Host" value="pagead2.googlesyndication.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://wesnerm.blogs.com/" /> 
  </url>
- <url name="page15" source="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-6379068705570091&dt=1159003441187&lmt=1159003438&
alt_color=FFFFFF&prev_fmts=120x240_as%2C160x600_as&format=468x60_as&output=html&url=http%3A%2F%2Fwesnerm.blogs.com%2F&
color_bg=FFFFFF&color_text=000000&color_link=0000FF&color_url=008000&color_border=FFFFFF&ad_type=text_image&cc=100&u_h=768&
u_w=1024&u_ah=704&u_aw=1024&u_cd=32&u_tz=120&u_his=1&u_java=true&u_nplug=25&u_nmime=106" method="get">
  <header name="Host" value="pagead2.googlesyndication.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://wesnerm.blogs.com/" /> 
  </url>
- <url name="page16" source="http://www.assoc-amazon.com/e/ir?t=netundocume-20&l=as2&o=1&a=0670033847" method="get">
  <header name="Host" value="www.assoc-amazon.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://wesnerm.blogs.com/" /> 
  </url>
- <url name="page17" source="http://www.assoc-amazon.com/e/ir?t=netundocume-20&l=as2&o=1&a=0596101139" method="get">
  <header name="Host" value="www.assoc-amazon.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://wesnerm.blogs.com/" /> 
  </url>
- <url name="page18" source="http://www.blogpatrol.com/counter.php?i=4273&r=&n=Mozilla/5.0%20%28Windows%3B%20U%3B%20Windows%20NT%205.1%3B%20en-US%3B
%20rv%3A1.8.1%29%20Gecko/20060918%20Firefox/2.0&p=Mozilla/5.0%20%28Windows%3B%20U%3B%20Windows%20NT%205.1%3B%20en-US%3B%20rv%3A
1.8.1%29%20Gecko/20060918%20Firefox/2.0&g=http%3A//wesnerm.blogs.com/&sd=32&sw=1024x768" method="get">
  <header name="Host" value="www.blogpatrol.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://wesnerm.blogs.com/" /> 
  </url>
- <url name="page19" source="http://wesnerm.blogs.com/net_undocumented/911scan3.png" method="get">
  <header name="Host" value="wesnerm.blogs.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://wesnerm.blogs.com/" /> 
  </url>
- <url name="page20" source="http://www.typepad.com/t/stats?blog_id=7693&page=http%3A//wesnerm.blogs.com/&referrer=" method="get">
  <header name="Host" value="www.typepad.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://wesnerm.blogs.com/" /> 
  </url>
- <url name="page21" source="http://wesnerm.blogs.com/.shared/themes/lilia/theme-stevenson/li-bg.gif" method="get">
  <header name="Host" value="wesnerm.blogs.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://wesnerm.blogs.com/.shared/themes/lilia/theme-stevenson.css" /> 
  </url>
- <url name="page22" source="http://wesnerm.blogs.com/.shared/themes/lilia/theme-stevenson/date-header-bg.gif" method="get">
  <header name="Host" value="wesnerm.blogs.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://wesnerm.blogs.com/.shared/themes/lilia/theme-stevenson.css" /> 
  </url>
- <url name="page23" source="http://wesnerm.blogs.com/.shared/themes/lilia/theme-stevenson/entry-header-bg.gif" method="get">
  <header name="Host" value="wesnerm.blogs.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://wesnerm.blogs.com/.shared/themes/lilia/theme-stevenson.css" /> 
  </url>
- <url name="page24" source="http://wesnerm.blogs.com/favicon.ico" method="get">
  <header name="Host" value="wesnerm.blogs.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  </url>
- <url name="page25" source="http://6a.typepad.com/favicon.ico" method="get">
  <header name="Host" value="6a.typepad.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  </url>
  </webh4ck>

In order to build Google AdSense blocks, the web browser makes requests to .googlesyndication.com. In this domain, pagead/show_ads.js is a special command used to build urls. This command happens to produce Javascript code sent back to the client and run from there. And pagead/ads is a special command which instructs Google to build the html markup for the Google AdSense block unit itself.

There are 4 requests in total related to Google AdSense :

  1. http://pagead2.googlesyndication.com/pagead/show_ads.js. This request should actually appear 3 times, but it is made only once, then it's cached, and the web browser reuses the cache.
  2. http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-6379068705570091&dt=1159003441093&lmt=1159003438&alt_color=ECEBF5&format=120x240_as& output=html&url=http%3A%2F%2Fwesnerm.blogs.com%2F&color_bg=ECEBF5&color_text=6F6F6F&color_link=0000CC&color_url=008000& color_border=ECEBF5&ad_type=text_image&cc=100&u_h=768&u_w=1024&u_ah=704&u_aw=1024&u_cd=32&u_tz=120&u_his=1&u_java=true&u_nplug=25&u_nmime=106
  3. http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-6379068705570091&dt=1159003441171&lmt=1159003438&alt_color=ECEBF5&prev_fmts=120x240_as&format=160x600_as& output=html&url=http%3A%2F%2Fwesnerm.blogs.com%2F&color_bg=ECEBF5&color_text=6F6F6F&color_link=0000CC&color_url=008000& color_border=ECEBF5&ad_type=text_image&cc=100&u_h=768&u_w=1024&u_ah=704&u_aw=1024&u_cd=32&u_tz=120&u_his=1&u_java=true&u_nplug=25&u_nmime=106
  4. http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-6379068705570091&dt=1159003441187&lmt=1159003438&alt_color=FFFFFF&prev_fmts=120x240_as%2C160x600_as&format=468x60_as& output=html&url=http%3A%2F%2Fwesnerm.blogs.com%2F&color_bg=FFFFFF&color_text=000000&color_link=0000FF&color_url=008000& color_border=FFFFFF&ad_type=text_image&cc=100&u_h=768&u_w=1024&u_ah=704&u_aw=1024&u_cd=32&u_tz=120&u_his=1&u_java=true&u_nplug=25&u_nmime=106

The first request is a shared Javascript piece of code which dynamically adds html markup to the web page. This takes shape of an html <iframe src=...> which in turn creates mini web pages within the main web page, and is responsible for producing a number of web requests of its own (just like a regular web page). Since there are 3 Google AdSense blocks, three such web requests are created to populate those iframes, and the url are exactly the three urls reproduced above.

Notice that, because of the nature of the web, the 3 last requests can appear in any order. But we can disambiguate which is which thanks to the passed parameters. In bold is the format parameter and we can easily deduce that 120 x 240 is indeed the first Google AdSense block unit in the vertical bar on the left, and it is indeed vertical (120 pixels wide, 240 pixels height). Then next request passes 160 x 600 which is another vertical Google AdSense block. Finally, the third one is the one of interest to us, with a format passed as 468 x 60, an horizontal block.

At this point, Google AdSense block units have been built and ready to be clicked, but as a user we still have no idea what's going to happen when we click on an ad. Let's click.

 

Phase 2 : clicking the first ad in the horizontal Google AdSense block unit


Clicking on one ad (Keil.com)

Let's see what clicking the ad produces in terms of web requests.

  <?xml version="1.0" encoding="UTF-8" ?> 
- <webh4ck>
- <url name="page1" source="http://pagead2.googlesyndication.com/pagead/iclk?sa=l&ai=BTG4HVPwURb63F5Oa-QLjoLmeCarwiw3KnsjQBsCNtwGA6jAQARgIIOj_o
AMoAjAAOABAyhFQ4MaKwwGYAcLVggKgAZOWwf8DsgERd2VzbmVybS5ibG9ncy5jb226AQk0Njh4NjBfYXPIAQHaARlodHRwOi8vd2VzbmVybS5ibG9ncy5jb20v4AE
DgAIB&num=8&adurl=http://www.keil.com/gl/c51/&client=ca-pub-6379068705570091&nm=16&nh=1&jca=8770" method="get">
  <header name="Host" value="pagead2.googlesyndication.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  </url>
- <url name="page2" source="http://www.googleadservices.com/pagead/adclick?sa=L&ai=BTG4HVPwURb63F5Oa-QLjoLmeCarwiw3KnsjQBsCNtwGA6jAQARgIIOj_o
AMoAjAAOABAyhFQ4MaKwwGYAcLVggKgAZOWwf8DsgERd2VzbmVybS5ibG9ncy5jb226AQk0Njh4NjBfYXPIAQHaARlodHRwOi8vd2VzbmVybS5ibG9ncy5jb20v4AE
DgAIB&num=8&adurl=http://www.keil.com/gl/c51/&client=ca-pub-6379068705570091&nm=16&nh=1&jca=8770" method="get">
  <header name="Host" value="www.googleadservices.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-6379068705570091&dt=1159003441187&lmt=1159003438&
  alt_color=FFFFFF&prev_fmts=120x240_as%2C160x600_as&format=468x60_as&output=html&url=http%3A%2F%2Fwesnerm.blogs.com%2F&
  color_bg=FFFFFF&color_text=000000&color_link=0000FF&color_url=008000&color_border=FFFFFF&ad_type=text_image&cc=100&u_h=768&
  u_w=1024&u_ah=704&u_aw=1024&u_cd=32&u_tz=120&u_his=1&u_java=true&u_nplug=25&u_nmime=106" /> 
  </url>
- <url name="page3" source="http://www.keil.com/gl/c51/?gclid=CN-2nfa6w4cCFSU5XgodS3NUHg" method="get">
  <header name="Host" value="www.keil.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-6379068705570091&dt=1159003441187&lmt=1159003438&
  alt_color=FFFFFF&prev_fmts=120x240_as%2C160x600_as&format=468x60_as&output=html&url=http%3A%2F%2Fwesnerm.blogs.com%2F&
  color_bg=FFFFFF&color_text=000000&color_link=0000FF&color_url=008000&color_border=FFFFFF&ad_type=text_image&cc=100&u_h=768&
  u_w=1024&u_ah=704&u_aw=1024&u_cd=32&u_tz=120&u_his=1&u_java=true&u_nplug=25&u_nmime=106" /> 
  </url>
- <url name="page4" source="http://www.keil.com/c51/" method="get">
  <header name="Host" value="www.keil.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-6379068705570091&dt=1159003441187&lmt=1159003438&
  alt_color=FFFFFF&prev_fmts=120x240_as%2C160x600_as&format=468x60_as&output=html&url=http%3A%2F%2Fwesnerm.blogs.com%2F&
  color_bg=FFFFFF&color_text=000000&color_link=0000FF&color_url=008000&color_border=FFFFFF&ad_type=text_image&cc=100&u_h=768&
  u_w=1024&u_ah=704&u_aw=1024&u_cd=32&u_tz=120&u_his=1&u_java=true&u_nplug=25&u_nmime=106" /> 
  </url>
- <url name="page5" source="http://www.keil.com/_css/t5_ns_screen.css" method="get">
  <header name="Host" value="www.keil.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="text/css,*/*;q=0.1" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://www.keil.com/c51/" /> 
  </url>
- <url name="page6" source="http://www.keil.com/_css/t5_common.css" method="get">
  <header name="Host" value="www.keil.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="text/css,*/*;q=0.1" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://www.keil.com/c51/" /> 
  </url>
- <url name="page7" source="http://www.keil.com/_css/keilinfo.js" method="get">
  <header name="Host" value="www.keil.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="*/*" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://www.keil.com/c51/" /> 
  </url>
- <url name="page8" source="http://www.keil.com/product/brochures/cx51_v8.jpg" method="get">
  <header name="Host" value="www.keil.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://www.keil.com/c51/" /> 
  </url>
- <url name="page9" source="http://www.keil.com/images/keilarm.gif" method="get">
  <header name="Host" value="www.keil.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://www.keil.com/c51/" /> 
  </url>
- <url name="page10" source="http://www.keil.com/images/keilinfo.gif?js=1&ts=1159004377234.58&rs=1024x768&cd=32&ln=en&tz=GMT%20+02%3A00&jv=1" method="get">
  <header name="Host" value="www.keil.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://www.keil.com/c51/" /> 
  </url>
- <url name="page11" source="http://www.keil.com/product/brochures/uv3.jpg" method="get">
  <header name="Host" value="www.keil.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://www.keil.com/c51/" /> 
  </url>
- <url name="page12" source="http://www.keil.com/iconexp/24x24/shadow/cpu.png" method="get">
  <header name="Host" value="www.keil.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://www.keil.com/c51/" /> 
  </url>
- <url name="page13" source="http://www.keil.com/iconexp/24x24/shadow/text_marked.png" method="get">
  <header name="Host" value="www.keil.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://www.keil.com/c51/" /> 
  </url>
- <url name="page14" source="http://www.keil.com/c51/dp_c51.png" method="get">
  <header name="Host" value="www.keil.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  <header name="Referer" value="http://www.keil.com/c51/" /> 
  </url>
- <url name="page15" source="http://www.keil.com/favicon.ico" method="get">
  <header name="Host" value="www.keil.com" /> 
  <header name="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0" /> 
  <header name="Accept" value="image/png,*/*;q=0.5" /> 
  <header name="Accept-Language" value="en-us" /> 
  <header name="Accept-Encoding" value="gzip,deflate" /> 
  <header name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.7" /> 
  <header name="Keep-Alive" value="300" /> 
  <header name="Proxy-Connection" value="keep-alive" /> 
  </url>
  </webh4ck>

Here is how to read the sequence of requests above :

  • a first request to pagead2.googlesyndication.com is issued with command /pagead/iclk
  • a second request is issued to googleadservices.com with command /pagead/adclick.
  • a first request to the actual ad landing page is made, ie http://www.keil.com/gl/c51/?gclid=CN-2nfa6w4cCFSU5XgodS3NUHg.
  • followed by a redirect to the sponsor landing page is made, i.e. http://www.keil.com/gl/c51
  • followed by all requests whose function is to retrieve images, javascript and CSS in the web

 

If you ping or trace-route pagead2.googlesyndication.com and googleadservices.com, these resolve to different machines, hence I am inclined to think that the entire reason for having such sequence of requests is to "double-click" a request. But that's rather weak as we are going to see.

Then the landing page has a parameter of the form gclid=CN-2nfa6w4cCFSU5XgodS3NUHg. In fact, any AdWords sponsor can add a trailing static tracking suffix to better track the clicks in their web server logs. Note that, since the trailing part is static, the parameter is not dynamic at all. And by the way gclid is obviously short for Google click id.

If we take a closer look at the respective requests sent to pagead2.googlesyndication.com and googleadservices.com, we can deduce the parameters passed only differ by a single letter in one of the passed parameters : the first request passes sa=l, while the other passes sa=L, notice the change in case. Again, this appears to be the equivalent of a double-click. It seems rational to believe that only the combination of those two requests produce an actual billing for the ad sponsor.

Another question of interest is who and when is the key BTG4HVPwURb63F5Oa-QLjoLmeCarwiw3KnsjQBsCNtwGA6jAQARgIIOj_oAMoAjAAOABAyhFQ4MaKwwGYAcLVggKgAZOWwf8DsgERd2VzbmVybS5ibG9ncy5jb22 6AQk0Njh4NjBfYXPIAQHaARlodHRwOi8vd2VzbmVybS5ibG9ncy5jb20v4AEDgAIB being encrypted? This key is returned by Google servers when the Google AdSense block units are built. There are reasons to believe this key is an encrypted version of the long urls we saw in phase 1, perhaps with additional information such as the IP address of the user.

 

Conclusion

The article explains what's going on when one clicks an ad in a Google AdSense block. A simple recording tool is used to track the sequence of web requests. And another tool, not used here, could be used to reveal the post-processed html markup, for instance the actual markup for the Google AdSense block units. Google uses two requests to make an actual click and charge a sponsor. It's unclear whether a web check is performed to ensure the click leads to a real visit. Google official answer on the subject is that no web check is performed and that Google assumes the click leads to a real visit, and charges the sponsor for the click.

The whole click sequence can easily be automated. Of course, Google probably monitors additional information that does not appear above such as the IP address of the user, or the time when web requests are issued (especially if a ton of these are issued simultaneously) to disambiguate families of invalid clicks and detect click frauds. That said, Google only holds a part of the truth, they don't own the sponsor web server logs for instance.

To minimize click fraud in the future, it would seem quite logical that either Google performs a web check before charging : for instance the sponsor landing page (http://www.keil.com/gl/c51/?gclid=CN-2nfa6w4cCFSU5XgodS3NUHg) could be a redirect to Google servers. Or provide a service to install on web servers such that the sponsor can automatically detect and report invalid clicks by monitoring special patterns. This would not stop occasional click fraud (a competitor clicks on the ad), but it may stop "industrial" click fraud. The risk left is that industrial click fraud disguised as occasional click fraud, such as the PTR (people paid to read and click on special ads) case.

 

written by Stéphane Rodriguez - September 23, 2006.