diff --git a/lib/reducers/notif-permission-alert-info-reducer.js b/lib/reducers/notif-permission-alert-info-reducer.js
--- a/lib/reducers/notif-permission-alert-info-reducer.js
+++ b/lib/reducers/notif-permission-alert-info-reducer.js
@@ -1,15 +1,13 @@
 // @flow
 
+import type { AlertInfo } from '../types/alert-types.js';
 import type { BaseAction } from '../types/redux-types';
-import {
-  type NotifPermissionAlertInfo,
-  recordNotifPermissionAlertActionType,
-} from '../utils/push-alerts.js';
+import { recordNotifPermissionAlertActionType } from '../utils/push-alerts.js';
 
 function reduceNotifPermissionAlertInfo(
-  state: NotifPermissionAlertInfo,
+  state: AlertInfo,
   action: BaseAction,
-): NotifPermissionAlertInfo {
+): AlertInfo {
   if (action.type === recordNotifPermissionAlertActionType) {
     return {
       totalAlerts: state.totalAlerts + 1,
diff --git a/lib/types/alert-types.js b/lib/types/alert-types.js
new file mode 100644
--- /dev/null
+++ b/lib/types/alert-types.js
@@ -0,0 +1,27 @@
+// @flow
+
+const alertTypes = Object.freeze({
+  NOTIF_PERMISSION: 'notif-permission',
+});
+
+type AlertType = $Values<typeof alertTypes>;
+
+export type AlertInfo = {
+  +totalAlerts: number,
+  +lastAlertTime: number,
+};
+
+export type AlertInfos = {
+  +[alertID: AlertType]: AlertInfo,
+};
+
+export type AlertStore = {
+  +alertInfos: AlertInfos,
+};
+
+const defaultAlertInfo: AlertInfo = {
+  totalAlerts: 0,
+  lastAlertTime: 0,
+};
+
+export { alertTypes, defaultAlertInfo };
diff --git a/lib/types/redux-types.js b/lib/types/redux-types.js
--- a/lib/types/redux-types.js
+++ b/lib/types/redux-types.js
@@ -138,7 +138,7 @@
   SetLateResponsePayload,
   UpdateKeyserverReachabilityPayload,
 } from '../keyserver-conn/keyserver-conn-types.js';
-import type { NotifPermissionAlertInfo } from '../utils/push-alerts.js';
+import type { AlertInfo } from '../types/alert-types.js';
 
 export type BaseAppState<NavInfo: BaseNavInfo = BaseNavInfo> = {
   +navInfo: NavInfo,
@@ -150,7 +150,7 @@
   +messageStore: MessageStore,
   +loadingStatuses: { [key: string]: { [idx: number]: LoadingStatus } },
   +calendarFilters: $ReadOnlyArray<CalendarFilter>,
-  +notifPermissionAlertInfo: NotifPermissionAlertInfo,
+  +notifPermissionAlertInfo: AlertInfo,
   +watchedThreadIDs: $ReadOnlyArray<string>,
   +lifecycleState: LifecycleState,
   +enabledApps: EnabledApps,
diff --git a/lib/utils/push-alerts.js b/lib/utils/push-alerts.js
--- a/lib/utils/push-alerts.js
+++ b/lib/utils/push-alerts.js
@@ -1,21 +1,11 @@
 // @flow
 
-export type NotifPermissionAlertInfo = {
-  +totalAlerts: number,
-  +lastAlertTime: number,
-};
-
-const defaultNotifPermissionAlertInfo: NotifPermissionAlertInfo = {
-  totalAlerts: 0,
-  lastAlertTime: 0,
-};
+import type { AlertInfo } from '../types/alert-types.js';
 
 const recordNotifPermissionAlertActionType = 'RECORD_NOTIF_PERMISSION_ALERT';
 
 const msInDay = 24 * 60 * 60 * 1000;
-const shouldSkipPushPermissionAlert = (
-  alertInfo: NotifPermissionAlertInfo,
-): boolean =>
+const shouldSkipPushPermissionAlert = (alertInfo: AlertInfo): boolean =>
   (alertInfo.totalAlerts > 3 &&
     alertInfo.lastAlertTime > Date.now() - msInDay) ||
   (alertInfo.totalAlerts > 6 &&
@@ -23,8 +13,4 @@
   (alertInfo.totalAlerts > 9 &&
     alertInfo.lastAlertTime > Date.now() - msInDay * 7);
 
-export {
-  defaultNotifPermissionAlertInfo,
-  recordNotifPermissionAlertActionType,
-  shouldSkipPushPermissionAlert,
-};
+export { recordNotifPermissionAlertActionType, shouldSkipPushPermissionAlert };
diff --git a/lib/utils/reducers-utils.test.js b/lib/utils/reducers-utils.test.js
--- a/lib/utils/reducers-utils.test.js
+++ b/lib/utils/reducers-utils.test.js
@@ -1,8 +1,8 @@
 // @flow
 
 import { authoritativeKeyserverID } from './authoritative-keyserver.js';
-import { defaultNotifPermissionAlertInfo } from './push-alerts.js';
 import { resetUserSpecificState } from './reducers-utils.js';
+import { defaultAlertInfo } from '../types/alert-types.js';
 import { defaultWebEnabledApps } from '../types/enabled-apps.js';
 import { defaultCalendarFilters } from '../types/filter-types.js';
 import { defaultKeyserverInfo } from '../types/keyserver-types.js';
@@ -46,7 +46,7 @@
       loadingStatuses: {},
       calendarFilters: defaultCalendarFilters,
       dataLoaded: false,
-      notifPermissionAlertInfo: defaultNotifPermissionAlertInfo,
+      notifPermissionAlertInfo: defaultAlertInfo,
       watchedThreadIDs: [],
       lifecycleState: 'active',
       enabledApps: defaultWebEnabledApps,
diff --git a/native/push/push-handler.react.js b/native/push/push-handler.react.js
--- a/native/push/push-handler.react.js
+++ b/native/push/push-handler.react.js
@@ -28,6 +28,7 @@
 } from 'lib/selectors/thread-selectors.js';
 import { isLoggedIn } from 'lib/selectors/user-selectors.js';
 import { mergePrefixIntoBody } from 'lib/shared/notif-utils.js';
+import type { AlertInfo } from 'lib/types/alert-types.js';
 import type { RawMessageInfo } from 'lib/types/message-types.js';
 import type { ThreadInfo } from 'lib/types/minimally-encoded-thread-permissions-types.js';
 import type { Dispatch } from 'lib/types/redux-types.js';
@@ -38,7 +39,6 @@
   convertNotificationMessageInfoToNewIDSchema,
 } from 'lib/utils/migration-utils.js';
 import {
-  type NotifPermissionAlertInfo,
   recordNotifPermissionAlertActionType,
   shouldSkipPushPermissionAlert,
 } from 'lib/utils/push-alerts.js';
@@ -110,7 +110,7 @@
   +threadInfos: {
     +[id: string]: ThreadInfo,
   },
-  +notifPermissionAlertInfo: NotifPermissionAlertInfo,
+  +notifPermissionAlertInfo: AlertInfo,
   +allUpdatesCurrentAsOf: {
     +[keyserverID: string]: number,
   },
diff --git a/native/redux/default-state.js b/native/redux/default-state.js
--- a/native/redux/default-state.js
+++ b/native/redux/default-state.js
@@ -3,11 +3,11 @@
 import { Platform } from 'react-native';
 import Orientation from 'react-native-orientation-locker';
 
+import { defaultAlertInfo } from 'lib/types/alert-types.js';
 import { defaultEnabledApps } from 'lib/types/enabled-apps.js';
 import { defaultCalendarFilters } from 'lib/types/filter-types.js';
 import { defaultKeyserverInfo } from 'lib/types/keyserver-types.js';
 import { defaultGlobalThemeInfo } from 'lib/types/theme-types.js';
-import { defaultNotifPermissionAlertInfo } from 'lib/utils/push-alerts.js';
 
 import { defaultDimensionsInfo } from './dimensions-updater.react.js';
 import type { AppState } from './state-types.js';
@@ -43,7 +43,7 @@
   calendarFilters: defaultCalendarFilters,
   dataLoaded: false,
   customServer: natNodeServer,
-  notifPermissionAlertInfo: defaultNotifPermissionAlertInfo,
+  notifPermissionAlertInfo: defaultAlertInfo,
   watchedThreadIDs: [],
   lifecycleState: 'active',
   enabledApps: defaultEnabledApps,
diff --git a/native/redux/persist.js b/native/redux/persist.js
--- a/native/redux/persist.js
+++ b/native/redux/persist.js
@@ -59,6 +59,7 @@
   DEPRECATED_unshimMessageStore,
   unshimFunc,
 } from 'lib/shared/unshim-utils.js';
+import { defaultAlertInfo } from 'lib/types/alert-types.js';
 import { defaultEnabledApps } from 'lib/types/enabled-apps.js';
 import { defaultCalendarQuery } from 'lib/types/entry-types.js';
 import { defaultCalendarFilters } from 'lib/types/filter-types.js';
@@ -95,7 +96,6 @@
   convertThreadStoreThreadInfosToNewIDSchema,
 } from 'lib/utils/migration-utils.js';
 import { entries } from 'lib/utils/objects.js';
