CAR-607 · cur8-mob

Deal Details V3 Analytics Plan

Tracking plan for the DDV3 screens under src/screens/deal, following the onboarding conventions and the shared @ifgengineering/client-analytics package.

How analytics works in cur8-mob

Master event table

LIVE already fires in DDV3 FIX P0 fires but needs a change NEW P0 add before rollout NEW P1 engagement REUSE existing event + source prop SKIP deliberately untracked

All NEW events carry deal_id and deal_name via the shared hook. "Extra props" lists anything beyond those.

#Event (wire name)StatusTriggerExtra propsLocation
1cur8:dealDetails_pageViewedLIVEScreen mount, no owned investmentinvestment_name, source: "DDV3"deal-details.screen.tsx
2cur8:portfolioDetails_pageViewedLIVEScreen mount, owned investmentinvestment_name, source: "DDV3"deal-details.screen.tsx
3cur8:dealDetailsInvest_clickedLIVESticky CTA, add money, new commitmentcta: "investNow"|"addMoney", deal_namedeal-details.screen.tsx, useCommitmentAnalytics
4cur8:dealDescription_readLIVEDescription screen unmountmax_scroll_depth_pct, time_on_page_secondssupporting-screens/description.screen.tsx
5cur8:earningsCalendarEntryPointClickedLIVEEarnings calendar CTA (INCOME deals)is_investoroverview/hero/EarningsCalendarCta
6cur8:dealDetailsEditCommitment_clickedLIVEModify payment on payment receiptentity_name, type: "oneOff"activity-receipts/PaymentActivityV3
7cur8:dealDetailsTab_clickedFIX P0Today: Details tab tap only. Fix: both directions + swipeadd tab: "details"|"activity"deal-details.screen.tsx
8Activity timeline card clicked (existing hook)FIX P0Today: payment + reallocation rows only. Fix: all 8 receipt categoriesactivity_typeactivity/use-activity-routing.ts
9cur8:dealDetailsInvestBlocked_shownNEW P0Blocker / verify-identity / 24h-cooldown modal intercepts invest CTAreason: "kyc"|"cooldown"|"onboarding"|"closed"deal-details.screen.tsx
10cur8:dealDetailsDocument_openedNEW P0Document row in DocumentsSection or manage drawerdocument_title, document_category, action: "view"|"download"overview/sections/DocumentsSection, manage drawer
11cur8:dealDetailsWhyWeInvest_pageViewedNEW P0Why We Invest screen focussupporting-screens/why-we-invest.screen.tsx
12cur8:dealDetailsCalculator_usedNEW P1First interaction with embedded calculator, once per mountreturns-calculator/
13cur8:dealDetailsVideo_playedNEW P1Video playback startedvideo_type: "deal_video"|"webinar_replay"supporting-screens/video.screen.tsx, WebinarSection
14cur8:dealDetailsWebinar_clickedNEW P1Webinar section CTAaction: "register"|"replay"overview/sections/WebinarSection
15cur8:dealDetailsGlossary_openedNEW P1Glossary info trigger or footer buttonterm_keyoverview/glossary/GlossaryDrawer
16cur8:dealDetailsManageHolding_openedNEW P1Manage button on holding cardactivity/ManageHoldingDrawer
17cur8:dealDetailsManageHolding_optionClickedNEW P1Option chosen in manage draweroption: "manageEarnings"|"moveToIsa"|"documents"|"liquidate"activity/ManageHoldingDrawer
18cur8:dealDetailsShariaCta_clickedNEW P1"How is this sharia compliant?" CTAoverview/sections/ShariaCta
19cur8CalculatorEntryPointClickedREUSEFull calculator link under embedded calcentry_point: "deal_details"returns-calculator/
20cur8:investmentUpdate_viewed / cur8:investmentUpdatesTab_clickedREUSEInvestment update card / view alladd source: "DDV3"overview/sections/InvestmentUpdatesSlider
21cur8:dealBot_* familyREUSEDealbot open from header (existing events already fire)deal-details.screen.tsx
22Pull-to-refresh, back buttons, glossary dismiss, calculator slider ticks, "Show all activity", holding carousel swipes, bank account prompt, IF-ISA cardSKIPNoise, or covered by downstream funnel events

Downstream funnel (already instrumented, no work needed)

View
cur8:dealDetails_pageViewed with source: "DDV3"
Intent
cur8:dealDetailsInvest_clicked · drop-off visible via cur8:dealDetailsInvestBlocked_shown (new)
Flow
cur8:commitmentFlow_pageViewed + commitment step page views
Commitment
cur8:investmentCommitted
Payment
cur8:paymentConfirmed · cur8:plaidPayment_initiated|confirmed|failed
The source: "DDV3" prop on the view and intent steps is what lets Mixpanel compare old vs new deal details conversion. It must stay on every shared event.

Legacy parity check

The old screen (home/dealDetails/) fires page view, invest clicked, watchlist toggle, earnings calendar, generate statement, and deal tour. DDV3 keeps page view, invest, and earnings calendar. Watchlist, statement, and tour don't exist in DDV3, so nothing to port. If watchlist returns, cur8:watchlist_buttonClicked already exists.

Property conventions

Implementation approach

  1. Package first: add payload interfaces to packages/client-analytics/src/types.ts (AnalyticsActions) and wire-name mappings to the switch in src/index.ts. Workspace symlink means no publish step for local dev.
  2. One DRY hook: add use-deal-analytics.ts in src/screens/deal that pre-binds { deal_id, deal_name, source: "DDV3" } and exposes typed trigger functions, mirroring useCommitmentAnalytics. Components never repeat base props.
  3. Wire P0, then P1, keeping each trigger at the interaction site (component/hook), never in redux.
  4. Tests: jest contract tests asserting each trigger fires the right action key with the right props, matching the existing analytics test pattern.

QA checklist before wider FF_DEAL_DETAILS_V3 rollout

Open questions