From bb3d1455f09f23ea6a3fb68485aa7cddd24eda20 Mon Sep 17 00:00:00 2001 From: Fabricio Campos Date: Wed, 4 Feb 2026 14:22:29 -0300 Subject: [PATCH] forward user properties to exposure events --- .../node/src/exposure/exposure-service.ts | 2 +- .../local/exposure/exposure-service.test.ts | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/packages/node/src/exposure/exposure-service.ts b/packages/node/src/exposure/exposure-service.ts index 896db7e..f41fe7e 100644 --- a/packages/node/src/exposure/exposure-service.ts +++ b/packages/node/src/exposure/exposure-service.ts @@ -77,7 +77,7 @@ export const toExposureEvents = ( device_id: exposure.user.device_id, event_properties: eventProperties, user_properties: { - $set: set, + $set: { ...exposure.user.user_properties, ...set }, $unset: unset, }, insert_id: `${exposure.user.user_id} ${ diff --git a/packages/node/test/local/exposure/exposure-service.test.ts b/packages/node/test/local/exposure/exposure-service.test.ts index d2f0f1c..df1607f 100644 --- a/packages/node/test/local/exposure/exposure-service.test.ts +++ b/packages/node/test/local/exposure/exposure-service.test.ts @@ -133,6 +133,38 @@ test('exposure to event as expected', async () => { } }); +test('user_properties from ExperimentUser are forwarded to exposure event', async () => { + const user: ExperimentUser = { + user_id: 'user', + device_id: 'device', + user_properties: { anonymous: true, plan: 'premium' }, + }; + const results = { + my_flag: { + key: 'treatment', + value: 'treatment', + metadata: { + segmentName: 'All Other Users', + flagType: 'experiment', + flagVersion: 1, + default: false, + }, + }, + }; + const exposure = new Exposure(user, results); + const events = toExposureEvents(exposure, DAY_MILLIS); + + expect(events.length).toEqual(1); + const event = events[0]; + + // Verify custom user_properties are included in $set + expect(event.user_properties['$set']).toEqual({ + anonymous: true, + plan: 'premium', + '[Experiment] my_flag': 'treatment', + }); +}); + test('tracking called', async () => { const logEventMock = jest.spyOn(instance, 'logEvent'); await service.track(