Files
trezor-suite/suite-common/analytics
Jan Václavík 9d37d98581 feat(suite): Refactor analytics
feat(suite): Divide analytics to relevant packages

refactor(suite): Split suite-common/analytics

fix(suite): Fix errors

fix(suite): Update codeowners

fix(suite): Fix undefined in event attributes

fix(suite): Fix suite-native tests

chore: split Services for Native vs Desktop

refactor(suite): Polish @suite-common/analytics

refactor(suite): Polish @suite/analytics and @suite-native/analytics

refactor(suite): Add analytics and legacyAnalytics to extraDependencies

refactor(suite): add useAnalytics and useLegacyAnalytics for desktop/native

refactor(suite): use analytics reporting in thunks

refactor(suite): fix naming and event type

refactor(suite): Refactor existing analytics reporting

refactor(suite): Refactor existing analytics reporting

refactor(suite): Refactor existing analytics reporting in actions

refactor(suite): Delete generate docs

refactor(suite): Fix analytics in middleware

refactor(suite): Refactor useLegacyAnalytics for suite native

fix(suite): Fix errors

fix(suite): Fix errors

fix(suite): Fix issues from code review

fix(suite): Fix side effect in guideActions

refactor(suite): Create getTypedNativeLegacyAnalytics and getTypedDesktopLegacyAnalytics

fix(suite): Fix type errors

refactor(suite): Extract types from suite-common/analytics to separated package

fix(suite): Fix bugs

fix: missing shared legacy analytics type in desktop analytics type

fix(suite): Fix errors

refactor(suite): Refactor useLegacyAnalytics and useAnalytics to new package structure

fix(suite): Fix depchecks

fix(suite): Fix yarnlock and depchecks

fix(suite): Update project refs

WIP

fix: desktop services typing from extra

WIP

# Conflicts:
#	packages/suite/src/hooks/suite/useLabelingCombined.ts
#	suite-native/app/src/navigation/AppTabNavigator.tsx

