From 7365038ece0947ff4ceea5050a3428ae953a1364 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 10 Apr 2026 20:03:00 +0000 Subject: [PATCH 1/3] Add collectionId to PLAYBACK_PLAY analytics events for playlist play attribution Enriches the existing Amplitude PLAYBACK_PLAY events with a collectionId property when a track is played from a playlist/album context. This enables answering "how many track plays originated from playlists" in Amplitude. Covers all collection play surfaces: - Web: collection page (play button + track row clicks) - Web: collection tiles (desktop + mobile web) - Web: queue sagas (passive next/previous within a collection) - Mobile: collection screen (play button + track list item plays) https://claude.ai/code/session_01QszUni9cixkeUCYyViirgV --- packages/common/src/models/Analytics.ts | 1 + .../CollectionScreenDetailsTile.tsx | 21 ++++++++++++------- packages/web/src/common/store/queue/sagas.ts | 15 ++++++++++--- .../track/desktop/CollectionTile.tsx | 6 ++++-- .../track/mobile/CollectionTile.tsx | 6 ++++-- .../collection-page/useCollectionPage.ts | 14 ++++++++----- 6 files changed, 44 insertions(+), 19 deletions(-) diff --git a/packages/common/src/models/Analytics.ts b/packages/common/src/models/Analytics.ts index 6f0a3c8b89c..06d938759f0 100644 --- a/packages/common/src/models/Analytics.ts +++ b/packages/common/src/models/Analytics.ts @@ -1476,6 +1476,7 @@ type PlaybackPlay = { id?: string isPreview?: boolean source: PlaybackSource + collectionId?: string } type PlaybackPause = { eventName: Name.PLAYBACK_PAUSE diff --git a/packages/mobile/src/screens/collection-screen/CollectionScreenDetailsTile.tsx b/packages/mobile/src/screens/collection-screen/CollectionScreenDetailsTile.tsx index 4f5bb3159aa..8f1daa3b6a6 100644 --- a/packages/mobile/src/screens/collection-screen/CollectionScreenDetailsTile.tsx +++ b/packages/mobile/src/screens/collection-screen/CollectionScreenDetailsTile.tsx @@ -167,12 +167,19 @@ type CollectionScreenDetailsTileProps = { | 'contentType' > -const recordPlay = (id: Maybe, play = true) => { +const recordPlay = ( + id: Maybe, + play = true, + collectionId?: Maybe +) => { track( make({ eventName: play ? Name.PLAYBACK_PLAY : Name.PLAYBACK_PAUSE, id: String(id), - source: PlaybackSource.PLAYLIST_PAGE + source: PlaybackSource.PLAYLIST_PAGE, + ...(play && collectionId != null + ? { collectionId: String(collectionId) } + : {}) }) ) } @@ -337,7 +344,7 @@ export const CollectionScreenDetailsTile = ({ recordPlay(playingTrackId, false) } else if (!isPlaying && isQueued) { dispatch(tracksActions.play()) - recordPlay(playingTrackId) + recordPlay(playingTrackId, true, numericCollectionId) recordPlaylistPlay({ collectionId: numericCollectionId, isAlbum: !!isAlbum, @@ -347,7 +354,7 @@ export const CollectionScreenDetailsTile = ({ } else if (trackCount > 0 && firstTrack) { dispatch(queueActions.clear({})) dispatch(tracksActions.play(firstTrack.uid, { isPreview })) - recordPlay(firstTrack.id) + recordPlay(firstTrack.id, true, numericCollectionId) recordPlaylistPlay({ collectionId: numericCollectionId, isAlbum: !!isAlbum, @@ -582,13 +589,13 @@ const CollectionTrackList = ({ recordPlay(id, false) } else if (playingUid !== uid) { dispatch(tracksActions.play(uid)) - recordPlay(id) + recordPlay(id, true, numericCollectionId) } else { dispatch(tracksActions.play()) - recordPlay(id) + recordPlay(id, true, numericCollectionId) } }, - [dispatch, isPlaying, playingUid] + [dispatch, isPlaying, playingUid, numericCollectionId] ) return ( Date: Fri, 10 Apr 2026 20:04:00 +0000 Subject: [PATCH 2/3] Add changeset for collectionId analytics enrichment https://claude.ai/code/session_01QszUni9cixkeUCYyViirgV --- .changeset/playlist-play-collection-id.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .changeset/playlist-play-collection-id.md diff --git a/.changeset/playlist-play-collection-id.md b/.changeset/playlist-play-collection-id.md new file mode 100644 index 00000000000..6f211903158 --- /dev/null +++ b/.changeset/playlist-play-collection-id.md @@ -0,0 +1,7 @@ +--- +"@audius/common": patch +"@audius/mobile": patch +"@audius/web": patch +--- + +Add collectionId to PLAYBACK_PLAY analytics events when a track is played from a playlist or album context From d2e179e1e31135959708f501e248527b506078bb Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 10 Apr 2026 20:10:36 +0000 Subject: [PATCH 3/3] Fix lint formatting in queue sagas https://claude.ai/code/session_01QszUni9cixkeUCYyViirgV --- packages/web/src/common/store/queue/sagas.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/packages/web/src/common/store/queue/sagas.ts b/packages/web/src/common/store/queue/sagas.ts index 87b6cfea353..36545b7a4da 100644 --- a/packages/web/src/common/store/queue/sagas.ts +++ b/packages/web/src/common/store/queue/sagas.ts @@ -418,13 +418,11 @@ function* watchNext() { playerBehavior }) ) - const queueCollectionId = yield* select(getCollectionId) + const collId = yield* select(getCollectionId) const event = make(Name.PLAYBACK_PLAY, { id: `${id}`, source: PlaybackSource.PASSIVE, - ...(queueCollectionId - ? { collectionId: queueCollectionId } - : {}) + ...(collId ? { collectionId: collId } : {}) }) yield* put(event) } @@ -512,13 +510,11 @@ function* watchPrevious() { playerBehavior }) ) - const queueCollectionId = yield* select(getCollectionId) + const collId = yield* select(getCollectionId) const event = make(Name.PLAYBACK_PLAY, { id: `${id}`, source: PlaybackSource.PASSIVE, - ...(queueCollectionId - ? { collectionId: queueCollectionId } - : {}) + ...(collId ? { collectionId: collId } : {}) }) yield* put(event) } else {