{"id":33766,"date":"2025-09-01T17:24:17","date_gmt":"2025-09-01T15:24:17","guid":{"rendered":"https:\/\/yieldbird.com\/research-hub\/?p=33766"},"modified":"2025-09-02T12:22:59","modified_gmt":"2025-09-02T10:22:59","slug":"transaction-ids-in-prebid-just-changed-heres-what-publishers-need-to-know","status":"publish","type":"post","link":"https:\/\/yieldbird.com\/research-hub\/transaction-ids-in-prebid-just-changed-heres-what-publishers-need-to-know\/","title":{"rendered":"Transaction IDs in Prebid just changed. Here\u2019s what Publishers need to know."},"content":{"rendered":"\n<div aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\nPrebid.js 10.9.0 (released 27 Aug, 2025) now generates a different Transaction ID (TID) for each Bidder. That breaks the long-standing practice where one TID was shared across exchanges\/paths for the same impression, which DSPs used to de-duplicate auctions and power SPO. The IAB Tech Lab says the change is \u201cmaterially non-compliant\u201d with OpenRTB and is calling for a collaborative fix.\n\n\n\n\n<div style=\"height:70px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2>What is a Transaction ID (TID) in programmatic?<\/h2>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\nIn OpenRTB, source.tid is an auction-level identifier meant to be the same for all participants who see the same impression opportunity &#8211; across SSPs, exchanges, and paths. Buyers use that shared key to detect duplicates and avoid bidding against themselves. The spec describes tid as \u201ccommon across all participants in this bid request.\u201d\n\n\n\n<div style=\"height:70px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2>How Prebid treated TIDs until now<\/h2>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\nPrebid exposed two places for IDs that map to this concept:\n<ul>\n \t<li><code>ortb2.source.tid<\/code>: auction identifier<\/li>\n \t<li><code>ortb2Imp.ext.tid<\/code>: impression\/Ad unit identifier<\/li>\n<\/ul>\nIf you turned them on, Prebid generated one TID per Ad unit per auction and sent the same value to every Bidder \u2013 aligning with how DSPs deduplicated requests.\n\n\n\n<div style=\"height:70px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2>The change: bidder-specific TIDs (Prebid.js 10.9.0)<\/h2>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\nOn 27 Aug, 2025, Prebid.js 10.9.0 shipped a core change: Prebid now generates unique TIDs per Bidder instead of one shared ID across all exchanges\/paths. Concretely:\n<ul>\n \t<li><code>ortb2.source.tid<\/code> is unique per Bidder<\/li>\n \t<li><code>ortb2Imp.ext.tid<\/code> is generated per Bidder \u00d7 transaction<\/li>\n \t<li>Adapter-visible <code>.auctionId<\/code>\/<code>.transactionId<\/code> now reference those ORTB2 fields<\/li>\n \t<li>Publisher-provided first-party values are ignored for these fields<\/li>\n<\/ul>\nThis change affects Prebid.js; similar logic would need separate rollout in Prebid Server.\n\n<strong>Impact:<\/strong> buyers can no longer use a shared cross-exchange TID to spot duplicates.\nThat removes the deduplication mechanism many DSPs used for SPO and bid-collision control.\nOf course, that applies only to auctions run through Prebid 10.9.0 (or newer if released when you read this article).\n\n\n\n<div style=\"height:70px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2>Standards view: IAB Tech Lab\u2019s objection<\/h2>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<blockquote>OpenRTB\u2019s intent is clear: TID should be common across participants.\nThe IAB Tech Lab publicly said Prebid\u2019s new behavior is\n\u201cmaterially non-compliant with the OpenRTB specification\u201d\nand urged the industry to address concerns through the spec process, not unilateral changes.<\/blockquote>\n\n\n\n<div style=\"height:70px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2>The Publisher perspective: risks, trade-offs, and what to do next<\/h2>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<ol>\n \t<li><strong>Yield protection vs. buyer efficiency<\/strong>\nA shared TID helps DSPs cut waste &#8211; but it can also expose your effective floors and path economics across SSPs.\nIf buyers can \u201cmap\u201d your paths, they may favor cheaper routes or avoid deals\/PMPs, pressuring net CPMs.\nBidder-specific TIDs reduce that stitching risk.<\/li>\n \t<li><strong>Privacy &amp; contractual posture<\/strong>\nSome publishers have contractual limits on data sharing and want to minimize cross-party joins that piece together\nuser or deal metadata. Prebid previously made TIDs opt-in for similar reasons;\nthe bidder-specific shift extends that posture.<\/li>\n \t<li><strong>Auction integrity means different things<\/strong>\nBuyers see integrity as avoiding duplicate auctions.\nPublishers see it as keeping competition strong without exposing pricing or path details.\nWithout a clear standard, buyers may push you to make paths more transparent for SPO.<\/li>\n \t<li><strong>Product reality: change is opt-in<\/strong>\nNothing flips on unless you enable TIDs. With 10.9.0+, enabling TIDs gives you Bidder-scoped TIDs by default;\nyou cannot force a single cross-exchange TID from Prebid.js anymore.\n(Prebid Server would need its own update to match).<\/li>\n<\/ol>\n\n\n\n<div style=\"height:70px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2>Practical guidance for Publishers<\/h2>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3>Decide at the Domain level (recommended):<\/h3>\n<ul>\n \t<li>If you enabled TIDs to help a key buyer deduplicate,\ncheck if Bidder-specific TIDs still meet their needs.\nMany DSPs will now use heuristics (GPID\/Ad unit, timestamps, SSP seller IDs) to deduplicate.<\/li>\n \t<li>If you kept TIDs <em>off<\/em> for privacy or yield, 10.9.0 helps:\nyou can enable TIDs without exposing a shared cross-SSP join key.<\/li>\n<\/ul>\n<h3>Configuration checklist (Prebid.js):<\/h3>\n<ul>\n \t<li>Audit your wrapper version. If moving to 10.9.0+, document that TIDs are Bidder-specific.<\/li>\n \t<li>If you want any TID at all, set <code>pbjs.setConfig({enableTIDs:true})<\/code>.\nKeep a runbook that explains to commercial teams what this means for SPO conversations.<\/li>\n<\/ul>\n<h3>Signals to offer instead of shared TID (case-by-case):<\/h3>\n<ul>\n \t<li>GPID (global placement) and stable Ad unit identifiers<\/li>\n \t<li>Deal hygiene: clean, consistent naming and clear package structures reduce buyer need to infer paths<\/li>\n \t<li>Server-side parity: if you use Prebid Server, coordinate with your Vendor to keep policies aligned<\/li>\n<\/ul>\nYou can also prepare a brief FAQ for demand partners explaining why your TIDs are Bidder-scoped\nand which alternative \u201cdeduplication\u201d signals you support.\n<h3>Measurement:<\/h3>\nTrack bid density, win rate, and net CPM by SSP before\/after upgrading.\nIf buyers change routing behavior, you\u2019ll see it quickly.\n\n\n\n<div style=\"height:70px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2>Where this likely lands<\/h2>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\nThere\u2019s a standards gap: OpenRTB expects one shared TID, but Prebid.js now makes TIDs Bidder-specific.\nIAB Tech Lab is calling for a joint fix.\nPossible options include publisher-controlled scope, privacy guards, or a dedup-only token.\nUntil then, expect context-based buyer deduplication and more one-off policies.\n\n\n\n<div style=\"height:70px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2>Bottom line for Publishers<\/h2>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<ul>\n \t<li>If you value yield protection\/path opacity: 10.9.0 is aligned with your goals;\nyou can enable TIDs without exposing a universal join key.<\/li>\n \t<li>If a key buyer insists on dedup via TID: align expectations &#8211;\nPrebid can\u2019t provide a cross-exchange TID client-side anymore;\noffer GPID\/placement stability and collaborate on heuristics.<\/li>\n \t<li>Stay engaged with standards: the outcome will shape SPO, privacy, and data rights for years.<\/li>\n<\/ul>\n\n\n\n<div style=\"height:70px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<footer><strong>Note for Publishers using our Prebid Stack:<\/strong>\nPrebid 10.9.0 will be gradually rolled on all websites with active Yieldbird Platform implementation\nuntil the end of September.\n\n<\/footer>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Prebid.js 10.9.0 (released 27 Aug, 2025) now generates a different Transaction ID (TID) for each Bidder. That breaks the long-standing practice where one TID was shared across exchanges\/paths for the same impression, which DSPs used to de-duplicate auctions and power SPO. The IAB Tech Lab says the change is \u201cmaterially non-compliant\u201d with OpenRTB and is calling for a collaborative fix.<\/p>\n","protected":false},"author":40,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[10],"tags":[],"class_list":["post-33766","post","type-post","status-publish","format-standard","hentry","category-programmatic-for-publishers"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/yieldbird.com\/research-hub\/wp-json\/wp\/v2\/posts\/33766","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yieldbird.com\/research-hub\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yieldbird.com\/research-hub\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yieldbird.com\/research-hub\/wp-json\/wp\/v2\/users\/40"}],"replies":[{"embeddable":true,"href":"https:\/\/yieldbird.com\/research-hub\/wp-json\/wp\/v2\/comments?post=33766"}],"version-history":[{"count":13,"href":"https:\/\/yieldbird.com\/research-hub\/wp-json\/wp\/v2\/posts\/33766\/revisions"}],"predecessor-version":[{"id":33786,"href":"https:\/\/yieldbird.com\/research-hub\/wp-json\/wp\/v2\/posts\/33766\/revisions\/33786"}],"wp:attachment":[{"href":"https:\/\/yieldbird.com\/research-hub\/wp-json\/wp\/v2\/media?parent=33766"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yieldbird.com\/research-hub\/wp-json\/wp\/v2\/categories?post=33766"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yieldbird.com\/research-hub\/wp-json\/wp\/v2\/tags?post=33766"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}