# Conflicts:
#	packages/suite-desktop-ui/package.json
#	packages/suite-desktop-ui/src/support/DesktopUpdater/EarlyAccessDisable.tsx
#	packages/suite-desktop-ui/src/support/DesktopUpdater/EarlyAccessEnable.tsx
#	packages/suite-desktop-ui/tsconfig.json
#	packages/suite/src/actions/suite/suiteActions.ts
#	packages/suite/src/components/connection/BluetoothConnectionModal.tsx
#	packages/suite/src/components/connection/CantSeeTrezorModal.tsx
#	packages/suite/src/components/connection/ConnectDeviceGlobalModal.tsx
#	packages/suite/src/components/guide/Feedback.tsx
#	packages/suite/src/components/guide/Guide.tsx
#	packages/suite/src/components/guide/SupportFeedbackSelection.tsx
#	packages/suite/src/components/suite/PrerequisitesGuide/DeviceConnect.tsx
#	packages/suite/src/components/suite/bluetooth/BluetoothDeviceListItem.tsx
#	packages/suite/src/components/suite/layouts/SuiteLayout/PageHeader/GlobalSendReceive/GlobalReceiveModal/GlobalReceiveModal.tsx
#	packages/suite/src/components/suite/layouts/SuiteLayout/PageHeader/GlobalSendReceive/GlobalSendReceiveButtons.tsx
#	packages/suite/src/components/suite/layouts/SuiteLayout/PageHeader/HeaderDropdown.tsx
#	packages/suite/src/components/suite/layouts/SuiteLayout/PageHeader/TradeActions.tsx
#	packages/suite/src/components/suite/modals/ReduxModal/ConfirmValueModal/ConfirmValueModal.tsx
#	packages/suite/src/components/suite/modals/ReduxModal/TransactionReviewModal/TransactionReviewModalBodyInner.tsx
#	packages/suite/src/components/suite/modals/ReduxModal/TransactionReviewModal/TransactionReviewOutputList/TransactionReviewModalBottomContent.tsx
#	packages/suite/src/components/suite/modals/ReduxModal/UserContextModal/AddAccountModal/AddAccountButton/AddAccountButton.tsx
#	packages/suite/src/components/suite/modals/ReduxModal/UserContextModal/AddTokenModal.tsx
#	packages/suite/src/components/suite/modals/ReduxModal/UserContextModal/ApproveModal.tsx
#	packages/suite/src/components/suite/modals/ReduxModal/UserContextModal/AutoStartBeforeQuitModal.tsx
#	packages/suite/src/components/suite/modals/ReduxModal/UserContextModal/ClaimModal/ClaimModal.tsx
#	packages/suite/src/components/suite/modals/ReduxModal/UserContextModal/ConfirmUnverifiedModal.tsx
#	packages/suite/src/components/suite/modals/ReduxModal/UserContextModal/ConnectPermissionsModal.tsx
#	packages/suite/src/components/suite/modals/ReduxModal/UserContextModal/MultiShareBackupModal/MultiShareBackupModal.tsx
#	packages/suite/src/components/suite/modals/ReduxModal/UserContextModal/RevokeModal.tsx
#	packages/suite/src/components/suite/modals/ReduxModal/UserContextModal/StellarManageTokenModal.tsx
#	packages/suite/src/components/suite/modals/ReduxModal/UserContextModal/UnstakeModal/UnstakeForm/UnstakeButton.tsx
#	packages/suite/src/components/suite/modals/ReduxModal/UserContextModal/UnstakeModal/UnstakeModal.tsx
#	packages/suite/src/components/wallet/WalletLayout/AccountBanners/StakingBanner.tsx
#	packages/suite/src/components/wallet/WalletLayout/AccountTopPanel/AccountNavigation.tsx
#	packages/suite/src/hooks/settings/backends/useBackendsForm.ts
#	packages/suite/src/hooks/suite/useChangeDeviceLabel.ts
#	packages/suite/src/hooks/wallet/trading/form/useTradingExchangeForm.ts
#	packages/suite/src/hooks/wallet/trading/form/useTradingSellForm.ts
#	packages/suite/src/views/dashboard/AssetsView/AssetCard/AssetCard.tsx
#	packages/suite/src/views/dashboard/AssetsView/AssetTable/AssetRow.tsx
#	packages/suite/src/views/dashboard/DashboardFooter.tsx
#	packages/suite/src/views/dashboard/StakingDashboard/StakingDashboardAccountRow.tsx
#	packages/suite/src/views/onboarding/steps/DeviceAuthenticityStep/SecurityCheck.tsx
#	packages/suite/src/views/settings/SettingsDevice/AutoLock.tsx
#	packages/suite/src/views/settings/SettingsDevice/Brightness.tsx
#	packages/suite/src/views/settings/SettingsDevice/ChangePin.tsx
#	packages/suite/src/views/settings/SettingsDevice/DisplayRotation.tsx
#	packages/suite/src/views/settings/SettingsDevice/ForgetDevice.tsx
#	packages/suite/src/views/settings/SettingsDevice/HapticFeedback.tsx
#	packages/suite/src/views/settings/SettingsDevice/MultiShareBackup.tsx
#	packages/suite/src/views/settings/SettingsDevice/Passphrase.tsx
#	packages/suite/src/views/settings/SettingsDevice/PinProtection.tsx
#	packages/suite/src/views/settings/SettingsDevice/ThpAutoconnect.tsx
#	packages/suite/src/views/settings/SettingsDevice/WipeCode.tsx
#	packages/suite/src/views/settings/SettingsDevice/WipeDevice/WipeDeviceModal.tsx
#	packages/suite/src/views/settings/SettingsGeneral/AddressDisplay.tsx
#	packages/suite/src/views/settings/SettingsGeneral/AutoEject.tsx
#	packages/suite/src/views/settings/SettingsGeneral/BaseCurrency.tsx
#	packages/suite/src/views/settings/SettingsGeneral/BioAuthSettings.tsx
#	packages/suite/src/views/settings/SettingsGeneral/DesktopSuiteBanner.tsx
#	packages/suite/src/views/settings/SettingsGeneral/Labeling.tsx
#	packages/suite/src/views/settings/SettingsGeneral/Language.tsx
#	packages/suite/src/views/settings/SettingsGeneral/MevProtection.tsx
#	packages/suite/src/views/settings/SettingsGeneral/NetworkReserve.tsx
#	packages/suite/src/views/settings/SettingsGeneral/Theme.tsx
#	packages/suite/src/views/settings/SettingsGeneral/TorOnionLinks.tsx
#	packages/suite/src/views/suite/SwitchDevice/DeviceItem/EjectConfirmation.tsx
#	packages/suite/src/views/suite/SwitchDevice/SwitchDevice.tsx
#	packages/suite/src/views/wallet/send/Outputs/Address.tsx
#	packages/suite/src/views/wallet/send/SendRaw.tsx
#	packages/suite/src/views/wallet/staking/components/StakingDashboard/components/ClaimCard.tsx
#	packages/suite/src/views/wallet/staking/components/StakingDashboard/components/EmptyStakingCard.tsx
#	packages/suite/src/views/wallet/staking/components/StakingDashboard/components/NewProviderCard.tsx
#	packages/suite/src/views/wallet/staking/components/StakingDashboard/components/StakingCard.tsx
#	packages/suite/src/views/wallet/tokens/TokensNavigation.tsx
#	packages/suite/src/views/wallet/tokens/common/TokensTable/TokenRow.tsx
#	packages/suite/src/views/wallet/trading/common/TradingDetail/TradingDetailBuy/TradingDetailBuy.tsx
#	packages/suite/src/views/wallet/trading/common/TradingDetail/TradingDetailExchange/TradingDetailExchange.tsx
#	packages/suite/src/views/wallet/trading/common/TradingDetail/TradingDetailSell/TradingDetailSell.tsx
#	packages/suite/src/views/wallet/trading/common/TradingForm/TradingFormApproval.tsx
#	packages/suite/src/views/wallet/trading/common/TradingLayout/TradingLayoutNavigation.tsx
#	packages/suite/src/views/wallet/trading/common/TradingSelectedOffer/TradingOfferExchange/TradingOfferExchange.tsx
#	packages/suite/src/views/wallet/trading/common/TradingSelectedOffer/TradingOfferSell/TradingOfferSellTransaction.tsx
#	packages/suite/src/views/wallet/transactions/TradeBox/TradeBox.tsx
#	packages/suite/src/views/wallet/transactions/TransactionList/TransactionListActions/ExportAction.tsx
#	packages/suite/src/views/wallet/transactions/components/AccountEmpty.tsx
#	suite/e2e/package.json
#	suite/e2e/tsconfig.json
#	yarn.lock
2026-01-17 21:10:25 +01:00
..
2026-01-17 21:10:25 +01:00
2026-01-17 21:10:25 +01:00
2026-01-17 21:10:25 +01:00
2026-01-17 21:10:25 +01:00
2026-01-17 21:10:25 +01:00

