diff --git a/lib/reducers/dm-operations-queue-reducer.js b/lib/reducers/dm-operations-queue-reducer.js
--- a/lib/reducers/dm-operations-queue-reducer.js
+++ b/lib/reducers/dm-operations-queue-reducer.js
@@ -12,6 +12,7 @@
   pruneDMOpsQueueActionType,
   type QueuedDMOperations,
   queueDMOpsActionType,
+  saveUnsupportedOperationActionType,
 } from '../types/dm-ops.js';
 import type { BaseAction } from '../types/redux-types.js';
 
@@ -173,6 +174,20 @@
       },
       operations: [],
     };
+  } else if (action.type === saveUnsupportedOperationActionType) {
+    return {
+      store,
+      operations: [
+        {
+          type: 'replace_dm_operation',
+          payload: {
+            id: action.payload.id,
+            type: action.payload.operation.type,
+            operation: action.payload.operation,
+          },
+        },
+      ],
+    };
   }
   return { store, operations: [] };
 }
diff --git a/lib/shared/dm-ops/process-dm-ops.js b/lib/shared/dm-ops/process-dm-ops.js
--- a/lib/shared/dm-ops/process-dm-ops.js
+++ b/lib/shared/dm-ops/process-dm-ops.js
@@ -2,6 +2,7 @@
 
 import invariant from 'invariant';
 import * as React from 'react';
+import uuid from 'uuid';
 
 import type { ProcessDMOperationUtilities } from './dm-op-spec.js';
 import { dmOpSpecs } from './dm-op-specs.js';
@@ -19,11 +20,6 @@
 import { useGetLatestMessageEdit } from '../../hooks/latest-message-edit.js';
 import { useDispatchWithMetadata } from '../../hooks/ops-hooks.js';
 import { mergeUpdatesWithMessageInfos } from '../../reducers/message-reducer.js';
-import {
-  type MessageNotifyType,
-  messageNotifyTypes,
-} from '../../shared/messages/message-spec.js';
-import { messageSpecs } from '../../shared/messages/message-specs.js';
 import {
   usePeerToPeerCommunication,
   type ProcessOutboundP2PMessagesResult,
@@ -34,6 +30,7 @@
   queueDMOpsActionType,
   dmOperationValidator,
   type ProcessDMOpsPayload,
+  saveUnsupportedOperationActionType,
 } from '../../types/dm-ops.js';
 import type { RawMessageInfo } from '../../types/message-types.js';
 import type { DispatchMetadata } from '../../types/redux-types.js';
@@ -41,6 +38,11 @@
 import type { ClientUpdateInfo } from '../../types/update-types.js';
 import { extractUserIDsFromPayload } from '../../utils/conversion-utils.js';
 import { useSelector, useDispatch } from '../../utils/redux-utils.js';
+import {
+  type MessageNotifyType,
+  messageNotifyTypes,
+} from '../messages/message-spec.js';
+import { messageSpecs } from '../messages/message-specs.js';
 
 function useProcessDMOperation(): (
   dmOperationSpecification: DMOperationSpecification,
@@ -102,6 +104,24 @@
         dispatchMetadata = dmOperationSpecification.metadata;
       }
 
+      if (!dmOpSpecs[dmOp.type]) {
+        dispatchWithMetadata(
+          {
+            type: saveUnsupportedOperationActionType,
+            payload: {
+              operation: dmOp,
+              id: uuid.v4(),
+            },
+          },
+          dispatchMetadata,
+        );
+        addLog(
+          "This operation type isn't supported by this code version",
+          JSON.stringify(dmOp),
+        );
+        return;
+      }
+
       let composableMessageID: ?string = null;
       if (
         dmOperationSpecification.type ===
@@ -205,7 +225,6 @@
           },
           dispatchMetadata,
         );
-        await confirmPeerToPeerMessage(dispatchMetadata);
         return;
       }
 
diff --git a/lib/types/dm-ops.js b/lib/types/dm-ops.js
--- a/lib/types/dm-ops.js
+++ b/lib/types/dm-ops.js
@@ -585,6 +585,13 @@
   +userID: string,
 };
 
+export const saveUnsupportedOperationActionType =
+  'SAVE_UNSUPPORTED_DM_OPERATION';
+export type SaveUnsupportedOperationPayload = {
+  +operation: DMOperation,
+  +id: string,
+};
+
 export type OperationsQueue = $ReadOnlyArray<{
   +operation: DMOperation,
   +timestamp: number,
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
@@ -53,6 +53,7 @@
   ClearQueuedMessageDMOpsPayload,
   ClearQueuedEntryDMOpsPayload,
   ClearQueuedMembershipDMOpsPayload,
+  SaveUnsupportedOperationPayload,
 } from './dm-ops.js';
 import type { DraftStore } from './draft-types.js';
 import type { EnabledApps, SupportedApps } from './enabled-apps.js';
@@ -1681,6 +1682,10 @@
         +type: 'RESTORE_USER_SUCCESS',
         +payload: RestoreUserResult,
         +loadingInfo: LoadingInfo,
+      }
+    | {
+        +type: 'SAVE_UNSUPPORTED_DM_OPERATION',
+        +payload: SaveUnsupportedOperationPayload,
       },
 }>;