diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index a1ac2ba228e3a8bab876023fb8a4cdbadd11f35f..879949012ef37e2a9045dd75d761f3d70c929050 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -14,9 +14,16 @@
 # As above, but rules for running when the scheduler triggers the pipeline.
 .schedule_rules: &RUN_ON_SCHEDULE
   rules:
-    - if: '$CI_PIPELINE_SOURCE == "schedule"'
+    # There are multiple schedules so make sure this one is for us.
+    - if: '$SCHEDULE_TARGET != $CI_JOB_NAME'
+      when: "never"
 
-    - when: "never"
+    # Make sure this is actually a scheduled run
+    - if: '$CI_PIPELINE_SOURCE != "schedule"'
+      when: "never"
+
+    # Conditions look good: run.
+    - when: "always"
 
 stages:
   - "build"
@@ -169,7 +176,8 @@ update-nixpkgs:
               "$CI_DEFAULT_BRANCH"
 
 update-production:
-  <<: *RUN_ON_MERGE_REQUEST
+  <<: *RUN_ON_SCHEDULE
+  stage: "build"
   script:
     - |
       ./ci-tools/update-production \