Suite Analytics

This is the shared analytics package for Trezor Suite, containing all event types used across the app. It is designed to work in both web and native (mobile) environments.

Depending on your environment, you can choose one of the following packages, each with its own set of events:

// @TODO

Package Environment Events Defined In
@suite-common/analytics @suite-common ./src/events/shared
@suite/analytics @trezor/suite ./src/events/suite
@suite-native/analytics @suite-native ./src/events/suite-native

More details can be found in the company Notion where implemented events with expected attributes and other notes related to analytics can be found.

Tracking

Data from production builds (codesign branch) should be sent to:

Data from development builds should be sent to:

Add/Modify event

In case a new event has to be added or an old one has to be modified, please follow the following subsections.

What to track

Navigation between pages is not required to be tracked as it is tracked automatically by router/location-change event. However, a case when it is good to track it is when a user can get to the same location using different methods (e.g. two different buttons on the same page). All other user actions without sensitive info can be tracked. If you are in doubt, please contact our analyst.

Type declaration

All events and their properties should be declared in src/events/suite/types.ts (or in the corresponding directory for other environments). Event types should be declared in the EventType enum in src/events/suite/constants.ts. Supplementary types can be declared in src/events/suite/definitions.ts.

Reporting in code

To report an event, import analytics from the package based on your environment and initialize analytics (as soon as app starts).

// Desktop/web
import { analytics } from '@suite/analytics';
// Suite Native
import { analytics } from '@suite-native/analytics';
// Suite Common
import { analytics } from '@suite-common/analytics';

analytics.init(enabled, {
    instanceId,
    sessionId,
    environment,
    commitId,
    isDev,
    callbacks: {
        onEnable: () => ...,
        onDisable: () => ...,
    },
});

After that, you can use report method anywhere in your project scope.

// @TODO fix docs

analytics.report({
    type: 'event',
    payload: {
        attribute: attributeValue,
    },
});

Versioning

From Suite version 22.10.1, analytics uses Suite versioning. That means, that analytics version will change even if there are no changes in analytics changelog. However, there can be changes in Suite functionality, which can also change behavior of analytics.

Changelog

Add a record of change to Notion. Please use a format of previous records.

Company table

Add event to the analytics overview in the Company Notion.

How to check that events are tracked?

  1. Option: Open DevTools, navigate to Network tab, filter traffic by .log and check the Query String Parameters section
  2. Option: Get access to Keboola via access form (link in company Notion)
  3. Option: Create a modified build of app with an analytics server URL pointing to your server

Suite Native:

  1. Option: Set the environment variable EXPO_PUBLIC_IS_ANALYTICS_LOGGER_ENABLED=true and run the app. The logs will be printed to the console.