Tracking plan for the DDV3 screens under src/screens/deal, following the onboarding conventions and the shared @ifgengineering/client-analytics package.
packages/client-analytics (types.ts AnalyticsActions map + the switch in index.ts mapping action keys to wire names). No local constants files.cur8:<camelObject>_<action>, properties snake_case.useAnalytics / useTrackEvent for interactions, useScreenView for focus-based page views. track() fans out to Mixpanel (EU) and Customer.io. app: "Cur8" and channel: "mobile" auto-attach.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) | Status | Trigger | Extra props | Location |
|---|---|---|---|---|---|
| 1 | cur8:dealDetails_pageViewed | LIVE | Screen mount, no owned investment | investment_name, source: "DDV3" | deal-details.screen.tsx |
| 2 | cur8:portfolioDetails_pageViewed | LIVE | Screen mount, owned investment | investment_name, source: "DDV3" | deal-details.screen.tsx |
| 3 | cur8:dealDetailsInvest_clicked | LIVE | Sticky CTA, add money, new commitment | cta: "investNow"|"addMoney", deal_name | deal-details.screen.tsx, useCommitmentAnalytics |
| 4 | cur8:dealDescription_read | LIVE | Description screen unmount | max_scroll_depth_pct, time_on_page_seconds | supporting-screens/description.screen.tsx |
| 5 | cur8:earningsCalendarEntryPointClicked | LIVE | Earnings calendar CTA (INCOME deals) | is_investor | overview/hero/EarningsCalendarCta |
| 6 | cur8:dealDetailsEditCommitment_clicked | LIVE | Modify payment on payment receipt | entity_name, type: "oneOff" | activity-receipts/PaymentActivityV3 |
| 7 | cur8:dealDetailsTab_clicked | FIX P0 | Today: Details tab tap only. Fix: both directions + swipe | add tab: "details"|"activity" | deal-details.screen.tsx |
| 8 | Activity timeline card clicked (existing hook) | FIX P0 | Today: payment + reallocation rows only. Fix: all 8 receipt categories | activity_type | activity/use-activity-routing.ts |
| 9 | cur8:dealDetailsInvestBlocked_shown | NEW P0 | Blocker / verify-identity / 24h-cooldown modal intercepts invest CTA | reason: "kyc"|"cooldown"|"onboarding"|"closed" | deal-details.screen.tsx |
| 10 | cur8:dealDetailsDocument_opened | NEW P0 | Document row in DocumentsSection or manage drawer | document_title, document_category, action: "view"|"download" | overview/sections/DocumentsSection, manage drawer |
| 11 | cur8:dealDetailsWhyWeInvest_pageViewed | NEW P0 | Why We Invest screen focus | supporting-screens/why-we-invest.screen.tsx | |
| 12 | cur8:dealDetailsCalculator_used | NEW P1 | First interaction with embedded calculator, once per mount | returns-calculator/ | |
| 13 | cur8:dealDetailsVideo_played | NEW P1 | Video playback started | video_type: "deal_video"|"webinar_replay" | supporting-screens/video.screen.tsx, WebinarSection |
| 14 | cur8:dealDetailsWebinar_clicked | NEW P1 | Webinar section CTA | action: "register"|"replay" | overview/sections/WebinarSection |
| 15 | cur8:dealDetailsGlossary_opened | NEW P1 | Glossary info trigger or footer button | term_key | overview/glossary/GlossaryDrawer |
| 16 | cur8:dealDetailsManageHolding_opened | NEW P1 | Manage button on holding card | activity/ManageHoldingDrawer | |
| 17 | cur8:dealDetailsManageHolding_optionClicked | NEW P1 | Option chosen in manage drawer | option: "manageEarnings"|"moveToIsa"|"documents"|"liquidate" | activity/ManageHoldingDrawer |
| 18 | cur8:dealDetailsShariaCta_clicked | NEW P1 | "How is this sharia compliant?" CTA | overview/sections/ShariaCta | |
| 19 | cur8CalculatorEntryPointClicked | REUSE | Full calculator link under embedded calc | entry_point: "deal_details" | returns-calculator/ |
| 20 | cur8:investmentUpdate_viewed / cur8:investmentUpdatesTab_clicked | REUSE | Investment update card / view all | add source: "DDV3" | overview/sections/InvestmentUpdatesSlider |
| 21 | cur8:dealBot_* family | REUSE | Dealbot open from header (existing events already fire) | deal-details.screen.tsx | |
| 22 | Pull-to-refresh, back buttons, glossary dismiss, calculator slider ticks, "Show all activity", holding carousel swipes, bank account prompt, IF-ISA card | SKIP | Noise, or covered by downstream funnel events |
cur8:dealDetails_pageViewed with source: "DDV3"cur8:dealDetailsInvest_clicked · drop-off visible via cur8:dealDetailsInvestBlocked_shown (new)cur8:commitmentFlow_pageViewed + commitment step page viewscur8:investmentCommittedcur8:paymentConfirmed · cur8:plaidPayment_initiated|confirmed|failedsource: "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.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.
deal_id and deal_name (snake_case). Existing events keep their historical props (investment_name on page views); do not rename shipped events.source: "DDV3".is_committed: boolean and view: "details"|"activity".investment_name on page views but deal_name on clicks. New events standardise on deal_name + deal_id.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.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.FF_DEAL_DETAILS_V3 rolloutsource = "DDV3" filtersourcedealDetailsInvestBlocked_shown by reasondealDetailsTab_clicked semantics change (both directions + tab prop will shift counts)cur8:watchlist_buttonClicked.