Skip to content

Commit 9fa6e7d

Browse files
adds manual gpid to prebid ad unit and launch to 99% of users (#1651)
* adds manual gpid to prebid ad unit * fix slotconfig spec type issue * refactor to add higher definition ext object * use window config to get page details * use window config to get page details * use slot key for slot name * add 2% ab test for gpid * add gpid to 99% of users * add changeset for release * refator gpid test name * amend userVariant control logic * Update src/experiments/tests/gpid-prebid.ts Co-authored-by: Emma Imber <108270776+emma-imber@users.noreply.github.com> * extends date for test --------- Co-authored-by: Emma Imber <108270776+emma-imber@users.noreply.github.com>
1 parent ecc4e1b commit 9fa6e7d

4 files changed

Lines changed: 66 additions & 0 deletions

File tree

.changeset/tiny-rats-lay.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@guardian/commercial': patch
3+
---
4+
5+
adds gpid for 99% of users to prebid request

src/experiments/ab-tests.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { ABTest } from '@guardian/ab-core';
2+
import { gpidPrebidAdUnits } from './tests/gpid-prebid';
23
import { mpuWhenNoEpic } from './tests/mpu-when-no-epic';
34
import { newHeaderBiddingEndpoint } from './tests/new-header-bidding-endpoint';
45
import { optOutFrequencyCap } from './tests/opt-out-frequency-cap';
@@ -13,4 +14,5 @@ export const concurrentTests: ABTest[] = [
1314
mpuWhenNoEpic,
1415
optOutFrequencyCap,
1516
newHeaderBiddingEndpoint,
17+
gpidPrebidAdUnits,
1618
];
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import type { ABTest } from '@guardian/ab-core';
2+
3+
export const gpidPrebidAdUnits: ABTest = {
4+
id: 'GpidPrebidAdUnits',
5+
author: '@commercial-dev',
6+
start: '2024-11-15',
7+
expiry: '2024-12-22',
8+
audience: 2 / 100,
9+
audienceOffset: 0 / 100,
10+
audienceCriteria: '',
11+
successMeasure: 'Verify GPID is added to Prebid.js ad units',
12+
description:
13+
'Test to verify that GPID is correctly added to Prebid.js ad units.',
14+
variants: [
15+
{
16+
id: 'control',
17+
test: (): void => {
18+
/* no-op */
19+
},
20+
},
21+
{
22+
id: 'variant',
23+
test: (): void => {
24+
/* no-op */
25+
},
26+
},
27+
],
28+
canRun: () => true,
29+
};

src/lib/header-bidding/prebid/prebid.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { EventTimer } from '../../../core/event-timer';
99
import type { PageTargeting } from '../../../core/targeting/build-page-targeting';
1010
import type { Advert } from '../../../define/Advert';
1111
import { isUserInVariant } from '../../../experiments/ab';
12+
import { gpidPrebidAdUnits } from '../../../experiments/tests/gpid-prebid';
1213
import { newHeaderBiddingEndpoint } from '../../../experiments/tests/new-header-bidding-endpoint';
1314
import { getPageTargeting } from '../../build-page-targeting';
1415
import { getAdvertById } from '../../dfp/get-advert-by-id';
@@ -163,10 +164,21 @@ type BidderSettings = {
163164
magnite?: Partial<BidderSetting>;
164165
};
165166

167+
const shouldIncludeGpid = !isUserInVariant(gpidPrebidAdUnits, 'control');
168+
166169
class PrebidAdUnit {
167170
code: string | null | undefined;
168171
bids: PrebidBid[] | null | undefined;
169172
mediaTypes: PrebidMediaTypes | null | undefined;
173+
gpid?: string;
174+
ortb2Imp?: {
175+
ext: {
176+
gpid: string;
177+
data: {
178+
pbadslot: string;
179+
};
180+
};
181+
};
170182

171183
constructor(
172184
advert: Advert,
@@ -176,13 +188,31 @@ class PrebidAdUnit {
176188
this.code = advert.id;
177189
this.bids = bids(advert.id, slot.sizes, pageTargeting);
178190
this.mediaTypes = { banner: { sizes: slot.sizes } };
191+
if (shouldIncludeGpid) {
192+
this.gpid = this.generateGpid(advert, slot);
193+
this.ortb2Imp = {
194+
ext: {
195+
gpid: this.gpid,
196+
data: {
197+
pbadslot: this.gpid,
198+
},
199+
},
200+
};
201+
}
202+
179203
advert.headerBiddingSizes = slot.sizes;
180204
log('commercial', `PrebidAdUnit ${this.code}`, this.bids);
181205
}
182206

183207
isEmpty() {
184208
return this.code == null;
185209
}
210+
private generateGpid(advert: Advert, slot: HeaderBiddingSlot): string {
211+
const sectionName = window.guardian.config.page.section;
212+
const contentType = window.guardian.config.page.contentType;
213+
const slotName = slot.key;
214+
return `/59666047/gu/${sectionName}/${contentType}/${slotName}`;
215+
}
186216
}
187217

188218
declare global {

0 commit comments

Comments
 (0)