-import { defaultNotifPermissionAlertInfo } from 'lib/utils/push-alerts.js';
 import { resetUserSpecificState } from 'lib/utils/reducers-utils.js';
 import {
   deprecatedConvertClientDBThreadInfoToRawThreadInfo,
@@ -159,7 +159,7 @@
 const migrations = {
   [1]: (state: AppState) => ({
     ...state,
-    notifPermissionAlertInfo: defaultNotifPermissionAlertInfo,
+    notifPermissionAlertInfo: defaultAlertInfo,
   }),
   [2]: (state: AppState) => ({
     ...state,
diff --git a/native/redux/state-types.js b/native/redux/state-types.js
--- a/native/redux/state-types.js
+++ b/native/redux/state-types.js
@@ -3,6 +3,7 @@
 import type { Orientations } from 'react-native-orientation-locker';
 import type { PersistState } from 'redux-persist/es/types.js';
 
+import type { AlertInfo } from 'lib/types/alert-types.js';
 import type { AuxUserStore } from 'lib/types/aux-user-types.js';
 import type { CommunityStore } from 'lib/types/community-types.js';
 import type { DBOpsStore } from 'lib/types/db-ops-types';
@@ -23,7 +24,6 @@
 import type { ThreadActivityStore } from 'lib/types/thread-activity-types';
 import type { ThreadStore } from 'lib/types/thread-types.js';
 import type { CurrentUserInfo, UserStore } from 'lib/types/user-types.js';
-import type { NotifPermissionAlertInfo } from 'lib/utils/push-alerts.js';
 
 import type { DimensionsInfo } from './dimensions-updater.react.js';
 import type { NavInfo } from '../navigation/default-state.js';
@@ -58,7 +58,7 @@
   +calendarFilters: $ReadOnlyArray<CalendarFilter>,
   +dataLoaded: boolean,
   +customServer: ?string,
-  +notifPermissionAlertInfo: NotifPermissionAlertInfo,
+  +notifPermissionAlertInfo: AlertInfo,
   +watchedThreadIDs: $ReadOnlyArray<string>,
   +lifecycleState: LifecycleState,
   +enabledApps: EnabledApps,
diff --git a/web/redux/default-state.js b/web/redux/default-state.js
--- a/web/redux/default-state.js
+++ b/web/redux/default-state.js
@@ -1,10 +1,10 @@
 // @flow
 
+import { defaultAlertInfo } from 'lib/types/alert-types.js';
 import { defaultWebEnabledApps } from 'lib/types/enabled-apps.js';
 import { defaultCalendarFilters } from 'lib/types/filter-types.js';
 import { defaultKeyserverInfo } from 'lib/types/keyserver-types.js';
 import { defaultGlobalThemeInfo } from 'lib/types/theme-types.js';
-import { defaultNotifPermissionAlertInfo } from 'lib/utils/push-alerts.js';
 
 import type { AppState } from './redux-setup.js';
 import { authoritativeKeyserverID } from '../authoritative-keyserver.js';
@@ -44,7 +44,7 @@
   loadingStatuses: {},
   calendarFilters: defaultCalendarFilters,
   dataLoaded: false,
-  notifPermissionAlertInfo: defaultNotifPermissionAlertInfo,
+  notifPermissionAlertInfo: defaultAlertInfo,
   watchedThreadIDs: [],
   lifecycleState: 'active',
   enabledApps: defaultWebEnabledApps,
diff --git a/web/redux/redux-setup.js b/web/redux/redux-setup.js
--- a/web/redux/redux-setup.js
+++ b/web/redux/redux-setup.js
@@ -30,6 +30,7 @@
   identityInvalidSessionDowngrade,
   invalidSessionRecovery,
 } from 'lib/shared/session-utils.js';
+import type { AlertInfo } from 'lib/types/alert-types.js';
 import type { AuxUserStore } from 'lib/types/aux-user-types.js';
 import type { CommunityStore } from 'lib/types/community-types.js';
 import type { MessageID, DBOpsStore } from 'lib/types/db-ops-types.js';
@@ -53,7 +54,6 @@
 import type { ThreadActivityStore } from 'lib/types/thread-activity-types';
 import type { ThreadStore } from 'lib/types/thread-types.js';
 import type { CurrentUserInfo, UserStore } from 'lib/types/user-types.js';
-import type { NotifPermissionAlertInfo } from 'lib/utils/push-alerts.js';
 import { resetUserSpecificState } from 'lib/utils/reducers-utils.js';
 
 import {
@@ -102,7 +102,7 @@
   +calendarFilters: $ReadOnlyArray<CalendarFilter>,
   +communityPickerStore: CommunityPickerStore,
   +windowDimensions: WindowDimensions,
-  +notifPermissionAlertInfo: NotifPermissionAlertInfo,
+  +notifPermissionAlertInfo: AlertInfo,
   +watchedThreadIDs: $ReadOnlyArray<string>,
   +lifecycleState: LifecycleState,
   +enabledApps: EnabledApps,