diff --git a/notifications_routing/router.py b/notifications_routing/router.py
index a69904ed857777a76394e06edae8105e2fd2792a..d5523d6ceff56c06b4a07de7761a4ff5506b0f48 100644
--- a/notifications_routing/router.py
+++ b/notifications_routing/router.py
@@ -69,6 +69,7 @@ class Router(megabus.Listener):
             str(OutputMessageKeys.IMGURL): message_json[str(InputMessageKeys.IMGURL)],
             str(OutputMessageKeys.CHANNEL_CATEGORY): category_name,
             str(OutputMessageKeys.PRIVATE): message_json[str(InputMessageKeys.PRIVATE)],
+            str(OutputMessageKeys.INTERSECTION): message_json[str(InputMessageKeys.INTERSECTION)],
             str(OutputMessageKeys.TARGETUSERS): message_json[str(InputMessageKeys.TARGETUSERS)],
             str(OutputMessageKeys.TARGETGROUPS): message_json[str(InputMessageKeys.TARGETGROUPS)],
         }
@@ -118,7 +119,7 @@ class Router(megabus.Listener):
 
         return channel_users
 
-    def get_target_users(self, channel_id, specified_target_users, specified_target_groups):  # noqa: C901
+    def get_target_users(self, channel_id, specified_target_users, specified_target_groups):
         """Join users from our data source and the grappa system to return a unique users list."""
         target_users = []
         if specified_target_users:
@@ -132,9 +133,9 @@ class Router(megabus.Listener):
 
         return target_users
 
-    def process_message(self, message):
-        """Process a message according to user and default preferences and sends to available delivery channels."""
-        if message.get(OutputMessageKeys.PRIVATE) is True:
+    def process_target_users(self, message):
+        """Process unique users list, if targeted, intersection or standard post."""
+        if OutputMessageKeys.PRIVATE in message and message[OutputMessageKeys.PRIVATE]:
             logging.debug("Processing direct notification %s", message[OutputMessageKeys.ID])
             target_users = self.get_target_users(
                 message[OutputMessageKeys.CHANNEL_ID],
@@ -144,6 +145,17 @@ class Router(megabus.Listener):
             if not target_users:
                 logging.debug("no target_users found for notification %s", message[OutputMessageKeys.ID])
                 return
+            if OutputMessageKeys.INTERSECTION in message and message[OutputMessageKeys.INTERSECTION]:
+                logging.debug("Processing intersection target users for %s", message[OutputMessageKeys.ID])
+                tmp_channel_users = self.get_channel_users(message[OutputMessageKeys.CHANNEL_ID])
+                if not tmp_channel_users:
+                    logging.debug(
+                        "no tmp_channel_users to intersect for channel %s", message[OutputMessageKeys.CHANNEL_ID]
+                    )
+                    return
+                target_users = set(tmp_channel_users).intersection(target_users)
+
+            return target_users
         else:
             logging.debug("Processing general notification %s", message[OutputMessageKeys.ID])
             target_users = self.get_channel_users(message[OutputMessageKeys.CHANNEL_ID])
@@ -151,6 +163,14 @@ class Router(megabus.Listener):
                 logging.debug("no channel_users for channel %s", message[OutputMessageKeys.CHANNEL_ID])
                 return
 
+            return target_users
+
+    def process_message(self, message):
+        """Process a message according to user and default preferences and sends to available delivery channels."""
+        target_users = self.process_target_users(message)
+        if not target_users:
+            return
+
         for user in target_users:
             # Never logged in users, apply default preferences
             has_logged_in = self.data_source.LAST_LOGIN in user and user.get(self.data_source.LAST_LOGIN)
diff --git a/notifications_routing/utils.py b/notifications_routing/utils.py
index 2191740c53c8ce804df7a33a01fe4771b33f2145..ff87e317e55df1a7039cce68ab4a9f11d17a85e6 100644
--- a/notifications_routing/utils.py
+++ b/notifications_routing/utils.py
@@ -29,6 +29,7 @@ class InputMessageKeys(StrEnum):
     LINK = "link"
     IMGURL = "imgUrl"
     PRIVATE = "private"
+    INTERSECTION = "intersection"
     TARGETUSERS = "targetUsers"
     TARGETGROUPS = "targetGroups"
 
@@ -48,6 +49,7 @@ class OutputMessageKeys(StrEnum):
     IMGURL = "img_url"
     ID = "id"
     PRIVATE = "private"
+    INTERSECTION = "intersection"
     TARGETUSERS = "target_users"
     TARGETGROUPS = "target_groups"