diff --git a/lib/shared/dm-ops/dm-op-utils.js b/lib/shared/dm-ops/dm-op-utils.js
--- a/lib/shared/dm-ops/dm-op-utils.js
+++ b/lib/shared/dm-ops/dm-op-utils.js
@@ -58,6 +58,7 @@
   +recipients:
     | { +type: 'all_peer_devices' | 'self_devices' }
     | { +type: 'some_users', +userIDs: $ReadOnlyArray<string> },
+  +sendOnly?: boolean,
 };
 
 // The operation received from other peers, causes changes to
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
@@ -68,6 +68,8 @@
         return;
       }
 
+      const { op: dmOp } = dmOperationSpecification;
+
       let outboundP2PMessages: ?$ReadOnlyArray<OutboundP2PMessage> = null;
       if (
         dmOperationSpecification.type === dmOperationSpecificationTypes.OUTBOUND
@@ -94,7 +96,41 @@
         dispatchMetadata = dmOperationSpecification.metadata;
       }
 
-      const { op: dmOp } = dmOperationSpecification;
+      let messageIDWithoutAutoRetry: ?string = null;
+      if (
+        dmOperationSpecification.type ===
+          dmOperationSpecificationTypes.OUTBOUND &&
+        !dmOpSpecs[dmOp.type].supportsAutoRetry
+      ) {
+        messageIDWithoutAutoRetry = dmOp.messageID;
+      }
+
+      if (
+        dmOperationSpecification.type ===
+          dmOperationSpecificationTypes.OUTBOUND &&
+        dmOperationSpecification.sendOnly
+      ) {
+        const notificationsCreationData = await dmOpSpecs[
+          dmOp.type
+        ].notificationsCreationData?.(dmOp, utilities);
+
+        dispatchWithMetadata(
+          {
+            type: processDMOpsActionType,
+            payload: {
+              rawMessageInfos: [],
+              updateInfos: [],
+              outboundP2PMessages,
+              messageIDWithoutAutoRetry,
+              notificationsCreationData,
+            },
+          },
+          dispatchMetadata,
+        );
+
+        return;
+      }
+
       const processingCheckResult = dmOpSpecs[dmOp.type].canBeProcessed(
         dmOp,
         viewerID,
@@ -194,15 +230,6 @@
         });
       }
 
-      let messageIDWithoutAutoRetry: ?string = null;
-      if (
-        dmOperationSpecification.type ===
-          dmOperationSpecificationTypes.OUTBOUND &&
-        !dmOpSpecs[dmOperationSpecification.op.type].supportsAutoRetry
-      ) {
-        messageIDWithoutAutoRetry = dmOperationSpecification.op.messageID;
-      }
-
       dispatchWithMetadata(
         {
           type: processDMOpsActionType,