Fair warning: in today’s post, I’m going to go into fairly deep technical detail around some of the newer workflows linked to the agentic buying of advertising, as well as looking at ChatGPT ads behind the hood, and performance television (which is increasingly being pitched alongside Meta as a performance channel).
The crux of this piece is making sure that marketers are able to form a clear, fair, and truly attributable view of what’s going on behind their advertising in order to measure and ensure that you’re scaling the right activity and deprioritising the stuff that might be giving fluffy numbers on a dashboard that can’t be traced back to true source data and real biz value.
The key argument comes down to using raw data in order to form your own opinions of performance, and I’ll show you how to do that deeper down the piece. The example I gave is actually quite an interesting one of a TV platform materially underreporting its performance.
So, this goes both ways: to ensure that you’re not dealing with overinflated platform-marked homework (the easy assumption to make around what we’re talking about here!), through to making sure that a platform pixel’s inability to capture data in 2026 is not costing you the opportunity to scale a channel which is actually working well for you but which is doing a poor job of demonstrating that value.
So, diving in - measurement is the topic du jour. Every new ad channel that launched this year arrived with a measurement story.
ChatGPT Ads named 20 measurement partners on 5 October, which does a really good job of sounding like an open, measurable platform, but we’ll dive into the limitations of these partners shortly more specifically, where they sit in the measurement chain and what they can and cannot see. IAB Tech Lab’s agent-to-agent buying standard has a whole section headed Reconciliation. Performance CTV comes with a CPA column because it fancies a chunk of Meta’s over-inflated budgets. The belief underneath all three is that more reporting is the same thing as more accountability. But in the world of enterprise B2B, where contracts are usually signed over DocuSign rather than an e-commerce checkout: how do we work out which platform is really delivering to our marketing KPIs?
Having built an ad exchange, I’d put the question differently. When you spent $50,000 on that channel last month, who counted what you got? If the only answer is the company that sent the invoice, then your vendor has marked its own homework, and the one decision left to you is whether to believe the grade. As a side note, if the answer is GA4, you also need to be aware that that has a Google bias lens to it, potentially (I’m making no claims because I don’t want to get sued ;) )
New here? I’m Mike Harty. I’ve spent more than 15 years building programmatic platforms, first at PowerLinks and now at FunnelFuel, where we run account-based programmatic for B2B brands. The B2B Stack is where I write about the plumbing. Subscribe for free for one thought provoking piece a week
What you’ll learn in this article:
Why programmatic always kept two counts of every impression, and why that was the whole point
How ChatGPT Ads can have 20 measurement partners - but do they truly see enough upstream data in order to form a proper measurement opinion?
Where IAB Tech Lab’s AAMP 3.0 draft loses the receipt between the proposal and the auction and why the agentic tomorrow is not yet the agentic today
What a CRM match found that a DSP pixel missed, by a factor of eleven! This is why we shouldn’t assume that platforms always over-report, and we should form our own unbiased opinions by looking across all the media activations that we run collectively.
Why the join key is the other half of the problem, and what Apple said about it on 19 October
The log test: four questions to ask any channel or vendor before the money moves
Plus Field Notes: three more vendors marking their own homework this week, including Google’s “optional” cap and a GEO dashboard with a 9% match rate.
Programmatic Uniquely Has Two/three impression counts
when you think about digital advertising, the vast majority of money flows through Walled Gardens - the biggest of whom include Google, Meta, and LinkedIn. These are singular platforms which run an end-to-end ecosystem.
Programmatic advertising is different because it’s addressing the open internet - it’s creating a join between publishers and advertisers using advertising technology as middleware. This middleware spans technology focused on the supply side of the ecosystem (SSP’s), representing publishers, and the demand side of the ecosystem (DSPs), representing advertisers.
The thing people forget about real-time bidding (AKA programmatic advertising) is that it was built by parties who didn’t trust each other. Publishers and their SSPs didn’t trust ad networks. Networks didn’t trust DSPs. Nobody trusted the ad server. So the protocol was designed so that every impression produced more than one record: the SSP logged what it offered, the exchange logged the auction, and the DSP logged what it bid, what it won and whether the creative rendered.
This creates a unique ecosystem which has multiple streams of log-level data, giving advertisers a deeper opportunity to really understand what’s happening behind their media buy, in a way that you can frankly never achieve if you’re utilising Ward Garden inventory.
When I was building an exchange, discrepancy was a daily conversation - frankly, there never is one perfectly right answer. The three counts never agreed to the exact unit for numerous genuine reasons. Timeouts, dropped win notices, creatives that won the auction and never rendered. We set thresholds, usually a few percent, and billed to a reconciled number.¹ Nobody thought this was elegant but it was the reason the market worked. Each side kept its own record, and the invoice was settled against both.
Log-level data is the buyer’s half of that arrangement, and now, more commonly because of curation, supply-side log-level data is also typically available. A proper DSP seat gives you a row per impression: timestamp, domain or app, the bid, the clearing price, which identifiers were present. It is the file you take to the seller when the numbers don’t match. It is also the file your analyst joins to the CRM to find the deals the pixel never saw. The only excuse for not getting towards full data, or at least very detailed reporting, is if you’ve booked on an outcomes-based business model. In that case, the transaction and the billable event are the outcome that was pre-agreed, as opposed to impressions batched into advertising units - so the right for this type of data is limited by the fact you didn’t pay for it, you paid instead for an outcome.
I’ve started calling this the log test. Before the attribution model, before the dashboard, before anyone argues about incrementality, there is one question: does anybody other than the seller hold a record of what was served and what it cost? Fail that, and every number downstream is a claim made with a vested interest in getting you to spend more money
Three exhibits from the last month fail it, each in a different place.
ChatGPT Ads: one log, twenty partners
On 5 October OpenAI announced a visual ad format inside image generation, US testing from later this month, and what it called its first set of third-party measurement partners. The list is long and familiar to those of us living in the weeds: ten attribution vendors from AppsFlyer and Adjust through to Triple Whale and DV Rockerbox; Hightouch, Tealium and LiveRamp to pipe conversion data in; Fospha, Measured and INCRMNTAL for full-funnel work; Haus, Measured and WorkMagic for geo experiments. DoubleVerify and IAS are building brand-suitability pilots. OpenAI also published early results: DV Rockerbox put WeightWatchers’ attributed CPA 15.3% below its blended paid-search benchmark, and Triple Whale found 93% of Portland Leather’s ChatGPT visitors were new to the brand.
On the practitioner side the week looked different, when you take a wander through the murky world of Reddit, X, and LinkedIn threads, which are brilliant at showing us what the people who actually execute all of this are seeing and thinking.
Threads on r/adops and r/PPC on Reddit around 13 and 14 October carried a set of figures from a vendor that sells click-fraud refunds: 923 billed clicks, 58% flagged as non-human, 665 from Azure IP ranges. The inference is that the plague of automated traffic and bot traffic has made its way into LLMs. I must admit, I, for one, had assumed these environments were clean because of the gated access and the payment models behind ChatGPT. However, we must also remember that the ad programme behind ChatGPT is currently running on the free tiers - the signup journey is actually potentially easy enough to be gamed through robotic traffic - but at this stage, I can’t see what the value of that will be and who the winners will be outside of OpenAI. In programmatic advertising, this plague was linked to publishers and website owners trying to generate false page impressions in order to get paid for them. There is no such gain in ChatGPT ads
And before we cast aspersions, we should treat those as vendor numbers, unaudited, from a company whose product is finding bots and frankly, we don’t know how good it is at identifying bots against humans. The pushback in the same threads was fair: ChatGPT itself runs on Azure, so an Azure address may simply be OpenAI’s own infrastructure fetching a page. All of this, though, does go to highlight that rumblings about the authenticity of traffic coming out of LLMs are gaining posture within practitioner threads, from those closest to the stats and the data that they’re outputting. We shouldn’t rush to assume that these new environments are as clean as we would like to believe - and again, this is why we need to get closer to log-level data in order to perform our own validations around the authenticity of the traffic
B2B testers reported a plainer problem: clicks arrived, demo bookings didn’t. The marketer is first left trying to work out if it was a poorly constructed ad campaign that caused the lack of performance, a messaging issue, or some other wider delivery problem. Or is the wider problem that they were partially buying non-human traffic. Verifying that without access to logs is incredibly difficult
Now apply the log test. Every one of those twenty partners sits downstream of OpenAI’s pixel and conversions API. They can tell you what happened on your site after a click OpenAI says it sent. None of them can truly tell you whether the click came from a person, because the only record of the click lives with OpenAI. The vendor with the refund product has an incentive to find bots. OpenAI has an incentive not to. In programmatic that argument gets settled by putting two files side by side. Here there is one file, and the 5 October announcement said nothing about invalid traffic. I also can’t find a public ad library, which means you can’t even see what your competitors are running.
There’s a B2B-specific wrinkle underneath. ChatGPT serves ads on the Free and Go plans. The people who sign six-figure software contracts tend to sit on Team or Enterprise seats their company pays for. So the person your ad can reach and the person who buys are separated by the pricing page. That’s an inventory gap, and no measurement partner can see it from where they sit. All of this should help us temper our expectations around what ChatGPT ads can realistically deliver for B2B buyers right now
AAMP 3.0: the agent reads 71 fields and still can’t find the receipt
In this section, we’re going to look at agentic advertising. The premise is taking humans out of the loop and allowing agents to negotiate between themselves to find the right placements at the right time for each advertiser that they represent. As a side note, there are a number of different rival protocols in play at the moment, and this is an emerging space within digital advertising, lacking the maturity to really jump into with two feet first. It’s also pretty complex and pretty new stuff, so hang on and bear with me if this is feeling a bit too technical - I’ll get to the wider point shortly
IAB Tech Lab published AAMP 3.0 on 22 September with a draft specification called OpenProposal, and the public comment window closed on 22 October. OpenProposal is the object a seller’s agent uses to describe what it is selling so a buyer’s agent can score it against a brief at machine speed: 71 fields under 11 headers, each field carrying one of seven mutability markers (immutable, seller-set, selectable, settable, supplied, requestable, derived), and only three of the 71 needing a round trip with the other side. All very complex, all very ad tech, and all very cutting edge.
The design claim, in the repository’s own words, is that composition is constraint satisfaction rather than negotiation. The lifecycle runs Publish, Discover, Compare, Qualify, Negotiate, Bind and Execute, Report, and execution lands in whichever existing standard the line item maps to: OpenDirect 2.1, the Deals API or OpenRTB 2.6.
I want this to work. FunnelFuel is building agent-facing tooling over our own account graph, so what follows is an argument about where the log lives. I’m for the agents.
The sharpest critique I’ve read came via a developer analysis that Deniz Genc summarised on 5 October. Once the accepted path is programmatic, execution is still an OpenRTB bid request and response on whatever exchange is already running. Nothing in that message pair identifies which proposal won. There is no proposal identifier and no pointer to the version of the brief that was scored. The worked example is CTV: a brief asks for 15 and 30 second spots, the proposal is scored on exactly those lengths, and the buyer’s agent then builds the auction call from a template that still carries a five-to-sixty second duration range. A DSP can legitimately return a 45 second creative. Every constraint agreed at the comparison stage disappears at the auction hop, and nothing in the protocol notices.
Reconciliation is a header in the specification and a gap in the protocol. The Report stage flows back through existing reporting standards, which is a polite way of saying it flows back through whoever already holds the log. If the buyer’s agent can’t prove the impression it won is the line item it accepted, the settlement reference points at the seller’s record by default.
@pesach_lattin put the economics in one line on X: agents don’t raise CPMs, they find the floor. I’d add that the floor gets found by whichever party holds the more complete record. Agentic buying, in this draft, keeps the black box and changes who writes the proposal. If the comment period didn’t produce a proposal handle in the bid request, the first revision needs one.
If you know the person who’ll be asked to “pilot agentic buying” next quarter, send them this before they sign the statement of work.
Performance CTV: the pixel counted 109, the CRM found 1,250
David Nyurenberg of InterMedia Advertising wrote an open letter on AdExchanger on 13 October asking performance CTV companies to stop promising that television now behaves like Meta.
First, InterMedia and Adstra tested IP-based ZIP code targeting and found only 23% of residential IPs reached the intended ZIP. Device-level CTV identifiers held up far better. Second, for a DTC advertiser where 63% of purchases happen on an iPhone, the DSP pixel recorded 109 completed checkouts on a recent campaign. When the agency matched impression IPs against the advertiser’s own CRM logs instead, it found 1,250.
That anecdote is the log test in miniature. The pixel is the platform’s count, built on whatever identity match the platform could make. The CRM match is the buyer’s count. The buyer’s count was eleven times larger. Whichever number you believe, the decision to keep or cut CTV was about to be made on the small one, and the small one measures the pixel, not the television. This is probably emblematic of the problem with measurement in 2026. Even when you’ve got a TV-based platform trying to present itself in the best light possible, it’s potentially underreporting its own impact by an order of magnitude - and therefore, you can see the value of running this exercise, both from an over- and under-reporting point of view. Based on the TV platform’s own data, you might be turning the campaign off, but based on the log-level testing, you might be scaling it up
For B2B the pixel catches even less. The conversion is a form fill three weeks later, on a laptop, from an office IP range that no household graph has ever seen, by a colleague of the person who watched the ad. The only count that means anything is the account-level one: did the companies we reached show up in pipeline at a higher rate than the companies we held out? That is a match you run yourself, against your own CRM, with your own list. It is also, in my experience, the only CTV number a CFO will accept twice.
Nyurenberg names the next problem himself: iCloud Private Relay already hid the iPhone IPs that connected a TV exposure to a mobile conversion, and Apple’s WebKit changes now reach LiveRamp, UID2 and ID5. Which brings us to the other half of the test.
The key is the other half
Two things make a log worth having: who holds it, and what identifier it’s keyed on. On 19 October Apple moved the second one.
The WebKit team published an explainer for the identity-resolution blocking that ships in iOS, iPadOS, macOS and visionOS 27. The mechanism it describes is the one the whole post-cookie industry runs on: a third-party script on a login or newsletter form captures the email address, sends it to a central server, mints an opaque ID bound to that email and hands it back to the page. Logging out doesn’t remove it. Then comes the sentence that matters for every “first-party” identity pitch you’ve sat through. Even when the graph is scoped to a single company’s data, WebKit says, the central resolver is a third party operating as a clearinghouse. Safari now blocks those domains at the network level.
Essentially, Apple is rug-pulling the whole identity fabric of the open internet.
The join key, the identifier that links a record on one site to a record on another, is what Apple has decided a tracker is. Server-side resolution was sold as the privacy-safe version of the same thing. Under this definition the location of the server is irrelevant. If a central resolver holds the key, it’s a third party, whoever’s data it holds.²
An account graph that resolves to companies sits on the other side of that line, which I argued at length in the account graph piece.
The Account Graph Is Not an Identity Graph
Most of the industry uses “account graph” and “identity graph” as if they’re the same asset wearing two names. They aren’t. One of them is a genuinely rare thing to build properly, and it isn’t the one that gets the coverage number printed on the sales deck.
The key is a firmographic entity. Nobody’s email address is involved. Its source is public record and your own CRM. You can hold it yourself. I run a company whose core asset is exactly that kind of graph, so weigh my enthusiasm accordingly, but the structural point stands without me: a key you hold, resolved to a company, survives 19 October. A key a vendor holds, resolved to a person, doesn’t.
The same custody question applies to the signals you pay for, including intent. One cold-email operator on X this week wrote that “surging on CRM software” usually means one intern googled something.
The pushback from r/SalesOperations was that the real problem is data modelling and DataOps on the buyer’s side. Both are right, and they’re describing the same failure from two ends.
A signal that arrives without a source, a date and an expiry is a rumour. Put a rumour in a CRM field and an SDR will read it as a fact. That is what often happens with intent
Meanwhile a sales-ops team on Reddit described paying Clay and ZoomInfo and still building its own job-change tracking in Claude, because so much enrichment traces back to the same handful of upstream providers. Three vendors, one underlying row, three invoices. Call that duplication, not diversification.
And this applies to managed service, mine included. If your programmatic partner won’t hand you the delivery file and an account-level match for you to map against your CRM, you’ve rebuilt the same problem with a friendlier logo on it. Ask for both. If you ask us, you’ll get both.
The log test
Here is the test in full. Put it to any channel, platform or data vendor before the money moves.
Who holds the count? Is there a record of what was served and what it cost that the seller doesn’t control? A DSP seat with log-level data passes.
What does it reconcile against? Can the outcome be matched to something you own, such as your CRM or your own server logs? A pixel reconciles against nothing. A CRM match does.
Does the paperwork travel? Do the terms you agreed survive into execution, and does every signal carry a source, a date and an expiry? If the proposal has no handle in the bid request, or the intent score has no timestamp, the answer is no.
Who holds the key? If an identifier links your records to someone else’s, who holds it, and is it a person’s email or a company? Since 19 October that question has an answer in Safari.
Two rules follow. A channel that fails questions one and two gets test budget to learn, never scale budget on the strength of its own CPA. A vendor that fails three and four goes into the CRM as a note, not a field.
Here’s where I’ll plant the flag. A channel that won’t give you a log you can reconcile isn’t a media buy. It’s a subscription with a dashboard. Most of the market will keep spending on those anyway, because the CPA looks good and the quarter is short, and I understand why. But if ChatGPT Ads showed you a CPA 15% below search and declined to show you the log, would you scale it? I wouldn’t. Tell me in the comments why I’m wrong, and what you’d need to see in the file before you did.
Field Notes
Three more cases from the week of 13 October where the vendor sets the exam, sits it and marks it.
Google’s “optional” cap, 14 October. Google Ads introduced channel prioritisation and a percentage budget cap for low-priority channels such as search partners and the Display Network. Both are described, in the blog post and the help page, as best-effort. From February 2027, Search campaigns using Display migrate automatically, and Google’s suggested way to keep today’s behaviour is to set Display to low priority at 50%. Practitioners on r/PPC summed it up as “sure google, very optional”. A cap that aims rather than binds is a target, and the platform grades whether it hit it. Read alongside August’s change that moves budget-limited campaigns toward their target CPA instead of letting them beat it, the pattern is clear enough: Google now decides what performance you’re allowed to have, and reports it to you.
GEO dashboards, threads from 16 to 19 October. Across r/GEO_optimization, r/aeo and r/DigitalMarketing, practitioners compared notes on AI-visibility tools. One agency found its roughly 200 tracked prompts matched real Search Console queries 9% of the time. Another worked out that appearing in four of ten runs gives a confidence interval of 17% to 69%. A third found 89% of URLs cited by ChatGPT were cited on a single day and never again. Much of the underlying data comes from the vendors themselves, so treat it as directional. The structure is the problem: the vendor chooses the prompts, then scores its own visibility against them. Before paying for AI visibility, ask for the prompt list and the Search Console overlap. If the overlap is near 9%, you’re buying a horoscope with a login.
LinkedIn’s suggested audiences, X, 19 and 20 October. @kaleighf posted that LinkedIn’s suggested audiences beat her own ICP targeting; the measure was impressions. @Simon_Akrouche replied that more impressions may not mean more conversions. @kamilrextin then did the arithmetic that should sit on every B2B media plan: 1,200 target accounts times eight people on the committee is 9,600 buyers, so $5,000 makes you faintly familiar to a few hundred of them. When a platform grades its own suggestion on its own inventory, the metric it picks is the one it sells. The useful number is that denominator, and LinkedIn is one channel against it. I wrote about why the rest of the committee lives elsewhere in [LINK: The Buying Committee Doesn’t Live on LinkedIn].
Are you about to sign off spend on a channel that hasn’t shown you a log?
FunnelFuel runs B2B programmatic in advanced ways: as a full managed service, or as a bespoke fit alongside an in-house team. If you want to see what a proper delivery file and an account-level CRM match look like on your own accounts, I’ll walk you through ours: funnelfuel.io.
Connect with me on LinkedIn, DM me on Substack, or reply to this email (mike@funnelfuel.io).
No pitch, no obligation. If the log test is useful on its own, take it and use it.
¹ Discrepancy thresholds were never standardised, but the working norm across the exchanges I dealt with was that anything under a few percent got billed to the seller’s number and anything over triggered an investigation. The point was never the threshold. The point was that both sides had a number to compare.
² The day after the WebKit explainer, Digiday reported that Apple’s own ads business is growing and counted dozens of open Apple Ads roles. I’ll let you draw your own conclusion about a company that defines the tracker and sells the alternative. It doesn’t change the definition, which is the part that will outlast the headlines.
Sources: WebKit, Blocking Identity Resolution Infrastructure, 19 October 2026; David Nyurenberg, AdExchanger, 13 October 2026; PPC Land on AAMP 3.0 and the 22 October comment deadline; IAB Tech Lab OpenProposal repository; Deniz Genc on the missing proposal handle, 5 October 2026; TechCrunch on OpenAI’s 5 October measurement announcement; PPC Land on Google’s best-effort cap, 14 October 2026; practitioner threads on r/adops, r/PPC, r/SalesOperations, r/GEO_optimization, r/aeo and r/DigitalMarketing, and posts from @pesach_lattin, @MrColdEmail, @kaleighf, @Simon_Akrouche and @kamilrextin on X, 13 to 20 October 2026.



