diff --git a/app/assets/stylesheets/framework/common.scss b/app/assets/stylesheets/framework/common.scss
index 7f5583c917a4b2381303c085a50913e48df685be..b24fce6f0c21facebbba58c4055505d12b06c5ca 100644
--- a/app/assets/stylesheets/framework/common.scss
+++ b/app/assets/stylesheets/framework/common.scss
@@ -299,6 +299,10 @@ table {
 
 .well {
   margin-bottom: $gl-padding;
+
+  hr {
+    border-color: $gray-darker;
+  }
 }
 
 .search_box {
diff --git a/app/assets/stylesheets/framework/forms.scss b/app/assets/stylesheets/framework/forms.scss
index f0727e9688ae58d315b10fa26552fbc27956c4ac..e83a1f7ad687256323924acf1abad4bcde57dc68 100644
--- a/app/assets/stylesheets/framework/forms.scss
+++ b/app/assets/stylesheets/framework/forms.scss
@@ -68,6 +68,46 @@ label {
   }
 }
 
+.help-form .form-group {
+  margin-left: 0;
+  margin-right: 0;
+
+  .control-label {
+    font-weight: bold;
+    padding-top: 4px;
+  }
+
+  .form-control {
+    height: 29px;
+    background: $white-light;
+    font-family: $monospace_font;
+  }
+
+  .input-group-btn .btn {
+    padding: 3px $gl-btn-padding;
+    background-color: $gray-light;
+    border: 1px solid $border-color;
+  }
+
+  .text-block {
+    line-height: 0.8;
+    padding-top: 9px;
+
+    code {
+      line-height: 1.8;
+    }
+  }
+
+  @media(max-width: $screen-sm-min) {
+    padding: 0 $gl-padding;
+
+    .control-label,
+    .text-block {
+      padding-left: 0;
+    }
+  }
+}
+
 .fieldset-form fieldset {
   margin-bottom: 20px;
 }
@@ -167,4 +207,3 @@ label {
     color: $gl-text-color;
   }
 }
-
diff --git a/app/assets/stylesheets/pages/settings.scss b/app/assets/stylesheets/pages/settings.scss
index 2e8f356298d473fab7bc5d71ed11519ed1b4b1b8..51c926608f9af300a93e4a804e85784b5201e6aa 100644
--- a/app/assets/stylesheets/pages/settings.scss
+++ b/app/assets/stylesheets/pages/settings.scss
@@ -20,3 +20,7 @@
 .danger-title {
   color: $gl-danger;
 }
+
+.service-settings .control-label {
+  padding-top: 0;
+}
diff --git a/app/models/project_services/mattermost_slash_commands_service.rb b/app/models/project_services/mattermost_slash_commands_service.rb
index 67902329593ffa8a730902b8d43618855efca062..33431f41dc2344a2f196b5fb1b6a294b1f4ccff2 100644
--- a/app/models/project_services/mattermost_slash_commands_service.rb
+++ b/app/models/project_services/mattermost_slash_commands_service.rb
@@ -19,13 +19,6 @@ class MattermostSlashCommandsService < ChatService
     'mattermost_slash_commands'
   end
 
