
If you’ve ever had a beautiful HTML5 banner rejected at upload or under-report clicks once live, the culprit is often a missing or incorrectly wired clickTag. In 2025, Google Ads, DV360, Adform, and Sizmek still expect slightly different patterns. Below we’ll show exactly how we implement click-throughs for each platform, the packaging rules that prevent rejections, and paste-ready snippets you can drop into your creatives. As a team that designs once and ships many sizes, we obsess over making the click layer bulletproof and consistent across variants.
What the clickTag is and why it matters in 2025
- clickTag (sometimes spelled clickTAG) is a variable that the ad server uses to inject its click tracker and final landing URL. You don’t hardcode the URL; you read the one the platform passes in.
- JavaScript is case-sensitive. Some platforms expect
clickTag
(lowercase T), othersclickTAG
(uppercase TAG). Use the exact casing required by the platform. - Hardcoding an
<a href="https://...">
for the main click is risky: it bypasses tracking, makes late landing-page changes impossible without new builds, and often leads to rejection.
Implementation patterns by platform
Google Ads & DV360: use a global clickTag variable
For hand-coded HTML5 (not using Google Web Designer), a common, reliable pattern is to expose a global clickTag
variable for the ad server to override, and wire your tap area to open it. Keep the default value for local testing only.
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="ad.size" content="width=300,height=250">
<script>
// Default for local testing; Google platforms override this value
var clickTag = "https://www.example.com";
</script>
<style>
html, body { margin: 0; }
#tap-area { position: absolute; inset: 0; cursor: pointer; }
</style>
</head>
<body>
<div id="tap-area" aria-label="Open advertiser site" role="button" tabindex="0"></div>
<script>
var area = document.getElementById('tap-area');
function openClick(){ window.open(clickTag, '_blank'); }
area.addEventListener('click', openClick);
area.addEventListener('keydown', function(e){ if(e.key === 'Enter' || e.key === ' ') openClick(); });
</script>
</body>
</html>
Using Google Web Designer (GWD)? Add a Tap Area covering the banner, then attach a custom action that calls window.open(clickTag, '_blank')
. The platform will supply the value for clickTag
on upload.
Adform: clickTAG (uppercase) + manifest.json + DHTML API
Adform expects click-through variables to be declared in manifest.json
and read in your banner via the Adform DHTML API. The variable name is commonly clickTAG
(uppercase TAG). This approach also supports multiple click-throughs.
manifest.json (single or multiple click-throughs)
{
"version": "1.0",
"files": [
"index.html",
"main.css",
"main.js",
"images/bg.jpg"
],
"clickTags": {
"clickTAG": "https://site.example.com/",
"clickTAG2": "https://site.example.com/about/"
}
}
index.html (read via Adform DHTML API)
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="ad.size" content="width=300,height=250">
<script src="https://s1.adform.net/banners/scripts/rmb/Adform.DHTML.js"></script>
<style>
html, body { margin: 0; }
#click-area { position: absolute; inset: 0; cursor: pointer; }
</style>
</head>
<body>
<div id="click-area" aria-label="Open advertiser site" role="button" tabindex="0"></div>
<script>
// Default URL is for local testing only; Adform overrides via manifest.json
var primaryUrl = dhtml.getVar('clickTAG', 'https://example.com');
var area = document.getElementById('click-area');
function openClick(){ window.open(primaryUrl, '_blank'); }
area.addEventListener('click', openClick);
area.addEventListener('keydown', function(e){ if(e.key === 'Enter' || e.key === ' ') openClick(); });
</script>
</body>
</html>
Key point: read the value with dhtml.getVar('clickTAG', ...)
instead of hardcoding it.
Sizmek: use the ad kit’s clickthrough
In Sizmek builds, delegate the click-through to the platform by calling the ad kit’s clickthrough function from your click handler (common when authoring with GWD).
// In your custom action bound to the tap area
adkit.clickthrough();
This ensures Sizmek can inject its tracking and landing URL.
Multiple CTAs and named click-throughs
Some placements require more than one click destination (e.g., primary CTA plus a secondary text link). Adform supports multiple named click-throughs declared in manifest.json
(e.g., clickTAG
, clickTAG2
, etc.). Wire each CTA to its corresponding variable:
<script>
var primaryURL = dhtml.getVar('clickTAG', 'https://example.com/primary');
var secondaryURL = dhtml.getVar('clickTAG2', 'https://example.com/secondary');
document.getElementById('cta-primary').addEventListener('click', function(){
window.open(primaryURL, '_blank');
});
document.getElementById('cta-secondary').addEventListener('click', function(){
window.open(secondaryURL, '_blank');
});
</script>
For Google Ads/DV360 and Sizmek, follow the platform’s guidance for additional exits if required by the placement. If the buy permits only a single primary click-through, keep it simple and route all clicks to the main variable.
Packing and uploading HTML5 zips correctly
- Keep all assets at the zip root alongside
index.html
(avoid nested folder structures that break relative paths on upload). - Adform: include a valid
manifest.json
listing your files and declaring clickTAG variable(s). Your code should read values viadhtml.getVar
. - Google Ads/DV360: ensure the bundle exposes a global
clickTag
and that your click handler opens it. - Sizmek: wire the click via the ad kit’s clickthrough method in your handler.
- Avoid hardcoded anchors for the main click; rely on the platform variable to ensure proper tracking and late URL changes without rebuilds.
Pre-flight QA checklist we use before trafficking
- Click opens in a new tab and resolves correctly in each platform’s preview/test environment.
- Case sensitivity matches the platform:
clickTag
(Google stack) vsclickTAG
(Adform). - Tap/click overlay actually covers the intended area across all sizes, including responsive or fluid creative edges.
- Keyboard access: pressing Enter or Space on the main clickable element triggers the click (improves accessibility and prevents QA rejections).
- No JavaScript errors in console; animation loops don’t block clicks.
- File references load over HTTPS; no mixed-content issues that could block script execution.
Troubleshooting common issues
- Clicks work locally but not on-platform: remove any hardcoded
href
on your main layer and read from the platform variable (clickTag
,clickTAG
, oradkit.clickthrough()
). - Adform click not tracked: confirm the variable name matches
manifest.json
, and you’re usingdhtml.getVar
(not a literal URL). - Google Ads/DV360 upload warning about missing click tag: verify the presence of a global
clickTag
variable and that your click handler opens it. - Sizmek click opens the wrong URL: route the click to
adkit.clickthrough()
instead ofwindow.open()
so Sizmek injects its landing URL.
Copy-paste code you can adapt today
Google Ads / DV360 minimal
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="ad.size" content="width=300,height=250">
<script>var clickTag = "https://www.example.com";</script>
<style>html,body{margin:0}#tap-area{position:absolute;inset:0;cursor:pointer}</style>
</head>
<body>
<div id="tap-area" aria-label="Open advertiser site" role="button" tabindex="0"></div>
<script>
var a = document.getElementById('tap-area');
function go(){ window.open(clickTag, '_blank'); }
a.addEventListener('click', go);
a.addEventListener('keydown', function(e){ if(e.key==='Enter' || e.key===' ') go(); });
</script>
</body>
</html>
Adform single-click template
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="ad.size" content="width=300,height=250">
<script src="https://s1.adform.net/banners/scripts/rmb/Adform.DHTML.js"></script>
<style>html,body{margin:0}#click-area{position:absolute;inset:0;cursor:pointer}</style>
</head>
<body>
<div id="click-area" aria-label="Open advertiser site" role="button" tabindex="0"></div>
<script>
var url = dhtml.getVar('clickTAG', 'https://example.com');
var el = document.getElementById('click-area');
function go(){ window.open(url, '_blank'); }
el.addEventListener('click', go);
el.addEventListener('keydown', function(e){ if(e.key==='Enter' || e.key===' ') go(); });
</script>
</body>
</html>
Remember to declare clickTAG
in manifest.json
and include it in your zip.
Sizmek (GWD) handler
// In your GWD custom action bound to the Tap Area
adkit.clickthrough();
Production tips from building many sizes
- Make a dedicated “Click/Tap Overlay” layer that stretches to the canvas edges across all sizes. Lock it visually in your design system so it’s never accidentally nudged.
- Keep the click logic in one place (a single JS module or inline block) so QA only checks it once per creative set.
- Guard against double-fires by keeping the overlay on one layer and avoiding nested elements with additional click handlers.
- Respect accessibility: give the main clickable element a role of button and a tabindex, and mirror click on Enter/Space.
- Avoid CSS pointer-events on animated layers above your overlay unless intentional; they can block the click.
Where SizeIM fits in this workflow
We design once, then generate all the standard IAB sizes without manually redrawing layouts. That consistency is crucial for click correctness: when your tap overlay and CTA positioning are defined in the master, those decisions carry through every size. With Brand Kit management, logos, fonts, and colors remain locked and consistent while you implement the small platform-specific click snippet appropriate for Google Ads/DV360, Adform, or Sizmek.
If you’re building multi-size sets regularly and want to keep click handling consistent across dozens of sizes, try streamlining the design phase with SizeIM and then drop in the platform-specific code from this guide during export or final QA.
Want to see how we can help you produce complete ad sets faster while keeping clickTag wiring consistent? Visit us at https://www.sizeim.com.