Index: sitescripts/notifications/parser.py
===================================================================
--- a/sitescripts/notifications/parser.py
+++ b/sitescripts/notifications/parser.py
@@ -118,15 +118,12 @@
         data = codecs.getreader("utf8")(archive.extractfile(fileinfo))
         try:
           notification = _parse_notification(data, name)
-          if "inactive" in notification:
-            continue
-          current_time = datetime.datetime.now()
-          start = notification.pop("start", None)
-          if start is not None and current_time < start:
-            continue
-          end = notification.pop("end", None)
-          if end is not None and current_time > end:
-            continue
+          if not "inactive" in notification:
+            current_time = datetime.datetime.now()
+            start = notification.pop("start", current_time)
+            end = notification.pop("end", current_time)
+            if not start <= current_time <= end:
+              notification["inactive"] = True
           notifications.append(notification)
         except:
           traceback.print_exc()
Index: sitescripts/notifications/test/notification.py
===================================================================
--- a/sitescripts/notifications/test/notification.py
+++ b/sitescripts/notifications/test/notification.py
@@ -299,5 +299,44 @@
     self.assertEqual(len(result["notifications"]), 1)
     self.assertEqual(result["notifications"][0]["id"], "1")
 
+  def test_stays_in_group_when_notification_present(self):
+    self.load_notifications_mock.return_value = [
+      {"id": "a"}
+    ]
+    result = json.loads(notification.notification({
+      "QUERY_STRING": "lastVersion=197001010000-a/0-b/1"
+    }, lambda *args: None))
+    self.assertEqual(len(result["notifications"]), 0)
+    self.assertRegexpMatches(result["version"], r"-a/0")
+
+  def test_leaves_group_when_notification_absent(self):
+    self.load_notifications_mock.return_value = []
+    result = json.loads(notification.notification({
+      "QUERY_STRING": "lastVersion=197001010000-a/0-b/1"
+    }, lambda *args: None))
+    self.assertEqual(len(result["notifications"]), 0)
+    self.assertRegexpMatches(result["version"], r"[^-]*")
+
+  def test_stays_in_group_when_notification_inactive(self):
+    self.load_notifications_mock.return_value = [
+      {"id": "a", "inactive": True}
+    ]
+    result = json.loads(notification.notification({
+      "QUERY_STRING": "lastVersion=197001010000-a/0-b/1"
+    }, lambda *args: None))
+    self.assertEqual(len(result["notifications"]), 0)
+    self.assertRegexpMatches(result["version"], r"-a/0")
+
+  def test_inactive_notifications_not_returned(self):
+    self.load_notifications_mock.return_value = [
+      {"id": "a", "title": {}, "message": {}, "inactive": True},
+      {"id": "b", "title": {}, "message": {}, "inactive": False},
+      {"id": "c", "title": {}, "message": {}}
+    ]
+    result = json.loads(notification.notification({}, lambda *args: None))
+    self.assertEqual(len(result["notifications"]), 2)
+    self.assertEqual(result["notifications"][0]["id"], "b")
+    self.assertEqual(result["notifications"][1]["id"], "c")
+
 if __name__ == '__main__':
   unittest.main()
Index: sitescripts/notifications/test/parser.py
===================================================================
--- a/sitescripts/notifications/test/parser.py
+++ b/sitescripts/notifications/test/parser.py
@@ -63,13 +63,15 @@
     self.assertEqual(notifications[0]["severity"], "information")
     self.assertEqual(notifications[0]["title"]["en-US"], "The title")
     self.assertEqual(notifications[0]["message"]["en-US"], "The message")
+    self.assertNotIn("inactive", notifications[0])
 
   def test_inactive(self):
     self.notification_to_load = ("1", """
 inactive = True
 """)
     notifications = parser.load_notifications()
-    self.assertEqual(len(notifications), 0)
+    self.assertEqual(len(notifications), 1)
+    self.assertTrue(notifications[0]["inactive"])
 
   def test_in_range(self):
     current_time = datetime.datetime.now()
@@ -83,6 +85,7 @@
     notifications = parser.load_notifications()
     self.assertEqual(len(notifications), 1)
     self.assertEqual(notifications[0]["id"], "1")
+    self.assertNotIn("inactive", notifications[0])
 
   def test_after_range(self):
     current_time = datetime.datetime.now()
@@ -93,7 +96,8 @@
 end = %s
 """ % (_format_time(start_time), _format_time(end_time)))
     notifications = parser.load_notifications()
-    self.assertEqual(len(notifications), 0)
+    self.assertEqual(len(notifications), 1)
+    self.assertTrue(notifications[0]["inactive"])
 
   def test_before_range(self):
     current_time = datetime.datetime.now()
@@ -104,7 +108,8 @@
 end = %s
 """ % (_format_time(start_time), _format_time(end_time)))
     notifications = parser.load_notifications()
-    self.assertEqual(len(notifications), 0)
+    self.assertEqual(len(notifications), 1)
+    self.assertTrue(notifications[0]["inactive"])
 
   def test_start_and_end_not_present(self):
     current_time = datetime.datetime.now()
@@ -117,6 +122,7 @@
 """ % (_format_time(start_time), _format_time(end_time)))
     notifications = parser.load_notifications()
     self.assertEqual(len(notifications), 1)
+    self.assertNotIn("inactive", notifications[0])
     self.assertNotIn("start", notifications[0])
     self.assertNotIn("end", notifications[0])
 
Index: sitescripts/notifications/web/notification.py
===================================================================
--- a/sitescripts/notifications/web/notification.py
+++ b/sitescripts/notifications/web/notification.py
@@ -29,8 +29,6 @@
                         if x.count("/") == 1)
   groups = []
   for notification in notifications:
-    if "variants" not in notification:
-      continue
     group_id = notification["id"]
     if group_id in version_groups:
       groups.append({"id": group_id, "variant": int(version_groups[group_id])})
@@ -104,6 +102,7 @@
   version = params.get("lastVersion", [""])[0]
   notifications = load_notifications()
   groups = _determine_groups(version, notifications)
+  notifications = [x for x in notifications if not x.get("inactive", False)]
   if not groups:
     groups = _assign_groups(notifications)
   response = _create_response(notifications, groups)
