An HTML5 banner can look correct in the producer’s usual browser and still fail after upload. A relative asset path resolves differently, an iframe changes the click context, a cold cache exposes a blank first paint, or a narrow mobile placement makes a legal line unreadable. The answer is not to open every ZIP on every device. It is to test a compact set of environments chosen from the actual risks of the campaign.
A useful QA matrix tells the team what was tested, why each row exists, and which result still needs ad-platform confirmation. It keeps a local pass, a browser pass, an upload acceptance, and a live placement check from being collapsed into one vague “approved” status.
Start with the delivery contract
Before choosing browsers, write down what every package must do. Record the booked size, platform, ZIP limit, ClickTag method, destination ownership, animation duration, loop rule, backup-image requirement, locales, and any publisher-specific restrictions.
This contract is the fixed side of the matrix. The environment rows are variables. If the 300 x 250 is meant to loop twice, stop on a complete final frame, and use a platform-injected destination, every test row checks that same behavior. A producer should not quietly change the expected loop count because one preview behaves differently.
Keep platform rules current. For example, Google Ads’ uploaded display specifications and Display & Video 360’s HTML5 creative guidance currently require animated creatives to stop within 30 seconds. Those pages can change, and another publisher may set a different limit, so copy the relevant rule and the date checked into the campaign brief instead of relying on memory.
Use a small risk-based matrix
Begin with four rows that expose different classes of failure:
- Extracted ZIP over local HTTP: proves the package can run without source-workspace files or a development server.
- Banner inside a plain iframe: exposes parent-window assumptions, dimensions, focus, and click-area problems.
- Secondary browser engine: catches rendering, font, image decoding, and timing differences hidden by the producer’s default browser.
- Target ad-platform preview: checks the environment that parses the ZIP, injects click behavior, and applies the media-buy rules.
Add rows only when the campaign creates a real risk. A high-DPI row belongs in the matrix when detailed photography or small product packaging must stay sharp. A touch-device row matters when mobile inventory is in scope. A slow-load row matters when the opening scene depends on several images or fonts. A second locale matters when it changes line count, character set, or legal-copy density.
Capella
The matrix should stay small enough to rerun after a late change. Ten thoughtful rows that the team can repeat are more useful than fifty browser-and-device combinations nobody will revisit.
Test the final ZIP outside the source workspace
Extract a duplicate of the exact delivery ZIP into an empty directory and serve that directory over HTTP. Do not open the source project and assume it represents the package. Shared fonts, image folders, modules, or fallback scripts can make a broken ZIP appear complete.
Watch the network panel from the first request. Confirm that every asset returns successfully, filenames match their case-sensitive references, and no request escapes to an unapproved host. Reload once with cache disabled, then once with a warm cache. The cold run tests the first viewer; the warm run can reveal duplicate initialization, overlapping timelines, or code that assumes assets load only once.
Record the exact ZIP filename, byte size, and checksum beside the results. If QA uses a different export from the one ad ops uploads, the matrix proves the wrong artifact.
Put the creative inside an iframe
Standalone tabs are forgiving. Ad creatives usually run in a framed or otherwise managed environment, where assumptions about the top-level window can fail. Create a plain test page with an iframe at the booked dimensions and load the extracted package through the same local server.
Check the whole canvas, not only the visible CTA. ClickTag behavior may be supplied by the platform, by a global variable, or by the creative itself. Follow the agreed contract and verify the fallback separately from the injected path. Do not hard-code a production destination just to make the local test pass.
Inspect console errors from both the host page and the banner frame. Look for attempts to access window.parent, blocked popups, missing globals, mixed-content requests, and uncaught load failures. A banner that animates correctly but throws on click is not ready.
Also verify that the iframe keeps the exact placement dimensions. Scaling a 300 x 250 preview to fill a larger review card can hide clipped copy or make a small hit area feel acceptable. Run the acceptance pass at 100% placement size.
Choose browsers by engine and media plan
Do not build the matrix from brand names alone. Start with the browser engine used by production and add another engine when the media plan, client review process, or known feature risk justifies it. A campaign expected to run on desktop and mobile should include both pointer and touch input, but it does not need every phone model in the studio.
Prioritize differences the banner can actually expose:
- Web-font loading and fallback metrics.
- SVG masks, filters, and clipping.
- Image decoding at first paint.
- CSS transforms and overflow at native dimensions.
- High pixel density for detailed raster assets.
- Click behavior with pointer and touch input.
- Timeline recovery after the tab is hidden and shown again.
HSBC
If the creative uses only basic HTML, CSS transforms, optimized images, and a tested animation library, the second-engine pass can stay brief. If it depends on complex SVG filters, external fonts, video, or platform APIs, expand the relevant rows and document why.
Cover first paint, playback, and the stopped state
A single screenshot at the end of the animation is not a browser test. Observe three distinct phases:
- First paint: an intentional visual appears without a blank flash, missing font, or late layout jump.
- Playback: scenes arrive in the approved order, text remains readable, and no element clips or flickers during transforms.
- Stopped state: the animation respects the duration and loop rule, leaves no decorative motion running, and holds a complete brand, offer, CTA, and required legal copy.
For GSAP work, measure the timeline instead of estimating from a screen recording. GSAP’s totalDuration() documentation distinguishes the total runtime, including repeats and repeat delays, from one cycle’s duration. Recheck that value after copy, dwell time, or loop-count changes.
Do not treat a replay button on an agency review page as proof that the trafficked creative loops correctly. Review controls belong to the review surface; the ZIP’s own timeline must still stop or repeat according to the delivery contract.
Stress the restrictive formats and locales
Choose one representative format from each layout family, then add the format with the least tolerance. A shallow leaderboard can expose vertical clipping. A narrow mobile unit can expose long CTA labels. A tall unit can reveal image decode or scroll-like motion that looks acceptable in a square preview but feels aggressive in placement.
Intelekt
Use real localized copy, not placeholder strings. Include the locale with the longest headline, widest CTA, densest legal line, or different script. Run both the custom font and its fallback when typography is a dependency. The master language passing in two browsers does not prove the localized package is safe.
Record evidence without overstating it
Give each matrix row a short result:
- Environment and browser version.
- Device class, input type, and pixel density when relevant.
- ZIP filename and checksum.
- Cold or warm cache.
- First paint, playback, final frame, and click result.
- Console or network findings.
- Pass, fail, or not tested.
- Evidence link or capture.
Keep the status vocabulary precise. “Local iframe QA passed” means the extracted package behaved correctly in the recorded local environments. “Upload accepted” means the platform parsed that exact ZIP. “Platform preview passed” means someone watched and clicked it there. “Serving verified” requires the intended creative and destination in the appropriate placement. None of those states automatically proves the next one.
When a row fails, preserve the failing artifact and environment before editing. Fix the smallest supported cause, create a new version, and rerun the affected row plus the baseline. A browser-specific workaround that changes shared layout or timing also needs the restrictive-format and final-frame checks again.
A practical preflight matrix
For a typical multi-size campaign, a compact final matrix might contain:
- Primary browser, extracted ZIP, cold cache, baseline 300 x 250.
- Primary browser, plain iframe, baseline 300 x 250.
- Secondary engine, plain iframe, baseline 300 x 250.
- Mobile touch device, restrictive portrait or mobile size.
- High-density display, image-heavy final frame.
- Longest locale, narrowest compatible format.
- Target platform preview, one format per layout family.
- Target platform preview, final uploaded ZIPs after any repair.
This is not a universal certification list. It is a campaign-specific set of observations that can be rerun when creative, code, platform, or packaging changes.
Test the environments that can change the outcome
Browser QA for HTML5 banners should not become a device inventory exercise. Start with the final delivery contract, test the extracted ZIP, add iframe and secondary-engine coverage, and expand only for risks present in the campaign.
The result is a matrix that protects the creative without slowing every revision: small enough to repeat, specific enough to catch real placement failures, and honest about the difference between local evidence and platform proof.


