diff --git a/app/models/project_services/slack_service/pipeline_message.rb b/app/models/project_services/slack_service/pipeline_message.rb
index f8d03c0e2fa3a238d7ec8e226292d4adf2de6415..b6355fc4171ce20f02b444a38c8b3f0d0e7bc238 100644
--- a/app/models/project_services/slack_service/pipeline_message.rb
+++ b/app/models/project_services/slack_service/pipeline_message.rb
@@ -13,7 +13,7 @@ class SlackService
 
       @project_name = data[:project][:path_with_namespace]
       @project_url = data[:project][:web_url]
-      @user_name = data[:user] && data[:user][:name]
+      @user_name = (data[:user] && data[:user][:name]) || 'API'
     end
 
     def pretext
diff --git a/changelogs/unreleased/fix-slack-pipeline-message-by-api.yml b/changelogs/unreleased/fix-slack-pipeline-message-by-api.yml
new file mode 100644
index 0000000000000000000000000000000000000000..aa5ad5cd8d6a4adb084ed697db5d0092d28bfb43
--- /dev/null
+++ b/changelogs/unreleased/fix-slack-pipeline-message-by-api.yml
@@ -0,0 +1,4 @@
+---
+title: Fix Slack pipeline message from pipelines made by API
+merge_request: 8059
+author:
diff --git a/spec/models/project_services/slack_service/pipeline_message_spec.rb b/spec/models/project_services/slack_service/pipeline_message_spec.rb
index 363138a9454ca5cec4e65a036ade72c74d01163c..4098500122f037867661722617e8b6f548aed4ec 100644
--- a/spec/models/project_services/slack_service/pipeline_message_spec.rb
+++ b/spec/models/project_services/slack_service/pipeline_message_spec.rb
@@ -2,6 +2,7 @@ require 'spec_helper'
 
 describe SlackService::PipelineMessage do
   subject { SlackService::PipelineMessage.new(args) }
+  let(:user) { { name: 'hacker' } }
 
   let(:args) do
     {
@@ -15,7 +16,7 @@ describe SlackService::PipelineMessage do
       },
       project: { path_with_namespace: 'project_name',
                  web_url: 'example.gitlab.com' },
-      user: { name: 'hacker' }
+      user: user
     }
   end
 
@@ -28,9 +29,7 @@ describe SlackService::PipelineMessage do
     let(:message) { build_message('passed') }
 
     it 'returns a message with information about succeeded build' do
-      expect(subject.pretext).to be_empty
-      expect(subject.fallback).to eq(message)
-      expect(subject.attachments).to eq([text: message, color: color])
+      verify_message
     end
   end
 
@@ -40,16 +39,29 @@ describe SlackService::PipelineMessage do
     let(:duration) { 10 }
 
     it 'returns a message with information about failed build' do
-      expect(subject.pretext).to be_empty
-      expect(subject.fallback).to eq(message)
-      expect(subject.attachments).to eq([text: message, color: color])
+      verify_message
     end
+
+    context 'when triggered by API therefore lacking user' do
+      let(:user) { nil }
+      let(:message) { build_message(status, 'API') }
+
+      it 'returns a message stating it is by API' do
+        verify_message
+      end
+    end
+  end
+
+  def verify_message
+    expect(subject.pretext).to be_empty
+    expect(subject.fallback).to eq(message)
+    expect(subject.attachments).to eq([text: message, color: color])
   end
 
-  def build_message(status_text = status)
+  def build_message(status_text = status, name = user[:name])
     "<example.gitlab.com|project_name>:" \
     " Pipeline <example.gitlab.com/pipelines/123|#123>" \
     " of <example.gitlab.com/commits/develop|develop> branch" \
-    " by hacker #{status_text} in #{duration} #{'second'.pluralize(duration)}"
+    " by #{name} #{status_text} in #{duration} #{'second'.pluralize(duration)}"
   end
 end