{"id":5966,"date":"2026-08-17T16:17:22","date_gmt":"2026-08-17T16:17:22","guid":{"rendered":"https:\/\/adex.com\/blog\/?p=5966"},"modified":"2026-08-17T16:53:04","modified_gmt":"2026-08-17T16:53:04","slug":"ad-stacking-fraud-pixel-stuffing","status":"publish","type":"post","link":"https:\/\/adex.com\/blog\/ad-stacking-fraud-pixel-stuffing\/","title":{"rendered":"Ad Stacking Fraud and Pixel Stuffing: The Impressions Nobody Saw"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">One ad slot on a page can fire four ad calls, load four creatives, and paint three of them directly behind the one on top. All four get counted as served impressions, and the invoice reflects all four. Ad stacking fraud works because nothing in that sequence breaks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pixel stuffing is the same idea compressed. A creative loads inside a frame sized at one pixel by one pixel, renders correctly, fires its impression tracker, and vanishes into a page nobody inspects. From a buying-side view, the first thing reporting shows is nothing unusual: impressions delivered, no discrepancy against the seller&#8217;s count, CTR (click-through rate) soft but not absurd. Both schemes survive on arithmetic rather than stealth, because a served impression report counts completed ad calls and both complete them honestly.<\/p>\n\n\n<div class=\"toc\"><h4 class=\"toc__title\" id=\"contents\">Contents<\/h4><ul class=\"toc__list\"><li class=\"toc__list_item\"><a href=\"#an-impression-counted-is-not-an-impression-seen\">An Impression Counted Is Not an Impression Seen<\/a><\/li><li class=\"toc__list_item\"><a href=\"#how-ad-stacking-works-inside-a-single-slot\">How Ad Stacking Works Inside a Single Slot<\/a><\/li><li class=\"toc__list_item\"><a href=\"#how-pixel-stuffing-hides-a-creative-in-one-pixel\">How Pixel Stuffing Hides a Creative in One Pixel<\/a><\/li><li class=\"toc__list_item\"><a href=\"#why-the-served-impression-report-cannot-tell-the-difference\">Why the Served Impression Report Cannot Tell the Difference<\/a><\/li><li class=\"toc__list_item\"><a href=\"#viewability-is-the-layer-where-both-schemes-surface\">Viewability Is the Layer Where Both Schemes Surface<\/a><\/li><li class=\"toc__list_item\"><a href=\"#stacked-versus-stuffed-in-measurement-data\">Stacked Versus Stuffed in Measurement Data<\/a><\/li><li class=\"toc__list_item\"><a href=\"#stacked-versus-stuffed-what-each-leaves-behind\">Stacked Versus Stuffed: What Each Leaves Behind<\/a><\/li><li class=\"toc__list_item\"><a href=\"#where-the-rules-put-hidden-ads-and-where-the-risk-sits\">Where the Rules Put Hidden Ads, and Where the Risk Sits<\/a><\/li><li class=\"toc__list_item\"><a href=\"#the-signals-worth-pulling-first\">The Signals Worth Pulling First<\/a><\/li><li class=\"toc__list_item\"><a href=\"#where-these-signals-break-down\">Where These Signals Break Down<\/a><\/li><li class=\"toc__list_item\"><a href=\"#faq\">FAQ<\/a><\/li><li class=\"toc__list_item\"><a href=\"#what-to-do-when-the-numbers-look-fine\">What to Do When the Numbers Look Fine<\/a><\/li><\/ul><\/div><style>\n.toc {}\n.toc__title {\n      font-size: 32px;\n    line-height: 40px;\n    font-weight: 700;\n}\n.toc__list_item {\n    color: #FE645A !important;\n}\n.toc__list_item:not(:last-child){\n    margin-bottom: 5px;\n}\n.toc__list_item a {\n    font-size: 18px;\n    line-height: 24px;\n    color: #FE645A;\n    font-weight: 600;\n}\n.toc__list_item a:hover {\n    text-decoration: underline;\n}\n@media (max-width: 1023px) {.toc__title {font-size: 24px;line-height: 32px;}}\n<\/style>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"key-takeaways\">Key Takeaways:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A served impression records a completed ad call. The count is genuine; the value is not.<\/li>\n\n\n\n<li>A clean discrepancy check against the seller&#8217;s numbers proves the counting is consistent.<\/li>\n\n\n\n<li>Viewability separates the two schemes: a stacked slot lets the top creative pass while the layers beneath fail, and a stuffed slot fails on render size alone.<\/li>\n\n\n\n<li>Non-measurable impressions hide both, so viewable rate taken over measured rather than served impressions deletes the evidence.<\/li>\n\n\n\n<li>Hidden ads sit in the sophisticated invalid traffic category, where no single signal settles the question.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"an-impression-counted-is-not-an-impression-seen\">An Impression Counted Is Not an Impression Seen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A served impression fires when the ad call completes, and the creative is delivered to the browser. That event says nothing about geometry: where the creative landed, at what size, whether anything sat on top of it, or how long it stayed on screen. Two more states sit between counted and seen, and buyers routinely collapse all three into one.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>State<\/strong><\/th><th><strong>What Actually Fires<\/strong><\/th><th><strong>What It Proves<\/strong><\/th><th><strong>What It Does Not Prove<\/strong><\/th><\/tr><\/thead><tbody><tr><td>Served impression<\/td><td>Ad call completed, creative reached the browser<\/td><td>Delivery worked<\/td><td>Position, size, or time on screen<\/td><\/tr><tr><td>Measurable impression<\/td><td>Code could read slot size and position<\/td><td>The placement can be assessed<\/td><td>That geometry passed anything<\/td><\/tr><tr><td>Viewable impression<\/td><td>Enough pixels in view long enough to clear the standard<\/td><td>A user had the chance to see it<\/td><td>That anything behind it was visible<\/td><\/tr><tr><td>Non-measurable impression<\/td><td>Ad served, geometry unreadable<\/td><td>Nothing either way<\/td><td>Clean or dirty inventory<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"how-ad-stacking-works-inside-a-single-slot\">How Ad Stacking Works Inside a Single Slot<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The mechanics are ordinary page code. One container holds several ad calls, each in its own frame, all positioned at the same coordinates through absolute positioning and layer order. The frame drawn last, or given the highest layer value, is the one the browser paints on top. Every frame underneath renders in full, fires its own impression tracker, and is never visible to a human being. Variants swap one ingredient, using zero opacity on the lower frames or a parent element that clips everything below the first creative.<\/p>\n\n\n<div class=\"block__bord\"><div class=\"block__bord_desc\"><p>Building it costs almost nothing, and running it costs a little. Four creatives instead of one burns bandwidth and slows the page, which is why stacks in the wild stay shallow. That constraint is also the fingerprint: several impressions sharing one page URL, one viewport size, one session, and a timestamp cluster too tight for a human to have triggered them in sequence.<\/p>\n<\/div><\/div>\n<style>\n.block__bord { margin: 32px 0; padding: 1.25em 2.375em;\tborder-radius: 24px; background: rgba(0, 220, 200, 0.20); }\n.block__bord_desc {font-size: 16px !important;font-weight: 400 !important;color: #606060 !important;}\n<\/style>\n\n\n<div class=\"block__preview\">\n        <a href=\"https:\/\/adex.com\/blog\/adex-ads-txt-app-ads-txt-spoofing\/\" class=\"block__preview_img\"><img src=\"https:\/\/adex.com\/blog\/wp-content\/uploads\/2026\/06\/ads.txt.app_.ads_.txt.png\" srcset=\"https:\/\/adex.com\/blog\/wp-content\/uploads\/2026\/06\/ads.txt.app_.ads_.txt.png\" sizes=\"100vw\" alt=\"\" decoding=\"async\" class=\"lazy\"><\/a>\n    <div class=\"block__preview_box\">\n        <a href=\"https:\/\/adex.com\/blog\/category\/current_risks\/\" class=\"block__preview_box-cat\">Current risks<\/a>        <h3 class=\"block__preview_box-title\" id=\"ads-txt-and-app-ads-txt-spoofinghow-fraudsters-fake-the-right-to-sell-inventory\"><a href=\"https:\/\/adex.com\/blog\/adex-ads-txt-app-ads-txt-spoofing\/\">ads.txt and app-ads.txt Spoofing:How Fraudsters Fake the Right to Sell Inventory<\/a><\/h3>\n    <\/div>\n<\/div>\n<style>\n.block__preview {display: flex;align-items: center;justify-content: center; margin: 32px 0;}\n.block__preview a {text-decoration: none;}\n.block__preview_img {min-width: 360px;max-width: 360px;min-height: 188px;width: 100%;height: 100%;}\n.block__preview_img img {width: 100%;height: 100%;}\n.block__preview_box {margin-left: 40px;max-width: 360px;}\n.block__preview_box-cat {color: #00B8A7 !important;font-weight: 600;font-size: 12px;line-height: 16px;text-transform: uppercase; display: block; margin-bottom: 4px;}\n.block__preview_box-cat:hover {color: #FE645A !important; text-decoration: none !important;}\n.block__preview_box-title {font-size: 20px;font-weight: 700;line-height: 24px;color: #0B172D;}\n.block__preview_box-title a {color: #0B172D !important;}\n.block__preview_box-title a:hover {color: #FE645A !important;}\n@media screen and (max-width: 768px) {.block__preview {flex-direction: column;}.block__preview_box {max-width: 100%; margin-top: 32px;margin-left: 0px;}.block__preview_img {max-width: 100%;min-width: 100%;min-height: 100%;}}<\/style>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"how-pixel-stuffing-hides-a-creative-in-one-pixel\">How Pixel Stuffing Hides a Creative in One Pixel<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Stuffing does not bother with layers. The creative goes into a frame one pixel by one pixel, or a full-size frame shrunk by a scale transform, or a frame positioned at negative coordinates so it sits outside the visible page. The ad genuinely renders and the tracker genuinely fires. These are invisible ad impressions in the literal sense: the pixels exist, the user&#8217;s eye never had access to them.<\/p>\n\n\n<div class=\"block__bord\"><div class=\"block__bord_desc\"><p>What stuffing leaves behind is easy to overlook: the reported render dimensions do not match the size that was bought. One honest complication sits next to that. Genuine one-pixel elements are everywhere in ad tech, because measurement and conversion pixels are supposed to be invisible, so any impression fraud detection rule built on dimensions has to know whether it is reading a creative slot or a tracking call.<\/p>\n<\/div><\/div>\n<style>\n.block__bord { margin: 32px 0; padding: 1.25em 2.375em;\tborder-radius: 24px; background: rgba(0, 220, 200, 0.20); }\n.block__bord_desc {font-size: 16px !important;font-weight: 400 !important;color: #606060 !important;}\n<\/style>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"why-the-served-impression-report-cannot-tell-the-difference\">Why the Served Impression Report Cannot Tell the Difference<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Most buyers reconcile impressions by comparing their own ad server count against the seller&#8217;s count and investigating the gap. That check is worth running, and it cannot see either scheme. Both numbers derive from the same event, the completed ad call, observed from two ends of the same pipe.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is the part worth sitting with: a clean discrepancy report is not evidence of clean inventory, only evidence that two systems counted the same event the same way. In a stacked slot, both are correct that four impressions were served, and both are silent on the fact that three were painted behind a fourth. Click data does not rescue the report either, since the missing clicks from buried layers and stuffed slots dissolve into a blended CTR the top creative is still holding up.<\/p>\n\n\n<div class=\"block__preview\">\n        <a href=\"https:\/\/adex.com\/blog\/ad-discrepancy-when-your-stats-dont-match-up\/\" class=\"block__preview_img\"><img src=\"https:\/\/adex.com\/blog\/wp-content\/uploads\/2022\/06\/ADEX_Ad_Discrepancy.jpg\" srcset=\"https:\/\/adex.com\/blog\/wp-content\/uploads\/2022\/06\/ADEX_Ad_Discrepancy.jpg\" sizes=\"100vw\" alt=\"ADEX_Ad_Discrepancy\" decoding=\"async\" class=\"lazy\"><\/a>\n    <div class=\"block__preview_box\">\n        <a href=\"https:\/\/adex.com\/blog\/category\/guides\/\" class=\"block__preview_box-cat\">Guides<\/a>        <h3 class=\"block__preview_box-title\" id=\"ad-discrepancy-when-your-stats-dont-match-up\"><a href=\"https:\/\/adex.com\/blog\/ad-discrepancy-when-your-stats-dont-match-up\/\">Ad Discrepancy: When Your Stats Don\u2019t Match Up<\/a><\/h3>\n    <\/div>\n<\/div>\n<style>\n.block__preview {display: flex;align-items: center;justify-content: center; margin: 32px 0;}\n.block__preview a {text-decoration: none;}\n.block__preview_img {min-width: 360px;max-width: 360px;min-height: 188px;width: 100%;height: 100%;}\n.block__preview_img img {width: 100%;height: 100%;}\n.block__preview_box {margin-left: 40px;max-width: 360px;}\n.block__preview_box-cat {color: #00B8A7 !important;font-weight: 600;font-size: 12px;line-height: 16px;text-transform: uppercase; display: block; margin-bottom: 4px;}\n.block__preview_box-cat:hover {color: #FE645A !important; text-decoration: none !important;}\n.block__preview_box-title {font-size: 20px;font-weight: 700;line-height: 24px;color: #0B172D;}\n.block__preview_box-title a {color: #0B172D !important;}\n.block__preview_box-title a:hover {color: #FE645A !important;}\n@media screen and (max-width: 768px) {.block__preview {flex-direction: column;}.block__preview_box {max-width: 100%; margin-top: 32px;margin-left: 0px;}.block__preview_img {max-width: 100%;min-width: 100%;min-height: 100%;}}<\/style>\n\n\n\n<p class=\"wp-block-paragraph\">Here is what the two cases look like in cross section, with the ad server&#8217;s record set against what a person at the screen could have seen.<\/p>\n\n\n\n<style>\n  #adx-slot-fraud-v1,\n  #adx-slot-fraud-v1 * {\n    box-sizing: border-box;\n  }\n\n  #adx-slot-fraud-v1 {\n    --adx-text: #16181d;\n    --adx-muted: #5b6472;\n    --adx-panel: #f4f6fa;\n    --adx-border: #d8dee9;\n    --adx-line: #8a93a5;\n    --adx-white: #ffffff;\n    --adx-seen: #2fa37c;\n    --adx-hidden: #d9534f;\n    width: 100%;\n    max-width: 1000px;\n    margin: 32px auto;\n    color: var(--adx-text);\n    font-family: Lato, Helvetica, Arial, sans-serif;\n  }\n\n  #adx-slot-fraud-v1 .adx-visual__header {\n    margin: 0 0 18px;\n  }\n\n  #adx-slot-fraud-v1 .adx-visual__title {\n    margin: 0 0 7px;\n    color: var(--adx-text);\n    font-size: 24px;\n    font-weight: 700;\n    line-height: 1.25;\n  }\n\n  #adx-slot-fraud-v1 .adx-visual__intro {\n    margin: 0;\n    color: var(--adx-muted);\n    font-size: 13px;\n    line-height: 1.5;\n  }\n\n  #adx-slot-fraud-v1 .adx-cases {\n    display: grid;\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n    gap: 18px;\n  }\n\n  #adx-slot-fraud-v1 .adx-case {\n    min-width: 0;\n    padding: 22px;\n    border: 1px solid var(--adx-border);\n    border-radius: 10px;\n    background: var(--adx-panel);\n  }\n\n  #adx-slot-fraud-v1 .adx-case__header {\n    margin: 0 0 18px;\n  }\n\n  #adx-slot-fraud-v1 .adx-case__title {\n    display: block;\n    margin: 0 0 5px;\n    color: var(--adx-text);\n    font-size: 16px;\n    font-weight: 700;\n    line-height: 1.35;\n  }\n\n  #adx-slot-fraud-v1 .adx-case__subtitle {\n    margin: 0;\n    color: var(--adx-muted);\n    font-size: 12px;\n    line-height: 1.45;\n  }\n\n  #adx-slot-fraud-v1 .adx-stack-diagram {\n    display: grid;\n    grid-template-columns: minmax(190px, 1.15fr) minmax(130px, 0.85fr);\n    gap: 18px;\n    min-height: 204px;\n    align-items: center;\n    padding: 8px 2px 18px;\n  }\n\n  #adx-slot-fraud-v1 .adx-stack {\n    position: relative;\n    width: 196px;\n    height: 158px;\n    margin: 0 auto;\n  }\n\n  #adx-slot-fraud-v1 .adx-creative {\n    position: absolute;\n    width: 154px;\n    height: 108px;\n    border: 2px solid var(--adx-hidden);\n    border-radius: 8px;\n    background: var(--adx-white);\n  }\n\n  #adx-slot-fraud-v1 .adx-creative--4 {\n    top: 42px;\n    left: 42px;\n    z-index: 1;\n  }\n\n  #adx-slot-fraud-v1 .adx-creative--3 {\n    top: 28px;\n    left: 28px;\n    z-index: 2;\n  }\n\n  #adx-slot-fraud-v1 .adx-creative--2 {\n    top: 14px;\n    left: 14px;\n    z-index: 3;\n  }\n\n  #adx-slot-fraud-v1 .adx-creative--1 {\n    top: 0;\n    left: 0;\n    z-index: 4;\n    padding: 16px;\n    border-color: var(--adx-seen);\n  }\n\n  #adx-slot-fraud-v1 .adx-creative__name {\n    display: block;\n    margin-bottom: 7px;\n    color: var(--adx-text);\n    font-size: 14px;\n    font-weight: 700;\n    line-height: 1.3;\n  }\n\n  #adx-slot-fraud-v1 .adx-creative__state {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n    color: var(--adx-seen);\n    font-size: 12px;\n    font-weight: 700;\n    line-height: 1.3;\n  }\n\n  #adx-slot-fraud-v1 .adx-creative__state::before {\n    width: 8px;\n    height: 8px;\n    border-radius: 50%;\n    background: var(--adx-seen);\n    content: \"\";\n  }\n\n  #adx-slot-fraud-v1 .adx-layer-number {\n    position: absolute;\n    right: 5px;\n    bottom: 4px;\n    display: grid;\n    width: 20px;\n    height: 20px;\n    place-items: center;\n    border-radius: 50%;\n    background: var(--adx-hidden);\n    color: var(--adx-white);\n    font-size: 11px;\n    font-weight: 700;\n    line-height: 1;\n  }\n\n  #adx-slot-fraud-v1 .adx-layer-list {\n    display: grid;\n    gap: 10px;\n    margin: 0;\n    padding: 0;\n    list-style: none;\n  }\n\n  #adx-slot-fraud-v1 .adx-layer-list li {\n    display: grid;\n    grid-template-columns: 10px minmax(0, 1fr);\n    gap: 9px;\n    align-items: center;\n    color: var(--adx-text);\n    font-size: 12px;\n    line-height: 1.35;\n  }\n\n  #adx-slot-fraud-v1 .adx-layer-dot {\n    width: 9px;\n    height: 9px;\n    border-radius: 50%;\n    background: var(--adx-hidden);\n  }\n\n  #adx-slot-fraud-v1 .adx-layer-list li:first-child .adx-layer-dot {\n    background: var(--adx-seen);\n  }\n\n  #adx-slot-fraud-v1 .adx-layer-list strong {\n    font-weight: 700;\n  }\n\n  #adx-slot-fraud-v1 .adx-layer-list li:first-child strong {\n    color: var(--adx-seen);\n  }\n\n  #adx-slot-fraud-v1 .adx-layer-list li:not(:first-child) strong {\n    color: var(--adx-hidden);\n  }\n\n  #adx-slot-fraud-v1 .adx-stuffing-diagram {\n    display: grid;\n    grid-template-columns: minmax(150px, 1fr) 38px minmax(150px, 0.92fr);\n    gap: 8px;\n    min-height: 204px;\n    align-items: center;\n    padding: 0 0 18px;\n  }\n\n  #adx-slot-fraud-v1 .adx-page-mock {\n    position: relative;\n    width: 100%;\n    min-height: 184px;\n    padding: 18px 16px 31px;\n    border: 1px solid var(--adx-border);\n    border-radius: 9px;\n    background: var(--adx-white);\n  }\n\n  #adx-slot-fraud-v1 .adx-page-line {\n    height: 7px;\n    margin-bottom: 10px;\n    border-radius: 999px;\n    background: var(--adx-border);\n  }\n\n  #adx-slot-fraud-v1 .adx-page-line--short {\n    width: 70%;\n  }\n\n  #adx-slot-fraud-v1 .adx-page-line--medium {\n    width: 86%;\n  }\n\n  #adx-slot-fraud-v1 .adx-page-space {\n    height: 17px;\n  }\n\n  #adx-slot-fraud-v1 .adx-pixel-target {\n    position: absolute;\n    top: 72px;\n    left: 54%;\n    width: 1px;\n    height: 1px;\n    background: var(--adx-hidden);\n  }\n\n  #adx-slot-fraud-v1 .adx-pixel-target::before {\n    position: absolute;\n    top: 50%;\n    left: 50%;\n    width: 32px;\n    height: 32px;\n    border: 1px dashed var(--adx-hidden);\n    border-radius: 50%;\n    transform: translate(-50%, -50%);\n    content: \"\";\n  }\n\n  #adx-slot-fraud-v1 .adx-pixel-target::after {\n    position: absolute;\n    top: 50%;\n    left: 50%;\n    width: 7px;\n    height: 7px;\n    border-radius: 1px;\n    background: var(--adx-hidden);\n    transform: translate(-50%, -50%);\n    content: \"\";\n  }\n\n  #adx-slot-fraud-v1 .adx-page-label {\n    position: absolute;\n    right: 16px;\n    bottom: 12px;\n    left: 16px;\n    color: var(--adx-muted);\n    font-size: 11px;\n    line-height: 1.35;\n  }\n\n  #adx-slot-fraud-v1 .adx-callout-arrow {\n    position: relative;\n    height: 2px;\n    background: var(--adx-line);\n  }\n\n  #adx-slot-fraud-v1 .adx-callout-arrow::after {\n    position: absolute;\n    top: 50%;\n    right: -1px;\n    width: 0;\n    height: 0;\n    border-top: 5px solid transparent;\n    border-bottom: 5px solid transparent;\n    border-left: 7px solid var(--adx-line);\n    transform: translateY(-50%);\n    content: \"\";\n  }\n\n  #adx-slot-fraud-v1 .adx-zoom {\n    min-height: 160px;\n    padding: 14px;\n    border: 1px solid var(--adx-hidden);\n    border-radius: 9px;\n    background: var(--adx-white);\n  }\n\n  #adx-slot-fraud-v1 .adx-zoom__title {\n    display: block;\n    margin: 0 0 12px;\n    color: var(--adx-text);\n    font-size: 12px;\n    font-weight: 700;\n    line-height: 1.35;\n  }\n\n  #adx-slot-fraud-v1 .adx-source-creative {\n    position: relative;\n    display: grid;\n    width: 100%;\n    max-width: 132px;\n    aspect-ratio: 300 \/ 250;\n    margin: 0 auto 10px;\n    place-items: center;\n    border: 1px solid var(--adx-border);\n    border-radius: 5px;\n    background:\n      linear-gradient(var(--adx-border), var(--adx-border)) 12px 15px \/ 60% 6px no-repeat,\n      linear-gradient(var(--adx-border), var(--adx-border)) 12px 27px \/ 42% 6px no-repeat,\n      var(--adx-panel);\n  }\n\n  #adx-slot-fraud-v1 .adx-nested-pixel {\n    position: absolute;\n    right: 15px;\n    bottom: 14px;\n    width: 8px;\n    height: 8px;\n    border: 1px solid var(--adx-hidden);\n    background: var(--adx-hidden);\n  }\n\n  #adx-slot-fraud-v1 .adx-zoom__copy {\n    margin: 0;\n    color: var(--adx-muted);\n    font-size: 11px;\n    line-height: 1.4;\n    text-align: center;\n  }\n\n  #adx-slot-fraud-v1 .adx-facts {\n    overflow: hidden;\n    border: 1px solid var(--adx-border);\n    border-radius: 9px;\n    background: var(--adx-white);\n  }\n\n  #adx-slot-fraud-v1 .adx-fact {\n    display: grid;\n    grid-template-columns: minmax(0, 1fr) auto;\n    gap: 14px;\n    align-items: center;\n    min-height: 39px;\n    padding: 9px 14px;\n    border-bottom: 1px solid var(--adx-border);\n    color: var(--adx-text);\n    font-size: 13px;\n    line-height: 1.35;\n  }\n\n  #adx-slot-fraud-v1 .adx-fact:last-child {\n    border-bottom: 0;\n  }\n\n  #adx-slot-fraud-v1 .adx-fact__value {\n    font-weight: 700;\n    text-align: right;\n  }\n\n  #adx-slot-fraud-v1 .adx-fact--seen .adx-fact__value {\n    color: var(--adx-seen);\n  }\n\n  #adx-slot-fraud-v1 .adx-fact--hidden .adx-fact__value {\n    color: var(--adx-hidden);\n  }\n\n  #adx-slot-fraud-v1 .adx-bottom-band {\n    margin-top: 18px;\n    padding: 17px 20px;\n    border: 1px solid var(--adx-border);\n    border-radius: 10px;\n    background: var(--adx-panel);\n  }\n\n  #adx-slot-fraud-v1 .adx-bottom-band__lead {\n    margin: 0 0 10px;\n    color: var(--adx-text);\n    font-size: 15px;\n    font-weight: 700;\n    line-height: 1.4;\n  }\n\n  #adx-slot-fraud-v1 .adx-bottom-band__row {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 8px 18px;\n    align-items: center;\n    color: var(--adx-muted);\n    font-size: 13px;\n    line-height: 1.45;\n  }\n\n  #adx-slot-fraud-v1 .adx-measure {\n    display: inline-flex;\n    align-items: center;\n    gap: 7px;\n    color: var(--adx-text);\n    font-weight: 700;\n  }\n\n  #adx-slot-fraud-v1 .adx-measure::before {\n    width: 6px;\n    height: 6px;\n    border-radius: 50%;\n    background: var(--adx-line);\n    content: \"\";\n  }\n\n  #adx-slot-fraud-v1 .adx-visual__caption {\n    margin-top: 10px;\n    color: var(--adx-muted);\n    font-size: 12px;\n    line-height: 1.5;\n  }\n\n  @media (max-width: 820px) {\n    #adx-slot-fraud-v1 .adx-cases {\n      grid-template-columns: 1fr;\n    }\n  }\n\n  @media (max-width: 520px) {\n    #adx-slot-fraud-v1 {\n      margin: 24px auto;\n    }\n\n    #adx-slot-fraud-v1 .adx-visual__title {\n      font-size: 21px;\n    }\n\n    #adx-slot-fraud-v1 .adx-case {\n      padding: 18px 15px;\n    }\n\n    #adx-slot-fraud-v1 .adx-stack-diagram {\n      grid-template-columns: 1fr;\n      gap: 14px;\n    }\n\n    #adx-slot-fraud-v1 .adx-layer-list {\n      grid-template-columns: repeat(2, minmax(0, 1fr));\n    }\n\n    #adx-slot-fraud-v1 .adx-stuffing-diagram {\n      grid-template-columns: 1fr;\n      gap: 14px;\n    }\n\n    #adx-slot-fraud-v1 .adx-callout-arrow {\n      width: 2px;\n      height: 28px;\n      margin: 0 auto;\n    }\n\n    #adx-slot-fraud-v1 .adx-callout-arrow::after {\n      top: auto;\n      right: auto;\n      bottom: -1px;\n      left: 50%;\n      border-top: 7px solid var(--adx-line);\n      border-right: 5px solid transparent;\n      border-bottom: 0;\n      border-left: 5px solid transparent;\n      transform: translateX(-50%);\n    }\n\n    #adx-slot-fraud-v1 .adx-zoom {\n      min-height: 0;\n    }\n\n    #adx-slot-fraud-v1 .adx-fact {\n      grid-template-columns: minmax(0, 1fr);\n      gap: 3px;\n    }\n\n    #adx-slot-fraud-v1 .adx-fact__value {\n      text-align: left;\n    }\n  }\n<\/style>\n\n<figure\n  id=\"adx-slot-fraud-v1\"\n  class=\"adx-visual\"\n  aria-labelledby=\"adx-slot-fraud-title\"\n  aria-describedby=\"adx-slot-fraud-intro adx-slot-fraud-caption\"\n>\n  <header class=\"adx-visual__header\">\n    <div id=\"adx-slot-fraud-title\" class=\"adx-visual__title\">\n      One Slot, Two Ways to Bill for Nothing\n    <\/div>\n\n    <p id=\"adx-slot-fraud-intro\" class=\"adx-visual__intro\">\n      Schematic comparison. Layer offsets and the one-pixel marker are enlarged for readability.\n    <\/p>\n  <\/header>\n\n  <div class=\"adx-cases\">\n    <section class=\"adx-case\" aria-labelledby=\"adx-stacking-title\">\n      <header class=\"adx-case__header\">\n        <span id=\"adx-stacking-title\" class=\"adx-case__title\">\n          Case A: Ad Stacking\n        <\/span>\n        <p class=\"adx-case__subtitle\">\n          One slot, four ad calls, four creatives\n        <\/p>\n      <\/header>\n\n      <div class=\"adx-stack-diagram\">\n        <div\n          class=\"adx-stack\"\n          role=\"img\"\n          aria-label=\"Four offset creative frames. Creative 1 is visible on top. Creatives 2, 3, and 4 are hidden underneath.\"\n        >\n          <div class=\"adx-creative adx-creative--4\" aria-hidden=\"true\">\n            <span class=\"adx-layer-number\">4<\/span>\n          <\/div>\n\n          <div class=\"adx-creative adx-creative--3\" aria-hidden=\"true\">\n            <span class=\"adx-layer-number\">3<\/span>\n          <\/div>\n\n          <div class=\"adx-creative adx-creative--2\" aria-hidden=\"true\">\n            <span class=\"adx-layer-number\">2<\/span>\n          <\/div>\n\n          <div class=\"adx-creative adx-creative--1\" aria-hidden=\"true\">\n            <span class=\"adx-creative__name\">Creative 1<\/span>\n            <span class=\"adx-creative__state\">Seen and in view<\/span>\n          <\/div>\n        <\/div>\n\n        <ul class=\"adx-layer-list\" aria-label=\"Creative visibility\">\n          <li>\n            <span class=\"adx-layer-dot\" aria-hidden=\"true\"><\/span>\n            <span>Creative 1: <strong>seen<\/strong><\/span>\n          <\/li>\n\n          <li>\n            <span class=\"adx-layer-dot\" aria-hidden=\"true\"><\/span>\n            <span>Creative 2: <strong>hidden<\/strong><\/span>\n          <\/li>\n\n          <li>\n            <span class=\"adx-layer-dot\" aria-hidden=\"true\"><\/span>\n            <span>Creative 3: <strong>hidden<\/strong><\/span>\n          <\/li>\n\n          <li>\n            <span class=\"adx-layer-dot\" aria-hidden=\"true\"><\/span>\n            <span>Creative 4: <strong>hidden<\/strong><\/span>\n          <\/li>\n        <\/ul>\n      <\/div>\n\n      <div class=\"adx-facts\" aria-label=\"Ad stacking measurement\">\n        <div class=\"adx-fact\">\n          <span>Served impressions<\/span>\n          <span class=\"adx-fact__value\">4<\/span>\n        <\/div>\n\n        <div class=\"adx-fact adx-fact--seen\">\n          <span>Creative visible to the user<\/span>\n          <span class=\"adx-fact__value\">1<\/span>\n        <\/div>\n\n        <div class=\"adx-fact\">\n          <span>Measurable by the tag on top<\/span>\n          <span class=\"adx-fact__value\">1<\/span>\n        <\/div>\n\n        <div class=\"adx-fact adx-fact--hidden\">\n          <span>Billed but never shown<\/span>\n          <span class=\"adx-fact__value\">3<\/span>\n        <\/div>\n      <\/div>\n    <\/section>\n\n    <section class=\"adx-case\" aria-labelledby=\"adx-stuffing-title\">\n      <header class=\"adx-case__header\">\n        <span id=\"adx-stuffing-title\" class=\"adx-case__title\">\n          Case B: Pixel Stuffing\n        <\/span>\n        <p class=\"adx-case__subtitle\">\n          One ad call, one creative rendered at 1 \u00d7 1\n        <\/p>\n      <\/header>\n\n      <div class=\"adx-stuffing-diagram\">\n        <div\n          class=\"adx-page-mock\"\n          role=\"img\"\n          aria-label=\"Page as the user sees it, with an enlarged marker showing the location of an otherwise invisible one-pixel ad slot.\"\n        >\n          <div class=\"adx-page-line\"><\/div>\n          <div class=\"adx-page-line adx-page-line--short\"><\/div>\n          <div class=\"adx-page-line adx-page-line--medium\"><\/div>\n          <div class=\"adx-page-space\"><\/div>\n          <div class=\"adx-page-line\"><\/div>\n          <div class=\"adx-page-line adx-page-line--short\"><\/div>\n          <div class=\"adx-page-line adx-page-line--medium\"><\/div>\n\n          <span class=\"adx-pixel-target\" aria-hidden=\"true\"><\/span>\n          <span class=\"adx-page-label\">Page as the user sees it<\/span>\n        <\/div>\n\n        <span class=\"adx-callout-arrow\" aria-hidden=\"true\"><\/span>\n\n        <div class=\"adx-zoom\">\n          <span class=\"adx-zoom__title\">Zoom on the slot<\/span>\n\n          <div\n            class=\"adx-source-creative\"\n            role=\"img\"\n            aria-label=\"A 300 by 250 source creative reduced to a one by one nested frame.\"\n          >\n            <span class=\"adx-nested-pixel\" aria-hidden=\"true\"><\/span>\n          <\/div>\n\n          <p class=\"adx-zoom__copy\">\n            300 \u00d7 250 creative squeezed into a 1 \u00d7 1 nested frame\n          <\/p>\n        <\/div>\n      <\/div>\n\n      <div class=\"adx-facts\" aria-label=\"Pixel stuffing measurement\">\n        <div class=\"adx-fact\">\n          <span>Served impressions<\/span>\n          <span class=\"adx-fact__value\">1<\/span>\n        <\/div>\n\n        <div class=\"adx-fact adx-fact--hidden\">\n          <span>Visible to the user<\/span>\n          <span class=\"adx-fact__value\">Nothing<\/span>\n        <\/div>\n\n        <div class=\"adx-fact adx-fact--hidden\">\n          <span>Pixels in view<\/span>\n          <span class=\"adx-fact__value\">0<\/span>\n        <\/div>\n\n        <div class=\"adx-fact adx-fact--hidden\">\n          <span>Render-size threshold<\/span>\n          <span class=\"adx-fact__value\">Failed<\/span>\n        <\/div>\n      <\/div>\n    <\/section>\n  <\/div>\n\n  <div class=\"adx-bottom-band\">\n    <p class=\"adx-bottom-band__lead\">\n      Both cases keep the served count clean.\n    <\/p>\n\n    <div class=\"adx-bottom-band__row\">\n      <span>The gap opens at the measurement layer through<\/span>\n      <span class=\"adx-measure\">render size<\/span>\n      <span class=\"adx-measure\">overlap<\/span>\n      <span class=\"adx-measure\">time in view<\/span>\n    <\/div>\n  <\/div>\n\n  <figcaption id=\"adx-slot-fraud-caption\" class=\"adx-visual__caption\">\n    A stacked slot bills for creatives hidden behind the top layer; a stuffed slot bills for a creative rendered at one pixel. Both can produce a clean served-impression count.\n  <\/figcaption>\n<\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"viewability-is-the-layer-where-both-schemes-surface\">Viewability Is the Layer Where Both Schemes Surface<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Viewability measurement asks a different question: not whether the ad was delivered, but whether enough of it stayed on screen long enough to be seen. The <a href=\"https:\/\/www.iab.com\/wp-content\/uploads\/2015\/06\/MRC-Viewable-Ad-Impression-Measurement-Guideline.pdf\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">MRC Viewable Ad Impression Measurement Guidelines<\/a> set the display threshold at a minimum of 50% of the ad&#8217;s pixels in view for at least one continuous second. For video the requirement is 50% of pixels for at least two continuous seconds, and for large ads above 242,500 pixels the threshold drops to 30% of pixels for one second.<\/p>\n\n\n<div class=\"block__bord\"><div class=\"block__bord_desc\"><p>Those thresholds are geometric, which is why they catch both schemes. A creative covered by three others and a creative rendered at one pixel fail on the same arithmetic: not enough pixels, not long enough. Viewability fraud is less a separate attack than the monetization of that gap.<\/p>\n<\/div><\/div>\n<style>\n.block__bord { margin: 32px 0; padding: 1.25em 2.375em;\tborder-radius: 24px; background: rgba(0, 220, 200, 0.20); }\n.block__bord_desc {font-size: 16px !important;font-weight: 400 !important;color: #606060 !important;}\n<\/style>\n\n\n\n<p class=\"wp-block-paragraph\">If your reporting stops at delivered impressions and cost per mille, no column exists where either scheme can appear.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"stacked-versus-stuffed-in-measurement-data\">Stacked Versus Stuffed in Measurement Data<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The two schemes leave different fingerprints. A stacked slot shows acceptable viewable rates on the top creative and in-view durations for the buried layers that are zero or absent, while a stuffed placement shows a collapse in measured impressions with render dimensions that contradict the size bought.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now the part that catches experienced teams. With only one measurement vendor in the chain, that vendor&#8217;s code measures the layer it is attached to and nothing else. If the tag rides on the top creative of a stacked slot, the report comes back clean for that creative and silent about the three underneath. Silence reads like a pass, and it is not one.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The same trap has an arithmetic version. Viewable rate is often calculated over measured impressions, and stuffing pushes impressions into the non-measurable bucket, so that denominator removes exactly the impressions carrying the evidence. Viewable rate can improve while inventory gets worse. Keep the denominator at served impressions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The matrix below sets both schemes against the axes a buyer can check.<\/p>\n\n\n\n<figure id=\"adx-stacked-stuffed-v1\" aria-labelledby=\"adx-stacked-stuffed-title\" aria-describedby=\"adx-stacked-stuffed-note adx-stacked-stuffed-caption\">\n  <style>\n    #adx-stacked-stuffed-v1 {\n      --adx-text: #16181d;\n      --adx-muted: #5b6472;\n      --adx-panel: #f4f6fa;\n      --adx-border: #d8dee9;\n      --adx-white: #ffffff;\n      --adx-blue: #2f6bff;\n      --adx-amber: #e8a33d;\n      --adx-red: #d9534f;\n      width: 100%;\n      max-width: 1000px;\n      margin: 32px auto;\n      color: var(--adx-text);\n      font-family: Lato, Helvetica, Arial, sans-serif;\n      box-sizing: border-box;\n    }\n\n    #adx-stacked-stuffed-v1 *,\n    #adx-stacked-stuffed-v1 *::before,\n    #adx-stacked-stuffed-v1 *::after {\n      box-sizing: border-box;\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__header {\n      margin: 0 0 18px;\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__title {\n      margin: 0;\n      color: var(--adx-text);\n      font-size: clamp(22px, 3vw, 28px);\n      font-weight: 700;\n      line-height: 1.25;\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__intro {\n      margin: 7px 0 0;\n      color: var(--adx-muted);\n      font-size: 13px;\n      line-height: 1.5;\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__legend {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 10px 22px;\n      margin: 0 0 14px;\n      padding: 12px 16px;\n      border: 1px solid var(--adx-border);\n      border-radius: 10px;\n      background: var(--adx-panel);\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__legend-item {\n      display: inline-flex;\n      align-items: center;\n      gap: 8px;\n      color: var(--adx-muted);\n      font-size: 12px;\n      line-height: 1.4;\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__swatch {\n      flex: 0 0 auto;\n      width: 14px;\n      height: 14px;\n      border-radius: 3px;\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__swatch--blue {\n      background: var(--adx-blue);\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__swatch--amber {\n      background: var(--adx-amber);\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__swatch--red {\n      background: var(--adx-red);\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__desktop {\n      display: block;\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__table {\n      width: 100%;\n      border-collapse: separate;\n      border-spacing: 0 10px;\n      table-layout: fixed;\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__table caption {\n      position: absolute;\n      width: 1px;\n      height: 1px;\n      padding: 0;\n      margin: -1px;\n      overflow: hidden;\n      clip: rect(0, 0, 0, 0);\n      white-space: nowrap;\n      border: 0;\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__table col:first-child {\n      width: 23%;\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__table col:nth-child(2),\n    #adx-stacked-stuffed-v1 .adx-matrix__table col:nth-child(3) {\n      width: 38.5%;\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__table thead th {\n      padding: 14px 18px;\n      border-top: 1px solid var(--adx-border);\n      border-bottom: 1px solid var(--adx-border);\n      background: var(--adx-panel);\n      color: var(--adx-text);\n      font-size: 15px;\n      font-weight: 700;\n      line-height: 1.35;\n      text-align: left;\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__table thead th:first-child {\n      border-left: 1px solid var(--adx-border);\n      border-radius: 10px 0 0 10px;\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__table thead th:last-child {\n      border-right: 1px solid var(--adx-border);\n      border-radius: 0 10px 10px 0;\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__table tbody th,\n    #adx-stacked-stuffed-v1 .adx-matrix__table tbody td {\n      padding: 18px;\n      border-top: 1px solid var(--adx-border);\n      border-bottom: 1px solid var(--adx-border);\n      background: var(--adx-white);\n      vertical-align: middle;\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__table tbody th {\n      position: relative;\n      border-left: 1px solid var(--adx-border);\n      border-radius: 10px 0 0 10px;\n      background: var(--adx-panel);\n      color: var(--adx-text);\n      font-size: 14px;\n      font-weight: 700;\n      line-height: 1.4;\n      text-align: left;\n      box-shadow: inset 6px 0 0 var(--row-color);\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__table tbody td {\n      color: var(--adx-text);\n      font-size: 13px;\n      font-weight: 400;\n      line-height: 1.55;\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__table tbody td + td {\n      border-left: 1px solid var(--adx-border);\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__table tbody td:last-child {\n      border-right: 1px solid var(--adx-border);\n      border-radius: 0 10px 10px 0;\n    }\n\n    #adx-stacked-stuffed-v1 .adx-row--amber {\n      --row-color: var(--adx-amber);\n    }\n\n    #adx-stacked-stuffed-v1 .adx-row--red {\n      --row-color: var(--adx-red);\n    }\n\n    #adx-stacked-stuffed-v1 .adx-row--blue {\n      --row-color: var(--adx-blue);\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__mobile {\n      display: none;\n    }\n\n    #adx-stacked-stuffed-v1 .adx-comparison {\n      overflow: hidden;\n      border: 1px solid var(--adx-border);\n      border-left: 6px solid var(--row-color);\n      border-radius: 10px;\n      background: var(--adx-white);\n    }\n\n    #adx-stacked-stuffed-v1 .adx-comparison__heading {\n      margin: 0;\n      padding: 13px 15px;\n      border-bottom: 1px solid var(--adx-border);\n      background: var(--adx-panel);\n      color: var(--adx-text);\n      font-size: 15px;\n      font-weight: 700;\n      line-height: 1.4;\n    }\n\n    #adx-stacked-stuffed-v1 .adx-comparison__content {\n      display: grid;\n      grid-template-columns: 1fr 1fr;\n    }\n\n    #adx-stacked-stuffed-v1 .adx-comparison__item {\n      min-width: 0;\n      padding: 14px 15px 16px;\n    }\n\n    #adx-stacked-stuffed-v1 .adx-comparison__item + .adx-comparison__item {\n      border-left: 1px solid var(--adx-border);\n    }\n\n    #adx-stacked-stuffed-v1 .adx-comparison__label {\n      display: block;\n      margin: 0 0 6px;\n      color: var(--adx-muted);\n      font-size: 12px;\n      font-weight: 700;\n      line-height: 1.35;\n      text-transform: uppercase;\n      letter-spacing: 0.04em;\n    }\n\n    #adx-stacked-stuffed-v1 .adx-comparison__text {\n      margin: 0;\n      color: var(--adx-text);\n      font-size: 13px;\n      line-height: 1.55;\n    }\n\n    #adx-stacked-stuffed-v1 .adx-matrix__caption {\n      margin: 14px 0 0;\n      color: var(--adx-muted);\n      font-size: 12px;\n      line-height: 1.5;\n    }\n\n    @media (max-width: 760px) {\n      #adx-stacked-stuffed-v1 {\n        margin: 26px auto;\n      }\n\n      #adx-stacked-stuffed-v1 .adx-matrix__desktop {\n        display: none;\n      }\n\n      #adx-stacked-stuffed-v1 .adx-matrix__mobile {\n        display: grid;\n        gap: 12px;\n      }\n    }\n\n    @media (max-width: 520px) {\n      #adx-stacked-stuffed-v1 .adx-matrix__legend {\n        display: grid;\n        gap: 9px;\n      }\n\n      #adx-stacked-stuffed-v1 .adx-comparison__content {\n        grid-template-columns: 1fr;\n      }\n\n      #adx-stacked-stuffed-v1 .adx-comparison__item + .adx-comparison__item {\n        border-top: 1px solid var(--adx-border);\n        border-left: 0;\n      }\n    }\n  <\/style>\n\n  <header class=\"adx-matrix__header\">\n    <h2 class=\"adx-matrix__title\" id=\"adx-stacked-stuffed-title\">Stacked Versus Stuffed: What Each Leaves Behind<\/h2>\n    <p class=\"adx-matrix__intro\" id=\"adx-stacked-stuffed-note\">Read each row across. This is an illustrative pattern, not measured data.<\/p>\n  <\/header>\n\n  <div class=\"adx-matrix__legend\" aria-label=\"Row color legend\">\n    <span class=\"adx-matrix__legend-item\">\n      <span class=\"adx-matrix__swatch adx-matrix__swatch--blue\" aria-hidden=\"true\"><\/span>\n      Blue: signal to pull\n    <\/span>\n    <span class=\"adx-matrix__legend-item\">\n      <span class=\"adx-matrix__swatch adx-matrix__swatch--amber\" aria-hidden=\"true\"><\/span>\n      Amber: looks normal or ambiguous\n    <\/span>\n    <span class=\"adx-matrix__legend-item\">\n      <span class=\"adx-matrix__swatch adx-matrix__swatch--red\" aria-hidden=\"true\"><\/span>\n      Red: fails measurement\n    <\/span>\n  <\/div>\n\n  <div class=\"adx-matrix__desktop\">\n    <table class=\"adx-matrix__table\">\n      <caption>Comparison of ad stacking and pixel stuffing across served reporting, viewability, exposing signals, false positive risks, and single-vendor coverage.<\/caption>\n      <colgroup>\n        <col>\n        <col>\n        <col>\n      <\/colgroup>\n      <thead>\n        <tr>\n          <th scope=\"col\">What You Compare<\/th>\n          <th scope=\"col\">Ad Stacking<\/th>\n          <th scope=\"col\">Pixel Stuffing<\/th>\n        <\/tr>\n      <\/thead>\n      <tbody>\n        <tr class=\"adx-row--amber\">\n          <th scope=\"row\">Served Impression Report<\/th>\n          <td>Looks normal. Every layer is recorded as one served impression.<\/td>\n          <td>Looks normal. One ad call produces one count, with no served-report discrepancy to chase.<\/td>\n        <\/tr>\n        <tr class=\"adx-row--red\">\n          <th scope=\"row\">Viewability Measurement<\/th>\n          <td>The top layer can pass. Lower layers fail or return as non-measurable.<\/td>\n          <td>It fails outright or lands in the non-measurable bucket.<\/td>\n        <\/tr>\n        <tr class=\"adx-row--blue\">\n          <th scope=\"row\">Signal That Exposes It<\/th>\n          <td>Slot overlap, layer order, and time in view for each creative.<\/td>\n          <td>Reported render width and height, plus frame-nesting depth.<\/td>\n        <\/tr>\n        <tr class=\"adx-row--amber\">\n          <th scope=\"row\">Main False Positive Risk<\/th>\n          <td>Consent screens, sticky headers, and legitimate overlays can cover ads.<\/td>\n          <td>Small legitimate units and slots that collapse when a page fails to fill.<\/td>\n        <\/tr>\n        <tr class=\"adx-row--red\">\n          <th scope=\"row\">With One Vendor in the Chain<\/th>\n          <td>Only the layer carrying the vendor&#8217;s tag is measured. Silence from lower layers is not a pass.<\/td>\n          <td>The non-measurable rate rises while served impressions remain unchanged.<\/td>\n        <\/tr>\n      <\/tbody>\n    <\/table>\n  <\/div>\n\n  <div class=\"adx-matrix__mobile\" role=\"group\" aria-label=\"Mobile comparison of ad stacking and pixel stuffing\">\n    <section class=\"adx-comparison adx-row--amber\">\n      <h3 class=\"adx-comparison__heading\" id=\"served-impression-report\">Served Impression Report<\/h3>\n      <div class=\"adx-comparison__content\">\n        <div class=\"adx-comparison__item\">\n          <span class=\"adx-comparison__label\">Ad Stacking<\/span>\n          <p class=\"adx-comparison__text\">Looks normal. Every layer is recorded as one served impression.<\/p>\n        <\/div>\n        <div class=\"adx-comparison__item\">\n          <span class=\"adx-comparison__label\">Pixel Stuffing<\/span>\n          <p class=\"adx-comparison__text\">Looks normal. One ad call produces one count, with no served-report discrepancy to chase.<\/p>\n        <\/div>\n      <\/div>\n    <\/section>\n\n    <section class=\"adx-comparison adx-row--red\">\n      <h3 class=\"adx-comparison__heading\" id=\"viewability-measurement\">Viewability Measurement<\/h3>\n      <div class=\"adx-comparison__content\">\n        <div class=\"adx-comparison__item\">\n          <span class=\"adx-comparison__label\">Ad Stacking<\/span>\n          <p class=\"adx-comparison__text\">The top layer can pass. Lower layers fail or return as non-measurable.<\/p>\n        <\/div>\n        <div class=\"adx-comparison__item\">\n          <span class=\"adx-comparison__label\">Pixel Stuffing<\/span>\n          <p class=\"adx-comparison__text\">It fails outright or lands in the non-measurable bucket.<\/p>\n        <\/div>\n      <\/div>\n    <\/section>\n\n    <section class=\"adx-comparison adx-row--blue\">\n      <h3 class=\"adx-comparison__heading\" id=\"signal-that-exposes-it\">Signal That Exposes It<\/h3>\n      <div class=\"adx-comparison__content\">\n        <div class=\"adx-comparison__item\">\n          <span class=\"adx-comparison__label\">Ad Stacking<\/span>\n          <p class=\"adx-comparison__text\">Slot overlap, layer order, and time in view for each creative.<\/p>\n        <\/div>\n        <div class=\"adx-comparison__item\">\n          <span class=\"adx-comparison__label\">Pixel Stuffing<\/span>\n          <p class=\"adx-comparison__text\">Reported render width and height, plus frame-nesting depth.<\/p>\n        <\/div>\n      <\/div>\n    <\/section>\n\n    <section class=\"adx-comparison adx-row--amber\">\n      <h3 class=\"adx-comparison__heading\" id=\"main-false-positive-risk\">Main False Positive Risk<\/h3>\n      <div class=\"adx-comparison__content\">\n        <div class=\"adx-comparison__item\">\n          <span class=\"adx-comparison__label\">Ad Stacking<\/span>\n          <p class=\"adx-comparison__text\">Consent screens, sticky headers, and legitimate overlays can cover ads.<\/p>\n        <\/div>\n        <div class=\"adx-comparison__item\">\n          <span class=\"adx-comparison__label\">Pixel Stuffing<\/span>\n          <p class=\"adx-comparison__text\">Small legitimate units and slots that collapse when a page fails to fill.<\/p>\n        <\/div>\n      <\/div>\n    <\/section>\n\n    <section class=\"adx-comparison adx-row--red\">\n      <h3 class=\"adx-comparison__heading\" id=\"with-one-vendor-in-the-chain\">With One Vendor in the Chain<\/h3>\n      <div class=\"adx-comparison__content\">\n        <div class=\"adx-comparison__item\">\n          <span class=\"adx-comparison__label\">Ad Stacking<\/span>\n          <p class=\"adx-comparison__text\">Only the layer carrying the vendor&#8217;s tag is measured. Silence from lower layers is not a pass.<\/p>\n        <\/div>\n        <div class=\"adx-comparison__item\">\n          <span class=\"adx-comparison__label\">Pixel Stuffing<\/span>\n          <p class=\"adx-comparison__text\">The non-measurable rate rises while served impressions remain unchanged.<\/p>\n        <\/div>\n      <\/div>\n    <\/section>\n  <\/div>\n\n  <figcaption class=\"adx-matrix__caption\" id=\"adx-stacked-stuffed-caption\">The two schemes look identical in a served impression report and diverge sharply once render size, overlap, and time in view are added.<\/figcaption>\n<\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"where-the-rules-put-hidden-ads-and-where-the-risk-sits\">Where the Rules Put Hidden Ads, and Where the Risk Sits<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The <a href=\"https:\/\/www.iab.com\/guidelines\/mrc-invalid-traffic-ivt-detection-and-filtration-guidelines-addendum\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">IAB and MRC invalid traffic detection and filtration guidelines<\/a> split invalid traffic into GIVT (general invalid traffic), which routine filters remove, and SIVT (sophisticated invalid traffic), which they do not. Hidden ads and falsified ad requests sit in SIVT, and the guidelines are explicit that this category needs advanced analytics and corroboration across multiple points rather than a single check.<\/p>\n\n\n<div class=\"block__bord\"><div class=\"block__bord_desc\"><p>Risk concentrates where nobody is looking at the page. Unfiltered open programmatic supply, unverified exchanges, and long chains with opaque resellers share one property: each hop puts the buyer further from the page where the creative lands and reduces what can be verified. The scheme belongs to whoever writes the page code, not to the format bought or the channel it came through.<\/p>\n<\/div><\/div>\n<style>\n.block__bord { margin: 32px 0; padding: 1.25em 2.375em;\tborder-radius: 24px; background: rgba(0, 220, 200, 0.20); }\n.block__bord_desc {font-size: 16px !important;font-weight: 400 !important;color: #606060 !important;}\n<\/style>\n\n\n\n<p class=\"wp-block-paragraph\">The surrounding waste is documented, even if this scheme is not counted separately. The <a href=\"https:\/\/www.ana.net\/content\/show\/id\/pr-2023-06-programmaticstudy\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">ANA Programmatic Media Supply Chain Transparency Study<\/a> first look, published in 2023 by the Association of National Advertisers, tracked 123 million dollars of ad spend across 35.5 billion impressions from 21 marketers between September 2022 and January 2023. The study found that made-for-advertising websites took <strong>21% of the impressions and 15% of the ad spend<\/strong> it examined, and put total waste in the $88 billion open-web programmatic market at as much as <strong>$20 billion, or 23% of it<\/strong>.<\/p>\n\n\n<div class=\"block__preview\">\n        <a href=\"https:\/\/adex.com\/blog\/device-farm-fraud-vs-bots\/\" class=\"block__preview_img\"><img src=\"https:\/\/adex.com\/blog\/wp-content\/uploads\/2026\/07\/adex-device-farm-fraud-vs-bots.png\" srcset=\"https:\/\/adex.com\/blog\/wp-content\/uploads\/2026\/07\/adex-device-farm-fraud-vs-bots.png\" sizes=\"100vw\" alt=\"Device farm fraud vs bots: why real phones pass device checks, where each leaves traces, and which signals catch which kind of fake audience.\" decoding=\"async\" class=\"lazy\"><\/a>\n    <div class=\"block__preview_box\">\n        <a href=\"https:\/\/adex.com\/blog\/category\/current_risks\/\" class=\"block__preview_box-cat\">Current risks<\/a>        <h3 class=\"block__preview_box-title\" id=\"device-farm-fraud-vs-bots-two-ways-to-fake-an-audience\"><a href=\"https:\/\/adex.com\/blog\/device-farm-fraud-vs-bots\/\">Device Farm Fraud vs Bots: Two Ways to Fake an Audience<\/a><\/h3>\n    <\/div>\n<\/div>\n<style>\n.block__preview {display: flex;align-items: center;justify-content: center; margin: 32px 0;}\n.block__preview a {text-decoration: none;}\n.block__preview_img {min-width: 360px;max-width: 360px;min-height: 188px;width: 100%;height: 100%;}\n.block__preview_img img {width: 100%;height: 100%;}\n.block__preview_box {margin-left: 40px;max-width: 360px;}\n.block__preview_box-cat {color: #00B8A7 !important;font-weight: 600;font-size: 12px;line-height: 16px;text-transform: uppercase; display: block; margin-bottom: 4px;}\n.block__preview_box-cat:hover {color: #FE645A !important; text-decoration: none !important;}\n.block__preview_box-title {font-size: 20px;font-weight: 700;line-height: 24px;color: #0B172D;}\n.block__preview_box-title a {color: #0B172D !important;}\n.block__preview_box-title a:hover {color: #FE645A !important;}\n@media screen and (max-width: 768px) {.block__preview {flex-direction: column;}.block__preview_box {max-width: 100%; margin-top: 32px;margin-left: 0px;}.block__preview_img {max-width: 100%;min-width: 100%;min-height: 100%;}}<\/style>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"the-signals-worth-pulling-first\">The Signals Worth Pulling First<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Start with render dimensions, broken out by seller and by placement rather than blended. A creative bought at one size and reported at another is the fastest read available, and the one signal that resolves stuffing on its own most of the time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Non-measurable rate deserves its own column, also by seller, because a blended number hides one bad seller inside a large buy. Sellers whose non-measurable share runs far above the rest of the buy, with served impressions holding steady, are worth pulling for review regardless of whether anyone can prove intent.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In-view duration works better as a distribution than an average. Honest inventory produces a spread, while a placement where in-view time clusters at exactly the minimum, or where buried creatives report no duration at all, is describing machinery rather than people. Time to first scroll makes a useful pair, since a viewable impression logged before a user could have scrolled that far deserves review. Frame nesting depth closes the set, because creatives arriving several frames deep with the innermost frame far smaller than the unit bought describe a slot never meant to be seen.<\/p>\n\n\n<div class=\"block__preview\">\n        <a href=\"https:\/\/adex.com\/blog\/ad-injection-attacks-architecture-prevention\/\" class=\"block__preview_img\"><img src=\"https:\/\/adex.com\/blog\/wp-content\/uploads\/2026\/05\/Adex-Ad-Injection-Attacks-Flow.png\" srcset=\"https:\/\/adex.com\/blog\/wp-content\/uploads\/2026\/05\/Adex-Ad-Injection-Attacks-Flow.png\" sizes=\"100vw\" alt=\"Adex - visual showing how ad injection attacks reach the impression through client-side browser manipulation.\" decoding=\"async\" class=\"lazy\"><\/a>\n    <div class=\"block__preview_box\">\n        <a href=\"https:\/\/adex.com\/blog\/category\/guides\/\" class=\"block__preview_box-cat\">Guides<\/a>        <h3 class=\"block__preview_box-title\" id=\"ad-injection-attacks-how-they-work-how-to-detect-them-and-how-to-defend-against-them\"><a href=\"https:\/\/adex.com\/blog\/ad-injection-attacks-architecture-prevention\/\">Ad Injection Attacks: How They Work, How to Detect Them, and How to Defend Against Them<\/a><\/h3>\n    <\/div>\n<\/div>\n<style>\n.block__preview {display: flex;align-items: center;justify-content: center; margin: 32px 0;}\n.block__preview a {text-decoration: none;}\n.block__preview_img {min-width: 360px;max-width: 360px;min-height: 188px;width: 100%;height: 100%;}\n.block__preview_img img {width: 100%;height: 100%;}\n.block__preview_box {margin-left: 40px;max-width: 360px;}\n.block__preview_box-cat {color: #00B8A7 !important;font-weight: 600;font-size: 12px;line-height: 16px;text-transform: uppercase; display: block; margin-bottom: 4px;}\n.block__preview_box-cat:hover {color: #FE645A !important; text-decoration: none !important;}\n.block__preview_box-title {font-size: 20px;font-weight: 700;line-height: 24px;color: #0B172D;}\n.block__preview_box-title a {color: #0B172D !important;}\n.block__preview_box-title a:hover {color: #FE645A !important;}\n@media screen and (max-width: 768px) {.block__preview {flex-direction: column;}.block__preview_box {max-width: 100%; margin-top: 32px;margin-left: 0px;}.block__preview_img {max-width: 100%;min-width: 100%;min-height: 100%;}}<\/style>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"where-these-signals-break-down\">Where These Signals Break Down<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every signal above has an honest explanation competing with it. Consent screens, sticky headers, and chat widgets cover ads legitimately, so overlap alone cannot separate a stacked slot from a normal page. Slots also collapse to near-zero dimensions when a page fails to fill, and high non-measurable rates come from app webviews with poor geometry reporting or from privacy tools that block measurement scripts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Analysts who work these cases describe the same sequence: one signal raises a seller for review, a second independent signal decides whether it is a pattern, and a human still looks before money moves. The strongest evidence is consistency over time on one seller rather than severity in a single day.<\/p>\n\n\n<div class=\"block__bord\"><div class=\"block__bord_desc\"><p>One capability gap is worth stating plainly. A standard buying report does not expose the layer order of a page, so a buyer cannot see stacking directly. Getting there needs either a measurement vendor that reports overlap and obstruction, or manual inspection of a disclosed placement. Where placements are not disclosed, page-level diagnosis is unavailable and the realistic action is exclusion at the seller or path level. That is narrower than most buyers would like, and pretending otherwise produces worse decisions.<\/p>\n<\/div><\/div>\n<style>\n.block__bord { margin: 32px 0; padding: 1.25em 2.375em;\tborder-radius: 24px; background: rgba(0, 220, 200, 0.20); }\n.block__bord_desc {font-size: 16px !important;font-weight: 400 !important;color: #606060 !important;}\n<\/style>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">FAQ<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"what-is-ad-stacking-fraud\">What is ad stacking fraud? <\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ad stacking is when several ads load into one slot, layered so only the topmost creative is visible. Every layer fires its own impression tracker, so the advertiser pays for creatives no user could see.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"what-is-pixel-stuffing-in-advertising\">What is pixel stuffing in advertising? <\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Pixel stuffing places an ad inside a frame roughly one pixel by one pixel, or shrinks and repositions it so it cannot be perceived. The tell is that the reported render size does not match the creative size bought.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"why-dont-standard-impression-reports-show-ad-stacking\">Why don&#8217;t standard impression reports show ad stacking? <\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Because a served impression records that an ad call completed. Your ad server and the seller measure the same event, so their numbers agree and nothing there describes overlap, render size, or time on screen.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"does-viewability-measurement-catch-pixel-stuffing\">Does viewability measurement catch pixel stuffing? <\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Usually yes, either as a failed viewable impression or a non-measurable one. The catch is that non-measurable impressions are often left out of the viewable rate calculation, which hides the problem instead of showing it.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"what-does-a-non-measurable-impression-mean\">What does a non-measurable impression mean? <\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The ad served, but measurement code could not read the slot&#8217;s size or position, so viewability is unknown rather than good or bad. Legitimate causes include app webviews and blocked measurement scripts, which is why a high non-measurable share is worth investigating seller by seller.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"what-to-do-when-the-numbers-look-fine\">What to Do When the Numbers Look Fine<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The useful reflex is to stop asking whether impressions were delivered and start asking what happened to them after delivery. Two ratios do most of that work: measured over served, and viewable over served. Read both by seller, never blended, and never let the second one quietly switch to a measured-impression denominator.<\/p>\n\n\n<div class=\"block__bord\"><div class=\"block__bord_desc\"><p>The uncomfortable part is that a report with no discrepancies and no obvious anomaly is exactly what both schemes are built to produce. Clean plumbing and clean inventory are different claims, and only one of them shows up in a delivery report.<\/p>\n<\/div><\/div>\n<style>\n.block__bord { margin: 32px 0; padding: 1.25em 2.375em;\tborder-radius: 24px; background: rgba(0, 220, 200, 0.20); }\n.block__bord_desc {font-size: 16px !important;font-weight: 400 !important;color: #606060 !important;}\n<\/style>\n\n\n    <div class=\"block__buttons\">\n        <a href=\"https:\/\/app.adex.com\/auth\/login\" class=\"block__buttons_btn\">JOIN ADEX<\/a>    <\/div>\n<style>\n    .block__buttons {\n        text-align: center;\n    }\n\n    .block__buttons_btn {\n        background-color: rgba(254, 100, 90, 1) !important;\n        border-radius: 200px !important;\n        padding: 16px 24px !important;\n        font-weight: 600 !important;\n        font-size: 18px !important;\n        line-height: 24px !important;\n        text-align: center !important;\n        display: inline-block !important;\n        color: #fff !important;\n        text-decoration: none !important;\n        text-transform: uppercase !important;\n    }\n\n    .block__buttons_btn:hover {\n        color: rgba(11, 31, 58, 1) !important;\n    }\n<\/style>\n","protected":false},"excerpt":{"rendered":"<p>Paying for four impressions when the user could see only one? Find out how Ad Stacking Fraud and pixel stuffing hide behind normal-looking reports\u2014and which signals expose them before they drain your budget.<\/p>\n","protected":false},"author":8,"featured_media":6062,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[4],"tags":[18,16],"class_list":["post-5966","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-current_risks","tag-fraud","tag-threat"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Ad Stacking Fraud vs Pixel Stuffing: How to Detect Both<\/title>\n<meta name=\"description\" content=\"Ad stacking fraud and pixel stuffing hide unseen impressions behind clean reports. See how render size, overlap, and viewability expose both.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/adex.com\/blog\/ad-stacking-fraud-pixel-stuffing\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ad Stacking Fraud vs Pixel Stuffing: How to Detect Both\" \/>\n<meta property=\"og:description\" content=\"Ad stacking fraud and pixel stuffing hide unseen impressions behind clean reports. See how render size, overlap, and viewability expose both.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/adex.com\/blog\/ad-stacking-fraud-pixel-stuffing\/\" \/>\n<meta property=\"og:site_name\" content=\"ADEX\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/adexsaas\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-17T16:17:22+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-17T16:53:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/adex.com\/blog\/wp-content\/uploads\/2026\/07\/adex-ad-stacking-pixel-stuffing.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Olya Mikheeva\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@adexsaas\" \/>\n<meta name=\"twitter:site\" content=\"@adexsaas\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Olya Mikheeva\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/adex.com\\\/blog\\\/ad-stacking-fraud-pixel-stuffing\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/adex.com\\\/blog\\\/ad-stacking-fraud-pixel-stuffing\\\/\"},\"author\":{\"name\":\"Olya Mikheeva\",\"@id\":\"https:\\\/\\\/adex.com\\\/blog\\\/#\\\/schema\\\/person\\\/c5794aef7aa28987e7019a804390ee3a\"},\"headline\":\"Ad Stacking Fraud and Pixel Stuffing: The Impressions Nobody Saw\",\"datePublished\":\"2026-08-17T16:17:22+00:00\",\"dateModified\":\"2026-08-17T16:53:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/adex.com\\\/blog\\\/ad-stacking-fraud-pixel-stuffing\\\/\"},\"wordCount\":2285,\"publisher\":{\"@id\":\"https:\\\/\\\/adex.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/adex.com\\\/blog\\\/ad-stacking-fraud-pixel-stuffing\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/adex.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/adex-ad-stacking-pixel-stuffing.png\",\"keywords\":[\"Fraud\",\"Threat\"],\"articleSection\":[\"Current risks\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/adex.com\\\/blog\\\/ad-stacking-fraud-pixel-stuffing\\\/\",\"url\":\"https:\\\/\\\/adex.com\\\/blog\\\/ad-stacking-fraud-pixel-stuffing\\\/\",\"name\":\"Ad Stacking Fraud vs Pixel Stuffing: How to Detect Both\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/adex.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/adex.com\\\/blog\\\/ad-stacking-fraud-pixel-stuffing\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/adex.com\\\/blog\\\/ad-stacking-fraud-pixel-stuffing\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/adex.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/adex-ad-stacking-pixel-stuffing.png\",\"datePublished\":\"2026-08-17T16:17:22+00:00\",\"dateModified\":\"2026-08-17T16:53:04+00:00\",\"description\":\"Ad stacking fraud and pixel stuffing hide unseen impressions behind clean reports. See how render size, overlap, and viewability expose both.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/adex.com\\\/blog\\\/ad-stacking-fraud-pixel-stuffing\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/adex.com\\\/blog\\\/ad-stacking-fraud-pixel-stuffing\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/adex.com\\\/blog\\\/ad-stacking-fraud-pixel-stuffing\\\/#primaryimage\",\"url\":\"https:\\\/\\\/adex.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/adex-ad-stacking-pixel-stuffing.png\",\"contentUrl\":\"https:\\\/\\\/adex.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/adex-ad-stacking-pixel-stuffing.png\",\"width\":1200,\"height\":628,\"caption\":\"Ad stacking and pixel stuffing bill impressions nobody saw. How both schemes work, why standard reports miss them, and which signals expose them.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/adex.com\\\/blog\\\/ad-stacking-fraud-pixel-stuffing\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/adex.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ad Stacking Fraud and Pixel Stuffing: The Impressions Nobody Saw\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/adex.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/adex.com\\\/blog\\\/\",\"name\":\"ADEX - Ad Fraud & Invalid Traffic Prevention Platform\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/adex.com\\\/blog\\\/#organization\"},\"alternateName\":\"ADEX\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/adex.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/adex.com\\\/blog\\\/#organization\",\"name\":\"ADEX - Ad Fraud & Invalid Traffic Prevention Platform\",\"url\":\"https:\\\/\\\/adex.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/adex.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/adex.com\\\/blog\\\/wp-content\\\/uploads\\\/2022\\\/05\\\/CDD2258_copy-48-1.svg\",\"contentUrl\":\"https:\\\/\\\/adex.com\\\/blog\\\/wp-content\\\/uploads\\\/2022\\\/05\\\/CDD2258_copy-48-1.svg\",\"width\":148,\"height\":30,\"caption\":\"ADEX - Ad Fraud & Invalid Traffic Prevention Platform\"},\"image\":{\"@id\":\"https:\\\/\\\/adex.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/adexsaas\\\/\",\"https:\\\/\\\/x.com\\\/adexsaas\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/adex.com\\\/blog\\\/#\\\/schema\\\/person\\\/c5794aef7aa28987e7019a804390ee3a\",\"name\":\"Olya Mikheeva\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7e1ca40f4b08b576bd7c51e8946605febbcaa99bf482f69ead517b1cd512de42?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7e1ca40f4b08b576bd7c51e8946605febbcaa99bf482f69ead517b1cd512de42?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7e1ca40f4b08b576bd7c51e8946605febbcaa99bf482f69ead517b1cd512de42?s=96&d=mm&r=g\",\"caption\":\"Olya Mikheeva\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Ad Stacking Fraud vs Pixel Stuffing: How to Detect Both","description":"Ad stacking fraud and pixel stuffing hide unseen impressions behind clean reports. See how render size, overlap, and viewability expose both.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/adex.com\/blog\/ad-stacking-fraud-pixel-stuffing\/","og_locale":"en_US","og_type":"article","og_title":"Ad Stacking Fraud vs Pixel Stuffing: How to Detect Both","og_description":"Ad stacking fraud and pixel stuffing hide unseen impressions behind clean reports. See how render size, overlap, and viewability expose both.","og_url":"https:\/\/adex.com\/blog\/ad-stacking-fraud-pixel-stuffing\/","og_site_name":"ADEX","article_publisher":"https:\/\/www.facebook.com\/adexsaas\/","article_published_time":"2026-08-17T16:17:22+00:00","article_modified_time":"2026-08-17T16:53:04+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/adex.com\/blog\/wp-content\/uploads\/2026\/07\/adex-ad-stacking-pixel-stuffing.png","type":"image\/png"}],"author":"Olya Mikheeva","twitter_card":"summary_large_image","twitter_creator":"@adexsaas","twitter_site":"@adexsaas","twitter_misc":{"Written by":"Olya Mikheeva","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/adex.com\/blog\/ad-stacking-fraud-pixel-stuffing\/#article","isPartOf":{"@id":"https:\/\/adex.com\/blog\/ad-stacking-fraud-pixel-stuffing\/"},"author":{"name":"Olya Mikheeva","@id":"https:\/\/adex.com\/blog\/#\/schema\/person\/c5794aef7aa28987e7019a804390ee3a"},"headline":"Ad Stacking Fraud and Pixel Stuffing: The Impressions Nobody Saw","datePublished":"2026-08-17T16:17:22+00:00","dateModified":"2026-08-17T16:53:04+00:00","mainEntityOfPage":{"@id":"https:\/\/adex.com\/blog\/ad-stacking-fraud-pixel-stuffing\/"},"wordCount":2285,"publisher":{"@id":"https:\/\/adex.com\/blog\/#organization"},"image":{"@id":"https:\/\/adex.com\/blog\/ad-stacking-fraud-pixel-stuffing\/#primaryimage"},"thumbnailUrl":"https:\/\/adex.com\/blog\/wp-content\/uploads\/2026\/07\/adex-ad-stacking-pixel-stuffing.png","keywords":["Fraud","Threat"],"articleSection":["Current risks"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/adex.com\/blog\/ad-stacking-fraud-pixel-stuffing\/","url":"https:\/\/adex.com\/blog\/ad-stacking-fraud-pixel-stuffing\/","name":"Ad Stacking Fraud vs Pixel Stuffing: How to Detect Both","isPartOf":{"@id":"https:\/\/adex.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/adex.com\/blog\/ad-stacking-fraud-pixel-stuffing\/#primaryimage"},"image":{"@id":"https:\/\/adex.com\/blog\/ad-stacking-fraud-pixel-stuffing\/#primaryimage"},"thumbnailUrl":"https:\/\/adex.com\/blog\/wp-content\/uploads\/2026\/07\/adex-ad-stacking-pixel-stuffing.png","datePublished":"2026-08-17T16:17:22+00:00","dateModified":"2026-08-17T16:53:04+00:00","description":"Ad stacking fraud and pixel stuffing hide unseen impressions behind clean reports. See how render size, overlap, and viewability expose both.","breadcrumb":{"@id":"https:\/\/adex.com\/blog\/ad-stacking-fraud-pixel-stuffing\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/adex.com\/blog\/ad-stacking-fraud-pixel-stuffing\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/adex.com\/blog\/ad-stacking-fraud-pixel-stuffing\/#primaryimage","url":"https:\/\/adex.com\/blog\/wp-content\/uploads\/2026\/07\/adex-ad-stacking-pixel-stuffing.png","contentUrl":"https:\/\/adex.com\/blog\/wp-content\/uploads\/2026\/07\/adex-ad-stacking-pixel-stuffing.png","width":1200,"height":628,"caption":"Ad stacking and pixel stuffing bill impressions nobody saw. How both schemes work, why standard reports miss them, and which signals expose them."},{"@type":"BreadcrumbList","@id":"https:\/\/adex.com\/blog\/ad-stacking-fraud-pixel-stuffing\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/adex.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Ad Stacking Fraud and Pixel Stuffing: The Impressions Nobody Saw"}]},{"@type":"WebSite","@id":"https:\/\/adex.com\/blog\/#website","url":"https:\/\/adex.com\/blog\/","name":"ADEX - Ad Fraud & Invalid Traffic Prevention Platform","description":"","publisher":{"@id":"https:\/\/adex.com\/blog\/#organization"},"alternateName":"ADEX","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/adex.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/adex.com\/blog\/#organization","name":"ADEX - Ad Fraud & Invalid Traffic Prevention Platform","url":"https:\/\/adex.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/adex.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/adex.com\/blog\/wp-content\/uploads\/2022\/05\/CDD2258_copy-48-1.svg","contentUrl":"https:\/\/adex.com\/blog\/wp-content\/uploads\/2022\/05\/CDD2258_copy-48-1.svg","width":148,"height":30,"caption":"ADEX - Ad Fraud & Invalid Traffic Prevention Platform"},"image":{"@id":"https:\/\/adex.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/adexsaas\/","https:\/\/x.com\/adexsaas"]},{"@type":"Person","@id":"https:\/\/adex.com\/blog\/#\/schema\/person\/c5794aef7aa28987e7019a804390ee3a","name":"Olya Mikheeva","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/7e1ca40f4b08b576bd7c51e8946605febbcaa99bf482f69ead517b1cd512de42?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/7e1ca40f4b08b576bd7c51e8946605febbcaa99bf482f69ead517b1cd512de42?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7e1ca40f4b08b576bd7c51e8946605febbcaa99bf482f69ead517b1cd512de42?s=96&d=mm&r=g","caption":"Olya Mikheeva"}}]}},"_links":{"self":[{"href":"https:\/\/adex.com\/blog\/wp-json\/wp\/v2\/posts\/5966","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adex.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adex.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adex.com\/blog\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/adex.com\/blog\/wp-json\/wp\/v2\/comments?post=5966"}],"version-history":[{"count":12,"href":"https:\/\/adex.com\/blog\/wp-json\/wp\/v2\/posts\/5966\/revisions"}],"predecessor-version":[{"id":6077,"href":"https:\/\/adex.com\/blog\/wp-json\/wp\/v2\/posts\/5966\/revisions\/6077"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/adex.com\/blog\/wp-json\/wp\/v2\/media\/6062"}],"wp:attachment":[{"href":"https:\/\/adex.com\/blog\/wp-json\/wp\/v2\/media?parent=5966"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adex.com\/blog\/wp-json\/wp\/v2\/categories?post=5966"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adex.com\/blog\/wp-json\/wp\/v2\/tags?post=5966"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}