diff --git a/program/services.py b/program/services.py
index fc323d4120aa6ad729d280cd760270d6b708cff8..e8744fabfdb755787c9796857ccc0ca976f515ed 100644
--- a/program/services.py
+++ b/program/services.py
@@ -100,6 +100,19 @@ def resolve_conflicts(data: ScheduleCreateUpdateData, schedule_pk: int | None, s
     solutions = data.get("solutions", [])   # only needed if conflicts exist
 
     new_schedule = instantiate_upcoming_schedule(schedule, show_pk, schedule_pk)
+
+    last_date_is_unknown = new_schedule.last_date is None   # we need to keep track of this
+
+    # FIXME: refactor this to eliminate the duplication
+    if last_date_is_unknown:
+        if AUTO_SET_LAST_DATE_TO_END_OF_YEAR:
+            year = timezone.now().year
+            new_schedule.last_date = timezone.datetime(year, 12, 31).date()
+        else:
+            new_schedule.last_date = new_schedule.first_date + timedelta(
+                days=+AUTO_SET_LAST_DATE_TO_DAYS_IN_FUTURE
+            )
+
     show = new_schedule.show
     conflicts = make_conflicts(schedule, schedule_pk, show_pk)
 
@@ -307,6 +320,9 @@ def resolve_conflicts(data: ScheduleCreateUpdateData, schedule_pk: int | None, s
 
     # Database changes if no errors found
 
+    if last_date_is_unknown:
+        new_schedule.last_date = None
+
     if to_create:
         new_schedule.save()
 
@@ -344,7 +360,11 @@ def resolve_conflicts(data: ScheduleCreateUpdateData, schedule_pk: int | None, s
 def instantiate_upcoming_schedule(
     data: ScheduleData, show_pk: int, pk: int | None = None
 ) -> Schedule:
-    """Returns an upcoming schedule instance for conflict resolution"""
+    """
+    Returns an upcoming schedule instance for conflict resolution.
+
+    If the data does not contain a last_date, the Schedule instance will not contain a last_date.
+    """
 
     rrule = RRule.objects.get(pk=data["rrule"])
     show = Show.objects.get(pk=show_pk)
@@ -366,15 +386,7 @@ def instantiate_upcoming_schedule(
     end_time = parse_time(data["end_time"])
 
     # last_date may not be present in data
-    if data.get("last_date") is not None:
-        last_date = parse_date(data["last_date"])
-    else:
-        # If last_date was not set, set it to the end of the year or add x days
-        if AUTO_SET_LAST_DATE_TO_END_OF_YEAR:
-            year = timezone.now().year
-            last_date = timezone.datetime(year, 12, 31).date()
-        else:
-            last_date = first_date + timedelta(days=+AUTO_SET_LAST_DATE_TO_DAYS_IN_FUTURE)
+    last_date = parse_date(data["last_date"]) if data.get("last_date") is not None else None
 
     return Schedule(
         pk=pk,
@@ -434,12 +446,6 @@ def generate_timeslots(schedule: Schedule) -> list[TimeSlot]:
     """
     timeslots = []
 
-    # adjust last_date if end_time is after midnight
-    if schedule.end_time < schedule.start_time:
-        last_date = schedule.first_date + timedelta(days=+1)
-    else:
-        last_date = schedule.first_date
-
     if schedule.rrule.freq == 3:  # daily: Ignore schedule.by_weekday to set by_weekday
         by_weekday_start = by_weekday_end = (0, 1, 2, 3, 4, 5, 6)
     elif (
@@ -487,6 +493,22 @@ def generate_timeslots(schedule: Schedule) -> list[TimeSlot]:
         if schedule.end_time < schedule.start_time:
             by_weekday_end = by_weekday_start + 1 if by_weekday_start < 6 else 0
 
+    # adjust last_date if end_time is after midnight
+    if schedule.end_time < schedule.start_time:
+        last_date = schedule.first_date + timedelta(days=+1)
+    else:
+        last_date = schedule.first_date
+
+    # FIXME: refactor this to eliminate the duplication
+    if schedule.last_date is None:
+        if AUTO_SET_LAST_DATE_TO_END_OF_YEAR:
+            year = timezone.now().year
+            until = timezone.datetime(year, 12, 31).date()
+        else:
+            until = schedule.first_date + timedelta(days=+AUTO_SET_LAST_DATE_TO_DAYS_IN_FUTURE)
+    else:
+        until = schedule.last_date
+
     if schedule.rrule.freq == 0:  # once:
         starts = [datetime.combine(schedule.first_date, schedule.start_time)]
         ends = [datetime.combine(last_date, schedule.end_time)]
@@ -496,7 +518,7 @@ def generate_timeslots(schedule: Schedule) -> list[TimeSlot]:
                 freq=schedule.rrule.freq,
                 dtstart=datetime.combine(schedule.first_date, schedule.start_time),
                 interval=schedule.rrule.interval,
-                until=schedule.last_date + relativedelta(days=+1),
+                until=until + relativedelta(days=+1),
                 bysetpos=schedule.rrule.by_set_pos,
                 byweekday=by_weekday_start,
             )
@@ -506,7 +528,7 @@ def generate_timeslots(schedule: Schedule) -> list[TimeSlot]:
                 freq=schedule.rrule.freq,
                 dtstart=datetime.combine(last_date, schedule.end_time),
                 interval=schedule.rrule.interval,
-                until=schedule.last_date + relativedelta(days=+1),
+                until=until + relativedelta(days=+1),
                 bysetpos=schedule.rrule.by_set_pos,
                 byweekday=by_weekday_end,
             )