Home Articles Why Feed-Generated HTML5 Ads Get Rejected by Google Ads, DV360 and Ad Manager Why Feed-Generated HTML5 Ads Get Rejected by Google Ads, DV360 and Ad Manager Published Date: 19 Sep, 2026 Google Ads caps an uploaded HTML5 display creative at 600 KB and 40 files inside the ZIP archive, according to Google's own uploaded display ads specification. Display & Video 360 allows up to 100 files but caps the total download weight a browser pulls when the ad serves at 5 MB, and limits a single creative to 25 cookies and 100 external HTTP calls, per DV360's HTML5 creative guidelines. None of these numbers are secret. They are published in each platform's own spec pages. A feed-driven creative pipeline still trips over them constantly, because the ZIP a template engine assembles from a few thousand SKUs behaves nothing like the ZIP a designer builds by hand. This guide is for whoever owns creative QA on a catalog account: the specific reasons HTML5 ads generated from product feed data get rejected by Google Ads, DV360 and Google Ad Manager, and the fix for each one, so you catch them before the platform does. Why feed-generated HTML5 fails review more often than hand-built creative A designer building one banner by hand embeds the product photo directly in the ZIP, writes one clickTag, and checks the file count once. A template engine generating the same banner for 4,000 SKUs repeats every decision 4,000 times, and a mistake that costs nothing at n=1 compounds at scale. Four patterns account for most of it. First, the template usually references product images by the image_link URL straight from the feed, because that is the field the feed already has, rather than downloading and embedding the file, which is what the ZIP format requires. Second, a template that gives every badge state (in-stock, sale, best-seller, low-stock) its own image file multiplies the archive's file count before a single product photo is added. Third, minifying the build output for delivery speed strips metadata and obfuscates variables, including the exact ad.size meta tag and clickTag variable the ad platforms parse by name. Fourth, every tool in the stack — the creative-automation layer, the analytics tag, the ad network's own pixel — adds its own script or cookie, and nobody tests the assembled ad against the platform's combined ceiling until it is already in review. The technical limits, platform by platform These are the numbers that actually get enforced. Where a platform has not published a hard number, we say so rather than guess. PlatformMax ZIP / download sizeMax filesAllowed file typesNotable extra rule Google Ads — standard uploaded display600 KB (ZIP)40HTML, CSS, JS, GIF, PNG, JPG, JPEG, SVGOnly Google Fonts, Google-hosted CreateJS, GSAP and jQuery may be referenced externally; everything else must be internal to the ZIP Google Ads — App campaign HTML5 interstitial5.2 MB (ZIP)512Same core set as aboveOnly two dimensions are supported: 320×480 and 480×320 Display & Video 3605 MB total download weight (not ZIP size)100html, htm, css, js, jpg, jpeg, gif, png, svg plus a defined font-file setHard caps of 25 cookies, 100 external HTTP calls and 30 seconds of animation per creative; no audio autoplay Google Ad ManagerNo published hard cap — validated per bundleNot publicly specifiedSame core set; fixed dimensions only, no FluidRequires an unminified clickTag variable in the head and an ad.size meta tag; hard-coded click URLs break click tracking Sources: Google Ads uploaded display ad specs, Google Ads App campaign HTML5 asset troubleshooting, DV360 HTML5 creative guidelines, Google Ad Manager HTML5 guidelines. Five rejection causes that repeat across every platform, and the fix for each 1. Absolute image URLs instead of embedded assets The template pulls image_link straight from the feed and writes it into the markup as-is: <img src="https://cdn.example.com/feed/sku-4471-a.jpg"> Google's own HTML5 asset validator returns a specific error for this on App campaign interstitial bundles: "Your HTML5 ad is trying to reference an asset that is external to your .ZIP file. Only internal file references are allowed." The same rule applies, with less explicit error text, on standard display and DV360. Fix: at build time, fetch the file the image_link URL points to, re-encode it into the ZIP under a relative path, and reference that path instead: <img src="assets/sku-4471-a.jpg"> 2. File count blown out by per-variant badge and icon assets A template with six badge states across eight creative sizes is 48 files before a single product photo is added — already over Google Ads' 40-file cap for standard display. On a catalog with hundreds of active promotions, this is the single most common reason a batch export fails while the same template passed QA on a five-product test set. Fix: consolidate badge states into one spritesheet or an inline SVG <symbol> referenced by CSS class, so the file count stays flat regardless of how many badge states or sizes the campaign uses. 3. Missing or stripped ad.size meta tag Minification steps built for speed, not ad-tech compliance, frequently strip or reorder <head> content, including the dimension meta tag the platforms parse by exact name. Google Ads' validator error for this reads: "Your HTML5 ad is missing a primary .HTML file. Primary .HTML files include an Ad Size tag." Google Ad Manager requires the same information as <meta name="ad.size" content="width=300,height=250">. Fix: run the meta-tag check after minification, not before, and add it as an automated gate in the export pipeline rather than a manual spot-check. 4. clickTag hard-coded, missing, or minified beyond recognition A minifier turns a readable click handler into something like var a=b(3). DV360's own guidance is explicit that the click tag "should be easy for the ad server to read" and instructs teams not to run it through a code minifier; Ad Manager requires the same variable, declared exactly as clickTag, in the head. Fix: declare it once, unminified, and exclude that one line from the minification pass: var clickTag = "https://example.com/product/4471";. Never hard-code the destination URL elsewhere in the markup — Ad Manager cannot attribute clicks it does not see through the variable. 5. Cookie and HTTP-call ceiling exceeded by stacked tracking DV360 hard-caps a single creative at 25 cookies and 100 external HTTP calls. Each individual tag — a retargeting pixel, a web font request, a GA4 call, the creative-automation platform's own tracking snippet — is compliant on its own. Stacked together on one assembled ad, they are not, and the overage only shows up when someone tests the finished bundle rather than the template. Fix: route tracking through a single tag-manager container per ad instead of adding pixels individually, load fonts locally rather than via an external request, and test the count on a real rendered export — not the template — since template-level testing under-counts. A pre-flight checklist before a batch of feed-generated HTML5 creative goes live Every asset reference in the markup is relative to the ZIP root, not an absolute URL back to the feed's CDN. File count is checked on the assembled, product-specific ZIP — not the template — and sits under the target platform's cap. The ad.size meta tag (or DV360/Ad Manager equivalent) is present and unminified after the build step, not just before it. The clickTag variable is declared once, unminified, and is the only click destination in the file. Combined cookie count and external HTTP calls are tested on the rendered ad, against DV360's 25/100 ceiling, not estimated per tag. Total download weight is measured cold, post-compression, against the platform's actual limit — 600 KB for Google Ads standard display, 5 MB total for DV360. What this doesn't cover This is a technical compliance layer, not a full creative strategy. It does not cover social and native dynamic catalog ads — Meta and Instagram placements, TikTok catalog ads — built from the same feed, because those run on image and video assets through the platform's own catalog ad manager, not an HTML5 ZIP upload. For that specific job, purpose-built tools are a genuinely better fit than a general HTML5 pipeline: Confect is built specifically around Meta and Google catalog ad templates with hourly product sync, and Hunch is built around social and video dynamic creative, including hyper-localized variants. Neither produces IAB-spec HTML5 display banners, which is exactly the gap this guide addresses, but for their own lane they are worth evaluating on their own terms. This also does not cover creative testing or performance measurement — whether a given template out-converts another is a separate discipline from whether it passes technical review — and it does not replace a platform's content policy review. Fixing every item on the checklist above stops a technical rejection. It does not clear a creative that violates a platform's advertising policy on substantive grounds. Frequently asked questions What is the maximum file size for an HTML5 display ad in Google Ads? For standard uploaded display ads, the ZIP file must be 600 KB or smaller with no more than 40 files inside it. App campaign HTML5 interstitial assets follow a separate spec: up to 5.2 MB and 512 files, but only in the 320×480 or 480×320 dimensions. Why does DV360 measure total download weight instead of ZIP size? Because a ZIP can decompress into a much larger set of files once the browser renders it. DV360 caps the actual weight a visitor's browser downloads when the ad serves, at 5 MB, which is a more accurate proxy for real-world load impact than the compressed archive size. Can a feed-generated HTML5 ad reference external fonts or images? Generally no. Google Ads standard display only permits external references to Google Fonts and a small allowlist of Google-hosted libraries (CreateJS, GSAP, jQuery); everything else, including every product image, must be embedded in the ZIP with a relative path. Why does an HTML5 ad pass local testing but fail platform review? Local testing usually runs against the pre-minified, pre-compression source, not the exact ZIP that gets uploaded. Minification can strip the ad.size tag or mangle the clickTag variable after the local test already passed, so the checks need to run against the final build artifact. Does the 40-file limit apply per product or per campaign? Per individual creative ZIP. A batch export that generates one ZIP per SKU needs each one, individually, under the cap — the limit does not average out across a campaign's total file count. What's the difference between the App campaign HTML5 spec and the standard display HTML5 spec? They are separate specifications with different limits, aimed at different inventory. Standard uploaded display ads are capped at 600 KB and 40 files with flexible dimensions; App campaign HTML5 interstitials allow up to 5.2 MB and 512 files but only in two fixed portrait/landscape dimensions. Using one spec's assumptions on the other's surface is a common source of rejected bundles. Do these file and clickTag rules apply to video creative generated from the same feed? No — video assets follow each platform's video ad specs (encoding, duration, aspect ratio), not the HTML5 ZIP rules in this guide. A feed-driven pipeline that produces both video and HTML5 output needs separate QA passes for each. How do I test cookie and HTTP-call counts before uploading to DV360? Render the assembled creative in a browser with developer tools open, load the ad in an isolated tab, and count the actual cookies set and requests fired from the network panel. Testing the template in isolation, before tracking tags are injected at build time, will under-count both. If maintaining this compliance layer by hand isn't a good use of your team's time, see how Feedance's Creative Suite generates channel-ready creative directly from your product feed — static, video and HTML5 banners — alongside feed enrichment for the underlying product data. Karaca used the same feed-to-creative approach to produce 10,000 branded Black Friday creatives in two hours. Talk to us about your catalog and your current rejection rate. Prev Article llms.txt Won't Get Your Products Into AI Shopping Results. Your Feed Will. Related to this topic: How Bilyoner Ran Catalog Ads for the First Time and Lifted ROAS by 49% 15 Aug, 2026 How Note Cosmetics Increased ROAS by 127% — While Spending 10% Less 15 Aug, 2026 How Vivense Lifted ROAS 32% by Not Advertising Products It Couldn't Sell 15 Aug, 2026