BannerPeek

Home / Blog

clickTag Explained: How Clicks Work in HTML5 Banners (Google Ads, CM360/DV360, Adform, DSPs)

BannerPeek · September 15, 2026

If you have ever had a banner bounced with "clickTag missing" or "clickTag not readable", this is the whole story in one page.

What a clickTag is

A banner does not know where it will send people. The landing page is decided by the trafficker in the ad server, per campaign, per placement, often with tracking parameters appended, and it changes without anyone rebuilding the creative.

So the ad server needs a hook: a variable in your banner that it can overwrite at serve time with the real destination. That variable is the clickTag. Your code opens whatever is in the variable; the ad server fills the variable. If you hard-code https://example.com/spring-sale in an <a href>, the ad server can't change it, the clicks aren't tracked, and the creative is rejected.

That's it. Everything else is platform-specific spelling.

Google Ads (self-serve)

Google Ads is the exception: you don't need a clickTag at all. Google wraps the whole ad in a clickable layer and handles the destination from the ad settings. Do not add your own click handler; it can interfere. If you need multiple exits or a custom exit, use Google's optional ExitApi:

<script src="https://tpc.googlesyndication.com/pagead/gadgets/html5/api/exitapi.js"></script>
<script>
  document.getElementById('cta').addEventListener('click', function () {
    ExitApi.exit();
  });
</script>

For a normal banner, skip it and let Google make the ad clickable.

Campaign Manager 360, most DSPs (The Trade Desk, Xandr, Amazon DSP, and others)

This is the "standard" clickTag, and the one to build by default when the brief doesn't say otherwise:

<!doctype html>
<html>
<head>
  <meta name="ad.size" content="width=300,height=250">
  <script>
    var clickTag = "https://www.example.com"; // fallback for local testing only
  </script>
</head>
<body>
  <div id="banner" style="width:300px;height:250px;cursor:pointer;">
    <!-- creative -->
  </div>
  <script>
    document.getElementById('banner').addEventListener('click', function () {
      window.open(window.clickTag, '_blank');
    });
  </script>
</body>
</html>

Rules that validators check:

  • The variable is named exactly clickTag (lowercase c, uppercase T), declared globally, near the top of the file, as a plain string. Validators literally scan the source for var clickTag =.
  • The click opens window.clickTag at click time, not a copy you took earlier (the ad server may inject the value after your script ran).
  • Use window.open(..., '_blank'); don't location.href the iframe.
  • One clickTag per banner unless the brief asks for several (clickTag, clickTag2, ...).

DV360 / Studio with Enabler (Google's rich media library)

If you build with Google Web Designer or Studio, the click goes through the Enabler, not a variable:

<script src="https://s0.2mdn.net/ads/studio/Enabler.js"></script>
<script>
  function init() {
    document.getElementById('banner').addEventListener('click', function () {
      Enabler.exit('Main Exit');
    });
  }
  if (Enabler.isInitialized()) init();
  else Enabler.addEventListener(studio.events.StudioEvent.INIT, init);
</script>

The exit name ("Main Exit") is what the trafficker maps to a URL in Studio. You can have several named exits for multiple destinations. Google Web Designer generates this for you when you add a Tap Area with an Exit event.

Adform: clickTAG + manifest.json

Adform spells it clickTAG and wants every click declared in a manifest.json in the zip root:

{
  "version": "1.0",
  "title": "Spring 300x250",
  "width": "300",
  "height": "250",
  "clicktags": {
    "clickTAG": "https://www.example.com"
  },
  "source": "300x250.html"
}

Then in the HTML, include the Adform DHTML library and read the value with dhtml.getVar:

<head>
  <script src="https://s1.adform.net/banners/scripts/rmb/Adform.DHTML.js"></script>
</head>
<body>
  <div id="banner"><!-- creative --></div>
  <script>
    var clickTAGvalue = dhtml.getVar('clickTAG', 'https://www.example.com');
    document.getElementById('banner').addEventListener('click', function () {
      window.open(clickTAGvalue, '_blank');
    });
  </script>
</body>

Multiple destinations: add clickTAG2, clickTAG3 to both the manifest and the code. Adform parses the manifest to know how many clicks to expect; a click in code that isn't in the manifest is invisible to the trafficker.

Legacy: Sizmek EB.clickthrough()

You will still find it in old templates. Amazon Ad Server (formerly Sizmek) was shut down at the end of 2024; there is nowhere to serve that code anymore. Replace it with the CM360-style clickTag.

The two mistakes behind 90% of rejections

  1. Hard-coded URL. An <a href="https://..."> anywhere in the banner. Even if you also have a clickTag, the validator sees a link that bypasses tracking and rejects.
  2. Wrong spelling. clicktag, ClickTag, click_tag, or Adform's clickTAG sent to a CM360 placement. The variable is read by string match; spelling is the API.

Test before you send

You can't see a clickTag work locally, because nothing fills the variable. What you can check: click the banner, and confirm it opens the fallback URL in a new tab and that the console has no errors. If it opens nothing, or opens undefined, the variable isn't wired. (BannerPeek is adding a clickTag check to the preview page: click the banner and see which URL it would fire, or "no clickTag" if none. It's on the roadmap; see the comparison with Adpiler for what's live today.)

For the full weight, file count and format rules per platform, see HTML5 banner specs 2026.

Related reading

Related articles

Share your next campaign with one link

HTML5, image and video banners on one preview page, with pinned comments and approvals. Free while in early access.