-  def help
-    "This service allows you to use slash commands with your Mattermost installation.<br/>
-    To setup this Service you need to create a new <b>Slash commands</b> in your Mattermost integration panel.<br/>
-    <br/>
-    Create integration with URL #{service_trigger_url(self)} and enter the token below."
-  end
-
   def fields
     [
       { type: 'text', name: 'token', placeholder: '' }
diff --git a/app/views/admin/services/_form.html.haml b/app/views/admin/services/_form.html.haml
index cdbfc60f9a446f3486340d4db3130bcc1f2b60a0..e5b8ebdf613c710bac4f6f460d5b12b4a00fe115 100644
--- a/app/views/admin/services/_form.html.haml
+++ b/app/views/admin/services/_form.html.haml
@@ -4,7 +4,8 @@
 %p #{@service.description} template
 
 = form_for :service, url: admin_application_settings_service_path, method: :put, html: { class: 'form-horizontal fieldset-form' } do |form|
-  = render 'shared/service_settings', form: form
+  = render 'shared/service_settings', form: form, subject: @service
 
-  .form-actions
-    = form.submit 'Save', class: 'btn btn-save'
+  .footer-block.row-content-block
+    .form-actions
+      = form.submit 'Save', class: 'btn btn-save'
diff --git a/app/views/projects/services/_form.html.haml b/app/views/projects/services/_form.html.haml
index b41edeb2c7eaaa49edb1340d031ca2b54404df39..db51c4f8a4e2b54a8c5032506a597f1040ae2d16 100644
--- a/app/views/projects/services/_form.html.haml
+++ b/app/views/projects/services/_form.html.haml
@@ -7,14 +7,15 @@
     %p= @service.description
   .col-lg-9
     = form_for(@service, as: :service, url: namespace_project_service_path(@project.namespace, @project, @service.to_param), method: :put, html: { class: 'form-horizontal' }) do |form|
-      = render 'shared/service_settings', form: form
+      = render 'shared/service_settings', form: form, subject: @service
 
-      = form.submit 'Save changes', class: 'btn btn-save'
-      &nbsp;
-      - if @service.valid? && @service.activated?
-        - unless @service.can_test?
-          - disabled_class = 'disabled'
-          - disabled_title = @service.disabled_title
+      .footer-block.row-content-block
+        = form.submit 'Save changes', class: 'btn btn-save'
+        &nbsp;
+        - if @service.valid? && @service.activated?
+          - unless @service.can_test?
+            - disabled_class = 'disabled'
+            - disabled_title = @service.disabled_title
 
-        = link_to 'Test settings', test_namespace_project_service_path(@project.namespace, @project, @service), class: "btn #{disabled_class}", title: disabled_title
-      = link_to "Cancel", namespace_project_services_path(@project.namespace, @project), class: "btn btn-cancel"
+          = link_to 'Test settings', test_namespace_project_service_path(@project.namespace, @project, @service), class: "btn #{disabled_class}", title: disabled_title
+        = link_to "Cancel", namespace_project_services_path(@project.namespace, @project), class: "btn btn-cancel"
diff --git a/app/views/projects/services/mattermost_slash_commands/_help.html.haml b/app/views/projects/services/mattermost_slash_commands/_help.html.haml
new file mode 100644
index 0000000000000000000000000000000000000000..a676c0290a090c8ba510c2bc0c3a38162a9510f4
--- /dev/null
+++ b/app/views/projects/services/mattermost_slash_commands/_help.html.haml
@@ -0,0 +1,100 @@
+- pretty_path_with_namespace = "#{@project ? @project.namespace.name : 'namespace'} / #{@project ? @project.name : 'name'}"
+- run_actions_text = "Perform common operations on this project: #{pretty_path_with_namespace}"
+
+.well
+  This service allows GitLab users to perform common operations on this
+  project by entering slash commands in Mattermost.
+  %br
+  See list of available commands in Mattermost after setting up this service,
+  by entering
+  %code /&lt;command_trigger_word&gt; help
+  %br
+  %br
+  To setup this service:
+  %ul.list-unstyled
+    %li
+      1.
+      = link_to 'Enable custom slash commands', 'https://docs.mattermost.com/developer/slash-commands.html#enabling-custom-commands'
+      on your Mattermost installation
+    %li
+      2.
+      = link_to 'Add a slash command', 'https://docs.mattermost.com/developer/slash-commands.html#set-up-a-custom-command'
+      in Mattermost with these options:
+
+  %hr
+
+  .help-form
+    .form-group
+      = label_tag :display_name, 'Display name', class: 'col-sm-2 col-xs-12 control-label'
+      .col-sm-10.col-xs-12.input-group
+        = text_field_tag :display_name, "GitLab / #{pretty_path_with_namespace}", class: 'form-control input-sm', readonly: 'readonly'
+        .input-group-btn
+          = clipboard_button(clipboard_target: '#display_name')
+
+    .form-group
+      = label_tag :description, 'Description', class: 'col-sm-2 col-xs-12 control-label'
+      .col-sm-10.col-xs-12.input-group
+        = text_field_tag :description, run_actions_text, class: 'form-control input-sm', readonly: 'readonly'
+        .input-group-btn
+          = clipboard_button(clipboard_target: '#description')
+
+    .form-group
+      = label_tag nil, 'Command trigger word', class: 'col-sm-2 col-xs-12 control-label'
+      .col-sm-10.col-xs-12.text-block
+        %p Fill in the word that works best for your team.
+        %p
+          Suggestions:
+          %code= 'gitlab'
+          %code= @project.path # Path contains no spaces, but dashes
+          %code= @project.path_with_namespace
+
+    .form-group
+      = label_tag :request_url, 'Request URL', class: 'col-sm-2 col-xs-12 control-label'
+      .col-sm-10.col-xs-12.input-group
+        = text_field_tag :request_url, service_trigger_url(subject), class: 'form-control input-sm', readonly: 'readonly'
+        .input-group-btn
+          = clipboard_button(clipboard_target: '#request_url')
+
+    .form-group
+      = label_tag nil, 'Request method', class: 'col-sm-2 col-xs-12 control-label'
+      .col-sm-10.col-xs-12.text-block POST
+
+    .form-group
+      = label_tag :response_username, 'Response username', class: 'col-sm-2 col-xs-12 control-label'
+      .col-sm-10.col-xs-12.input-group
+        = text_field_tag :response_username, 'GitLab', class: 'form-control input-sm', readonly: 'readonly'
+        .input-group-btn
+          = clipboard_button(clipboard_target: '#response_username')
+
+    .form-group
+      = label_tag :response_icon, 'Response icon', class: 'col-sm-2 col-xs-12 control-label'
+      .col-sm-10.col-xs-12.input-group
+        = text_field_tag :response_icon, asset_url('gitlab_logo.png'), class: 'form-control input-sm', readonly: 'readonly'
+        .input-group-btn
+          = clipboard_button(clipboard_target: '#response_icon')
+
+    .form-group
+      = label_tag nil, 'Autocomplete', class: 'col-sm-2 col-xs-12 control-label'
+      .col-sm-10.col-xs-12.text-block Yes
+
+    .form-group
+      = label_tag :autocomplete_hint, 'Autocomplete hint', class: 'col-sm-2 col-xs-12 control-label'
+      .col-sm-10.col-xs-12.input-group
+        = text_field_tag :autocomplete_hint, '[help]', class: 'form-control input-sm', readonly: 'readonly'
+        .input-group-btn
+          = clipboard_button(clipboard_target: '#autocomplete_hint')
+
+    .form-group
+      = label_tag :autocomplete_description, 'Autocomplete description', class: 'col-sm-2 col-xs-12 control-label'
+      .col-sm-10.col-xs-12.input-group
+        = text_field_tag :autocomplete_description, run_actions_text, class: 'form-control input-sm', readonly: 'readonly'
+        .input-group-btn
+          = clipboard_button(clipboard_target: '#autocomplete_description')
+
+  %hr
+
+  %ul.list-unstyled
+    %li
+      3. After adding the slash command, paste the
+      %strong token
+      into the field below
diff --git a/app/views/shared/_service_settings.html.haml b/app/views/shared/_service_settings.html.haml
index 601ef51737a31cd53eaec6920eb559673cf7a763..9c5053dace5df1da26b7447adffab1dc17e7eb28 100644
--- a/app/views/shared/_service_settings.html.haml
+++ b/app/views/shared/_service_settings.html.haml
@@ -1,47 +1,50 @@
 = form_errors(@service)
 
-- if @service.help.present?
+- if lookup_context.template_exists?('help', "projects/services/#{@service.to_param}", true)
+  = render "projects/services/#{@service.to_param}/help", subject: subject
+- elsif @service.help.present?
   .well
     = preserve do
       = markdown @service.help
 
-.form-group
-  = form.label :active, "Active", class: "control-label"
-  .col-sm-10
-    = form.check_box :active
-
-- if @service.supported_events.present?
+.service-settings
   .form-group
-    = form.label :url, "Trigger", class: 'control-label'
-
+    = form.label :active, "Active", class: "control-label"
     .col-sm-10
-      - @service.supported_events.each do |event|
-        %div
-          = form.check_box service_event_field_name(event), class: 'pull-left'
-          .prepend-left-20
-            = form.label service_event_field_name(event), class: 'list-label' do
-              %strong
-                = event.humanize
-
-        - field = @service.event_field(event)
-
-        - if field
-          %p
-            = form.text_field field[:name], class: "form-control", placeholder: field[:placeholder]
-
-        %p.light
-          = service_event_description(event)
-
-- @service.global_fields.each do |field|
-  - type = field[:type]
-
-  - if type == 'fieldset'
-    - fields = field[:fields]
-    - legend = field[:legend]
-
-    %fieldset
-      %legend= legend
-      - fields.each do |subfield|
-        = render 'shared/field', form: form, field: subfield
-  - else
-    = render 'shared/field', form: form, field: field
+      = form.check_box :active
+
+  - if @service.supported_events.present?
+    .form-group
+      = form.label :url, "Trigger", class: 'control-label'
+
+      .col-sm-10
+        - @service.supported_events.each do |event|
+          %div
+            = form.check_box service_event_field_name(event), class: 'pull-left'
+            .prepend-left-20
+              = form.label service_event_field_name(event), class: 'list-label' do
+                %strong
+                  = event.humanize
+
+          - field = @service.event_field(event)
+
+          - if field
+            %p
+              = form.text_field field[:name], class: "form-control", placeholder: field[:placeholder]
+
+          %p.light
+            = service_event_description(event)
+
+  - @service.global_fields.each do |field|
+    - type = field[:type]
+
+    - if type == 'fieldset'
+      - fields = field[:fields]
+      - legend = field[:legend]
+
+      %fieldset
+        %legend= legend
+        - fields.each do |subfield|
+          = render 'shared/field', form: form, field: subfield
+    - else
+      = render 'shared/field', form: form, field: field
diff --git a/changelogs/unreleased/zj-mattermost-command-help-message.yml b/changelogs/unreleased/zj-mattermost-command-help-message.yml
new file mode 100644
index 0000000000000000000000000000000000000000..fab238a8d8d990e1058fa7c0406b8dc72a4fe6ec
--- /dev/null
+++ b/changelogs/unreleased/zj-mattermost-command-help-message.yml
@@ -0,0 +1,4 @@
+---
+title: Add help message for configuring Mattermost slash commands
+merge_request: 7558
+author: 
diff --git a/spec/features/projects/services/mattermost_slash_command_spec.rb b/spec/features/projects/services/mattermost_slash_command_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..f474e7e891bd949c60f5bd8a2bedbbf73c6d2b4d
--- /dev/null
+++ b/spec/features/projects/services/mattermost_slash_command_spec.rb
@@ -0,0 +1,48 @@
+require 'spec_helper'
+
+feature 'Setup Mattermost slash commands', feature: true do
+  include WaitForAjax
+
+  let(:user) { create(:user) }
+  let(:project) { create(:project) }
+  let(:service) { project.create_mattermost_slash_commands_service }
+
+  before do
+    project.team << [user, :master]
+    login_as(user)
+  end
+
+  describe 'user visites the mattermost slash command config page', js: true do
+    it 'shows a help message' do
+      visit edit_namespace_project_service_path(project.namespace, project, service)
+
+      wait_for_ajax
+
+      expect(page).to have_content("This service allows GitLab users to perform common")
+    end
+  end
+
+  describe 'saving a token' do
+    let(:token) { ('a'..'z').to_a.join }
+
+    it 'shows the token after saving' do
+      visit edit_namespace_project_service_path(project.namespace, project, service)
+
+      fill_in 'service_token', with: token
+      click_on 'Save'
+
+      value = find_field('service_token').value
+
+      expect(value).to eq(token)
+    end
+  end
+
+  describe 'the trigger url' do
+    it 'shows the correct url' do
+      visit edit_namespace_project_service_path(project.namespace, project, service)
+
+      value = find_field('request_url').value
+      expect(value).to match("api/v3/projects/#{project.id}/services/mattermost_slash_commands/trigger")
+    end
+  end
+end
diff --git a/spec/features/projects/slack_service/slack_service_spec.rb b/spec/features/projects/services/slack_service_spec.rb
similarity index 100%
rename from spec/features/projects/slack_service/slack_service_spec.rb
rename to spec/features/projects/services/slack_service_spec.rb