100% Private & Browser Based

Google Ads HTML5 Validator and ZIP Requirements (2026)

An HTML5 banner uploaded to Google Ads must be a ZIP of 600 KB or smaller with no more than 40 files, built only from HTML, CSS, JS, GIF, PNG, JPG, JPEG and SVG files, with an ad.size meta tag in the <head> of the primary HTML file and no external references except Google Fonts and the Google hosted CreateJS, GreenSock and jQuery libraries. Everything else on this page explains those rules, the exact upload errors they produce, and how to catch each one before Google does.

Campaign Manager 360 and Display & Video 360 are separate products with their own, much larger limits. They are compared in Google Ads vs CM360 vs DV360. This guide is about Google Ads only.

Check Your HTML5 ZIP Before Upload

Drop the published ZIP into the validator with Google Ads selected. It checks the 600 KB limit, the 40 file maximum, file types, ad.size, clickTag, external references and GIF timing in your browser. The file never leaves your machine.

Open the HTML5 Banner Validator

1. Google Ads HTML5 ZIP requirements

Every limit below comes from Google's uploaded display ads specifications and uploaded ads error guide, last verified in September 2026.

Requirement Google Ads rule What happens if you miss it
ZIP size 600 KB or smaller Upload refused: the file size for your ad is too big
File count No more than 40 files in the ZIP Upload refused
File types HTML, CSS, JS, GIF, PNG, JPG, JPEG, SVG Unsupported file type error. Fonts, WebP, MP4, JSON and nested ZIPs all fail
File names Letters, numbers, periods, hyphens and underscores only Unsupported characters error. A single space in a file name is enough
Primary HTML An HTML file with <meta name="ad.size" content="width=300,height=250"> inside a properly closed <head> Missing primary HTML file error
External references Relative paths only, except Google Fonts and the Google hosted CreateJS, GreenSock and jQuery builds Asset not found in your ZIP error
Clicks One exit. No multiple exits, no ExitApi.exit(), no Google Web Designer Tap Area Multiple exits or modifying clickability error
Animation 30 seconds or shorter. Loops are allowed but must stop at 30 seconds Outside the specification
Account access Account open more than 90 days, more than 9,000 USD lifetime spend, good policy history Your account doesn't support HTML5 ads

Static image uploads follow a different ceiling: GIF, JPG and PNG image ads can be at most 150 KB, and animated GIFs must run slower than 5 frames per second. The animated GIF guide covers the timing rules, and the banner ad sizes chart lists every dimension Google accepts.

2. External libraries Google Ads allows

Google Ads allows an HTML5 banner to load only four kinds of file from outside its ZIP: Google Fonts, and Google's hosted builds of CreateJS, GreenSock (GSAP) and jQuery. Everything else, including cdnjs, jsDelivr, unpkg, the CreateJS CDN and your own server, has to be bundled in the ZIP with a relative path. Otherwise the upload fails with "Your HTML5 ad is trying to reference an asset not found in your .ZIP file." The hosts and paths below are the ones the AdCheckLab validator accepts in Google Ads mode.

Library What Google names Host and path
Google Fonts Google Fonts fonts.googleapis.com and fonts.gstatic.com
CreateJS tweenjs, easeljs, createjs, preloadjs, soundjs s0.2mdn.net/ads/studio/cached_libs/
GreenSock TweenLite, TweenMax, CSSPlugin, EasePack, TimelineLite, TimelineMax s0.2mdn.net/ads/studio/cached_libs/
jQuery Google hosted jQuery ajax.googleapis.com/ajax/libs/jquery/

The current Studio hosted file names come from Google's Studio hosted JavaScript libraries page, and the jQuery URL from Google Hosted Libraries. Copy them exactly:

<script src="https://s0.2mdn.net/ads/studio/cached_libs/createjs_2019.11.15_min.js"></script>
<script src="https://s0.2mdn.net/ads/studio/cached_libs/tweenjs_1.0.0_min.js"></script>
<script src="https://s0.2mdn.net/ads/studio/cached_libs/gsap_3.14.2_min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap" rel="stylesheet">

One nuance: the Google Ads page names the classic GreenSock files, while the Studio page now hosts GSAP 3 at the same path. AdCheckLab accepts the whole cached_libs path. If you want no doubt at all, bundle GSAP inside the ZIP, where it simply counts toward the 600 KB.

