diff --git a/app/jobs/scheduled/backfill_dominant_colors.rb b/app/jobs/scheduled/backfill_dominant_colors.rb
new file mode 100644
index 00000000000..a0e3c733dfc
--- /dev/null
+++ b/app/jobs/scheduled/backfill_dominant_colors.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Jobs
+  class BackfillDominantColors < ::Jobs::Scheduled
+    every 15.minutes
+
+    def execute(args)
+      Upload.backfill_dominant_colors!(25)
+    end
+  end
+end
diff --git a/app/jobs/scheduled/periodical_updates.rb b/app/jobs/scheduled/periodical_updates.rb
index 01649de0627..5c5da8bac6b 100644
--- a/app/jobs/scheduled/periodical_updates.rb
+++ b/app/jobs/scheduled/periodical_updates.rb
@@ -48,8 +48,6 @@ module Jobs
 
       Category.auto_bump_topic!
 
-      Upload.backfill_dominant_colors!(25)
-
       nil
     end
 
diff --git a/spec/models/upload_spec.rb b/spec/models/upload_spec.rb
index 92d329303c0..a2441540ccc 100644
--- a/spec/models/upload_spec.rb
+++ b/spec/models/upload_spec.rb
@@ -666,6 +666,19 @@ RSpec.describe Upload do
       expect(red_image.dominant_color).to eq("FF0000")
     end
 
+    it "is backfilled by the job" do
+      expect(white_image.dominant_color).to eq(nil)
+      expect(red_image.dominant_color).to eq(nil)
+
+      Jobs::BackfillDominantColors.new.execute({})
+
+      white_image.reload
+      red_image.reload
+
+      expect(white_image.dominant_color).to eq("FFFFFF")
+      expect(red_image.dominant_color).to eq("FF0000")
+    end
+
     it "stores an empty string for non-image uploads" do
       expect(not_an_image.dominant_color).to eq(nil)
       expect(not_an_image.dominant_color(calculate_if_missing: true)).to eq("")