Four months of our own money on the open exchange
We spent $2,671.30 of our own money on display ads between May 14 and September 23, 2026. Much of it went to ad slots that did nothing, the usual meters hid that, and most of the waste turned out to be fixable once we stopped believing we could not fix it.
Published 2026-09-23 · Updated 2026-09-24 · Search job: is display ad traffic real
Between May 14 and September 23, 2026, we spent $2,671.30 of our own money on display ads bought on the open exchange: 69 campaigns and 641,081 impressions. The short version of what we learned is that a large share of the money landed on ad slots that produced no clicks, and usually no visits either, the numbers most people check first (click-through rate and a fraud vendor's score) made that hard to see, and most of the waste could be removed once we checked what the exchange actually allows instead of what we assumed it allowed.
We are an ad account an AI agent can run. Before we asked anyone else to buy through it, we bought through it ourselves, with a small daily budget, so we could see what an ordinary founder's first display test would really get. This is the result. Every number has a date, and the limits are at the end.
Last measured: 2026-09-24.
What we found, in five sentences
- In the first full read of where one batch of test campaigns ran, 1,073 of 1,149 ad slots got zero clicks, and they took 64 percent of the spend we could see.
- When we started auditing every night, the first run flagged $138.53 of $320.67 reviewed spend (43 percent) as waste or as suspicious.
- We had told ourselves we could only act on $7.79 of that. We were wrong: $89.71 (65 percent) was fixable the whole time.
- Click-through rate rewarded the worst supply, and the fraud score read zero for months simply because nothing was measuring.
- Our own portfolio is still graded "dirty" on most nights. It is less dirty than it was, and we can say exactly why.
What we bought
All spend below is our own. Nobody outside the company has run a campaign yet, so these are lab results, not customer results.
| Window (UTC) | Campaigns | Spend | What it was |
|---|---|---|---|
| 2026-05-14 to 05-22 | 3 | $26.18 | First live smoke tests |
| 2026-06-10 to 06-24 | 13 | $976.13 | Learning flights for our own product ads |
| 2026-07-01 to 08-26 | 18 | $711.34 | More product flights and landing-page tests |
| 2026-08-26 to 08-27 | 20 | $432.45 | Two short waves bought only to see where the money goes |
| 2026-09-03 to 09-23 | 15 | $525.20 | A continuous $20-a-day portfolio we tune one change at a time |
| Total | 69 | $2,671.30 | 641,081 impressions |
Campaigns are grouped by the month they first spent. The September portfolio averaged $24.61 a day across 21 UTC days. That is roughly 5,000 impressions and 20 clicks a day, which is a small sample, and it shapes everything below.
Most of the money went to slots that did nothing
An ad slot (a "placement") is one specific space on one specific site or app. The open exchange sells thousands of them, and you do not get to pick which ones you meet until you have paid for them.
On 2026-09-02 we pulled a full slot-by-slot report for the two August waves. It covered $316.64 of their roughly $432 spend. The exchange's report tops out at 5,000 rows sorted by spend, so the smallest slots are missing.
- 1,149 slots showed up. 1,073 of them (93.4 percent) got zero clicks.
- Those zero-click slots took $202.77, which is 64 percent of the spend we could see.
- The rest of the list was not healthy either. Seven sites produced 41.3 percent of all clicks from 4.7 percent of impressions.
Zero clicks is not proof that a slot is fraud. It is proof that the slot bought us nothing we could observe. The full breakdown is in Most placements we bought did nothing, and the click pile-up is in Seven domains produced two fifths of the clicks.
Later we could also check visits, not just clicks. From September 5 the click links carried the slot and site they came from, so a visit could be matched to the slot that sent it. Of the ten zero-click findings the nightly audit raised from September 7 onward, six recorded no visits at all, and the other four recorded eight visits between them.
The meters we were told to watch lied, in three different ways
A report that said zero when the clicks were there
On 2026-06-21 our dashboard showed the June flights at 33,271 impressions, 0 clicks, and $498.49 spent. We nearly concluded display does not work. On June 26 our contact at the exchange could see clicks on their side, and we found the bug: our report asked for a field called click, but the exchange names it clicks. The request still succeeded. It just left clicks out, and that looked exactly like a campaign nobody clicked. Zero clicks that were a field name has the full correction.
The lesson we kept is that a zero is a claim about the meter before it is a claim about the traffic.
Click-through rate rewarded the worst supply
In the first nightly audit (a window of 2026-08-26 to 09-01), our account's average click-through rate was 0.29 percent. Fifteen sites and slots were far above it: 180 clicks on 4,825 impressions, about 3.7 percent. On this kind of supply a rate that high is a sign of automated clicking, not of a great audience. If we had optimized toward click-through rate, the system would have moved budget toward exactly those places.
That is why we stopped scoring on it. CTR is a trap is the short argument.
The fraud score read zero because nothing was measuring
Display fraud is usually measured by a vendor tag attached to the ad. Until 2026-09-08, none of our ads carried one. The exchange's invalid-traffic field read 0 on every day from September 3 to September 7. On September 8, the day we attached the tag, it read 22 invalid impressions out of 5,671 (0.388 percent). On September 9 it read 51 out of 4,174 (1.222 percent).
Nothing about the traffic changed on September 8. The meter did. We were measuring nothing and reading zero as fine covers this.
Even with the tag on, we do not judge traffic on the vendor's number alone. From September 11 to 15 it sat between 1.247 and 1.659 percent. That is elevated but not alarming. Over the same days, our own check found $32.56 of spend it said to exclude, and $19.92 of that was a single webmail site that took money and returned zero clicks. The vendor number told us "a bit high." Our own read told us where the money went.
We said we could not fix most of it. We were wrong.
The first nightly audit ran on 2026-09-02 over 2026-08-26 to 09-01. It reviewed $320.67 of spend and raised 74 findings worth $138.53:
| What was flagged | Findings | Spend |
|---|---|---|
| Spend with zero clicks (at least 500 impressions and $5) | 12 | $82.45 |
| Delivery on sites that do not authorize the seller | 47 | $32.51 |
| Click-through rate far above the account normal | 15 | $23.57 |
Our product could act on $7.79 of that, about 6 percent. The rest was refused with a sentence saying slot-level and site-level exclusions needed a special list object the account did not have.
We checked the exchange's own list of targeting options the same day. Slot and site exclusions are direct settings that need no list object. The refusal had been blocking most of the value the whole time:
| Where the waste was | Findings | Spend | Before | After 2026-09-02 |
|---|---|---|---|---|
| Whole sites (domain) | 45 | $48.82 | Blocked | Still blocked, needs a list object |
| Individual ad slots | 15 | $47.71 | Blocked, wrongly | Fixable |
| Sites inside an exchange | 11 | $34.21 | Blocked, wrongly | Fixable |
| Whole exchanges | 3 | $7.79 | Fixable | Fixable |
That moved fixable waste from $7.79 to $89.71, or 65 percent of what the audit found. The domain bucket is still advisory today.
This was one of four times we wrote down "the exchange cannot do this" after checking a single place. All four are in Four times we said the seat could not do it. If you remember one thing from this article for your own buying, it is to check the capability before you believe the refusal, even when the refusal is your own.
What we actually changed, and what happened
We change one thing at a time on the September portfolio, write down how to undo it before we do it, and judge it on a fixed date. At 20 clicks a day, two changes at once cannot be told apart. The rule is in Decisions need a revert command.
Excluded the known-bad slots and sites at launch (2026-09-03). The portfolio started with 15 slot and 11 site exclusions from the first audit. Our experiments log records that 78 findings then expired and open flagged waste fell from about $134 to about $17. That comparison is an operator reading, not a controlled test, so treat it as direction rather than a measured effect.
Required authorized sellers on half the portfolio (applied 2026-09-09, judged 2026-09-10). Five campaigns only bought inventory where the site lists the seller as authorized. The other five did not change. After the change, the vendor's invalid rate was 1.027 percent on the treated half and 3.166 percent on the untouched half, and the treated half still delivered ($15.97 against $9.07). We kept it. Two honest notes: we judged this on the vendor score, which we no longer use to decide, and authorization did not touch the bigger waste above. ads.txt did not save this buy explains why.
Bid one wasteful slot down instead of blocking it (applied 2026-09-10, judged 2026-09-15). A single slot had taken $6.15 over 1,254 impressions with zero clicks. Instead of excluding it, we bid 70 percent less there. Before the change it cost about $0.97 a day. On the five complete days after, it cost $0.17, $0.23, $0.33, $0.16, and $0.19, about $0.22 a day. It kept appearing, still with zero clicks, so we can keep judging it, and total delivery held above $20 every day. We kept it. The reason to prefer this over a hard block on a small budget is in Bid down instead of kill.
Bid one wasteful site down the same way (applied 2026-09-16, judged 2026-09-24, a week late). We pulled that one site's delivery directly, so the numbers are complete rather than cut off at a row limit. Before any bid-down it cost a $5.00 CPM. With only the slot-level bid-down in place (September 11 to 15) it cost $1.98. With the site-level bid-down (September 17 to 23) it cost $0.85: $0.28 on 327 impressions, still zero clicks, and it still appeared every day. The five campaigns we had not touched bought the same site that week at the full $5.00, which gave us an accidental control group. Adjusted for the shrinking portfolio, the site's share of our impressions fell from 3.34 percent to 1.51 percent, and the account grade did not get worse. We kept it. We were a week late judging it, and the log says so.
Where our own traffic stands today
Since 2026-09-15 the nightly audit also writes one overall grade for the account. It comes from our own evidence: spend on supply that should be excluded, visits we can tie to a real browser session, hidden trap links that only bots follow, and on-page actions a person has to do on purpose. The vendor score is a hint in that grade, not the decision.
| Audit night | Window | Spend reviewed | Grade | Spend to exclude |
|---|---|---|---|---|
| 2026-09-15 | 09-08 to 09-14 | $124.91 | Dirty | $54.04 (5 findings) |
| 2026-09-16 | 09-09 to 09-15 | $123.84 | Dirty | $21.18 (2) |
| 2026-09-17 | 09-10 to 09-16 | $120.75 | Mixed | $0.00 |
| 2026-09-18 | 09-11 to 09-17 | $124.47 | Dirty | $5.67 (2) |
| 2026-09-19 | 09-12 to 09-18 | $121.67 | Dirty | $5.39 (1) |
| 2026-09-20 | 09-13 to 09-19 | $124.70 | Dirty | $11.77 (2) |
| 2026-09-21 | 09-14 to 09-20 | $117.29 | Mixed | $0.00 |
| 2026-09-22 | 09-15 to 09-21 | $115.67 | Mixed | $0.00 |
| 2026-09-23 | 09-16 to 09-22 | $109.14 | Dirty | $15.78 (1) |
Nine graded nights: six dirty, three mixed, none clean. The share of reviewed spend marked for exclusion fell from 43 percent on September 15 to 14 percent on September 23. The one finding left on September 23 is the same webmail site that showed up on September 12, back after it had aged out: $15.78 on 3,473 impressions with zero clicks. Site-wide blocks still need the list object we do not create yet, so this is the bucket we can see and cannot yet remove.
We are publishing this table because a clean-looking portfolio would be less useful to you. If our own small, hand-tuned account grades dirty most nights, a first display test with no audit at all is very likely buying some of the same supply.
What the nightly audit does now
Any account can turn it on with one command. Once on, it runs every night and:
- reads the last seven complete days of delivery at four levels: exchange, site, ad slot, and whole domain;
- flags spend with zero clicks, click-through rates too high to be real, clicks that never became visits, and delivery on sites that did not authorize the seller;
- says whether it could actually see your delivery, and says so when the report was cut off at its row limit, instead of showing "no findings" in green;
- gives the account one first-party grade, with the reasons written out;
- lets you apply a finding at exchange, site, or slot level, which creates new targeting you can point a campaign at. It never edits a live campaign by itself.
The commands are in ztdsp supply-audit commands, and the step-by-step for acting on a finding is in Apply a Supply Audit finding.
The technical detail, for people who buy programmatic
- The exchange is FreeWheel's Beeswax, on one child seat. Placement and site exclusions compile to the direct
app_sitekeysplacementandsite. Domain exclusions need adomain_listreference object from/rest/v2/ref/lists, which we do not create yet. - Supply Audit stores slot and site findings as composite keys such as
PUBMATIC|pm/4557769. The value sent to the exchange is the part after the pipe. Sending the whole key matches nothing, and the slot keeps serving while the buyer is told it was excluded. - Reporting keys come back label-cased (
Campaign ID, notcampaign_id). Clicks areclicks, plural. inventory_agganddomain_aggare two views of the same auctions. The first audit briefly reported $630.49 reviewed against $320.67 real because it added them together. Reviewed spend is now the larger of the two, and it is a lower bound. See Audited spend used Math.max.- Campaign spend in this article is the larger of the lifetime exchange snapshot and the sum of hourly report rows, per campaign. Adding the two together roughly doubles spend. See Two spend sources, one auction.
- The vendor tag is HUMAN FraudSensor, creative add-on 44, at $0.05 CPM. Viewability is still unmeasured, because that tag does not measure it.
- The bid-down is a Beeswax bid modifier: one
placementterm,multiplier: 0.3, attached withbid_modifier_idand amax_bidequal to the existing $5.00 CPM bid.
Limits we want you to hold us to
- Small budget. About $20 to $25 a day in September. Many single-slot numbers above rest on a few dollars.
- One buyer, one seat. Every campaign is ours, on one exchange account. Your mix of sites and creatives could look different.
- Partial coverage. Every covered audit run hit the exchange's 5,000-row report cap. The low-spend tail is not in the numbers.
- Clicks are not visits. In the latest window we recorded 292 unique landing sessions against 46 billed clicks. Those are different meters, so the audit marks the click-to-visit ratio unreliable instead of reading it as a great result.
- The grade is beta and it is our reading. The thresholds ($5 and 500 impressions for zero-click spend, 5x the account's normal click-through rate for implausible clicks) are choices we made, not industry standards.
- Why September spend fell. Daily spend slid from $26.69 on September 14 to $15.95 on September 23. That was not the experiments. Each September test campaign had a $60 lifetime cap, and daily caps overshoot (they spent $2.20 to $3.00 a day against $2.00), so they ran out in 16 to 20 days instead of 30. Two finished on September 19 and 21, three were paused on September 17, and one had its line switched off at the exchange on September 10 while our dashboard still said it was running. We found that last one on September 24. It is the same kind of silent stop we have written about before, and we are adding a check that compares the two sides every day.
Run the same audit on your own campaign
If you are running display ads, or thinking about it, you can run the same nightly check on your own delivery and read the same grade. Sign up at adprimezero.com, or have your agent run npx -y ztdsp register, then ztdsp supply-audit activate. The first covered run will tell you how much of your spend it could see and where that spend went.