The hosted copies also help with weight. A library loaded from the Google host is not inside the ZIP, so it counts toward neither the 600 KB limit nor the 40 file maximum. For an Adobe Animate banner, switching CreateJS from the bundled copy to the hosted one is often the single biggest saving; the Adobe Animate section of the clickTag guide shows where that setting lives.

What gets refused:

Campaign Manager 360 and DV360 publish no allowlist like this one, and DV360 even expects video to be hosted outside the ZIP, so the validator reports other hosts there as the warning External Resources Referenced rather than an error. Bundling is still the safer choice: a publisher page that blocks a third party host leaves the banner empty.

3. Google's HTML5 Validator vs AdCheckLab

Google runs its own HTML5 Validator at h5validator.appspot.com/adwords/asset. You click Upload, choose the ZIP, and it reports errors against the Google Ads requirements. Because Google maintains it, it is the reference check, and it is worth running as the very last step before the real upload.

Question Google HTML5 Validator AdCheckLab Validator
Where is the ZIP processed? On a Google web service, after you upload it Inside your browser. The file is never uploaded anywhere
Whose rules? Google's own Google Ads checks Limits transcribed from each platform's help pages, last verified September 2026
Which platforms? Google Ads at this address Google Ads, CM360, DV360 and a Generic mode, each with its own limits and file type list
Best moment to use it Last, right before the upload While building and during QA, as often as you like

What AdCheckLab adds on top of a pass or fail result:

Neither tool can promise approval. Google still reviews every ad against its advertising policies after upload. What a validator removes is the avoidable technical rejection.

4. Google Ads HTML5 upload errors and fixes

The quoted text in the first column is the wording Google documents for each upload error. Where people search a shorter phrase, it is listed too, with the name of the AdCheckLab check that catches the same problem.

Error you see Cause Fix
Missing primary asset
"Your HTML5 ad is missing a primary .HTML file."
No HTML file carries an ad.size tag inside a closed head, or the ZIP wraps everything in a parent folder. AdCheckLab reports Missing index.html, index.html Nested in Subfolder or Missing ad.size Meta Tag. Add the ad.size tag to the head and zip the files, not the folder. The causes are in section 5.
File size too large
"The file size for your ad is too big."
The ZIP is over 600 KB. AdCheckLab reports ZIP File Weight Limit Exceeded. Compress images, drop unused assets, load CreateJS or GSAP from the Google host instead of bundling them. See how to compress HTML5 ZIP banners.
Unsupported file type
"The ad contains an unsupported file type."
A font, WebP image, video, JSON file, source file or nested ZIP is inside the package. Remove it or convert it to one of the eight accepted types. Load fonts from Google Fonts instead of bundling them.
Disallowed external references
"Your HTML5 ad is trying to reference an asset not found in your .ZIP file."
A script, stylesheet or image loads from a CDN or your own server. AdCheckLab reports Disallowed External References. Bundle the file with a relative path, or switch to the Google hosted build. The list and the exact URLs are in section 2.
Missing clickTag The banner never declares a clickTag variable, or reads one it never declared. AdCheckLab reports Missing clickTag Variable or clickTag Used but Never Declared. Declare var clickTag in the head and open it on click. The missing clickTag guide has the code, or inject it with the clickTag Editor.
Invalid clickTag casing clicktag, ClickTag or clickTAG. JavaScript names are case sensitive, so an ad server looking for clickTag never finds them. Rename every declaration and every reference to exactly clickTag.
"HTML5 ad contains multiple exits" Several click destinations, for example clickTag1 and clickTag2. Google Ads does not allow multiple exits. Keep one exit. Multiple exits belong in CM360, which supports them.
"Your HTML5 ad is modifying clickability, which is not supported" A Google Web Designer Tap Area, or ExitApi.exit() with the exitapi.js script. AdCheckLab reports Custom Exit Not Allowed. Delete the Tap Area, or remove the exitapi.js script from the head.
"This ad was created with the environment 'Generic' instead of 'Google Ads.'" A Google Web Designer file built for the wrong ad environment. Switch the document to the Google Ads environment and publish again. See the Google Web Designer guide.
"You must upload a published file." The Google Web Designer author file was zipped instead of the published output. Use Publish, then Publish locally, and upload that ZIP.
Invalid Fourth Party Call An empty <video> tag left in the markup. Delete the empty video tag.

