diff --git a/CHANGES.rst b/CHANGES.rst
index 26a2256e5383ef7c1565c626c2a6733331d1acb6..3390e87f65531fe735362f0dd4068181cbee51f1 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -39,6 +39,8 @@ Changelog
     if grabbing a sky map from an external URL such as from Fermi-GBM that
     lacks this field.
 
+-   Prevent external event from switching superevents.
+
 2.0.4 "Skunk Ape" (2023-03-28)
 ------------------------------
 
diff --git a/gwcelery/tasks/raven.py b/gwcelery/tasks/raven.py
index ab22326339d60146a683100ba5e7815070c09219..7e0f98310278beb0460c330d4caf2c2561a02121 100644
--- a/gwcelery/tasks/raven.py
+++ b/gwcelery/tasks/raven.py
@@ -217,6 +217,10 @@ def raven_pipeline(raven_search_results, gracedb_id, alert_object, tl, th,
             exttrig_id = gracedb_id
             superevent = result
             ext_event = alert_object
+            # Don't continue if it is a different superevent than previous one.
+            if ext_event['superevent'] is not None \
+                    and ext_event['superevent'] != superevent['superevent_id']:
+                return
 
         canvas = (
             gracedb.add_event_to_superevent.si(superevent_id, exttrig_id)
diff --git a/gwcelery/tests/test_tasks_raven.py b/gwcelery/tests/test_tasks_raven.py
index bebb52b728fa36eb27f6ecf491c5e0b2b71c964f..ab932cf6d601d095239a2f97006da91774c7fd64 100644
--- a/gwcelery/tests/test_tasks_raven.py
+++ b/gwcelery/tests/test_tasks_raven.py
@@ -207,7 +207,9 @@ def mock_get_superevent(superevent_id):
      [[{'superevent_id': 'S12', 'far': .001, 'preferred_event': 'G3'}],
         'T4', -10, 10, 'Burst'],
      [[{'superevent_id': 'MS13', 'far': 1, 'preferred_event': 'M3'}],
-        'M15', -1, 5, 'CBC']])
+        'M15', -1, 5, 'CBC'],
+     [[{'superevent_id': 'S13', 'far': 1, 'preferred_event': 'G4'}],
+        'E6', -60, 600, 'Burst']])
 @patch('gwcelery.tasks.raven.trigger_raven_alert.run')
 @patch('gwcelery.tasks.gracedb.get_labels', mock_get_labels)
 @patch('gwcelery.tasks.raven.calculate_coincidence_far.run',
@@ -229,7 +231,8 @@ def test_raven_pipeline(mock_plot_overlap_integral,
     """
     alert_object = {'preferred_event': 'G1', 'pipeline': 'Fermi',
                     'search': 'Supernova' if graceid == 'T4' else 'GRB',
-                    'labels': []}
+                    'labels': [],
+                    'superevent': None if graceid != 'E6' else 'S14'}
     time_coinc_far = mock_coinc_far()['temporal_coinc_far']
     space_coinc_far = mock_coinc_far()['spatiotemporal_coinc_far']
 
@@ -293,13 +296,20 @@ def test_raven_pipeline(mock_plot_overlap_integral,
         alert_calls.append(call(
             mock_coinc_far(),
             result, graceid, alert_object, group))
-    mock_trigger_raven_alert.assert_has_calls(alert_calls, any_order=True)
-
-    mock_calculate_coincidence_far.assert_has_calls(coinc_calls,
-                                                    any_order=True)
-    mock_update_superevent.assert_has_calls(update_calls, any_order=True)
-    mock_create_label.assert_has_calls(label_calls, any_order=True)
-    mock_plot_overlap_integral.assert_has_calls(plot_calls, any_order=True)
+    if graceid != 'E6':
+        mock_trigger_raven_alert.assert_has_calls(alert_calls, any_order=True)
+
+        mock_calculate_coincidence_far.assert_has_calls(coinc_calls,
+                                                        any_order=True)
+        mock_update_superevent.assert_has_calls(update_calls, any_order=True)
+        mock_create_label.assert_has_calls(label_calls, any_order=True)
+        mock_plot_overlap_integral.assert_has_calls(plot_calls, any_order=True)
+    else:
+        mock_trigger_raven_alert.assert_not_called()
+        mock_calculate_coincidence_far.assert_not_called()
+        mock_update_superevent.assert_not_called()
+        mock_create_label.assert_not_called()
+        mock_plot_overlap_integral.assert_not_called()
 
 
 @pytest.mark.parametrize(