HTML5 Banner Specs 2026: Google Ads, CM360/DV360, Adform, Amazon DSP, The Trade Desk
BannerPeek · September 15, 2026
Every banner brief says "standard HTML5 specs". There is no such thing. Google Ads, Campaign Manager 360, Adform and the DSPs all want slightly different zips, and the difference between them is usually one line of JavaScript and one meta tag. This is the checklist I keep next to me when I export. It is written for people who build banners, not for media planners.
Rule zero: the numbers below are the platform maximums. The publisher or the media plan can be stricter (and often is: 150 KB is still the most common line in a brief). Ask for the spec sheet of the actual placement before you start optimising.
The parts that are the same everywhere
- One HTML file at the root of the zip, all assets referenced with relative paths. No nested zips, no folders you forgot to flatten.
<meta name="ad.size" content="width=300,height=250">in the<head>. Google Ads, CM360, DV360 and most DSPs read the size from this tag. If it is missing, some platforms guess from the file name, some reject the upload. Put it in every banner, every time.- Animation stops within 30 seconds, including loops. Three loops of a 10-second animation is the common interpretation; check the brief.
- No local storage, no cookies, no external calls except the few libraries a platform explicitly whitelists.
- A backup image (JPG/PNG/GIF, usually under 40–50 KB) in the same size. Some platforms generate it; most still ask for it.
- Fonts and libraries: embed them or load only from the CDNs the platform allows. A Google Fonts
<link>is fine on Google; the same link may fail a strict publisher's validator.
Google Ads (the self-serve platform)
| Requirement | Value |
|---|---|
| Zip size | 600 KB max (many briefs still say 150 KB; both are true depending on who you ask) |
| Files in the zip | 40 max |
| Accepted file types | HTML, CSS, JS, GIF, PNG, JPG, JPEG, SVG |
| External references | Not allowed, except Google Fonts, CreateJS and GreenSock (GSAP) hosted files |
| Local storage | Not allowed |
| Expandable / rich formats | Not supported |
| Click handling | The whole ad is made clickable by Google. No clickTag variable needed. Optional ExitApi for custom exits |
| Sizes | Standard IAB sizes: 300×250, 336×280, 728×90, 970×250, 160×600, 300×600, 320×50, 320×100, 300×50 and more |
The catch nobody tells designers: an advertiser account can only upload HTML5 ads if it is older than 90 days, has spent more than $9,000 USD lifetime, and has a clean policy history. If your client's account is new, your perfect zip will be rejected with a vague message and it is not your fault. Ask before you build.
Campaign Manager 360 and Display & Video 360 (Google Marketing Platform)
This is where most agency campaigns are trafficked, and the spec is more generous than Google Ads.
| Requirement | Value |
|---|---|
| Files in the zip | up to 100 |
| Upload size | up to 9.5 MB per bundle (the served creative should still be far smaller; publishers cap at 150–300 KB initial load) |
| Click handling | At least one clickTag, or the Enabler.exit() method if you build with Google's Enabler (Studio) |
| Meta tag | ad.size required |
| Structure | Must run inside an iframe; no nested zips |
| HTTP calls | max 100 per ad when served |
The classic CM360 click implementation, which also works on most DSPs:
<script>
var clickTag = "https://www.example.com";
</script>
...
<a href="javascript:window.open(window.clickTag)">
<!-- banner content -->
</a>
The trafficker reads the clickTag variable and swaps the destination after upload, so never hard-code the landing page in an <a href>.
Adform
Adform wants two extra things in the zip that no other platform asks for.
manifest.jsonin the root, naming the main HTML file, the size, and every click tag the banner uses:
{
"version": "1.0",
"title": "Campaign 300x250",
"description": "",
"width": "300",
"height": "250",
"events": { "enabled": 1, "list": {} },
"clicktags": { "clickTAG": "https://www.example.com" },
"source": "300x250.html"
}
- The Adform DHTML library in the
<head>and clicks read throughdhtml.getVar:
<script src="https://s1.adform.net/banners/scripts/rmb/Adform.DHTML.js"></script>
<script>
var clickTAGvalue = dhtml.getVar('clickTAG', 'https://www.example.com');
document.body.onclick = function () { window.open(clickTAGvalue, '_blank'); };
</script>
Note the capitalisation: clickTAG on Adform, clickTag almost everywhere else. Adform itself accepts large zips; the weight limit comes from the publisher.
Amazon DSP
Amazon's own placements are strict on weight: 200 KB for the common desktop sizes (300×250, 728×90, 160×600), lower on mobile, and backup images around 40 KB in most markets. Standard clickTag variable. If the brief says "Sizmek spec", ask what they mean: Amazon Ad Server (the former Sizmek) was shut down at the end of 2024, and old Sizmek EB.clickthrough() code does nothing useful anymore.
The Trade Desk, Xandr, Yahoo and other DSPs
Most DSPs accept the CM360-style zip: ad.size meta, a global window.clickTag, 150–500 KB depending on the exchange. Yahoo DSP has its own adkit.clicktag() helper. Xandr reads clickTag too. When in doubt, build the CM360 version and keep the click code in one obvious place so it can be adapted in two minutes.
The export checklist
Before you zip:
-
ad.sizemeta tag present and correct - Click goes through a variable (
clickTag/clickTAG/Enabler.exit), not a hard-coded URL - Animation stops within 30 s
- All assets local, relative paths, no external calls except allowed CDNs
- No
localStorage, no cookies, no console errors - Backup image in the same size, under the weight limit
- Zip contains files at the root, not a folder
- Weight under the brief's limit, not the platform's
- Adform only:
manifest.json+ DHTML library
One more thing: preview before you deliver
The fastest way to catch a wrong ad.size, a missing asset or a broken loop is to run the zip in a browser exactly as the ad server would: unpacked, in an iframe, at its real size, next to the other sizes of the campaign. That is what BannerPeek does; you drop the zips, it detects the sizes and gives you one link to send to the client for comments and approval. There is a free plan, no credit card.
Related reading
- clickTag explained, platform by platform — the one line of code every spec table above depends on.
- Are HTML5 banners still worth it in 2026? — before you build to spec, decide whether HTML5 is the right format at all.
- How to share banner ads with clients — what happens after the zip passes validation.
- Banner ad sizes 2026 — every standard size drawn at its actual pixel size, and which set to build for a brief.
- Ad creative naming conventions — how to deliver files under the agency's taxonomy without renaming them by hand.
Related articles
- clickTag Explained: How Clicks Work in HTML5 Banners (Google Ads, CM360/DV360, Adform, DSPs)
What the clickTag is, why you must never hard-code a landing page in a banner, and the exact click code for Google Ads, Campaign Manager 360, DV360 Studio (Enabler), Adform (clickTAG + manifest.json) and generic DSPs. With copy-paste snippets.
- How to Share Google Web Designer Banners with Clients for Review
Google Web Designer can make a shareable preview link, but only one ad per link, only for some ad environments, and with no comments or approvals. Here is what it does, where it stops, and how to send a whole GWD campaign to a client as one link.
- Mobile Banner Ad Sizes 2026: 320×50, 320×100, 300×250 and 320×480 (Drawn at Actual Size)
The mobile banner sizes that still get bought in 2026, drawn at their real pixel size: 320×50, 320×100, 300×50, 300×250 and the 320×480 interstitial. What each is for, how to design text that survives 50 pixels, retina exports, weight limits, and which set to build.
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.