diff --git a/enterprise/frontend/src/metabase-enterprise/application_permissions/reducer.js b/enterprise/frontend/src/metabase-enterprise/application_permissions/reducer.js
index 107e6cc042efbf07253583290833b49786303ca4..86d8ee475643fc9f91dacbb7cc11834e7a3e09ba 100644
--- a/enterprise/frontend/src/metabase-enterprise/application_permissions/reducer.js
+++ b/enterprise/frontend/src/metabase-enterprise/application_permissions/reducer.js
@@ -1,6 +1,5 @@
 import { assocIn } from "icepick";
 
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import {
   createAction,
   createThunkAction,
@@ -33,7 +32,6 @@ const UPDATE_APPLICATION_PERMISSION =
 export const updateApplicationPermission = createAction(
   UPDATE_APPLICATION_PERMISSION,
   ({ groupId, permission, value }) => {
-    MetabaseAnalytics.trackStructEvent("General Permissions", "save");
     return {
       groupId,
       permission: permission.permission,
@@ -47,8 +45,6 @@ const SAVE_APPLICATION_PERMISSIONS =
 export const saveApplicationPermissions = createThunkAction(
   SAVE_APPLICATION_PERMISSIONS,
   () => async (_dispatch, getState) => {
-    MetabaseAnalytics.trackStructEvent("General Permissions", "save");
-
     const { applicationPermissions, applicationPermissionsRevision } =
       getState().plugins.applicationPermissionsPlugin;
 
diff --git a/enterprise/frontend/src/metabase-enterprise/auth/actions.ts b/enterprise/frontend/src/metabase-enterprise/auth/actions.ts
index b225c0f2f09f2bec3d00e8162f2e076813a836f3..b489a08d139ddd39a9bbea63845cf773693deff3 100644
--- a/enterprise/frontend/src/metabase-enterprise/auth/actions.ts
+++ b/enterprise/frontend/src/metabase-enterprise/auth/actions.ts
@@ -4,7 +4,6 @@ import { redirect } from "metabase/lib/dom";
 import { getSetting } from "metabase/selectors/settings";
 import type { State } from "metabase-types/store";
 
-import { trackLoginSSO } from "./analytics";
 import { getSSOUrl } from "./utils";
 
 interface ThunkConfig {
@@ -15,8 +14,6 @@ export const LOGIN_SSO = "metabase-enterprise/auth/LOGIN_SSO";
 export const loginSSO = createAsyncThunk<void, string | undefined, ThunkConfig>(
   LOGIN_SSO,
   (redirectUrl: string | undefined, { getState }) => {
-    trackLoginSSO();
-
     const siteUrl = getSetting(getState(), "site-url");
     const ssoUrl = getSSOUrl(siteUrl, redirectUrl);
 
diff --git a/enterprise/frontend/src/metabase-enterprise/auth/analytics.ts b/enterprise/frontend/src/metabase-enterprise/auth/analytics.ts
deleted file mode 100644
index a5c9df98fa5904b5f38d12ce6587c6a065864338..0000000000000000000000000000000000000000
--- a/enterprise/frontend/src/metabase-enterprise/auth/analytics.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { trackStructEvent } from "metabase/lib/analytics";
-
-export const trackLoginSSO = () => {
-  trackStructEvent("Auth", "SSO Login Start");
-};
diff --git a/frontend/src/metabase/admin/databases/database.js b/frontend/src/metabase/admin/databases/database.js
index f22051955f0ec5bcb6c7586ceacf9cc0b8066a6e..6fde6cf7a5d1a99c733fc30d38afb8e7abd2aa4d 100644
--- a/frontend/src/metabase/admin/databases/database.js
+++ b/frontend/src/metabase/admin/databases/database.js
@@ -6,7 +6,6 @@ import { updateSetting } from "metabase/admin/settings/settings";
 import { getEngines } from "metabase/databases/selectors";
 import { getDefaultEngineKey } from "metabase/databases/utils/engine";
 import Databases from "metabase/entities/databases";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import {
   combineReducers,
   createThunkAction,
@@ -133,13 +132,12 @@ export const initializeDatabase = function (databaseId) {
 
 export const addSampleDatabase = createThunkAction(
   ADD_SAMPLE_DATABASE,
-  function (query) {
-    return async function (dispatch, getState) {
+  function () {
+    return async function (dispatch) {
       try {
         dispatch({ type: ADDING_SAMPLE_DATABASE });
         const sampleDatabase = await MetabaseApi.db_add_sample_database();
         dispatch(Databases.actions.invalidateLists());
-        MetabaseAnalytics.trackStructEvent("Databases", "Add Sample Data");
         return sampleDatabase;
       } catch (error) {
         console.error("error adding sample database", error);
@@ -153,52 +151,32 @@ export const addSampleDatabase = createThunkAction(
 export const createDatabase = function (database) {
   editParamsForUserControlledScheduling(database);
 
-  return async function (dispatch, getState) {
+  return async function (dispatch) {
     try {
       dispatch({ type: CREATE_DATABASE_STARTED });
       const action = await dispatch(Databases.actions.create(database));
       const savedDatabase = Databases.HACK_getObjectFromAction(action);
-      MetabaseAnalytics.trackStructEvent(
-        "Databases",
-        "Create",
-        database.engine,
-      );
 
       dispatch({ type: CREATE_DATABASE });
 
       return savedDatabase;
     } catch (error) {
       console.error("error creating a database", error);
-      MetabaseAnalytics.trackStructEvent(
-        "Databases",
-        "Create Failed",
-        database.engine,
-      );
       throw error;
     }
   };
 };
 
 export const updateDatabase = function (database) {
-  return async function (dispatch, getState) {
+  return async function (dispatch) {
     try {
       dispatch({ type: UPDATE_DATABASE_STARTED, payload: { database } });
       const action = await dispatch(Databases.actions.update(database));
       const savedDatabase = Databases.HACK_getObjectFromAction(action);
-      MetabaseAnalytics.trackStructEvent(
-        "Databases",
-        "Update",
-        database.engine,
-      );
 
       dispatch({ type: UPDATE_DATABASE, payload: { database: savedDatabase } });
       return savedDatabase;
     } catch (error) {
-      MetabaseAnalytics.trackStructEvent(
-        "Databases",
-        "Update Failed",
-        database.engine,
-      );
       dispatch({ type: UPDATE_DATABASE_FAILED, payload: { error } });
       throw error;
     }
@@ -208,7 +186,7 @@ export const updateDatabase = function (database) {
 // NOTE Atte Keinänen 7/26/17: Original monolithic saveDatabase was broken out to smaller actions
 // but `saveDatabase` action creator is still left here for keeping the interface for React components unchanged
 export const saveDatabase = function (database) {
-  return async function (dispatch, getState) {
+  return async function (dispatch) {
     const isUnsavedDatabase = !database.id;
     if (isUnsavedDatabase) {
       return await dispatch(createDatabase(database));
@@ -218,17 +196,13 @@ export const saveDatabase = function (database) {
   };
 };
 
-export const deleteDatabase = function (databaseId, isDetailView = true) {
-  return async function (dispatch, getState) {
+export const deleteDatabase = function (databaseId) {
+  return async function (dispatch) {
     try {
       dispatch({ type: DELETE_DATABASE_STARTED, payload: databaseId });
       await dispatch(Databases.actions.delete({ id: databaseId }));
       dispatch(push("/admin/databases/"));
-      MetabaseAnalytics.trackStructEvent(
-        "Databases",
-        "Delete",
-        isDetailView ? "Using Detail" : "Using List",
-      );
+
       dispatch({ type: DELETE_DATABASE, payload: { databaseId } });
     } catch (error) {
       console.error("error deleting database", error);
@@ -243,7 +217,7 @@ export const deleteDatabase = function (databaseId, isDetailView = true) {
 export const dismissSyncSpinner = createThunkAction(
   DISMISS_SYNC_SPINNER,
   function (databaseId) {
-    return async function (dispatch, getState) {
+    return async function () {
       try {
         await MetabaseApi.db_dismiss_sync_spinner({ dbId: databaseId });
       } catch (error) {
diff --git a/frontend/src/metabase/admin/datamodel/components/FilterPopover/FilterOptions.jsx b/frontend/src/metabase/admin/datamodel/components/FilterPopover/FilterOptions.jsx
index 5375d23f76aeee1b238096e5863c9f15b41ca5cc..0aa869128a8447e899ab59a47a30a1e8da5fa4a5 100644
--- a/frontend/src/metabase/admin/datamodel/components/FilterPopover/FilterOptions.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/FilterPopover/FilterOptions.jsx
@@ -5,7 +5,6 @@ import { t, jt } from "ttag";
 
 import CheckBox from "metabase/core/components/CheckBox";
 import CS from "metabase/css/core/index.css";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import {
   getFilterOptions,
   setFilterOptions,
@@ -72,7 +71,7 @@ export default class FilterOptions extends Component {
     return false;
   }
 
-  setOptionValue(name, value) {
+  setOptionValue(name) {
     const { filter } = this.props;
     const options = getFilterOptions(filter);
     this.props.onFilterChange(
@@ -81,12 +80,6 @@ export default class FilterOptions extends Component {
         [name]: !options[name],
       }),
     );
-    MetabaseAnalytics.trackStructEvent(
-      "QueryBuilder",
-      "Filter",
-      "SetOption",
-      name,
-    );
   }
 
   toggleOptionValue(name) {
@@ -100,7 +93,7 @@ export default class FilterOptions extends Component {
     }
     return (
       <div className={cx(CS.flex, CS.alignCenter)}>
-        {options.map(([name, option]) => (
+        {options.map(([name]) => (
           <div key={name} className={cx(CS.flex, CS.alignCenter)}>
             <CheckBox
               label={this.getOptionName(name)}
diff --git a/frontend/src/metabase/admin/datamodel/containers/SegmentApp.jsx b/frontend/src/metabase/admin/datamodel/containers/SegmentApp.jsx
index ab1b3c3ec3fcdfc691499326a792d74ae2d86051..c47d80490de647c38a9e90296c4e4f2283bb529a 100644
--- a/frontend/src/metabase/admin/datamodel/containers/SegmentApp.jsx
+++ b/frontend/src/metabase/admin/datamodel/containers/SegmentApp.jsx
@@ -6,7 +6,6 @@ import { push } from "react-router-redux";
 import { LeaveConfirmationModal } from "metabase/components/LeaveConfirmationModal";
 import Segments from "metabase/entities/segments";
 import { useCallbackEffect } from "metabase/hooks/use-callback-effect";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 
 import SegmentForm from "../components/SegmentForm";
 import { updatePreviewSummary } from "../datamodel";
@@ -38,7 +37,6 @@ const UpdateSegmentFormInner = ({
 
       try {
         await updateSegment(segment);
-        MetabaseAnalytics.trackStructEvent("Data Model", "Segment Updated");
         onChangeLocation("/admin/datamodel/segments");
       } catch (error) {
         setIsDirty(isDirty);
@@ -88,7 +86,6 @@ const CreateSegmentForm = ({
             ...segment,
             table_id: segment.definition["source-table"],
           });
-          MetabaseAnalytics.trackStructEvent("Data Model", "Segment Updated");
           onChangeLocation("/admin/datamodel/segments");
         } catch (error) {
           setIsDirty(isDirty);
diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/FieldRemappingSettings/FieldRemappingSettings.jsx b/frontend/src/metabase/admin/datamodel/metadata/components/FieldRemappingSettings/FieldRemappingSettings.jsx
index 14819c490048eddf06cff73d7adf895eafa8f752..9f48be86889ceb39b820576eb6c888cfb29b3737 100644
--- a/frontend/src/metabase/admin/datamodel/metadata/components/FieldRemappingSettings/FieldRemappingSettings.jsx
+++ b/frontend/src/metabase/admin/datamodel/metadata/components/FieldRemappingSettings/FieldRemappingSettings.jsx
@@ -10,7 +10,6 @@ import PopoverWithTrigger from "metabase/components/PopoverWithTrigger";
 import Select from "metabase/core/components/Select";
 import CS from "metabase/css/core/index.css";
 import Fields from "metabase/entities/fields";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import { getMetadataUnfiltered } from "metabase/selectors/metadata";
 import {
   hasSourceField,
@@ -125,11 +124,6 @@ class FieldRemappingSettings extends Component {
     this.clearEditingStates();
 
     if (mappingType.type === "original") {
-      MetabaseAnalytics.trackStructEvent(
-        "Data Model",
-        "Change Remapping Type",
-        "No Remapping",
-      );
       await deleteFieldDimension({ id: field.id });
       this.setState({ hasChanged: false });
     } else if (mappingType.type === "foreign") {
@@ -137,11 +131,6 @@ class FieldRemappingSettings extends Component {
       const entityNameFieldId = this.getFKTargetTableEntityNameOrNull();
 
       if (entityNameFieldId) {
-        MetabaseAnalytics.trackStructEvent(
-          "Data Model",
-          "Change Remapping Type",
-          "Foreign Key",
-        );
         await updateFieldDimension(
           { id: field.id },
           {
@@ -158,11 +147,6 @@ class FieldRemappingSettings extends Component {
         });
       }
     } else if (mappingType.type === "custom") {
-      MetabaseAnalytics.trackStructEvent(
-        "Data Model",
-        "Change Remapping Type",
-        "Custom Remappings",
-      );
       await updateFieldDimension(
         { id: field.id },
         {
@@ -183,10 +167,6 @@ class FieldRemappingSettings extends Component {
     this.clearEditingStates();
 
     if (hasSourceField(foreignKeyClause)) {
-      MetabaseAnalytics.trackStructEvent(
-        "Data Model",
-        "Update FK Remapping Target",
-      );
       await updateFieldDimension(
         { id: field.id },
         {
@@ -378,10 +358,6 @@ class ValueRemappings extends Component {
   }
 
   onSaveClick = () => {
-    MetabaseAnalytics.trackStructEvent(
-      "Data Model",
-      "Update Custom Remappings",
-    );
     // Returns the promise so that ButtonWithStatus can show the saving status
     return this.props.updateRemappings(this.state.editingRemappings);
   };
diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/SemanticTypeAndTargetPicker/SemanticTypeAndTargetPicker.tsx b/frontend/src/metabase/admin/datamodel/metadata/components/SemanticTypeAndTargetPicker/SemanticTypeAndTargetPicker.tsx
index 7f54cfcf65b08eb10c4a90054b0dee291f18c612..72317cea52e1dbbd6718a854c3829a5a58b4a3a6 100644
--- a/frontend/src/metabase/admin/datamodel/metadata/components/SemanticTypeAndTargetPicker/SemanticTypeAndTargetPicker.tsx
+++ b/frontend/src/metabase/admin/datamodel/metadata/components/SemanticTypeAndTargetPicker/SemanticTypeAndTargetPicker.tsx
@@ -7,7 +7,6 @@ import type { SelectChangeEvent } from "metabase/core/components/Select";
 import Select, { Option } from "metabase/core/components/Select";
 import AdminS from "metabase/css/admin.module.css";
 import CS from "metabase/css/core/index.css";
-import { trackStructEvent } from "metabase/lib/analytics";
 import * as MetabaseCore from "metabase/lib/core";
 import { getGlobalSettingsForColumn } from "metabase/visualizations/lib/settings/column";
 import type Field from "metabase-lib/v1/metadata/Field";
@@ -73,8 +72,6 @@ const SemanticTypeAndTargetPicker = ({
       } else {
         onUpdateField(field, { semantic_type: semanticType });
       }
-
-      trackStructEvent("Data Model", "Update Field Special-Type", semanticType);
     },
     [field, onUpdateField],
   );
@@ -84,7 +81,6 @@ const SemanticTypeAndTargetPicker = ({
       onUpdateField(field, {
         settings: { ...field.settings, currency },
       });
-      trackStructEvent("Data Model", "Update Currency Type", currency);
     },
     [field, onUpdateField],
   );
@@ -92,7 +88,6 @@ const SemanticTypeAndTargetPicker = ({
   const handleChangeTarget = useCallback(
     ({ target: { value: fk_target_field_id } }: SelectChangeEvent<FieldId>) => {
       onUpdateField(field, { fk_target_field_id });
-      trackStructEvent("Data Model", "Update Field Target");
     },
     [field, onUpdateField],
   );
diff --git a/frontend/src/metabase/admin/people/components/GroupsListing.jsx b/frontend/src/metabase/admin/people/components/GroupsListing.jsx
index b80c8a620d895fd77fabf10bef26b3288d59f5c8..535ddfb6b46e4c4fcb968222c286ef9c33263a61 100644
--- a/frontend/src/metabase/admin/people/components/GroupsListing.jsx
+++ b/frontend/src/metabase/admin/people/components/GroupsListing.jsx
@@ -18,7 +18,6 @@ import Link from "metabase/core/components/Link";
 import AdminS from "metabase/css/admin.module.css";
 import ButtonsS from "metabase/css/components/buttons.module.css";
 import CS from "metabase/css/core/index.css";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import { color } from "metabase/lib/colors";
 import {
   isDefaultGroup,
@@ -340,8 +339,6 @@ export default class GroupsListing extends Component {
 
   // TODO: move this to Redux
   async onAddGroupCreateButtonClicked() {
-    MetabaseAnalytics.trackStructEvent("People Groups", "Group Added");
-
     try {
       await this.props.create({ name: this.state.text.trim() });
       this.setState({
@@ -401,7 +398,6 @@ export default class GroupsListing extends Component {
       this.setState({ groupBeingEdited: null });
     } else {
       // ok, fire off API call to change the group
-      MetabaseAnalytics.trackStructEvent("People Groups", "Group Updated");
       try {
         await this.props.update({ id: group.id, name: group.name.trim() });
         this.setState({ groupBeingEdited: null });
@@ -416,7 +412,6 @@ export default class GroupsListing extends Component {
 
   // TODO: move this to Redux
   async onDeleteGroupClicked(group) {
-    MetabaseAnalytics.trackStructEvent("People Groups", "Group Deleted");
     try {
       await this.props.delete(group);
     } catch (error) {
diff --git a/frontend/src/metabase/admin/people/people.js b/frontend/src/metabase/admin/people/people.js
index c324eaaffbb8bb023f23edc13f7860df2455a17e..33924177010bf3c622f3d5276af83d11d813806f 100644
--- a/frontend/src/metabase/admin/people/people.js
+++ b/frontend/src/metabase/admin/people/people.js
@@ -2,7 +2,6 @@ import { assoc, dissoc } from "icepick";
 import _ from "underscore";
 
 import Users from "metabase/entities/users";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import {
   createAction,
   createThunkAction,
@@ -39,7 +38,7 @@ export const createMembership = createAction(
       user_id: userId,
       group_id: groupId,
     });
-    MetabaseAnalytics.trackStructEvent("People Groups", "Membership Added");
+
     return {
       user_id: userId,
       group_id: groupId,
@@ -53,7 +52,7 @@ export const deleteMembership = createThunkAction(
     const memberships = getMemberships(getState());
     const membership = memberships[membershipId];
     await PermissionsApi.deleteMembership({ id: membershipId });
-    MetabaseAnalytics.trackStructEvent("People Groups", "Membership Deleted");
+
     return { membershipId, groupId: membership.group_id };
   },
 );
@@ -65,7 +64,7 @@ export const updateMembership = createAction(
       ...membership,
       id: membership.membership_id,
     });
-    MetabaseAnalytics.trackStructEvent("People Groups", "Membership Updated");
+
     return membership;
   },
 );
diff --git a/frontend/src/metabase/admin/permissions/analytics.ts b/frontend/src/metabase/admin/permissions/analytics.ts
deleted file mode 100644
index 1da015b0a25632b90e938366050627eec8f7a957..0000000000000000000000000000000000000000
--- a/frontend/src/metabase/admin/permissions/analytics.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import * as MetabaseAnalytics from "metabase/lib/analytics";
-
-import { DataPermission, type TableEntityId } from "./types";
-
-const getEventPrefix = (permission: DataPermission) => {
-  const shouldUseBackwardCompatibleEventName =
-    permission === DataPermission.VIEW_DATA;
-  if (shouldUseBackwardCompatibleEventName) {
-    return "";
-  }
-
-  return `${permission}-`;
-};
-
-const getEventName = (entityId: Partial<TableEntityId>, isNative: boolean) => {
-  if (isNative) {
-    return "native";
-  }
-  if (entityId.tableId != null) {
-    return "fields";
-  } else if (entityId.schemaName != null) {
-    return "tables";
-  } else {
-    return "schemas";
-  }
-};
-
-export const trackPermissionChange = (
-  entityId: Partial<TableEntityId>,
-  permission: DataPermission,
-  isNative: boolean,
-  value: string,
-) => {
-  const prefix = getEventPrefix(permission);
-  const eventName = getEventName(entityId, isNative);
-
-  MetabaseAnalytics.trackStructEvent(
-    "Permissions",
-    `${prefix}${eventName}`,
-    value,
-  );
-};
diff --git a/frontend/src/metabase/admin/permissions/permissions.js b/frontend/src/metabase/admin/permissions/permissions.js
index 9b7f771368cb8a52b2184008feffd991879acb47..f1c7242580364e7dfd596761d4eb3d034265eb93 100644
--- a/frontend/src/metabase/admin/permissions/permissions.js
+++ b/frontend/src/metabase/admin/permissions/permissions.js
@@ -14,7 +14,6 @@ import {
 import { getGroupFocusPermissionsUrl } from "metabase/admin/permissions/utils/urls";
 import Group from "metabase/entities/groups";
 import Tables from "metabase/entities/tables";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import {
   createAction,
   createThunkAction,
@@ -28,7 +27,6 @@ import {
 import { getMetadataWithHiddenTables } from "metabase/selectors/metadata";
 import { CollectionsApi, PermissionsApi } from "metabase/services";
 
-import { trackPermissionChange } from "./analytics";
 import { DataPermissionType, DataPermission } from "./types";
 import { isDatabaseEntityId } from "./utils/data-entity-id";
 import {
@@ -117,7 +115,6 @@ export const limitDatabasePermission = createThunkAction(
           },
           value: newValue,
           entityId,
-          skipTracking: true,
         }),
       );
     }
@@ -139,14 +136,7 @@ export const UPDATE_DATA_PERMISSION =
   "metabase/admin/permissions/UPDATE_DATA_PERMISSION";
 export const updateDataPermission = createThunkAction(
   UPDATE_DATA_PERMISSION,
-  ({
-    groupId,
-    permission: permissionInfo,
-    value,
-    entityId,
-    view,
-    skipTracking,
-  }) => {
+  ({ groupId, permission: permissionInfo, value, entityId, view }) => {
     return (dispatch, getState) => {
       if (isDatabaseEntityId(entityId)) {
         dispatch(
@@ -173,15 +163,6 @@ export const updateDataPermission = createThunkAction(
         }
       }
 
-      if (!skipTracking) {
-        trackPermissionChange(
-          entityId,
-          permissionInfo.permission,
-          permissionInfo.type === DataPermissionType.NATIVE,
-          value,
-        );
-      }
-
       return { groupId, permissionInfo, value, metadata, entityId };
     };
   },
@@ -192,7 +173,6 @@ export const SAVE_DATA_PERMISSIONS =
 export const saveDataPermissions = createThunkAction(
   SAVE_DATA_PERMISSIONS,
   () => async (_dispatch, getState) => {
-    MetabaseAnalytics.trackStructEvent("Permissions", "save");
     const state = getState();
     const allGroupIds = Object.keys(state.entities.groups);
     const {
@@ -239,8 +219,6 @@ const SAVE_COLLECTION_PERMISSIONS =
 export const saveCollectionPermissions = createThunkAction(
   SAVE_COLLECTION_PERMISSIONS,
   namespace => async (_dispatch, getState) => {
-    MetabaseAnalytics.trackStructEvent("Permissions", "save");
-
     const {
       originalCollectionPermissions,
       collectionPermissions,
diff --git a/frontend/src/metabase/admin/settings/app/components/SettingsEditor/SettingsEditor.jsx b/frontend/src/metabase/admin/settings/app/components/SettingsEditor/SettingsEditor.jsx
index 10c062dbb0f039bd7d8a420a0883a071c6391194..b457c305b30d7481cb9bdfcc3dbe03696c5889b6 100644
--- a/frontend/src/metabase/admin/settings/app/components/SettingsEditor/SettingsEditor.jsx
+++ b/frontend/src/metabase/admin/settings/app/components/SettingsEditor/SettingsEditor.jsx
@@ -9,7 +9,6 @@ import { t } from "ttag";
 import _ from "underscore";
 
 import ErrorBoundary from "metabase/ErrorBoundary";
-import { prepareAnalyticsValue } from "metabase/admin/settings/utils";
 import { UpsellSSO } from "metabase/admin/upsells";
 import { AdminLayout } from "metabase/components/AdminLayout";
 import { NotFound } from "metabase/components/ErrorPages";
@@ -17,7 +16,6 @@ import SaveStatus from "metabase/components/SaveStatus";
 import AdminS from "metabase/css/admin.module.css";
 import CS from "metabase/css/core/index.css";
 import title from "metabase/hoc/Title";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import MetabaseSettings from "metabase/lib/settings";
 import { Box } from "metabase/ui";
 
@@ -141,16 +139,6 @@ class SettingsEditor extends Component {
       } else {
         this.saveStatusRef.current.setSaved();
       }
-
-      const value = prepareAnalyticsValue(setting);
-
-      MetabaseAnalytics.trackStructEvent(
-        "General Settings",
-        setting.display_name || setting.key,
-        value,
-        // pass the actual value if it's a number
-        typeof value === "number" && value,
-      );
     } catch (error) {
       console.error(error);
       const message =
@@ -159,11 +147,6 @@ class SettingsEditor extends Component {
       if (options?.onError) {
         options.onError(error, message);
       }
-      MetabaseAnalytics.trackStructEvent(
-        "General Settings",
-        setting.display_name,
-        "error",
-      );
     }
   };
 
diff --git a/frontend/src/metabase/admin/settings/components/Email/SMTPConnectionForm.tsx b/frontend/src/metabase/admin/settings/components/Email/SMTPConnectionForm.tsx
index ef5258762e5b092b77f6406dbf708a8f21478522..a45c41eeb3789bd5b9b0dba674b09c0800e38330 100644
--- a/frontend/src/metabase/admin/settings/components/Email/SMTPConnectionForm.tsx
+++ b/frontend/src/metabase/admin/settings/components/Email/SMTPConnectionForm.tsx
@@ -16,7 +16,6 @@ import {
   FormRadioGroup,
   FormSubmitButton,
 } from "metabase/forms";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import { color } from "metabase/lib/colors";
 import * as Errors from "metabase/lib/errors";
 import { useDispatch, useSelector } from "metabase/lib/redux";
@@ -128,20 +127,10 @@ export const SMTPConnectionForm = ({
     try {
       await dispatch(sendTestEmail());
       setSendingEmail("success");
-      MetabaseAnalytics.trackStructEvent(
-        "Email Settings",
-        "Test Email",
-        "success",
-      );
 
       // show a confirmation for 3 seconds, then return to normal
       setTimeout(() => setSendingEmail("default"), 3000);
     } catch (error: any) {
-      MetabaseAnalytics.trackStructEvent(
-        "Email Settings",
-        "Test Email",
-        "error",
-      );
       setSendingEmail("default");
       setTestEmailError(error?.data?.message);
     }
diff --git a/frontend/src/metabase/admin/settings/components/widgets/PublicLinksListing/PublicLinksListing.jsx b/frontend/src/metabase/admin/settings/components/widgets/PublicLinksListing/PublicLinksListing.jsx
index 58e596d006901b5cd301a906def91a1e462bfe81..0345893b937b1f792f584010d76bc96fa1c35ec5 100644
--- a/frontend/src/metabase/admin/settings/components/widgets/PublicLinksListing/PublicLinksListing.jsx
+++ b/frontend/src/metabase/admin/settings/components/widgets/PublicLinksListing/PublicLinksListing.jsx
@@ -10,7 +10,6 @@ import ExternalLink from "metabase/core/components/ExternalLink";
 import Link from "metabase/core/components/Link";
 import AdminS from "metabase/css/admin.module.css";
 import CS from "metabase/css/core/index.css";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import * as Urls from "metabase/lib/urls";
 import { getSetting } from "metabase/selectors/settings";
 import { ActionsApi, CardApi, DashboardApi } from "metabase/services";
@@ -52,10 +51,6 @@ class PublicLinksListing extends Component {
     }
   }
 
-  trackEvent(label) {
-    MetabaseAnalytics.trackStructEvent(`Admin ${this.props.type}`, label);
-  }
-
   render() {
     const { getUrl, getPublicUrl, revoke, noLinksMessage } = this.props;
     let { list, error } = this.state;
@@ -84,11 +79,7 @@ class PublicLinksListing extends Component {
                   <tr key={link.id}>
                     <td>
                       {getUrl ? (
-                        <Link
-                          to={getUrl(link)}
-                          onClick={() => this.trackEvent("Entity Link Clicked")}
-                          className={CS.textWrap}
-                        >
+                        <Link to={getUrl(link)} className={CS.textWrap}>
                           {link.name}
                         </Link>
                       ) : (
diff --git a/frontend/src/metabase/admin/settings/utils.js b/frontend/src/metabase/admin/settings/utils.js
index 6ebef8285f8f03731334d4408011ae39d91af890..3e1e79992a7b7f0f1f195e10f9f5460324571782 100644
--- a/frontend/src/metabase/admin/settings/utils.js
+++ b/frontend/src/metabase/admin/settings/utils.js
@@ -2,13 +2,6 @@ import { t } from "ttag";
 
 import MetabaseSettings from "metabase/lib/settings";
 
-// in order to prevent collection of identifying information only fields
-// that are explicitly marked as collectable or booleans should show the true value
-export const prepareAnalyticsValue = setting =>
-  setting.allowValueCollection || setting.type === "boolean"
-    ? setting.value
-    : "success";
-
 export const settingToFormField = setting => ({
   name: setting.key,
   label: setting.display_name,
diff --git a/frontend/src/metabase/admin/settings/utils.unit.spec.js b/frontend/src/metabase/admin/settings/utils.unit.spec.js
deleted file mode 100644
index a5ca55b200e7150c15524d5bff6085674eb96446..0000000000000000000000000000000000000000
--- a/frontend/src/metabase/admin/settings/utils.unit.spec.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import { prepareAnalyticsValue } from "metabase/admin/settings/utils";
-
-describe("prepareAnalyticsValue", () => {
-  const defaultSetting = { value: 120, type: "number" };
-
-  it("should return a non identifying value by default", () => {
-    expect(prepareAnalyticsValue(defaultSetting)).toBe("success");
-  });
-
-  it("should return the value of a setting marked collectable", () => {
-    expect(
-      prepareAnalyticsValue({ ...defaultSetting, allowValueCollection: true }),
-    ).toBe(defaultSetting.value);
-  });
-
-  it('should return the value of a setting with a type of "boolean" collectable', () => {
-    expect(prepareAnalyticsValue({ ...defaultSetting, type: "boolean" })).toBe(
-      defaultSetting.value,
-    );
-  });
-});
diff --git a/frontend/src/metabase/auth/actions.ts b/frontend/src/metabase/auth/actions.ts
index ee3dde0919d92422d3b3fafeba81b1846cf7ac21..1b00d93ca8d411211efa0d13cc5f10588eceeb72 100644
--- a/frontend/src/metabase/auth/actions.ts
+++ b/frontend/src/metabase/auth/actions.ts
@@ -15,12 +15,6 @@ import { getSetting } from "metabase/selectors/settings";
 import { getUser } from "metabase/selectors/user";
 import { SessionApi, UtilApi } from "metabase/services";
 
-import {
-  trackLogin,
-  trackLoginGoogle,
-  trackLogout,
-  trackPasswordReset,
-} from "./analytics";
 import type { LoginData } from "./types";
 
 export const REFRESH_LOCALE = "metabase/user/REFRESH_LOCALE";
@@ -66,7 +60,6 @@ export const login = createAsyncThunk(
     try {
       await SessionApi.create(data);
       await dispatch(refreshSession()).unwrap();
-      trackLogin();
       if (!isSmallScreen()) {
         dispatch(openNavbar());
       }
@@ -88,7 +81,6 @@ export const loginGoogle = createAsyncThunk(
     try {
       await SessionApi.createWithGoogleAuth({ token: credential });
       await dispatch(refreshSession()).unwrap();
-      trackLoginGoogle();
       if (!isSmallScreen()) {
         dispatch(openNavbar());
       }
@@ -114,7 +106,6 @@ export const logout = createAsyncThunk(
 
         dispatch(clearCurrentUser());
         await dispatch(refreshLocale()).unwrap();
-        trackLogout();
 
         if (samlLogoutUrl) {
           window.location.href = samlLogoutUrl;
@@ -123,7 +114,6 @@ export const logout = createAsyncThunk(
         await deleteSession();
         dispatch(clearCurrentUser());
         await dispatch(refreshLocale()).unwrap();
-        trackLogout();
 
         // We use old react-router-redux which references old redux, which does not require
         // action type to be a string - unlike RTK v2+
@@ -163,7 +153,6 @@ export const resetPassword = createAsyncThunk(
     try {
       await SessionApi.reset_password({ token, password });
       await dispatch(refreshSession()).unwrap();
-      trackPasswordReset();
     } catch (error) {
       return rejectWithValue(error);
     }
diff --git a/frontend/src/metabase/auth/analytics.ts b/frontend/src/metabase/auth/analytics.ts
deleted file mode 100644
index a6614c50f0e49ae699b78c0a0dfb6da867f1dfe6..0000000000000000000000000000000000000000
--- a/frontend/src/metabase/auth/analytics.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { trackStructEvent } from "metabase/lib/analytics";
-
-export const trackLogin = () => {
-  trackStructEvent("Auth", "Login");
-};
-
-export const trackLoginGoogle = () => {
-  trackStructEvent("Auth", "Google Auth Login");
-};
-
-export const trackLogout = () => {
-  trackStructEvent("Auth", "Logout");
-};
-
-export const trackPasswordReset = () => {
-  trackStructEvent("Auth", "Password Reset");
-};
diff --git a/frontend/src/metabase/dashboard/actions/auto-wire-parameters/toasts.ts b/frontend/src/metabase/dashboard/actions/auto-wire-parameters/toasts.ts
index e66af6c37a4433ff7689353d782ac7b096954be9..b85c8ce7f4c0069f4c32c22007e89edb279a2183 100644
--- a/frontend/src/metabase/dashboard/actions/auto-wire-parameters/toasts.ts
+++ b/frontend/src/metabase/dashboard/actions/auto-wire-parameters/toasts.ts
@@ -169,7 +169,7 @@ export const showAddedCardAutoWireParametersToast =
 export const closeAutoWireParameterToast =
   (toastId: string = AUTO_WIRE_TOAST_ID) =>
   (dispatch: Dispatch) => {
-    dispatch(dismissUndo({ undoId: toastId, track: false }));
+    dispatch(dismissUndo({ undoId: toastId }));
   };
 
 const autoWireToastTypes = ["filterAutoConnect", "filterAutoConnectDone"];
@@ -179,7 +179,7 @@ export const closeAddCardAutoWireToasts =
 
     for (const undo of undos) {
       if (undo.type && autoWireToastTypes.includes(undo.type)) {
-        dispatch(dismissUndo({ undoId: undo.id, track: false }));
+        dispatch(dismissUndo({ undoId: undo.id }));
       }
     }
   };
diff --git a/frontend/src/metabase/dashboard/actions/parameters.ts b/frontend/src/metabase/dashboard/actions/parameters.ts
index 75c0cfffff9e979045be1a927204e11687bbbf58..700d6abd644ffb9feb2aa8817a148b209da9389c 100644
--- a/frontend/src/metabase/dashboard/actions/parameters.ts
+++ b/frontend/src/metabase/dashboard/actions/parameters.ts
@@ -740,7 +740,7 @@ export const closeAutoApplyFiltersToast = createThunkAction(
   () => (dispatch, getState) => {
     const toastId = getAutoApplyFiltersToastId(getState());
     if (toastId) {
-      dispatch(dismissUndo({ undoId: toastId, track: false }));
+      dispatch(dismissUndo({ undoId: toastId }));
     }
   },
 );
diff --git a/frontend/src/metabase/dashboard/components/AddSeriesModal/AddSeriesModal.tsx b/frontend/src/metabase/dashboard/components/AddSeriesModal/AddSeriesModal.tsx
index bbd141e2fc4ba061192023665b9db30bd2441c20..217fbcd434fb897851d1371bba032dd28a058583 100644
--- a/frontend/src/metabase/dashboard/components/AddSeriesModal/AddSeriesModal.tsx
+++ b/frontend/src/metabase/dashboard/components/AddSeriesModal/AddSeriesModal.tsx
@@ -5,7 +5,6 @@ import { t } from "ttag";
 
 import ButtonsS from "metabase/css/components/buttons.module.css";
 import CS from "metabase/css/core/index.css";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import { color } from "metabase/lib/colors";
 import Visualization from "metabase/visualizations/components/Visualization";
 import type {
@@ -70,7 +69,6 @@ export class AddSeriesModal extends Component<Props, State> {
         series: this.state.series.filter(c => c.id !== card.id),
       });
 
-      MetabaseAnalytics.trackStructEvent("Dashboard", "Remove Series");
       return;
     }
 
@@ -86,12 +84,6 @@ export class AddSeriesModal extends Component<Props, State> {
       isLoading: false,
       series: this.state.series.concat(card),
     });
-
-    MetabaseAnalytics.trackStructEvent(
-      "Dashboard",
-      "Add Series",
-      card.display + ", success",
-    );
   };
 
   handleRemoveSeries = (_event: MouseEvent, removedIndex: number) => {
@@ -109,7 +101,6 @@ export class AddSeriesModal extends Component<Props, State> {
         ...this.state.series.slice(actualRemovedIndex + 1),
       ],
     });
-    MetabaseAnalytics.trackStructEvent("Dashboard", "Remove Series");
   };
 
   handleDone = () => {
@@ -118,11 +109,6 @@ export class AddSeriesModal extends Component<Props, State> {
       attributes: { series: this.state.series },
     });
     this.props.onClose();
-    MetabaseAnalytics.trackStructEvent(
-      "Dashboard",
-      "Edit Series Modal",
-      "done",
-    );
   };
 
   render() {
diff --git a/frontend/src/metabase/dashboard/components/AddSeriesModal/QuestionList.tsx b/frontend/src/metabase/dashboard/components/AddSeriesModal/QuestionList.tsx
index 681d2d97fda78a3c7eaf65aaf59b5d06a9764bc7..3457b05394f14e71002de848d511dfc7faf0d3e2 100644
--- a/frontend/src/metabase/dashboard/components/AddSeriesModal/QuestionList.tsx
+++ b/frontend/src/metabase/dashboard/components/AddSeriesModal/QuestionList.tsx
@@ -6,7 +6,6 @@ import { t } from "ttag";
 import EmptyState from "metabase/components/EmptyState";
 import CS from "metabase/css/core/index.css";
 import { useDebouncedValue } from "metabase/hooks/use-debounced-value";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import { SEARCH_DEBOUNCE_DURATION } from "metabase/lib/constants";
 import { CardApi } from "metabase/services";
 import type {
@@ -93,14 +92,6 @@ export const QuestionList = memo(function QuestionList({
     loadCards(debouncedSearchText, lastCard?.id);
   }, [cards, debouncedSearchText, loadCards]);
 
-  const handleSearchFocus = () => {
-    MetabaseAnalytics.trackStructEvent(
-      "Dashboard",
-      "Edit Series Modal",
-      "search",
-    );
-  };
-
   const hasQuestionsToShow = cards.length > 0;
 
   return (
@@ -111,7 +102,6 @@ export const QuestionList = memo(function QuestionList({
           value={searchText}
           leftIcon="search"
           placeholder={t`Search for a question`}
-          onFocus={handleSearchFocus}
           onChange={e => setSearchText(e.target.value)}
         />
       </SearchContainer>
diff --git a/frontend/src/metabase/dashboard/components/DashboardGrid.tsx b/frontend/src/metabase/dashboard/components/DashboardGrid.tsx
index 5886b774aa25ab1dffb56a8d98df3f3807a06f5f..2efef4eb0a9d9cc7b4602a0dd981ed542443697a 100644
--- a/frontend/src/metabase/dashboard/components/DashboardGrid.tsx
+++ b/frontend/src/metabase/dashboard/components/DashboardGrid.tsx
@@ -22,7 +22,6 @@ import {
   isQuestionDashCard,
   getVisibleCardIds,
 } from "metabase/dashboard/utils";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import {
   GRID_WIDTH,
   GRID_ASPECT_RATIO,
@@ -285,7 +284,6 @@ class DashboardGrid extends Component<DashboardGridProps, DashboardGridState> {
 
     if (changes.length > 0) {
       setMultipleDashCardAttributes({ dashcards: changes });
-      MetabaseAnalytics.trackStructEvent("Dashboard", "Layout Changed");
     }
   };
 
@@ -480,7 +478,6 @@ class DashboardGrid extends Component<DashboardGridProps, DashboardGridState> {
       action: () =>
         this.props.undoRemoveCardFromDashboard({ dashcardId: dc.id }),
     });
-    MetabaseAnalytics.trackStructEvent("Dashboard", "Remove Card");
   };
 
   onDashCardAddSeries = (dc: BaseDashboardCard) => {
diff --git a/frontend/src/metabase/dashboard/components/DashboardSidebars.tsx b/frontend/src/metabase/dashboard/components/DashboardSidebars.tsx
index cd4c19eba8a16a68f83cb73bb32d652edb9eaf7c..7297d6b9d15d285d7642ff100d10ab0076f5e5b4 100644
--- a/frontend/src/metabase/dashboard/components/DashboardSidebars.tsx
+++ b/frontend/src/metabase/dashboard/components/DashboardSidebars.tsx
@@ -7,7 +7,6 @@ import {
   getEditingParameter,
   getParameters,
 } from "metabase/dashboard/selectors";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import { useSelector } from "metabase/lib/redux";
 import { ParameterSidebar } from "metabase/parameters/components/ParameterSidebar";
 import { hasMapping } from "metabase/parameters/utils/dashboards";
@@ -126,7 +125,6 @@ export function DashboardSidebars({
         cardId: cardId,
         tabId: selectedTabId,
       });
-      MetabaseAnalytics.trackStructEvent("Dashboard", "Add Card");
     },
     [addCardToDashboard, dashboard.id, selectedTabId],
   );
diff --git a/frontend/src/metabase/dashboard/containers/AutomaticDashboardApp.jsx b/frontend/src/metabase/dashboard/containers/AutomaticDashboardApp.jsx
index 02459c67fd1cbe4fc5930207cb29459bf3286d75..2a9b8ee6122f2778d6d2224ad0bc5b2db9a405d0 100644
--- a/frontend/src/metabase/dashboard/containers/AutomaticDashboardApp.jsx
+++ b/frontend/src/metabase/dashboard/containers/AutomaticDashboardApp.jsx
@@ -20,7 +20,6 @@ import Collections from "metabase/entities/collections";
 import Dashboards from "metabase/entities/dashboards";
 import title from "metabase/hoc/Title";
 import withToast from "metabase/hoc/Toast";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import { color } from "metabase/lib/colors";
 import * as Urls from "metabase/lib/urls";
 import { ParametersList } from "metabase/parameters/components/ParametersList";
@@ -91,7 +90,6 @@ class AutomaticDashboardAppInner extends Component {
     );
 
     this.setState({ savedDashboardId: newDashboard.id });
-    MetabaseAnalytics.trackStructEvent("AutoDashboard", "Save");
   };
 
   UNSAFE_componentWillReceiveProps(nextProps) {
@@ -189,16 +187,7 @@ class AutomaticDashboardAppInner extends Component {
           </div>
           {more && (
             <div className={cx(CS.flex, CS.justifyEnd, CS.px4, CS.pb4)}>
-              <Link
-                to={more}
-                className={CS.ml2}
-                onClick={() =>
-                  MetabaseAnalytics.trackStructEvent(
-                    "AutoDashboard",
-                    "ClickMore",
-                  )
-                }
-              >
+              <Link to={more} className={CS.ml2}>
                 <Button iconRight="chevronright">{t`Show more about this`}</Button>
               </Link>
             </div>
diff --git a/frontend/src/metabase/dashboard/hooks/use-dashboard-refresh-period.ts b/frontend/src/metabase/dashboard/hooks/use-dashboard-refresh-period.ts
index 961dfd51ac9b374704199b17d598966fd9170abb..17a34ddeac1e0d5e5306b1d050ff9d644a72f7cb 100644
--- a/frontend/src/metabase/dashboard/hooks/use-dashboard-refresh-period.ts
+++ b/frontend/src/metabase/dashboard/hooks/use-dashboard-refresh-period.ts
@@ -1,8 +1,6 @@
 import { useCallback, useRef, useState } from "react";
 import { useUnmount } from "react-use";
 
-import * as MetabaseAnalytics from "metabase/lib/analytics";
-
 import type { DashboardRefreshPeriodControls } from "../types";
 
 import { useInterval } from "./use-interval";
@@ -43,14 +41,13 @@ export const useDashboardRefreshPeriod = ({
         setPeriod(newPeriod);
         elapsedHook.current?.(0);
         start();
-        MetabaseAnalytics.trackStructEvent("Dashboard", "Set Refresh", period);
       } else {
         elapsed.current = 0;
         setPeriod(null);
         elapsedHook.current?.(null);
       }
     },
-    [period, start, stop],
+    [start, stop],
   );
 
   useUnmount(() => {
diff --git a/frontend/src/metabase/entities/dashboards.js b/frontend/src/metabase/entities/dashboards.js
index 7a26a497039041c670e19acc3be8ffc28f550991..6bc1e14f43b595e7de1d71c140a94d4762f06c85 100644
--- a/frontend/src/metabase/entities/dashboards.js
+++ b/frontend/src/metabase/entities/dashboards.js
@@ -18,7 +18,6 @@ import {
 import {
   compose,
   withAction,
-  withAnalytics,
   withNormalize,
   withRequestState,
 } from "metabase/lib/redux";
@@ -129,7 +128,6 @@ const Dashboards = createEntity({
         dashboard.id,
         "copy",
       ]),
-      withAnalytics("entities", "dashboard", "copy"),
     )(
       (entityObject, overrides, { notify } = {}) =>
         async (dispatch, getState) => {
diff --git a/frontend/src/metabase/entities/users.js b/frontend/src/metabase/entities/users.js
index e34ee73f01dc0efd588bd9ffba3bb5600c5cadc9..ebdf7c5e1903be2aa5b7d406107a31d365eb076a 100644
--- a/frontend/src/metabase/entities/users.js
+++ b/frontend/src/metabase/entities/users.js
@@ -1,7 +1,6 @@
 import { assocIn } from "icepick";
 
 import { userApi, sessionApi } from "metabase/api";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import { createEntity, entityCompatibleQuery } from "metabase/lib/entities";
 import { generatePassword } from "metabase/lib/security";
 import MetabaseSettings from "metabase/lib/settings";
@@ -105,10 +104,6 @@ const Users = createEntity({
     resetPasswordEmail:
       ({ email }) =>
       async dispatch => {
-        MetabaseAnalytics.trackStructEvent(
-          "People Admin",
-          "Trigger User Password Reset",
-        );
         await entityCompatibleQuery(
           email,
           dispatch,
@@ -119,10 +114,6 @@ const Users = createEntity({
     resetPasswordManual:
       async ({ id }, password = generatePassword()) =>
       async dispatch => {
-        MetabaseAnalytics.trackStructEvent(
-          "People Admin",
-          "Manual Password Reset",
-        );
         await entityCompatibleQuery(
           { id, password },
           dispatch,
@@ -133,8 +124,6 @@ const Users = createEntity({
     deactivate:
       ({ id }) =>
       async dispatch => {
-        MetabaseAnalytics.trackStructEvent("People Admin", "User Removed");
-
         await entityCompatibleQuery(
           id,
           dispatch,
@@ -145,8 +134,6 @@ const Users = createEntity({
     reactivate:
       ({ id }) =>
       async dispatch => {
-        MetabaseAnalytics.trackStructEvent("People Admin", "User Reactivated");
-
         const user = await entityCompatibleQuery(
           id,
           dispatch,
diff --git a/frontend/src/metabase/lib/analytics.js b/frontend/src/metabase/lib/analytics.js
index 035bd2d01c2551a5f8fe45a3cc0510a38cd49c68..c281abcec820e6f7d4278812679a951c8e1480f4 100644
--- a/frontend/src/metabase/lib/analytics.js
+++ b/frontend/src/metabase/lib/analytics.js
@@ -7,8 +7,6 @@ import { getUserId } from "metabase/selectors/user";
 export const createTracker = store => {
   if (Settings.snowplowEnabled()) {
     createSnowplowTracker(store);
-
-    document.body.addEventListener("click", handleStructEventClick, true);
   }
 };
 
@@ -22,15 +20,6 @@ export const trackPageView = url => {
   }
 };
 
-/**
- * @deprecated This uses GA which is not setup. We should use `trackSchemaEvent`.
- */
-export const trackStructEvent = (category, action, label, value) => {
-  if (!category || !label || !Settings.trackingEnabled()) {
-    return;
-  }
-};
-
 export const trackSchemaEvent = (schema, version, data) => {
   if (shouldLogAnalytics) {
     const { event, ...other } = data;
@@ -109,19 +98,6 @@ const trackSnowplowSchemaEvent = (schema, version, data) => {
   });
 };
 
-const handleStructEventClick = event => {
-  if (!Settings.trackingEnabled()) {
-    return;
-  }
-
-  for (let node = event.target; node != null; node = node.parentNode) {
-    if (node.dataset && node.dataset.metabaseEvent) {
-      const parts = node.dataset.metabaseEvent.split(";").map(p => p.trim());
-      trackStructEvent(...parts);
-    }
-  }
-};
-
 const getSanitizedUrl = url => {
   const urlWithoutSlug = url.replace(/(\/\d+)-[^\/]+$/, (match, path) => path);
   const urlWithoutHost = new URL(urlWithoutSlug, Settings.snowplowUrl());
diff --git a/frontend/src/metabase/lib/entities.js b/frontend/src/metabase/lib/entities.js
index f827d8889285c77f4402138f7d37735fc42a323f..8efdf0e196c6ec301bebe83fd79b961e494bad5c 100644
--- a/frontend/src/metabase/lib/entities.js
+++ b/frontend/src/metabase/lib/entities.js
@@ -81,7 +81,6 @@ import {
   handleEntities,
   compose,
   withAction,
-  withAnalytics,
   withRequestState,
   withCachedDataAndRequestState,
 } from "metabase/lib/redux";
@@ -195,16 +194,6 @@ export function createEntity(def) {
     ]);
   }
 
-  // same as withRequestState, but with category/label
-  function withEntityAnalytics(action) {
-    return withAnalytics(
-      "entities",
-      entity.name,
-      action,
-      entity.getAnalyticsMetadata,
-    );
-  }
-
   function withEntityActionDecorators(action) {
     return entity.actionDecorators[action] || (_ => _);
   }
@@ -230,7 +219,6 @@ export function createEntity(def) {
 
     create: compose(
       withAction(CREATE_ACTION),
-      withEntityAnalytics("create"),
       withEntityRequestState(() => ["create"]),
       withEntityActionDecorators("create"),
     )(entityObject => async (dispatch, getState) => {
@@ -245,7 +233,6 @@ export function createEntity(def) {
 
     update: compose(
       withAction(UPDATE_ACTION),
-      withEntityAnalytics("update"),
       withEntityRequestState(object => [object.id, "update"]),
       withEntityActionDecorators("update"),
     )(
@@ -301,7 +288,6 @@ export function createEntity(def) {
 
     delete: compose(
       withAction(DELETE_ACTION),
-      withEntityAnalytics("delete"),
       withEntityRequestState(object => [object.id, "delete"]),
       withEntityActionDecorators("delete"),
     )(entityObject => async (dispatch, getState) => {
diff --git a/frontend/src/metabase/lib/performance.js b/frontend/src/metabase/lib/performance.js
deleted file mode 100644
index 88766fad52898b66d731969ebd25c3e60be0c6a0..0000000000000000000000000000000000000000
--- a/frontend/src/metabase/lib/performance.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// startTimer starts a timer and returns a callback function.
-// Example usage:
-// const t = startTimer()
-// await vSlow()
-// t(duration => console.log(`That took ${duration}ms!`))
-// The function passed to `t` won't get called if `performance` isn't available.
-export function startTimer() {
-  if (typeof performance !== "object") {
-    // if the current environment doesn't have performance return a no-op function
-    return () => {};
-  }
-  const start = performance.now();
-  return f => f(performance.now() - start);
-}
diff --git a/frontend/src/metabase/lib/redux/utils.js b/frontend/src/metabase/lib/redux/utils.js
index cff5748732eeb0cf047d063feee10caf1078b191..8a987275cb227be87f33a554adc70da6c8d1e011 100644
--- a/frontend/src/metabase/lib/redux/utils.js
+++ b/frontend/src/metabase/lib/redux/utils.js
@@ -4,7 +4,6 @@ import moment from "moment-timezone"; // eslint-disable-line no-restricted-impor
 import { normalize } from "normalizr";
 import _ from "underscore";
 
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import { delay } from "metabase/lib/promise";
 import {
   setRequestLoading,
@@ -336,31 +335,6 @@ function withCachedData(
       };
 }
 
-export function withAnalytics(categoryOrFn, actionOrFn, labelOrFn, valueOrFn) {
-  // thunk decorator:
-  return thunkCreator =>
-    // thunk creator:
-    (...args) =>
-    // thunk:
-    (dispatch, getState) => {
-      function get(valueOrFn, extra = {}) {
-        if (typeof valueOrFn === "function") {
-          return valueOrFn(args, { ...extra }, getState);
-        }
-      }
-      try {
-        const category = get(categoryOrFn);
-        const action = get(actionOrFn, { category });
-        const label = get(labelOrFn, { category, action });
-        const value = get(valueOrFn, { category, action, label });
-        MetabaseAnalytics.trackStructEvent(category, action, label, value);
-      } catch (error) {
-        console.warn("withAnalytics threw an error:", error);
-      }
-      return thunkCreator(...args)(dispatch, getState);
-    };
-}
-
 export function withNormalize(schema) {
   return thunkCreator =>
     (...args) =>
diff --git a/frontend/src/metabase/public/components/EmbedModal/EmbedModal.tsx b/frontend/src/metabase/public/components/EmbedModal/EmbedModal.tsx
index 885ca3d1b42a3655e48dd80f362eb634eab8bcc1..2a43e46f212ce2ac89abd236db1813996b279e63 100644
--- a/frontend/src/metabase/public/components/EmbedModal/EmbedModal.tsx
+++ b/frontend/src/metabase/public/components/EmbedModal/EmbedModal.tsx
@@ -2,7 +2,6 @@ import { useState } from "react";
 import { t } from "ttag";
 
 import Modal from "metabase/components/Modal";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import { useSelector } from "metabase/lib/redux";
 import type { EmbedModalStep } from "metabase/public/lib/types";
 import { getSetting } from "metabase/selectors/settings";
@@ -46,7 +45,6 @@ export const EmbedModal = ({ children, isOpen, onClose }: EmbedModalProps) => {
   };
 
   const onEmbedClose = () => {
-    MetabaseAnalytics.trackStructEvent("Sharing Modal", "Modal Closed");
     onClose();
     setEmbedType(null);
   };
diff --git a/frontend/src/metabase/public/components/EmbedModal/SelectEmbedTypePane/SelectEmbedTypePane.tsx b/frontend/src/metabase/public/components/EmbedModal/SelectEmbedTypePane/SelectEmbedTypePane.tsx
index 53dcfc176275abbf5af713ee84ef85f6c791a899..1535ecaedaf14deda5a5d2c815b97cc6660e8736 100644
--- a/frontend/src/metabase/public/components/EmbedModal/SelectEmbedTypePane/SelectEmbedTypePane.tsx
+++ b/frontend/src/metabase/public/components/EmbedModal/SelectEmbedTypePane/SelectEmbedTypePane.tsx
@@ -5,7 +5,6 @@ import { t } from "ttag";
 import Link from "metabase/core/components/Link";
 import { PublicLinkCopyPanel } from "metabase/dashboard/components/PublicLinkPopover/PublicLinkCopyPanel";
 import type { ExportFormatType } from "metabase/dashboard/components/PublicLinkPopover/types";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import { useSelector } from "metabase/lib/redux";
 import {
   trackPublicEmbedCodeCopied,
@@ -53,11 +52,6 @@ export function SelectEmbedTypePane({
     e.stopPropagation();
     if (!isLoadingLink && !hasPublicLink) {
       setIsLoadingLink(true);
-      MetabaseAnalytics.trackStructEvent(
-        "Sharing Modal",
-        "Public Link Enabled",
-        resourceType,
-      );
       await onCreatePublicLink();
       setIsLoadingLink(false);
     }
@@ -67,11 +61,6 @@ export function SelectEmbedTypePane({
     e.stopPropagation();
     if (!isLoadingLink && hasPublicLink) {
       setIsLoadingLink(true);
-      MetabaseAnalytics.trackStructEvent(
-        "Sharing Modal",
-        "Public Link Disabled",
-        resourceType,
-      );
 
       trackPublicLinkRemoved({
         artifact: resourceType,
diff --git a/frontend/src/metabase/pulse/components/PulseEditChannels.tsx b/frontend/src/metabase/pulse/components/PulseEditChannels.tsx
index ba53c924720812fb34404f1c3b3e683ea60b47a3..dd6e9f1cf90f46dd7d6ff0b2525a39b06327ee60 100644
--- a/frontend/src/metabase/pulse/components/PulseEditChannels.tsx
+++ b/frontend/src/metabase/pulse/components/PulseEditChannels.tsx
@@ -7,7 +7,6 @@ import _ from "underscore";
 import ChannelSetupMessage from "metabase/components/ChannelSetupMessage";
 import Toggle from "metabase/core/components/Toggle";
 import CS from "metabase/css/core/index.css";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import { createChannel } from "metabase/lib/pulse";
 import SlackChannelField from "metabase/sharing/components/SlackChannelField";
 import { Icon, type IconName } from "metabase/ui";
@@ -43,7 +42,6 @@ interface PulseEditChannelsProps {
 
 export const PulseEditChannels = ({
   pulse,
-  pulseId,
   formInput,
   user,
   users,
@@ -60,12 +58,6 @@ export const PulseEditChannels = ({
     const channel = createChannel(channelSpec);
 
     setPulse({ ...pulse, channels: pulse.channels.concat(channel) });
-
-    MetabaseAnalytics.trackStructEvent(
-      pulseId ? "PulseEdit" : "PulseCreate",
-      "AddChannel",
-      type,
-    );
   };
 
   const onChannelPropertyChange = (index: number, name: string, value: any) => {
@@ -114,12 +106,6 @@ export const PulseEditChannels = ({
           );
 
       setPulse(updatedPulse);
-
-      MetabaseAnalytics.trackStructEvent(
-        pulseId ? "PulseEdit" : "PulseCreate",
-        "RemoveChannel",
-        type,
-      );
     }
   };
 
diff --git a/frontend/src/metabase/query_builder/actions/core/core.js b/frontend/src/metabase/query_builder/actions/core/core.js
index 8294ca46eca419b0d6ab289bae3c91118461c81c..9234c97c1fdb2bf4ad8f55b8b276e96d0b20c038 100644
--- a/frontend/src/metabase/query_builder/actions/core/core.js
+++ b/frontend/src/metabase/query_builder/actions/core/core.js
@@ -6,7 +6,6 @@ import Databases from "metabase/entities/databases";
 import { updateModelIndexes } from "metabase/entities/model-indexes/actions";
 import Questions from "metabase/entities/questions";
 import Revision from "metabase/entities/revisions";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import { loadCard } from "metabase/lib/card";
 import { shouldOpenInBlankWindow } from "metabase/lib/dom";
 import { createThunkAction } from "metabase/lib/redux";
@@ -207,11 +206,6 @@ export const apiCreateQuestion = question => {
       dispatch({ type: Databases.actionTypes.INVALIDATE_LISTS_ACTION });
     }
 
-    MetabaseAnalytics.trackStructEvent(
-      "QueryBuilder",
-      "Create Card",
-      createdQuestion.datasetQuery().type,
-    );
     trackNewQuestionSaved(
       question,
       createdQuestion,
@@ -268,12 +262,6 @@ export const apiUpdateQuestion = (question, { rerunQuery } = {}) => {
     // (some of the old alerts might be removed during update)
     await dispatch(fetchAlertsForQuestion(updatedQuestion.id()));
 
-    MetabaseAnalytics.trackStructEvent(
-      "QueryBuilder",
-      "Update Card",
-      updatedQuestion.datasetQuery().type,
-    );
-
     await dispatch({
       type: API_UPDATE_QUESTION,
       payload: updatedQuestion.card(),
diff --git a/frontend/src/metabase/query_builder/actions/core/initializeQB.ts b/frontend/src/metabase/query_builder/actions/core/initializeQB.ts
index a1c26c03a54de986f424f272e91f0a9fc858198e..94030b1b7194aa3e20e3bb8e42f4348471e8baa6 100644
--- a/frontend/src/metabase/query_builder/actions/core/initializeQB.ts
+++ b/frontend/src/metabase/query_builder/actions/core/initializeQB.ts
@@ -4,7 +4,6 @@ import querystring from "querystring";
 import { fetchAlertsForQuestion } from "metabase/alert/alert";
 import Questions from "metabase/entities/questions";
 import Snippets from "metabase/entities/snippets";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import { deserializeCardFromUrl, loadCard } from "metabase/lib/card";
 import { isNotNull } from "metabase/lib/types";
 import * as Urls from "metabase/lib/urls";
@@ -302,12 +301,6 @@ async function handleQBInit(
     });
   }
 
-  MetabaseAnalytics.trackStructEvent(
-    "QueryBuilder",
-    hasCard ? "Query Loaded" : "Query Started",
-    card.dataset_query.type,
-  );
-
   if (isSavedCard(card)) {
     dispatch(fetchAlertsForQuestion(card.id));
   }
@@ -328,7 +321,6 @@ async function handleQBInit(
 
     if (currentUser?.is_qbnewb) {
       uiControls.isShowingNewbModal = true;
-      MetabaseAnalytics.trackStructEvent("QueryBuilder", "Show Newb Modal");
     }
   }
 
diff --git a/frontend/src/metabase/query_builder/actions/native.ts b/frontend/src/metabase/query_builder/actions/native.ts
index bb4beafa3b2da3ec307f9428b0122a50e486019b..385b352f3a766787a1c8e5c4ab0316c81473adbc 100644
--- a/frontend/src/metabase/query_builder/actions/native.ts
+++ b/frontend/src/metabase/query_builder/actions/native.ts
@@ -1,7 +1,6 @@
 import { createAction } from "redux-actions";
 
 import Questions from "metabase/entities/questions";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import { createThunkAction } from "metabase/lib/redux";
 import { updateUserSetting } from "metabase/redux/settings";
 import { getMetadata } from "metabase/selectors/metadata";
@@ -27,9 +26,7 @@ import { updateQuestion } from "./core";
 import { SET_UI_CONTROLS } from "./ui";
 
 export const TOGGLE_DATA_REFERENCE = "metabase/qb/TOGGLE_DATA_REFERENCE";
-export const toggleDataReference = createAction(TOGGLE_DATA_REFERENCE, () => {
-  MetabaseAnalytics.trackStructEvent("QueryBuilder", "Toggle Data Reference");
-});
+export const toggleDataReference = createAction(TOGGLE_DATA_REFERENCE);
 
 export const SET_DATA_REFERENCE_STACK = "metabase/qb/SET_DATA_REFERENCE_STACK";
 export const setDataReferenceStack = createAction(SET_DATA_REFERENCE_STACK);
@@ -80,12 +77,6 @@ export const TOGGLE_TEMPLATE_TAGS_EDITOR =
   "metabase/qb/TOGGLE_TEMPLATE_TAGS_EDITOR";
 export const toggleTemplateTagsEditor = createAction(
   TOGGLE_TEMPLATE_TAGS_EDITOR,
-  () => {
-    MetabaseAnalytics.trackStructEvent(
-      "QueryBuilder",
-      "Toggle Template Tags Editor",
-    );
-  },
 );
 
 export const SET_IS_SHOWING_TEMPLATE_TAGS_EDITOR =
@@ -98,9 +89,7 @@ export const setIsShowingTemplateTagsEditor = (
 });
 
 export const TOGGLE_SNIPPET_SIDEBAR = "metabase/qb/TOGGLE_SNIPPET_SIDEBAR";
-export const toggleSnippetSidebar = createAction(TOGGLE_SNIPPET_SIDEBAR, () => {
-  MetabaseAnalytics.trackStructEvent("QueryBuilder", "Toggle Snippet Sidebar");
-});
+export const toggleSnippetSidebar = createAction(TOGGLE_SNIPPET_SIDEBAR);
 
 export const SET_IS_SHOWING_SNIPPET_SIDEBAR =
   "metabase/qb/SET_IS_SHOWING_SNIPPET_SIDEBAR";
diff --git a/frontend/src/metabase/query_builder/actions/querying.js b/frontend/src/metabase/query_builder/actions/querying.js
index 07b84396774ede35851eab8d2d4176c8063e19a6..8159ba8477526dc50a2ae31abb9f19ccb755b393 100644
--- a/frontend/src/metabase/query_builder/actions/querying.js
+++ b/frontend/src/metabase/query_builder/actions/querying.js
@@ -1,8 +1,6 @@
 import { createAction } from "redux-actions";
 import { t } from "ttag";
 
-import * as MetabaseAnalytics from "metabase/lib/analytics";
-import { startTimer } from "metabase/lib/performance";
 import { defer } from "metabase/lib/promise";
 import { createThunkAction } from "metabase/lib/redux";
 import { syncVizSettingsWithSeries } from "metabase/querying";
@@ -127,22 +125,12 @@ export const runQuestionQuery = ({
     const startTime = new Date();
     const cancelQueryDeferred = defer();
 
-    const queryTimer = startTimer();
-
     apiRunQuestionQuery(question, {
       cancelDeferred: cancelQueryDeferred,
       ignoreCache: ignoreCache,
       isDirty: isQueryDirty,
     })
       .then(queryResults => {
-        queryTimer(duration =>
-          MetabaseAnalytics.trackStructEvent(
-            "QueryBuilder",
-            "Run Query",
-            question.datasetQuery().type,
-            duration,
-          ),
-        );
         return dispatch(queryCompleted(question, queryResults));
       })
       .catch(error => dispatch(queryErrored(startTime, error)));
diff --git a/frontend/src/metabase/query_builder/actions/ui.ts b/frontend/src/metabase/query_builder/actions/ui.ts
index 7a7d3089ce3892e068551e5adb0854a83602f360..966e1ace09ebc65ec43fa7485bb4debaf61dd52e 100644
--- a/frontend/src/metabase/query_builder/actions/ui.ts
+++ b/frontend/src/metabase/query_builder/actions/ui.ts
@@ -1,6 +1,5 @@
 import { createAction } from "redux-actions";
 
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import { createThunkAction } from "metabase/lib/redux";
 import { checkNotNull } from "metabase/lib/types";
 import { updateUserSetting } from "metabase/redux/settings";
@@ -77,7 +76,6 @@ export const closeQbNewbModal = createThunkAction(CLOSE_QB_NEWB_MODAL, () => {
     // persist the fact that this user has seen the NewbModal
     const { currentUser } = getState();
     await UserApi.update_qbnewb({ id: checkNotNull(currentUser).id });
-    MetabaseAnalytics.trackStructEvent("QueryBuilder", "Close Newb Modal");
   };
 });
 
diff --git a/frontend/src/metabase/query_builder/components/AlertModals/AlertEditChannels.jsx b/frontend/src/metabase/query_builder/components/AlertModals/AlertEditChannels.jsx
index 17852293707386d2bb8d6c7b22d4194d61538550..d0ff379b91a1557c65c0da31e805ca92bbf562aa 100644
--- a/frontend/src/metabase/query_builder/components/AlertModals/AlertEditChannels.jsx
+++ b/frontend/src/metabase/query_builder/components/AlertModals/AlertEditChannels.jsx
@@ -43,7 +43,6 @@ class AlertEditChannelsInner extends Component {
         <div className={CS.mb2}>
           <PulseEditChannels
             pulse={alert}
-            pulseId={alert.id}
             formInput={formInput}
             user={user}
             users={users}
diff --git a/frontend/src/metabase/query_builder/components/AlertModals/CreateAlertModalContent.jsx b/frontend/src/metabase/query_builder/components/AlertModals/CreateAlertModalContent.jsx
index cab62ebfe1b290b20a26f03dae11071528d55d15..bfbab0afcb72f7f6b5abef7a594022ed4b2c26dd 100644
--- a/frontend/src/metabase/query_builder/components/AlertModals/CreateAlertModalContent.jsx
+++ b/frontend/src/metabase/query_builder/components/AlertModals/CreateAlertModalContent.jsx
@@ -11,7 +11,6 @@ import ModalContent from "metabase/components/ModalContent";
 import Button from "metabase/core/components/Button";
 import CS from "metabase/css/core/index.css";
 import { alertIsValid } from "metabase/lib/alert";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import MetabaseCookies from "metabase/lib/cookies";
 import { fetchPulseFormInput } from "metabase/pulse/actions";
 import {
@@ -74,11 +73,6 @@ class CreateAlertModalContentInner extends Component {
     await updateUrl(question, { dirty: false });
 
     onAlertCreated();
-    MetabaseAnalytics.trackStructEvent(
-      "Alert",
-      "Create",
-      alert.alert_condition,
-    );
   };
 
   proceedFromEducationalScreen = () => {
diff --git a/frontend/src/metabase/query_builder/components/AlertModals/UpdateAlertModalContent.jsx b/frontend/src/metabase/query_builder/components/AlertModals/UpdateAlertModalContent.jsx
index 4883516575b894af77f17817b1a41b3d7b0dd783..2763dbb0d2dca2bcd2360a32af0f38f3144ca88e 100644
--- a/frontend/src/metabase/query_builder/components/AlertModals/UpdateAlertModalContent.jsx
+++ b/frontend/src/metabase/query_builder/components/AlertModals/UpdateAlertModalContent.jsx
@@ -10,7 +10,6 @@ import ModalContent from "metabase/components/ModalContent";
 import Button from "metabase/core/components/Button";
 import CS from "metabase/css/core/index.css";
 import { alertIsValid } from "metabase/lib/alert";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import { updateUrl } from "metabase/query_builder/actions";
 import {
   getQuestion,
@@ -40,12 +39,6 @@ class UpdateAlertModalContentInner extends Component {
     await updateAlert(modifiedAlert);
     await updateUrl(question, { dirty: false });
     onAlertUpdated();
-
-    MetabaseAnalytics.trackStructEvent(
-      "Alert",
-      "Update",
-      modifiedAlert.alert_condition,
-    );
   };
 
   onDeleteAlert = async () => {
diff --git a/frontend/src/metabase/query_builder/components/template_tags/TagEditorSidebar.tsx b/frontend/src/metabase/query_builder/components/template_tags/TagEditorSidebar.tsx
index e386c1838bc636207faee01c2f4ef15c8616d455..f8aa223fc2da09186a980b1e9fd3ae47b77e6acf 100644
--- a/frontend/src/metabase/query_builder/components/template_tags/TagEditorSidebar.tsx
+++ b/frontend/src/metabase/query_builder/components/template_tags/TagEditorSidebar.tsx
@@ -5,7 +5,6 @@ import _ from "underscore";
 
 import ButtonsS from "metabase/css/components/buttons.module.css";
 import CS from "metabase/css/core/index.css";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import type { EmbeddingParameterVisibility } from "metabase/public/lib/types";
 import SidebarContent from "metabase/query_builder/components/SidebarContent";
 import type Question from "metabase-lib/v1/Question";
@@ -56,11 +55,6 @@ export class TagEditorSidebar extends Component<TagEditorSidebarProps> {
 
   setSection(section: "settings" | "help") {
     this.setState({ section });
-    MetabaseAnalytics.trackStructEvent(
-      "QueryBuilder",
-      "Template Tag Editor Section Change",
-      section,
-    );
   }
 
   render() {
diff --git a/frontend/src/metabase/redux/undo.ts b/frontend/src/metabase/redux/undo.ts
index 2b7c7f64a619c0302dbe39d5ec4c26b666130cf9..f3c677354939dc609fed46a16b9293fb05a2629d 100644
--- a/frontend/src/metabase/redux/undo.ts
+++ b/frontend/src/metabase/redux/undo.ts
@@ -2,7 +2,6 @@ import { createSelector } from "@reduxjs/toolkit";
 import type { Action } from "redux-actions";
 import _ from "underscore";
 
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import { createAction, createThunkAction } from "metabase/lib/redux";
 import type { State } from "metabase-types/store";
 import type { Undo } from "metabase-types/store/undo";
@@ -28,7 +27,7 @@ export const addUndo = createThunkAction(ADD_UNDO, undo => {
     let timeoutId = null;
     if (timeout) {
       timeoutId = setTimeout(
-        () => dispatch(dismissUndo({ undoId: id, track: false })),
+        () => dispatch(dismissUndo({ undoId: id })),
         timeout,
       );
     }
@@ -59,7 +58,7 @@ export const resumeUndo = createThunkAction(RESUME_UNDO, undo => {
     return {
       ...undo,
       timeoutId: setTimeout(
-        () => dispatch(dismissUndo({ undoId: undo.id, track: false })),
+        () => dispatch(dismissUndo({ undoId: undo.id })),
         restTime,
       ),
       timeout: restTime,
@@ -101,10 +100,7 @@ export const getIsRecentlyAutoConnectedDashcard = createSelector(
 
 export const dismissUndo = createAction(
   DISMISS_UNDO,
-  ({ undoId, track = true }: { undoId: Undo["id"]; track?: boolean }) => {
-    if (track) {
-      MetabaseAnalytics.trackStructEvent("Undo", "Dismiss Undo");
-    }
+  ({ undoId }: { undoId: Undo["id"] }) => {
     return undoId;
   },
 );
@@ -114,12 +110,9 @@ export const dismissAllUndo = createAction(DISMISS_ALL_UNDO);
 export const performUndo = createThunkAction(PERFORM_UNDO, undoId => {
   return (dispatch, getState) => {
     const undo = getUndo(getState(), undoId);
-    if (!undo?.actionLabel) {
-      MetabaseAnalytics.trackStructEvent("Undo", "Perform Undo");
-    }
     if (undo) {
       undo.actions?.forEach(action => dispatch(action));
-      dispatch(dismissUndo({ undoId, track: false }));
+      dispatch(dismissUndo({ undoId }));
     }
   };
 });
diff --git a/frontend/src/metabase/reference/reference.js b/frontend/src/metabase/reference/reference.js
index dabf0be9c5ae495d88eccc892ad9db9362fbaf19..5a5b1801958d92a96cb75682015a32d67c844814 100644
--- a/frontend/src/metabase/reference/reference.js
+++ b/frontend/src/metabase/reference/reference.js
@@ -1,6 +1,5 @@
 import { assoc } from "icepick";
 
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import { handleActions, createAction } from "metabase/lib/redux";
 
 import { filterUntouchedFields, isEmptyObject } from "./utils.js";
@@ -24,13 +23,9 @@ export const startLoading = createAction(START_LOADING);
 
 export const endLoading = createAction(END_LOADING);
 
-export const startEditing = createAction(START_EDITING, () => {
-  MetabaseAnalytics.trackStructEvent("Data Reference", "Started Editing");
-});
+export const startEditing = createAction(START_EDITING);
 
-export const endEditing = createAction(END_EDITING, () => {
-  MetabaseAnalytics.trackStructEvent("Data Reference", "Ended Editing");
-});
+export const endEditing = createAction(END_EDITING);
 
 export const expandFormula = createAction(EXPAND_FORMULA);
 
diff --git a/frontend/src/metabase/visualizations/components/CardRenderer.jsx b/frontend/src/metabase/visualizations/components/CardRenderer.jsx
index b4dfb8d1658e2e1b4e365db3d16aaddc2b9550af..fa0067f4da0fc2dd623975ddd902ecb0c4e8e097 100644
--- a/frontend/src/metabase/visualizations/components/CardRenderer.jsx
+++ b/frontend/src/metabase/visualizations/components/CardRenderer.jsx
@@ -2,20 +2,10 @@
 import PropTypes from "prop-types";
 import { Component } from "react";
 import ReactDOM from "react-dom";
-import _ from "underscore";
 
 import ExplicitSize from "metabase/components/ExplicitSize";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
-import { startTimer } from "metabase/lib/performance";
 import { isSameSeries } from "metabase/visualizations/lib/utils";
 
-// We track this as part of the render loop.
-// It's throttled to prevent pounding GA on every prop update.
-const trackEventThrottled = _.throttle(
-  MetabaseAnalytics.trackStructEvent,
-  10000,
-);
-
 class CardRenderer extends Component {
   static propTypes = {
     className: PropTypes.string,
@@ -76,12 +66,7 @@ class CardRenderer extends Component {
     parent.appendChild(element);
 
     try {
-      const t = startTimer();
       this._deregister = this.props.renderer(element, this.props);
-      t(duration => {
-        const { display } = this.props.card;
-        trackEventThrottled("Visualization", "Render Card", display, duration);
-      });
     } catch (err) {
       console.error(err);
       this.props.onRenderError(err.message || err);
diff --git a/frontend/src/metabase/visualizations/components/ChartSettings.jsx b/frontend/src/metabase/visualizations/components/ChartSettings.jsx
index 404f0d67910918126ccce1af1086708186fa6d1e..23adb03d5f8ccc7b1482cc563bce485c674e8504 100644
--- a/frontend/src/metabase/visualizations/components/ChartSettings.jsx
+++ b/frontend/src/metabase/visualizations/components/ChartSettings.jsx
@@ -8,7 +8,6 @@ import _ from "underscore";
 import Button from "metabase/core/components/Button";
 import Radio from "metabase/core/components/Radio";
 import CS from "metabase/css/core/index.css";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import {
   getVisualizationTransformed,
   extractRemappings,
@@ -115,8 +114,6 @@ class ChartSettings extends Component {
   };
 
   handleResetSettings = () => {
-    MetabaseAnalytics.trackStructEvent("Chart Settings", "Reset Settings");
-
     const originalCardSettings =
       this.props.dashcard.card.visualization_settings;
     const clickBehaviorSettings = getClickBehaviorSettings(this._getSettings());
diff --git a/frontend/src/metabase/visualizations/components/ClickActions/ClickActionsPopover.tsx b/frontend/src/metabase/visualizations/components/ClickActions/ClickActionsPopover.tsx
index 57452152ca0a00a729d91851bfe5f951a6fb5680..0224a9c9ddf021d10639aef1214e118b4a84286c 100644
--- a/frontend/src/metabase/visualizations/components/ClickActions/ClickActionsPopover.tsx
+++ b/frontend/src/metabase/visualizations/components/ClickActions/ClickActionsPopover.tsx
@@ -2,7 +2,6 @@ import { Component } from "react";
 import { connect } from "react-redux";
 import type * as tippy from "tippy.js";
 
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import { getEventTarget } from "metabase/lib/dom";
 import { performAction } from "metabase/visualizations/lib/action";
 import type {
@@ -11,16 +10,12 @@ import type {
   PopoverClickAction,
   OnChangeCardAndRun,
 } from "metabase/visualizations/types";
-import {
-  isPopoverClickAction,
-  isRegularClickAction,
-} from "metabase/visualizations/types";
+import { isPopoverClickAction } from "metabase/visualizations/types";
 import type { Series } from "metabase-types/api";
 import type { Dispatch } from "metabase-types/store";
 
 import { FlexTippyPopover } from "./ClickActionsPopover.styled";
 import { ClickActionsView } from "./ClickActionsView";
-import { getGALabelForAction } from "./utils";
 
 interface ChartClickActionsProps {
   clicked: ClickObject;
@@ -56,11 +51,6 @@ export class ClickActionsPopover extends Component<
   handleClickAction = (action: RegularClickAction) => {
     const { dispatch, onChangeCardAndRun } = this.props;
     if (isPopoverClickAction(action)) {
-      MetabaseAnalytics.trackStructEvent(
-        "Actions",
-        "Open Click Action Popover",
-        getGALabelForAction(action),
-      );
       this.setState({ popoverAction: action });
     } else {
       const didPerform = performAction(action, {
@@ -68,14 +58,6 @@ export class ClickActionsPopover extends Component<
         onChangeCardAndRun,
       });
       if (didPerform) {
-        if (isRegularClickAction(action)) {
-          MetabaseAnalytics.trackStructEvent(
-            "Actions",
-            "Executed Click Action",
-            getGALabelForAction(action),
-          );
-        }
-
         this.close();
       } else {
         console.warn("No action performed", action);
@@ -121,21 +103,9 @@ export class ClickActionsPopover extends Component<
             this.instance?.popperInstance?.update();
           }}
           onChangeCardAndRun={({ nextCard }) => {
-            if (popoverAction) {
-              MetabaseAnalytics.trackStructEvent(
-                "Action",
-                "Executed Click Action",
-                getGALabelForAction(popoverAction),
-              );
-            }
             onChangeCardAndRun({ nextCard });
           }}
           onClose={() => {
-            MetabaseAnalytics.trackStructEvent(
-              "Action",
-              "Dismissed Click Action Menu",
-              getGALabelForAction(popoverAction),
-            );
             this.close();
           }}
           series={series}
@@ -154,10 +124,6 @@ export class ClickActionsPopover extends Component<
           this.instance = instance;
         }}
         onClose={() => {
-          MetabaseAnalytics.trackStructEvent(
-            "Action",
-            "Dismissed Click Action Menu",
-          );
           this.close();
         }}
         placement="bottom-start"
diff --git a/frontend/src/metabase/visualizations/components/ClickActions/utils.ts b/frontend/src/metabase/visualizations/components/ClickActions/utils.ts
index 88aa29ed03f63d8690807e74bf89c203bc2fc461..c5d259ae3054e9c3588a4ec051386ca079509590 100644
--- a/frontend/src/metabase/visualizations/components/ClickActions/utils.ts
+++ b/frontend/src/metabase/visualizations/components/ClickActions/utils.ts
@@ -62,9 +62,6 @@ export const getGroupedAndSortedActions = (
     .value();
 };
 
-export const getGALabelForAction = (action: RegularClickAction) =>
-  action ? `${action.section || ""}:${action.name || ""}` : null;
-
 export const getSectionTitle = (
   sectionKey: string,
   actions: RegularClickAction[],
diff --git a/frontend/src/metabase/visualizations/components/Visualization/Visualization.jsx b/frontend/src/metabase/visualizations/components/Visualization/Visualization.jsx
index bd42c69d3d916c4a64e314ae3d7836990d8c5a60..39c34c1fd9b87e1ebddd1139bcf5d047d78a8150 100644
--- a/frontend/src/metabase/visualizations/components/Visualization/Visualization.jsx
+++ b/frontend/src/metabase/visualizations/components/Visualization/Visualization.jsx
@@ -10,7 +10,6 @@ import { SmallGenericError } from "metabase/components/ErrorPages";
 import ExplicitSize from "metabase/components/ExplicitSize";
 import CS from "metabase/css/core/index.css";
 import DashboardS from "metabase/css/dashboard.module.css";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import { formatNumber } from "metabase/lib/formatting";
 import { equals } from "metabase/lib/utils";
 import { getIsShowingRawTable } from "metabase/query_builder/selectors";
@@ -260,16 +259,6 @@ class Visualization extends PureComponent {
   handleVisualizationClick = clicked => {
     const { handleVisualizationClick } = this.props;
 
-    if (clicked) {
-      MetabaseAnalytics.trackStructEvent(
-        "Actions",
-        "Clicked",
-        `${clicked.column ? "column" : ""} ${clicked.value ? "value" : ""} ${
-          clicked.dimensions ? "dimensions=" + clicked.dimensions.length : ""
-        }`,
-      );
-    }
-
     if (typeof handleVisualizationClick === "function") {
       handleVisualizationClick(clicked);
       return;
diff --git a/frontend/src/metabase/visualizations/components/settings/ChartSettingsTableFormatting.jsx b/frontend/src/metabase/visualizations/components/settings/ChartSettingsTableFormatting.jsx
index 2cc35cd68565af7eff0745fb48b1cd6b5f0ced85..f818565b9f8c9daec2c6f71f2918eaf8be49b093 100644
--- a/frontend/src/metabase/visualizations/components/settings/ChartSettingsTableFormatting.jsx
+++ b/frontend/src/metabase/visualizations/components/settings/ChartSettingsTableFormatting.jsx
@@ -17,7 +17,6 @@ import Select, { Option } from "metabase/core/components/Select";
 import { Sortable, SortableList } from "metabase/core/components/Sortable";
 import Toggle from "metabase/core/components/Toggle";
 import CS from "metabase/css/core/index.css";
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import {
   getAccentColors,
   getStatusColorRanges,
@@ -156,19 +155,9 @@ export const ChartSettingsTableFormatting = props => {
         }}
         onRemove={index => {
           onChange([...value.slice(0, index), ...value.slice(index + 1)]);
-          MetabaseAnalytics.trackStructEvent(
-            "Chart Settings",
-            "Table Formatting",
-            "Remove Rule",
-          );
         }}
         onMove={(from, to) => {
           onChange(arrayMove(value, from, to));
-          MetabaseAnalytics.trackStructEvent(
-            "Chart Settings",
-            "Table Formatting",
-            "Move Rule",
-          );
         }}
       />
     );
@@ -493,12 +482,6 @@ const RuleEditor = ({
           <ColorRangeSelector
             value={rule.colors}
             onChange={colors => {
-              MetabaseAnalytics.trackStructEvent(
-                "Chart Settings",
-                "Table Formatting",
-                "Select Range  Colors",
-                colors,
-              );
               onChange({ ...rule, colors });
             }}
             colors={COLORS}
diff --git a/frontend/src/metabase/visualizations/lib/settings.js b/frontend/src/metabase/visualizations/lib/settings.js
index 8ab062bfdc72c5cc6ef91767c127bb7f46d91a11..2371154e313bdf644484cee02535f7e6574c0f76 100644
--- a/frontend/src/metabase/visualizations/lib/settings.js
+++ b/frontend/src/metabase/visualizations/lib/settings.js
@@ -1,7 +1,6 @@
 import { getIn } from "icepick";
 import _ from "underscore";
 
-import * as MetabaseAnalytics from "metabase/lib/analytics";
 import { ChartSettingColorPicker } from "metabase/visualizations/components/settings/ChartSettingColorPicker";
 import ChartSettingColorsPicker from "metabase/visualizations/components/settings/ChartSettingColorsPicker";
 import ChartSettingFieldPicker from "metabase/visualizations/components/settings/ChartSettingFieldPicker";
@@ -207,9 +206,6 @@ export function getPersistableDefaultSettings(settingsDefs, completeSettings) {
 }
 
 export function updateSettings(storedSettings, changedSettings) {
-  for (const key of Object.keys(changedSettings)) {
-    MetabaseAnalytics.trackStructEvent("Chart Settings", "Change Setting", key);
-  }
   const newSettings = {
     ...storedSettings,
     ...changedSettings,
diff --git a/src/metabase/server/middleware/security.clj b/src/metabase/server/middleware/security.clj
index 5cd1a59cf15cf7de2ede0da3e04ed6735ddce63a..9bf3250517c158e62ad96eab451cbc05d5522b80 100644
--- a/src/metabase/server/middleware/security.clj
+++ b/src/metabase/server/middleware/security.clj
@@ -101,9 +101,6 @@
                                  "https://accounts.google.com"
                                  ;; MailChimp. So people can sign up for the Metabase mailing list in the sign up process
                                  "metabase.us10.list-manage.com"
-                                 ;; Google analytics
-                                 (when (public-settings/anon-tracking-enabled)
-                                   "www.google-analytics.com")
                                  ;; Snowplow analytics
                                  (when (public-settings/anon-tracking-enabled)
                                    (snowplow/snowplow-url))