5. Fixing the missing primary asset error

The missing primary asset error means the platform opened your ZIP and could not find the HTML file that starts the banner. In Google Ads the wording is "Your HTML5 ad is missing a primary .HTML file. Make sure there's an .HTML file with an Ad Size tag in your HTML5 ad." Usually the HTML file is there, just one folder too deep, or its ad.size tag is missing or outside the head. Three causes cover almost every case.

The ZIP contains a folder, not the files

Right clicking a build folder and choosing Compress puts the folder itself inside the archive:

banner_300x250.zip
└── banner_300x250/
    ├── index.html
    ├── style.css
    └── img/

The ad server looks at the root of the archive, finds only a folder, and reports no primary file. What it needs is this:

banner_300x250.zip
├── index.html
├── style.css
└── img/

The ad.size tag is missing or misplaced

Google Ads identifies the primary file by its size tag. It must look like <meta name="ad.size" content="width=300,height=250">, sit inside the <head>, and the head must be closed with </head>. Google's own fix for this error is to search the HTML for the tag and check exactly those three things. A tag in the body, a head that is never closed, or a typo such as ad-size all produce the same error.

The file is not called index.html

Google Ads looks for any HTML file with a size tag, but naming the primary file index.html is the convention every platform and export tool understands, and it is what the AdCheckLab validator expects. Rename banner.html or 300x250.html to index.html, and delete leftover HTML files such as previews or author files. Campaign Manager 360 also asks for a complete HTML document that loads in an iframe and includes at least one click tag.

Validator result Meaning Fix
Missing index.html No file named index.html anywhere in the ZIP Rename the primary HTML file
index.html Nested in Subfolder It exists, but inside a folder, and the validator shows the path Zip the contents of the folder, not the folder
Missing ad.size Meta Tag No size tag in the head. An error for Google Ads, a warning elsewhere Add the tag with the real width and height
Malformed ad.size Meta Tag The tag exists but does not state both width and height Use the form width=300,height=250

When Primary Asset shows as passed in the validator, the file is where every platform expects it. If the ZIP then uploads but shows an empty frame, work through why a banner preview is blank.

6. A minimal index.html that passes

This is the smallest primary file that satisfies every rule above: the size tag in the head, one clickTag declared before anything reads it, and a single click handler on the whole canvas. Everything else in the ZIP is referenced by relative path.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="ad.size" content="width=300,height=250">
  <script type="text/javascript">
    var clickTag = "https://www.example.com";
  </script>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <div id="ad" onclick="window.open(window.clickTag, '_blank')">
    <img src="img/hero.jpg" width="300" height="250" alt="">
  </div>
</body>
</html>

Google's own upload guidance does not name a click variable: by default a Google Ads creative exits to the final URL you set on the ad in Google Ads. A single standard var clickTag declaration is the portable way to build it, because the same ZIP then also meets Campaign Manager 360 and DV360, which require a click tag, and it is what AdCheckLab checks for in Google Ads mode. If you need a declaration for many sizes at once, the clickTag Generator writes one row per format with the matching ad.size tag.

7. A preflight workflow that avoids rejections

  1. Export the final build. For Google Web Designer, publish locally. For Adobe Animate, publish with libraries bundled or pointed at the Google host.
  2. Zip the files, not the folder. index.html must sit at the root of the archive, as shown in section 5. Remove __MACOSX and .DS_Store entries.
  3. Validate in Google Ads mode. Fix every error first, then read the warnings: a missing backup image is optional for Google Ads, a hardcoded landing page link is not.
  4. Fix clicks in place. The clickTag Editor adds or repairs the declaration inside the ZIP without touching the animation code.
  5. Compress if the ZIP is over 600 KB. The Banner Compressor keeps file names and formats, so references inside the code keep working. Validate again afterwards.
  6. Upload, save, then test the click. Google notes that the preview popup does not click through. The working preview is the View full size ad link after the ad is saved.

For the full list of checks an ad ops team should sign off before trafficking, use the HTML5 banner QC checklist.