diff --git a/keyserver/src/creators/update-creator.js b/keyserver/src/creators/update-creator.js
--- a/keyserver/src/creators/update-creator.js
+++ b/keyserver/src/creators/update-creator.js
@@ -24,7 +24,7 @@
   type NewUpdatesRedisMessage,
 } from 'lib/types/redis-types.js';
 import type { RawThreadInfo } from 'lib/types/thread-types.js';
-import { updateTypes } from 'lib/types/update-types-enum.js';
+import { updateTypes, type UpdateType } from 'lib/types/update-types-enum.js';
 import {
   type ServerUpdateInfo,
   type UpdateData,
@@ -69,7 +69,7 @@
 type DeleteCondition = {
   +userID: string,
   +target: ?string,
-  +types: 'all_types' | $ReadOnlySet<number>,
+  +types: 'all_types' | $ReadOnlySet<UpdateType>,
 };
 
 export type ViewerInfo =
@@ -605,28 +605,8 @@
 }
 
 function getDeleteCondition(updateData: UpdateData): ?DeleteCondition {
-  let types;
-  if (updateData.type === updateTypes.DELETE_ACCOUNT) {
-    types = new Set([updateTypes.DELETE_ACCOUNT, updateTypes.UPDATE_USER]);
-  } else if (updateData.type === updateTypes.UPDATE_THREAD) {
-    types = new Set([
-      updateTypes.UPDATE_THREAD,
-      updateTypes.UPDATE_THREAD_READ_STATUS,
-    ]);
-  } else if (updateData.type === updateTypes.UPDATE_THREAD_READ_STATUS) {
-    types = new Set([updateTypes.UPDATE_THREAD_READ_STATUS]);
-  } else if (
-    updateData.type === updateTypes.DELETE_THREAD ||
-    updateData.type === updateTypes.JOIN_THREAD
-  ) {
-    types = 'all_types';
-  } else if (updateData.type === updateTypes.UPDATE_ENTRY) {
-    types = 'all_types';
-  } else if (updateData.type === updateTypes.UPDATE_CURRENT_USER) {
-    types = new Set([updateTypes.UPDATE_CURRENT_USER]);
-  } else if (updateData.type === updateTypes.UPDATE_USER) {
-    types = new Set([updateTypes.UPDATE_USER]);
-  } else {
+  const types = updateSpecs[updateData.type].deleteCondition;
+  if (!types) {
     return null;
   }
 
diff --git a/lib/shared/updates/bad-device-token-spec.js b/lib/shared/updates/bad-device-token-spec.js
--- a/lib/shared/updates/bad-device-token-spec.js
+++ b/lib/shared/updates/bad-device-token-spec.js
@@ -34,4 +34,5 @@
       deviceToken: info.deviceToken,
     };
   },
+  deleteCondition: null,
 });
diff --git a/lib/shared/updates/delete-account-spec.js b/lib/shared/updates/delete-account-spec.js
--- a/lib/shared/updates/delete-account-spec.js
+++ b/lib/shared/updates/delete-account-spec.js
@@ -69,4 +69,8 @@
       deletedUserID: info.deletedUserID,
     };
   },
+  deleteCondition: new Set([
+    updateTypes.DELETE_ACCOUNT,
+    updateTypes.UPDATE_USER,
+  ]),
 });
diff --git a/lib/shared/updates/delete-thread-spec.js b/lib/shared/updates/delete-thread-spec.js
--- a/lib/shared/updates/delete-thread-spec.js
+++ b/lib/shared/updates/delete-thread-spec.js
@@ -60,4 +60,5 @@
       threadID: info.threadID,
     };
   },
+  deleteCondition: 'all_types',
 });
diff --git a/lib/shared/updates/join-thread-spec.js b/lib/shared/updates/join-thread-spec.js
--- a/lib/shared/updates/join-thread-spec.js
+++ b/lib/shared/updates/join-thread-spec.js
@@ -139,4 +139,5 @@
       rawEntryInfos,
     };
   },
+  deleteCondition: 'all_types',
 });
diff --git a/lib/shared/updates/update-current-user-spec.js b/lib/shared/updates/update-current-user-spec.js
--- a/lib/shared/updates/update-current-user-spec.js
+++ b/lib/shared/updates/update-current-user-spec.js
@@ -52,4 +52,5 @@
       currentUserInfo: currentUserInfoResult,
     };
   },
+  deleteCondition: new Set([updateTypes.UPDATE_CURRENT_USER]),
 });
diff --git a/lib/shared/updates/update-entry-spec.js b/lib/shared/updates/update-entry-spec.js
--- a/lib/shared/updates/update-entry-spec.js
+++ b/lib/shared/updates/update-entry-spec.js
@@ -68,4 +68,5 @@
       entryInfo,
     };
   },
+  deleteCondition: 'all_types',
 });
diff --git a/lib/shared/updates/update-spec.js b/lib/shared/updates/update-spec.js
--- a/lib/shared/updates/update-spec.js
+++ b/lib/shared/updates/update-spec.js
@@ -12,6 +12,7 @@
   FetchMessageInfosResult,
 } from '../../types/message-types.js';
 import type { RawThreadInfos } from '../../types/thread-types.js';
+import type { UpdateType } from '../../types/update-types-enum.js';
 import type {
   ClientUpdateInfo,
   RawUpdateInfo,
@@ -85,4 +86,5 @@
     info: RawInfo,
     params: UpdateInfoFromRawInfoParams,
   ) => ?UpdateInfo,
+  +deleteCondition: ?('all_types' | $ReadOnlySet<UpdateType>),
 };
diff --git a/lib/shared/updates/update-thread-read-status-spec.js b/lib/shared/updates/update-thread-read-status-spec.js
--- a/lib/shared/updates/update-thread-read-status-spec.js
+++ b/lib/shared/updates/update-thread-read-status-spec.js
@@ -68,4 +68,5 @@
       unread: info.unread,
     };
   },
+  deleteCondition: new Set([updateTypes.UPDATE_THREAD_READ_STATUS]),
 });
diff --git a/lib/shared/updates/update-thread-spec.js b/lib/shared/updates/update-thread-spec.js
--- a/lib/shared/updates/update-thread-spec.js
+++ b/lib/shared/updates/update-thread-spec.js
@@ -84,4 +84,8 @@
       threadInfo,
     };
   },
+  deleteCondition: new Set([
+    updateTypes.UPDATE_THREAD,
+    updateTypes.UPDATE_THREAD_READ_STATUS,
+  ]),
 });
diff --git a/lib/shared/updates/update-user-spec.js b/lib/shared/updates/update-user-spec.js
--- a/lib/shared/updates/update-user-spec.js
+++ b/lib/shared/updates/update-user-spec.js
@@ -39,4 +39,5 @@
       updatedUserID: info.updatedUserID,
     };
   },
+  deleteCondition: new Set([updateTypes.UPDATE_USER]),
 });