diff --git a/lib/classes/JsonApi/Routes/Courseware/TaskGroupsUpdate.php b/lib/classes/JsonApi/Routes/Courseware/TaskGroupsUpdate.php
index 132888e22e4b33520371897523b020d35d5031fb..8662b71ea80330fc240022ae3f5b6df3595c09a2 100644
--- a/lib/classes/JsonApi/Routes/Courseware/TaskGroupsUpdate.php
+++ b/lib/classes/JsonApi/Routes/Courseware/TaskGroupsUpdate.php
@@ -63,19 +63,33 @@ class TaskGroupsUpdate extends JsonApiController
             return 'Invalid `type` of document“s `data`.';
         }
 
+        if (!self::arrayHas($json, 'data.attributes.start-date')) {
+            return 'Missing `start-date` attribute.';
+        }
+        $startDate = self::arrayGet($json, 'data.attributes.start-date');
+        if (!self::isValidTimestamp($startDate)) {
+            return '`start-date` is not an ISO 8601 timestamp.';
+        }
+
         if (!self::arrayHas($json, 'data.attributes.end-date')) {
-            return 'Missing `review-start` attribute.';
+            return 'Missing `end-date` attribute.';
         }
         $endDate = self::arrayGet($json, 'data.attributes.end-date');
         if (!self::isValidTimestamp($endDate)) {
             return '`end-date` is not an ISO 8601 timestamp.';
         }
+
+        if (self::fromISO8601($startDate) > self::fromISO8601($endDate)) {
+            return '`start-date` is later than `end-date`';
+        }
     }
 
     private function update(TaskGroup $taskGroup, array $json): TaskGroup
     {
+        $startDate = self::fromISO8601(self::arrayGet($json, 'data.attributes.start-date'));
         $endDate = self::fromISO8601(self::arrayGet($json, 'data.attributes.end-date'));
 
+        $taskGroup->start_date = $startDate->getTimestamp();
         $taskGroup->end_date = $endDate->getTimestamp();
 
         $taskGroup->store();