diff --git a/app/services/spam/spam_verdict_service.rb b/app/services/spam/spam_verdict_service.rb
index 2d4bebc8b2bb6065253ca1cbc35b26ad7fc49449..f69ee255e01ae2195a6006773da2c1ec7facab36 100644
--- a/app/services/spam/spam_verdict_service.rb
+++ b/app/services/spam/spam_verdict_service.rb
@@ -70,7 +70,8 @@ def get_spamcheck_verdict
         result = spamcheck_client.spam?(spammable: target, user: user, context: context, extra_features: extra_features)
 
         if result.evaluated?
-          Abuse::TrustScore.create!(user: user, score: result.score, source: :spamcheck)
+          correlation_id = Labkit::Correlation::CorrelationId.current_id || ''
+          Abuse::TrustScoreWorker.perform_async(user.id, :spamcheck, result.score, correlation_id)
         end
 
         result.verdict
diff --git a/spec/services/spam/spam_verdict_service_spec.rb b/spec/services/spam/spam_verdict_service_spec.rb
index 361742699b0cbe25d6f4df4c4e13b25dabdf3edb..8669bca90bd8b462686fcbb752b4ead67f461344 100644
--- a/spec/services/spam/spam_verdict_service_spec.rb
+++ b/spec/services/spam/spam_verdict_service_spec.rb
@@ -263,11 +263,10 @@
       end
 
       context 'if the endpoint is accessible' do
-        let(:user_scores) { Abuse::UserTrustScore.new(user) }
-
         before do
           allow(service).to receive(:spamcheck_client).and_return(spam_client)
           allow(spam_client).to receive(:spam?).and_return(spam_client_result)
+          allow(Labkit::Correlation::CorrelationId).to receive(:current_id).and_return('cid')
         end
 
         context 'if the result is a NOOP verdict' do
@@ -275,8 +274,8 @@
           let(:verdict_value) { ::Spamcheck::SpamVerdict::Verdict::NOOP }
 
           it 'returns the verdict' do
+            expect(Abuse::TrustScoreWorker).not_to receive(:perform_async)
             is_expected.to eq(NOOP)
-            expect(user_scores.spam_score).to eq(0.0)
           end
         end
 
@@ -286,8 +285,8 @@
 
           context 'the result was evaluated' do
             it 'returns the verdict and updates the spam score' do
+              expect(Abuse::TrustScoreWorker).to receive(:perform_async).once.with(user.id, :spamcheck, instance_of(Float), 'cid')
               is_expected.to eq(ALLOW)
-              expect(user_scores.spam_score).to be_within(0.000001).of(verdict_score)
             end
           end
 
@@ -295,8 +294,8 @@
             let(:verdict_evaluated) { false }
 
             it 'returns the verdict and does not update the spam score' do
+              expect(Abuse::TrustScoreWorker).not_to receive(:perform_async)
               expect(subject).to eq(ALLOW)
-              expect(user_scores.spam_score).to eq(0.0)
             end
           end
         end
@@ -317,8 +316,8 @@
 
           with_them do
             it "returns expected spam constant and updates the spam score" do
+              expect(Abuse::TrustScoreWorker).to receive(:perform_async).once.with(user.id, :spamcheck, instance_of(Float), 'cid')
               is_expected.to eq(expected)
-              expect(user_scores.spam_score).to be_within(0.000001).of(verdict_score)
             end
           end
         end