feat(role-manager): wire all analytics trackers and add network_id to action events - #137
Merged
Conversation
… action events Only page_view and three admin events were reaching GA4; the remaining trackers were defined but never called, and no action event carried the network. This wires every tracker at its natural call site and attaches network_id + ecosystem to all action events so adoption can be broken down per network. - useRoleManagerAnalytics: trackers take an AnalyticsNetworkContext (network_id, ecosystem) built via getAnalyticsNetworkContext(runtime) - role_granted/revoked/renounced, ownership_* and admin_* fire on mutation success in the dialog hooks - contract_selected fires on user-driven selection in useContractSelection - wallet_connected/disconnected via new WalletConnectionTracker (connector name only, never addresses) - snapshot_exported on successful export in useDashboardData - filter_applied via new useFilterAnalytics on Role Changes and Authorized Accounts (free-form values reported as set/cleared) - tests for the hook, filter analytics, wallet tracker and call sites - README: event -> params table
There was a problem hiding this comment.
Pull request overview
This PR completes Role Manager’s GA4 instrumentation by wiring previously-unused analytics trackers at their natural call sites and standardizing action events to always include network_id and ecosystem, enabling per-network adoption analysis downstream (Athena/Metabase). It also adds tracking for wallet connect/disconnect, filter usage, contract selection, and snapshot exports, with updated docs and tests under apps/role-manager.
Changes:
- Extend
useRoleManagerAnalyticsto use anAnalyticsNetworkContextand attachnetwork_id+ecosystemto all action events viagetAnalyticsNetworkContext(runtime). - Add new trackers/hooks for filter usage (
useFilterAnalytics) and wallet connect/disconnect (WalletConnectionTracker), and wire action trackers into relevant dialogs and flows. - Update README analytics documentation and expand/adjust test suites to validate new signatures and privacy constraints.
Reviewed changes
Copilot reviewed 35 out of 35 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| apps/role-manager/src/pages/RoleChanges.tsx | Wrap filter updates to emit filter_applied events for Role Changes page. |
| apps/role-manager/src/pages/AuthorizedAccounts.tsx | Emit filter_applied analytics on filter changes for Authorized Accounts page. |
| apps/role-manager/src/hooks/useRollbackAdminDelayDialog.ts | Add network context to admin_delay_change_rolled_back tracking on success. |
| apps/role-manager/src/hooks/useRoleManagerAnalytics.ts | Introduce network context + helpers; update trackers to include network_id/ecosystem. |
| apps/role-manager/src/hooks/useRevokeRoleDialog.ts | Track role_revoked on successful revoke mutation with network context. |
| apps/role-manager/src/hooks/useRenounceDialog.ts | Track ownership_renounced / role_renounced on success with network context. |
| apps/role-manager/src/hooks/useOwnershipTransferDialog.ts | Track ownership_transfer_initiated on tx success with network context. |
| apps/role-manager/src/hooks/useManageRolesDialog.ts | Track grant/revoke events for submitted role changes on multi-mutation success. |
| apps/role-manager/src/hooks/useFilterAnalytics.ts | New hook to diff filter states and emit privacy-safe filter_applied events. |
| apps/role-manager/src/hooks/useDashboardData.ts | Track snapshot_exported on successful snapshot download with network context. |
| apps/role-manager/src/hooks/useContractSelection.ts | Track user-driven contract_selected events with network + ecosystem resolution. |
| apps/role-manager/src/hooks/useChangeAdminDelayDialog.ts | Track admin_delay_change_scheduled on success with network context. |
| apps/role-manager/src/hooks/useCancelAdminTransferDialog.ts | Track admin_transfer_cancelled on success with network context. |
| apps/role-manager/src/hooks/useAssignRoleDialog.ts | Track role_granted on success with submitted role name and network context. |
| apps/role-manager/src/hooks/useAdminTransferDialog.ts | Track admin_transfer_initiated on tx success with network context. |
| apps/role-manager/src/hooks/useAcceptOwnershipDialog.ts | Track ownership_accepted on tx success with network context. |
| apps/role-manager/src/hooks/useAcceptAdminTransferDialog.ts | Track admin_transfer_accepted on tx success with network context. |
| apps/role-manager/src/hooks/index.ts | Export new analytics helpers/types and useFilterAnalytics. |
| apps/role-manager/src/hooks/tests/useSelectedContract.test.tsx | Stub analytics hook to satisfy provider requirements in contract selection tests. |
| apps/role-manager/src/hooks/tests/useRoleManagerAnalytics.test.tsx | Update analytics hook tests for network context + GA param correctness. |
| apps/role-manager/src/hooks/tests/useRevokeRoleDialog.test.tsx | Assert revoke success emits role revoke tracking with network context. |
| apps/role-manager/src/hooks/tests/useRenounceDialog.test.tsx | Add analytics assertions for renounce flows and unknown-network fallback. |
| apps/role-manager/src/hooks/tests/useOwnershipTransferDialog.test.tsx | Assert ownership transfer tracking fires with runtime network context. |
| apps/role-manager/src/hooks/tests/useManageRolesDialog.test.tsx | Assert manage roles grant/revoke analytics fire with network context. |
| apps/role-manager/src/hooks/tests/useFilterAnalytics.test.tsx | New tests for filter diffing + privacy-safe reporting and network dims. |
| apps/role-manager/src/hooks/tests/useDashboardData.test.tsx | Assert snapshot_exported tracking fires only on export success callback. |
| apps/role-manager/src/hooks/tests/useContractSelection.test.ts | Add analytics assertions for user-driven contract selections and non-tracked auto-select. |
| apps/role-manager/src/hooks/tests/useAssignRoleDialog.test.tsx | Assert grant success emits role_granted analytics with network context. |
| apps/role-manager/src/hooks/tests/useAcceptOwnershipDialog.test.tsx | Assert accept ownership success emits ownership_accepted analytics. |
| apps/role-manager/src/context/tests/ContractContext.test.tsx | Stub analytics hook for contract context test environment. |
| apps/role-manager/src/components/Analytics/WalletConnectionTracker.tsx | New component to track wallet connect/disconnect transitions with connector name. |
| apps/role-manager/src/components/Analytics/index.ts | Export WalletConnectionTracker from analytics barrel. |
| apps/role-manager/src/components/Analytics/tests/WalletConnectionTracker.test.tsx | New tests for wallet connect/disconnect events and address privacy. |
| apps/role-manager/src/App.tsx | Mount WalletConnectionTracker within providers so it can read wallet/runtime context. |
| apps/role-manager/README.md | Document analytics events, params, privacy constraints, and call sites. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
pasevin
marked this pull request as ready for review
August 25, 2026 14:21
- useFilterAnalytics: diff against a ref of the last reported filter state instead of the render closure so rapid successive updates are tracked correctly; callers now pass only the next state - WalletConnectionTracker: seed wasConnectedRef from the current status so an already-connected mount does not emit wallet_connected - tests for rapid updates, external baseline re-sync, and connected mount
pasevin
force-pushed
the
feat/analytics-wire-events
branch
from
August 25, 2026 14:28
ee509d6 to
2a01ba6
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Marketing/analytics only see
page_viewin GA4 because 12 of the 16 trackers inuseRoleManagerAnalyticswere never called, and the action events that did fire carried onlyecosystem. This PR wires every tracker at its natural call site and attachesnetwork_id+ecosystemto every action event so Stellar (and per-network) adoption can be queried in Athena/Metabase.Scope:
apps/role-manageronly.Changes
useRoleManagerAnalytics— trackers now take anAnalyticsNetworkContext({ networkId, ecosystem }), built viagetAnalyticsNetworkContext(runtime)(runtime.networkConfig.id/.ecosystem,"unknown"fallback). Every action event emitsnetwork_idandecosystem. Existing GA param names are unchanged.useCancelAdminTransferDialog):useAssignRoleDialog,useRevokeRoleDialog,useManageRolesDialog,useRenounceDialog,useOwnershipTransferDialog,useAcceptOwnershipDialog,useAdminTransferDialog,useAcceptAdminTransferDialog.contract_selected—useContractSelectiontracks user-driven selections (contract picker and select-by-id after adding a contract). Auto-selecting the first contract on load is not tracked.wallet_connected/wallet_disconnected— newWalletConnectionTracker(mounted inApp.tsx) reports connect/disconnect transitions with the connector name (MetaMask,Freighter, …).snapshot_exported—useDashboardDatapassesonSuccesstouseExportSnapshot(format: "json").filter_applied— newuseFilterAnalytics(page)hook used on Role Changes and Authorized Accounts; one event per changed filter field.apps/role-manager/README.mdgets an Analytics section with the table below.useFilterAnalyticsandWalletConnectionTracker; tracker assertions added to the assign/revoke/manage/renounce/ownership/accept-ownership/contract-selection/dashboard tests.Privacy
contract_addressis sent oncontract_selectedonly.searchQuery, date bounds) is reported asset/cleared— a search string may be an address. Enumerated filters report the selected option.Event → params
page_viewpage_title,page_path(shareduseAnalytics)TrackedRouteon every route rendercontract_selectedcontract_address,network_id,ecosystemuseContractSelection— user picks a contract / selects by idwallet_connectedwallet_type,network_id,ecosystemWalletConnectionTrackeron connectwallet_disconnectednetwork_id,ecosystemWalletConnectionTrackeron disconnectrole_grantedrole_name,network_id,ecosystemuseAssignRoleDialog,useManageRolesDialogon tx successrole_revokedrole_name,network_id,ecosystemuseRevokeRoleDialog,useManageRolesDialogon tx successrole_renouncedrole_name,network_id,ecosystemuseRenounceDialog(typerole) on tx successownership_transfer_initiatednetwork_id,ecosystemuseOwnershipTransferDialogon tx successownership_acceptednetwork_id,ecosystemuseAcceptOwnershipDialogon tx successownership_renouncednetwork_id,ecosystemuseRenounceDialog(typeownership) on tx successadmin_transfer_initiatednetwork_id,ecosystemuseAdminTransferDialogon tx successadmin_transfer_acceptednetwork_id,ecosystemuseAcceptAdminTransferDialogon tx successadmin_transfer_cancellednetwork_id,ecosystemuseCancelAdminTransferDialogon tx successadmin_delay_change_schedulednetwork_id,ecosystemuseChangeAdminDelayDialogon tx successadmin_delay_change_rolled_backnetwork_id,ecosystemuseRollbackAdminDelayDialogon tx successsnapshot_exportedformat(json),network_id,ecosystemuseDashboardDatawhen the download succeedsfilter_appliedpage,filter_type,filter_value,network_id,ecosystemuseFilterAnalyticson Role Changes / Authorized Accountsfilter_applied:page∈ {Role Changes,Authorized Accounts};filter_typeis the filter-state key (actionFilter,statusFilter,roleFilter,searchQuery,timestampFrom,timestampTo);filter_valueis the option for enumerated filters,set/clearedfor free-form ones.Not wired (intentionally)
network_idwould always beunknown; left out to keepfilter_appliedmeaningful. Easy to add if wanted.contract_selected(it is not a user action).page_viewstill covers the session.Verification
pnpm typecheck,pnpm lint— cleanpnpm test— 55 files / 1221 tests passing