Skip to content
This repository was archived by the owner on Jun 10, 2026. It is now read-only.

Tracking

Andrey Scherbovich edited this page Aug 12, 2021 · 43 revisions

Contracts (On-chain)

All Gnosis Safe contract state and interactions on-chain can be analyzed via Dune analytics. This includes properties such as:

  • Number of Safes deployed
  • Safe version
  • Number of owners and threshold
  • Number of transactions made
  • Fund store
  • ...

Gnosis Safe dashboards on Dune are tagged with the label Gnosis Safe. There is a main dashboard and a long list of dashboards for all kinds of purposes.

Web (Off-chain)

General

  • Google analytics is used for tracking.
  • Default properties such as device types and operating system are tracked.
    • e.g. Number of unique visitors daily/weekly/monthly or time spent on page
  • The landing page is tracked separate from the app:
  • Users have to accept the analytics cookie before they show up in the tracking. We don't track users that don't accept.
  • Tracking data can best be viewed via Datastudio:

Custom events

  • Wallet connected
    • category: 'Wallets'
    • action: 'Connect a wallet'
    • label: <provider name>
  • Safe created
    • category: 'User'
    • action: 'Created a safe'
  • Navigation (category: Safe Navigation)
    • Open Safe list via Sidebar (action: Safe List Sidebar)
    • Open coins (action: Coins)
    • Open collectibles (action: Collectibles)
    • Open transactions (action: Transactions)
    • Open address book (action: AddressBook)
    • Open Safe apps (action: Apps)
      • label: <Safe app name>
    • Open settings (action: Settings)
      • Details (label: Details)
      • Owners (label: Owners)
      • Advanced (label: Advanced)

Misc

Mobile (Off-chain)

General

Custom user properties

Docs

User properties should be tracked with every single event.

num_safes

  • Integer (Tracked as String though since Firebase only allows Strings for user properties.)
  • Should be the number of Safes that the user has added on their device, across all networks.
  • Number is 0 after fresh install
  • Number is increased when adding a Safe to the device
  • Number is decreased when removing a Safe from the device.

push_info

  • string
  • unknown if we haven't asked for push access yet (iOS only since we have push permission on Android by default)
  • enabled if we have push notification permission (or enabled it after previously denying)
  • disabled if the user denied push permission (or removed it after previously allowing)

num_keys_imported

  • Integer (Tracked as String though since Firebase only allows Strings for user properties.)
  • Should be the number of imported owner keys.

num_keys_generated

  • Integer (Tracked as String though since Firebase only allows Strings for user properties.)
  • Should be the number of generated owner keys.

num_keys_walletconnect

  • Integer (Tracked as String though since Firebase only allows Strings for user properties.)
  • Should be the number of connected owner keys.

num_keys_ledger_nano_x

  • Integer (Tracked as String though since Firebase only allows Strings for user properties.)
  • Should be the number of Ledger Nano X owner keys.

passcode_is_set

  • String, “true” or “false”

wc_for_dapps_enabled

  • String, “true” or “false”

wc_for_keys_enabled

  • String, “true” or “false”

Screen view tracking

  • Every screen should be tracked as separate event.
  • These events have the prefix screen_
  • We cannot use the Firebase native screen tracking since that's not working for us on iOS with SwiftUI. There is an issue on Github for this.
  • The screen name is set as event name with a screen_ prefix. Overview screen tracking
  • There is a limit of 500 unique event names on Firebase, afterwards they get dropped (Error code 8)
  • There are some reserved names we cannot use.
  • Params:
    • chain_id (String):
      • none if the chain id is not known yet
      • Chain identifier (e.g. "1" for mainnet) if it is already known:
        • By default take it from the currently selected safe chain
        • In the flow of adding a new safe specify it as the future Safe chain id

User action tracking

  • These events have the prefix user_

user_key_imported

  • Triggered each time after successfully importing an owner key.
  • Params:
    • import_type (String): seed or key

user_key_generated

  • Triggered each time after successfully generating an owner key.

user_key_deleted

  • Triggered each time after successfully deleting an owner key.

user_transaction_confirmed

  • Triggered each time a transaction has been confirmed with an imported owner key.
  • Params:
    • chain_id (String): Chain id

user_transaction_confirmed_walletconnect

  • Triggered each time a transaction has been confirmed with a connected owner key.
  • Params:
    • chain_id (String): Chain id

user_transaction_confirmed_ledger_nano_x

  • Triggered each time a transaction has been confirmed with a Ledger Nano X owner key.
  • Params:
    • chain_id (String): Chain id

user_transaction_rejected

  • Triggered each time a transaction has been rejected with an imported owner key.
  • Params:
    • chain_id (String): Chain id

user_transaction_rejected_walletconnect

  • Triggered each time a transaction has been rejected with a connected owner key.
  • Params:
    • chain_id (String): Chain id

user_transaction_rejected_ledger_nano_x

  • Triggered each time a transaction has been rejected with a Ledger Nano X owner key.
  • Params:
    • chain_id (String): Chain id

user_transaction_executed_walletconnect

  • Triggered each time a transaction has been executed with a connected owner key.
  • Params:
    • chain_id (String): Chain id

incoming_transaction_confirmed

  • Triggered each time an incoming WalletConnect transaction has been confirmed with an imported owner key.
  • Params:
    • chain_id (String): Chain id

incoming_transaction_confirmed_wc

  • Triggered each time an incoming WalletConnect transaction has been confirmed with a connected owner key.
  • Params:
    • chain_id (String): Chain id

user_banner_owner_skip

  • Triggered when clicking the x on the banner to ask users to import their owner key.

user_banner_owner_add

  • Triggered when clicking the Add on the banner to ask users to add their owner key.

user_banner_passcode_skip

  • Triggered when clicking the x on the banner to ask users to create a passcode.

user_banner_passcode_create

  • Triggered when clicking the Create on the banner to ask users to create a passcode.

user_onboarding_owner_skip

  • Triggered when clicking the Skip during onboarding, after adding a Safe when asking users to import their owner key.

user_onboarding_owner_add

  • Triggered when clicking the Add during onboarding, after adding a Safe when asking users to add their owner key.

user_passcode_enabled

  • Triggered every time the passcode was enabled

user_passcode_disabled

  • Triggered every time the passcode was disabled (not via reset)

user_passcode_skipped

  • Triggered every time the passcode was skipped on suggestion to set it up

user_passcode_reset

  • Triggered every time the passcode was reset (not via the disable function)

user_owner_connected_installed_wallet

  • Triggered every time an owner key was connected via installed wallet on device

user_owner_connected_external_wallet

  • Triggered every time an owner key was connected via external wallet

user_dapp_connected_universal_link

  • Triggered every time a dapp was connected via universal link on same device
  • Params:
    • chain_id (String): Chain id

user_dapp_connected_pasteboard

  • Triggered every time a dapp was connected via a link in pasteboard on same device
  • Params:
    • chain_id (String): Chain id

user_dapp_connected_scan_button

  • Triggered every time a dapp was connected via a scan button
  • Params:
    • chain_id (String): Chain id

user_safe_added

  • Triggered every time a Safe was added to the app
  • Params:
    • chain_id (String): Chain id

user_safe_removed

  • Triggered every time a Safe was removed from the app
  • Params:
    • chain_id (String): Chain id

user_ledger_nano_x_key_imported

  • Triggered each time after successfully importing ledger nano x owner key.

Clone this wiki locally