From 4991047b02ca0f5645088b937fd12322be2a193d Mon Sep 17 00:00:00 2001 From: Franco Zalamena Date: Tue, 7 Apr 2026 16:03:37 +0100 Subject: [PATCH] Fix trackInApp* functions returning 400 by preserving email/userId in payloads Stop stripping email and userId from trackInAppOpen, trackInAppClick, trackInAppClose, trackInAppDelivery, and trackInAppConsume request payloads. The authorization interceptor re-adds these fields, but removing them from the payload caused issues when the interceptor exclusion logic prevented re-addition, resulting in 400 errors. Fixes #552 Co-Authored-By: Claude Opus 4.6 --- src/events/events.test.ts | 34 +++++++++++++++++----------- src/events/inapp/events.ts | 46 +++++++++----------------------------- 2 files changed, 31 insertions(+), 49 deletions(-) diff --git a/src/events/events.test.ts b/src/events/events.test.ts index 854bfc01..230dd3e6 100644 --- a/src/events/events.test.ts +++ b/src/events/events.test.ts @@ -392,7 +392,7 @@ describe('Events Requests', () => { } }); - it('should not send up passed email or userId params', async () => { + it('should preserve email and userId in inApp payloads and strip them from non-inApp events', async () => { (global as any).localStorage = localStorageMock; const trackResponse = await track({ email: 'hello@gmail.com', @@ -471,8 +471,10 @@ describe('Events Requests', () => { JSON.parse(trackResponse.config.data).deviceInfo.appPackageName ).toBe('my-lil-site'); - expect(JSON.parse(trackClickResponse.config.data).email).toBeUndefined(); - expect(JSON.parse(trackClickResponse.config.data).userId).toBeUndefined(); + expect(JSON.parse(trackClickResponse.config.data).email).toBe( + 'hello@gmail.com' + ); + expect(JSON.parse(trackClickResponse.config.data).userId).toBe('1234'); expect( JSON.parse(trackClickResponse.config.data).deviceInfo.appPackageName ).toBe('my-lil-site'); @@ -480,8 +482,10 @@ describe('Events Requests', () => { WEB_PLATFORM ); - expect(JSON.parse(trackCloseResponse.config.data).email).toBeUndefined(); - expect(JSON.parse(trackCloseResponse.config.data).userId).toBeUndefined(); + expect(JSON.parse(trackCloseResponse.config.data).email).toBe( + 'hello@gmail.com' + ); + expect(JSON.parse(trackCloseResponse.config.data).userId).toBe('1234'); expect( JSON.parse(trackCloseResponse.config.data).deviceInfo.appPackageName ).toBe('my-lil-site'); @@ -489,8 +493,10 @@ describe('Events Requests', () => { WEB_PLATFORM ); - expect(JSON.parse(trackConsumeResponse.config.data).email).toBeUndefined(); - expect(JSON.parse(trackConsumeResponse.config.data).userId).toBeUndefined(); + expect(JSON.parse(trackConsumeResponse.config.data).email).toBe( + 'hello@gmail.com' + ); + expect(JSON.parse(trackConsumeResponse.config.data).userId).toBe('1234'); expect( JSON.parse(trackConsumeResponse.config.data).deviceInfo.appPackageName ).toBe('my-lil-site'); @@ -498,10 +504,10 @@ describe('Events Requests', () => { JSON.parse(trackConsumeResponse.config.data).deviceInfo.platform ).toBe(WEB_PLATFORM); - expect(JSON.parse(trackDeliveryResponse.config.data).email).toBeUndefined(); - expect( - JSON.parse(trackDeliveryResponse.config.data).userId - ).toBeUndefined(); + expect(JSON.parse(trackDeliveryResponse.config.data).email).toBe( + 'hello@gmail.com' + ); + expect(JSON.parse(trackDeliveryResponse.config.data).userId).toBe('1234'); expect( JSON.parse(trackDeliveryResponse.config.data).deviceInfo.appPackageName ).toBe('my-lil-site'); @@ -509,8 +515,10 @@ describe('Events Requests', () => { JSON.parse(trackDeliveryResponse.config.data).deviceInfo.platform ).toBe(WEB_PLATFORM); - expect(JSON.parse(trackOpenResponse.config.data).email).toBeUndefined(); - expect(JSON.parse(trackOpenResponse.config.data).userId).toBeUndefined(); + expect(JSON.parse(trackOpenResponse.config.data).email).toBe( + 'hello@gmail.com' + ); + expect(JSON.parse(trackOpenResponse.config.data).userId).toBe('1234'); expect( JSON.parse(trackOpenResponse.config.data).deviceInfo.appPackageName ).toBe('my-lil-site'); diff --git a/src/events/inapp/events.ts b/src/events/inapp/events.ts index 16c21d34..32cf2000 100644 --- a/src/events/inapp/events.ts +++ b/src/events/inapp/events.ts @@ -1,16 +1,11 @@ -/* eslint-disable no-param-reassign */ import { baseIterableRequest } from '../../request'; import { InAppEventRequestParams } from './types'; import { IterableResponse } from '../../types'; import { ENDPOINTS, WEB_PLATFORM } from '../../constants'; import { eventRequestSchema } from './events.schema'; -export const trackInAppClose = (payload: InAppEventRequestParams) => { - /* a customer could potentially send these up if they're not using TypeScript */ - delete (payload as any).userId; - delete (payload as any).email; - - return baseIterableRequest({ +export const trackInAppClose = (payload: InAppEventRequestParams) => + baseIterableRequest({ method: 'POST', url: ENDPOINTS.track_app_close.route, data: { @@ -25,19 +20,14 @@ export const trackInAppClose = (payload: InAppEventRequestParams) => { data: eventRequestSchema } }); -}; export const trackInAppOpen = ( payload: Omit< InAppEventRequestParams, 'clickedUrl' | 'inboxSessionId' | 'closeAction' > -) => { - /* a customer could potentially send these up if they're not using TypeScript */ - delete (payload as any).userId; - delete (payload as any).email; - - return baseIterableRequest({ +) => + baseIterableRequest({ method: 'POST', url: ENDPOINTS.track_app_open.route, data: { @@ -56,17 +46,12 @@ export const trackInAppOpen = ( ]) } }); -}; export const trackInAppClick = ( payload: Omit, sendBeacon = false -) => { - /* a customer could potentially send these up if they're not using TypeScript */ - delete (payload as any).userId; - delete (payload as any).email; - - return baseIterableRequest({ +) => + baseIterableRequest({ method: 'POST', url: ENDPOINTS.track_app_click.route, sendBeacon, @@ -82,19 +67,14 @@ export const trackInAppClick = ( data: eventRequestSchema.omit(['inboxSessionId', 'closeAction']) } }); -}; export const trackInAppDelivery = ( payload: Omit< InAppEventRequestParams, 'clickedUrl' | 'closeAction' | 'inboxSessionId' > -) => { - /* a customer could potentially send these up if they're not using TypeScript */ - delete (payload as any).userId; - delete (payload as any).email; - - return baseIterableRequest({ +) => + baseIterableRequest({ method: 'POST', url: ENDPOINTS.track_app_delivery.route, data: { @@ -113,19 +93,14 @@ export const trackInAppDelivery = ( ]) } }); -}; export const trackInAppConsume = ( payload: Omit< InAppEventRequestParams, 'clickedUrl' | 'closeAction' | 'inboxSessionId' > -) => { - /* a customer could potentially send these up if they're not using TypeScript */ - delete (payload as any).userId; - delete (payload as any).email; - - return baseIterableRequest({ +) => + baseIterableRequest({ method: 'POST', url: ENDPOINTS.track_app_consume.route, data: { @@ -144,4 +119,3 @@ export const trackInAppConsume = ( ]) } }); -};