Two Dead Queries and a Quarantined Ad: Why Italy's Messages-versus-Engagement Shelf Sat Empty This Cycle
Both Italy cohort pulls failed server-side and the lone spotlight ad was quarantined under thin-tier rules. What broke, what we withheld, and what reruns next.

There is no Italy messages-versus-engagement benchmark this cycle, and this piece exists to explain why rather than paper over the gap. Both cohort pulls came back empty after server-side failures, and the one ad that did surface was quarantined under thin-tier rules before it could become a story. What follows is a plain account of what broke, what we withheld, and what has to happen before the shelf can be stocked.
Two queries, two failures, zero rows
The standard Italy cycle runs two cohort pulls across a 90-day window: one for ads optimized toward messages, one for engagement. Both calls to fetchAdsCohortMetrics failed server-side before returning a single usable row. The database rejected each query with a Code 386 exception, a type mismatch, and both samples reported n=0 ads. No aggregates, no medians, no cohort rows, no platform splits. There is nothing in either result that can be cited.
When a pull dies this way, the honest sample size is zero. Zero is not a small sample with wide error bars. It is no sample at all, and no amount of framing turns it into a benchmark. The filters we intended to apply, market Italy, objectives messages and engagement, a 90-day lookback, never got the chance to select anything.
Why a thin result is not a story
Every result in this batch carried a thin tier tag, and tier discipline exists for exactly this situation. Thin means a result cannot support publication-grade claims, so its rows are set aside rather than promoted into narrative. A benchmark with one ad behind it is an anecdote wearing a benchmark's clothes, and readers would have no way to tell the difference from the headline.
The contrast with recent coverage is the point. The YouTube long-form value book, the TikTok awareness shelf, and the Instagram beauty read all went out because their pulls returned real tiers with real cohort rows behind every figure. This cycle's Italy comparison has none of that scaffolding, so it does not run. Consistency cuts both ways: the same rule that lets us publish medians with confidence forces us to stay silent when the cupboard is bare.
The one ad that surfaced, and why it stays unnamed here
The messages pull did produce one artifact: a single spotlight ad retrieved by fetchSpotlightAd. It arrived tagged thin at n=1. The rule is unambiguous, thin-tier rows get ignored, not converted into case studies, so the ad, its advertiser, and its spend and reach figures stay out of this piece. A lone creative, however large its footprint, cannot anchor medians, distributions, or a read on a market shelf. Dressing it up as a story would mean abandoning the discipline that keeps every other number on this site worth trusting. It sits in the drawer until a real cohort gives it context.
The error, in plain language
Code 386 is not an exotic failure. The query compares an id column stored as text against a numeric constant that arrived as an unsigned 64-bit integer. There is no common type the engine can coerce both sides into, so it refuses to guess, and the comparison fails, taking the whole query with it. That is why both pulls failed identically with n=0 instead of returning partial results: the comparison itself is what broke, and nothing downstream of it ever executed. Same exception shape, two different queries, one root cause.
None of this reflects anything about Italian advertisers or about the messages and engagement objectives. It is a plumbing problem in how identifiers are typed, and it produced a clean absence of data rather than a distorted one. A clean absence is at least easy to report honestly.
What happens next
The fix is mechanical: make the types match, then re-run both fetchAdsCohortMetrics calls for Italy, messages and engagement, 90-day windows. If either pull returns a small or large tier, the messages-versus-engagement shelf story becomes viable immediately, with aggregates, medians, and cohort rows cited in full. The quarantined spotlight would also regain context, since a single unit reads very differently as one row among many. Until the re-run lands, the shelf stays empty on purpose.
What operators can use in the meantime
Three practical notes while the corrected queries are pending:
- Do not treat lone ads you spot in an ad library as market benchmarks. One campaign's spend or reach describes that campaign, not the shelf it sits on.
- If you are benchmarking your own Italy messaging activity this week, lean on your own account history, or wait for the corrected cohort pull rather than borrowing someone else's single data point.
- Expect the comparison piece to arrive quickly after the fix. The queries themselves are cheap; only the type mismatch was standing in the way.
An empty shelf is still information
Reporting n=0 out loud is part of the job. Knowing a shelf is unmeasured beats guessing from a sample of one, and the discipline to leave a quarantined ad in the drawer is what makes the published medians credible when they come back. The Italy messages-versus-engagement story is postponed, not cancelled, and it will run the moment the rows exist to support it.
Keep Reading
Start with one monitor. Free.
Add a brand, paste a couple of competitor handles, and see your first calibrated readout in under five minutes.