diff --git a/CHANGELOG b/CHANGELOG
index 27e68431488969ff62c21390893cf81c33b30f7f..6a5b887b16ed0b73e241988a87efec42c27a220a 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -93,7 +93,6 @@ v 8.10.0
   - Fix viewing notification settings when a project is pending deletion
   - Updated compare dropdown menus to use GL dropdown
   - Redirects back to issue after clicking login link
-  - Submit issues created via the WebUI by non project members to Akismet !5333
   - All created issues, API or WebUI, can be submitted to Akismet for spam check !5333
   - Eager load award emoji on notes
   - Allow to define manual actions/builds on Pipelines and Environments
diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb
index b527dd0f4f27b28a6b10d574860dc3f1a5968386..f11e3fac9592d365c11c24bdcc5b343952e097f9 100644
--- a/app/controllers/projects/issues_controller.rb
+++ b/app/controllers/projects/issues_controller.rb
@@ -81,15 +81,9 @@ class Projects::IssuesController < Projects::ApplicationController
   def create
     @issue = Issues::CreateService.new(project, current_user, issue_params.merge({ request: request })).execute
 
-    if @issue.nil?
-      @issue = @project.issues.new
-      flash[:notice] = 'Your issue has been recognized as spam and has been discarded.'
-      render :new and return
-    end
-
     respond_to do |format|
       format.html do
-        if @issue.valid?
+        if @issue.errors.empty? && @issue.valid?
           redirect_to issue_path(@issue)
         else
           render :new
diff --git a/app/services/issues/create_service.rb b/app/services/issues/create_service.rb
index 496ea5a86a212f58ccfc58e8a4c5bee0cfcff07a..1085a1b93b8d28b9d85b0029111013cae57cbb23 100644
--- a/app/services/issues/create_service.rb
+++ b/app/services/issues/create_service.rb
@@ -6,8 +6,9 @@ module Issues
       issue = project.issues.new(params.except(:label_ids, :request))
       issue.author = params[:author] || current_user
 
-      if Issues::SpamCheckService.new(project, current_user, params).spam_detected?
-        return nil
+      if SpamCheckService.new(project, current_user, params).spam_detected?
+        issue.errors.add(:base, 'Your issue has been recognized as spam and has been discarded.')
+        return issue
       end
 
       if issue.save
diff --git a/app/services/issues/spam_check_service.rb b/app/services/issues/spam_check_service.rb
deleted file mode 100644
index b8d4e37faf58dc14062baa2aab9020e111187112..0000000000000000000000000000000000000000
--- a/app/services/issues/spam_check_service.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-module Issues
-  class SpamCheckService < BaseService
-    include Gitlab::AkismetHelper
-
-    def spam_detected?
-      text = [params[:title], params[:description]].reject(&:blank?).join("\n")
-      request = params[:request]
-
-      if request
-        if check_for_spam?(project) && is_spam?(request.env, current_user, text)
-          attrs = {
-            user_id: current_user.id,
-            project_id: project.id,
-            title: params[:title],
-            description: params[:description]
-          }
-          create_spam_log(project, current_user, attrs, request.env, api: false)
-          return true
-        end
-      end
-
-      false
-    end
-  end
-end
diff --git a/app/services/spam_check_service.rb b/app/services/spam_check_service.rb
new file mode 100644
index 0000000000000000000000000000000000000000..6768047aa63d5656318ed9209c00d14c7a3d5cc0
--- /dev/null
+++ b/app/services/spam_check_service.rb
@@ -0,0 +1,28 @@
+class SpamCheckService
+  include Gitlab::AkismetHelper
+
+  attr_accessor :subject, :current_user, :params
+
+  def initialize(subject, user, params = {})
+    @subject, @current_user, @params = subject, user, params.dup
+  end
+
+  def spam_detected?
+    request = params[:request]
+    return false unless request || check_for_spam?(subject)
+
+    text = [params[:title], params[:description]].reject(&:blank?).join("\n")
+
+    return false unless is_spam?(request.env, current_user, text)
+
+    attrs = {
+      user_id: current_user.id,
+      project_id: subject.id,
+      title: params[:title],
+      description: params[:description]
+    }
+    create_spam_log(subject, current_user, attrs, request.env, api: false)
+
+    true
+  end
+end
diff --git a/lib/api/issues.rb b/lib/api/issues.rb
index 787d416b960d318dc6874d2e3b3123ad69e1b846..21b9eb367e7dd2131e9c3d27d4bdd6b65ea6ef58 100644
--- a/lib/api/issues.rb
+++ b/lib/api/issues.rb
@@ -160,11 +160,13 @@ module API
 
         issue = ::Issues::CreateService.new(project, current_user, attrs.merge({ request: request })).execute
 
-        if issue.nil?
-          render_api_error!({ error: 'Spam detected' }, 400)
-        end
-
         if issue.valid?
+          # Need to check if id is nil here, because if issue is spam, errors
+          # get added, but Rails still thinks it's valid, but it is never saved
+          # so id will be nil
+          if issue.id.nil?
+            render_api_error!({ error: 'Spam detected' }, 400)
+          end
           # Find or create labels and attach to issue. Labels are valid because
           # we already checked its name, so there can't be an error here
           if params[:labels].present?