diff --git a/src/notifications/VectorPushRulesDefinitions.ts b/src/notifications/VectorPushRulesDefinitions.ts
index fb81ac799e..5eb4d6030c 100644
--- a/src/notifications/VectorPushRulesDefinitions.ts
+++ b/src/notifications/VectorPushRulesDefinitions.ts
@@ -111,6 +111,7 @@ export const VectorPushRulesDefinitions: Record<string, VectorPushRuleDefinition
             [VectorState.Loud]: StandardActions.ACTION_HIGHLIGHT_DEFAULT_SOUND,
             [VectorState.Off]: StandardActions.ACTION_DISABLED,
         },
+        syncedRuleIds: [RuleId.IsUserMention],
     }),
 
     // Messages containing @room
@@ -122,6 +123,7 @@ export const VectorPushRulesDefinitions: Record<string, VectorPushRuleDefinition
             [VectorState.Loud]: StandardActions.ACTION_HIGHLIGHT,
             [VectorState.Off]: StandardActions.ACTION_DISABLED,
         },
+        syncedRuleIds: [RuleId.IsRoomMention],
     }),
 
     // Messages just sent to the user in a 1:1 room
diff --git a/src/utils/pushRules/monitorSyncedPushRules.ts b/src/utils/pushRules/monitorSyncedPushRules.ts
index 0af5e37a33..2b89484343 100644
--- a/src/utils/pushRules/monitorSyncedPushRules.ts
+++ b/src/utils/pushRules/monitorSyncedPushRules.ts
@@ -63,7 +63,9 @@ const monitorSyncedRule = async (
     const primaryRuleVectorState = definition.ruleToVectorState(primaryRule);
 
     const outOfSyncRules = syncedRules.filter(
-        (syncedRule) => definition.ruleToVectorState(syncedRule) !== primaryRuleVectorState,
+        (syncedRule) =>
+            syncedRule.enabled !== primaryRule.enabled ||
+            definition.ruleToVectorState(syncedRule) !== primaryRuleVectorState,
     );
 
     if (outOfSyncRules.length) {
@@ -71,7 +73,7 @@ const monitorSyncedRule = async (
             matrixClient,
             // eslint-disable-next-line camelcase, @typescript-eslint/naming-convention
             outOfSyncRules.map(({ rule_id }) => rule_id),
-            primaryRule.actions,
+            primaryRule.enabled ? primaryRule.actions : undefined,
         );
     }
 };
diff --git a/test/components/structures/LoggedInView-test.tsx b/test/components/structures/LoggedInView-test.tsx
index 36598c9c98..a8cf7ffb34 100644
--- a/test/components/structures/LoggedInView-test.tsx
+++ b/test/components/structures/LoggedInView-test.tsx
@@ -16,7 +16,7 @@ limitations under the License.
 
 import React from "react";
 import { render, RenderResult } from "@testing-library/react";
-import { ConditionKind, EventType, IPushRule, MatrixEvent, ClientEvent } from "matrix-js-sdk/src/matrix";
+import { ConditionKind, EventType, IPushRule, MatrixEvent, ClientEvent, PushRuleKind } from "matrix-js-sdk/src/matrix";
 import { MediaHandler } from "matrix-js-sdk/src/webrtc/mediaHandler";
 import { logger } from "matrix-js-sdk/src/logger";
 
@@ -81,6 +81,11 @@ describe("<LoggedInView />", () => {
             enabled: true,
         } as IPushRule;
 
+        const oneToOneRuleDisabled = {
+            ...oneToOneRule,
+            enabled: false,
+        };
+
         const groupRule = {
             conditions: [{ kind: ConditionKind.EventMatch, key: "type", pattern: "m.room.message" }],
             actions: StandardActions.ACTION_NOTIFY,
@@ -221,6 +226,36 @@ describe("<LoggedInView />", () => {
                 );
             });
 
+            it("updates all mismatched rules from synced rules when primary rule is disabled", async () => {
+                setPushRules([
+                    // poll 1-1 rules are synced with oneToOneRule
+                    oneToOneRuleDisabled, // off
+                    pollStartOneToOne, // on
+                    pollEndOneToOne, // loud
+                    // poll group rules are synced with groupRule
+                    groupRule, // on
+                    pollStartGroup, // loud
+                ]);
+
+                getComponent();
+
+                await flushPromises();
+
+                // set to match primary rule
+                expect(mockClient.setPushRuleEnabled).toHaveBeenCalledWith(
+                    "global",
+                    PushRuleKind.Underride,
+                    pollStartOneToOne.rule_id,
+                    false,
+                );
+                expect(mockClient.setPushRuleEnabled).toHaveBeenCalledWith(
+                    "global",
+                    PushRuleKind.Underride,
+                    pollEndOneToOne.rule_id,
+                    false,
+                );
+            });
+
             it("catches and logs errors while updating a rule", async () => {
                 mockClient.setPushRuleActions.mockRejectedValueOnce("oups").mockResolvedValueOnce({});
 
@@ -302,6 +337,31 @@ describe("<LoggedInView />", () => {
                 );
             });
 
+            it("updates all mismatched rules from synced rules on a change to push rules account data when primary rule is disabled", async () => {
+                // setup a push rule state with mismatched rules
+                setPushRules([
+                    // poll 1-1 rules are synced with oneToOneRule
+                    oneToOneRuleDisabled, // off
+                    pollEndOneToOne, // loud
+                ]);
+
+                getComponent();
+
+                await flushPromises();
+
+                mockClient.setPushRuleEnabled.mockClear();
+
+                mockClient.emit(ClientEvent.AccountData, pushRulesEvent);
+
+                // set to match primary rule
+                expect(mockClient.setPushRuleEnabled).toHaveBeenCalledWith(
+                    "global",
+                    "underride",
+                    pollEndOneToOne.rule_id,
+                    false,
+                );
+            });
+
             it("stops listening to account data events on unmount", () => {
                 // setup a push rule state with mismatched rules
                 setPushRules([