diff --git a/Gemfile b/Gemfile
index 6674edc1d0c7766b81434224ed1e36bc6719a182..1182fb7eded35f42efe53c43b73fb3e53e439eec 100644
--- a/Gemfile
+++ b/Gemfile
@@ -204,6 +204,9 @@ gem 'redis-rails', '~> 5.0.2'
 gem 'redis', '~> 3.2'
 gem 'connection_pool', '~> 2.0'
 
+# Discord integration
+gem 'discordrb-webhooks', '~> 3.3', github: 'blackst0ne/discordrb', require: false
+
 # HipChat integration
 gem 'hipchat', '~> 1.5.0'
 
diff --git a/Gemfile.lock b/Gemfile.lock
index e755b0e0a8dd43e44c639ef238f84d7990f52cca..0cc549b0b30657140722d686c96e858d0e3041f0 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,3 +1,10 @@
+GIT
+  remote: git://github.com/blackst0ne/discordrb.git
+  revision: 2de6ec4dda1e2ea2966f1ced063698d7c5fc5225
+  specs:
+    discordrb-webhooks (3.3.0)
+      rest-client (~> 2.0)
+
 GEM
   remote: https://rubygems.org/
   specs:
@@ -972,6 +979,7 @@ DEPENDENCIES
   devise (~> 4.4)
   devise-two-factor (~> 3.0.0)
   diffy (~> 3.1.0)
+  discordrb-webhooks (~> 3.3)!
   doorkeeper (~> 4.3)
   doorkeeper-openid_connect (~> 1.5)
   ed25519 (~> 1.2)
diff --git a/Gemfile.rails5.lock b/Gemfile.rails5.lock
index 6ae7444f18f3513ec80d65e70649334de33e6bae..22b46333aec3cefc7a97b155057bd89c2fc0235e 100644
--- a/Gemfile.rails5.lock
+++ b/Gemfile.rails5.lock
@@ -1,3 +1,10 @@
+GIT
+  remote: git://github.com/blackst0ne/discordrb.git
+  revision: 2de6ec4dda1e2ea2966f1ced063698d7c5fc5225
+  specs:
+    discordrb-webhooks (3.3.0)
+      rest-client (~> 2.0)
+
 GEM
   remote: https://rubygems.org/
   specs:
@@ -981,6 +988,7 @@ DEPENDENCIES
   devise (~> 4.4)
   devise-two-factor (~> 3.0.0)
   diffy (~> 3.1.0)
+  discordrb-webhooks (~> 3.3)!
   doorkeeper (~> 4.3)
   doorkeeper-openid_connect (~> 1.5)
   ed25519 (~> 1.2)
diff --git a/app/models/project.rb b/app/models/project.rb
index 382fb4f463aa33e330c5b55b58ae9eafe4f99604..8a6b7abfa6ec12049ac96904be7db6333d97a817 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -135,6 +135,7 @@ class Project < ActiveRecord::Base
 
   # Project services
   has_one :campfire_service
+  has_one :discord_service
   has_one :drone_ci_service
   has_one :emails_on_push_service
   has_one :pipelines_email_service
diff --git a/app/models/project_services/discord_service.rb b/app/models/project_services/discord_service.rb
new file mode 100644
index 0000000000000000000000000000000000000000..ffd82afc1311753777bf3dd64928c88fac420d0a
--- /dev/null
+++ b/app/models/project_services/discord_service.rb
@@ -0,0 +1,63 @@
+# frozen_string_literal: true
+
+require "discordrb/webhooks"
+
+class DiscordService < ChatNotificationService
+  def title
+    "Discord Notifications"
+  end
+
+  def description
+    "Receive event notifications in Discord"
+  end
+
+  def self.to_param
+    "discord"
+  end
+
+  def help
+    "This service sends notifications about projects events to Discord channels.<br />
+    To set up this service:
+    <ol>
+      <li><a href='ADD-DISCORD-LINK-HERE'>Setup a custom Incoming Webhook</a>.</li>
+      <li>Paste the <strong>Webhook URL</strong> into the field below.</li>
+      <li>Select events below to enable notifications.</li>
+    </ol>"
+  end
+
+  def webhook_placeholder
+    "https://discordapp.com/api/webhooks/..."
+  end
+
+  def event_field(event)
+  end
+
+  def default_channel_placeholder
+  end
+
+  def default_fields
+    [
+      { type: "text", name: "webhook", placeholder: "e.g. #{webhook_placeholder}" },
+      { type: "checkbox", name: "notify_only_broken_pipelines" },
+      { type: "checkbox", name: "notify_only_default_branch" }
+    ]
+  end
+
+  private
+
+  def notify(message, opts)
+    client = Discordrb::Webhooks::Client.new(url: webhook)
+    client.execute do |builder|
+      builder.content = message.pretext
+      # builder.add_embed do |embed|
+      #   embed.title = 'Embed title'
+      #   embed.description = 'Embed description'
+      #   embed.timestamp = Time.now
+      # end
+    end
+  end
+
+  def custom_data(data)
+    super(data).merge(markdown: true)
+  end
+end
diff --git a/app/models/service.rb b/app/models/service.rb
index 4dbda7acab6f3c55f5ead6d3fa8e6b8f25579d64..5b8bf6e7cf010610d5449f8e7bd02a6ec2612ae4 100644
--- a/app/models/service.rb
+++ b/app/models/service.rb
@@ -253,6 +253,7 @@ def self.available_services_names
       bugzilla
       campfire
       custom_issue_tracker
+      discord
       drone_ci
       emails_on_push
       external_wiki
diff --git a/lib/api/services.rb b/lib/api/services.rb
index 0ae05ce08f19ee53249627a24576014d52147e86..1cb3b8a72771406b005a1532950f0227edd69eb6 100644
--- a/lib/api/services.rb
+++ b/lib/api/services.rb
@@ -298,6 +298,14 @@ class Services < Grape::API
           desc: 'Title'
         }
       ],
+      'discord' => [
+        {
+          required: true,
+          name: :webhook,
+          type: String,
+          desc: 'Discord webhook. e.g. https://discordapp.com/api/webhooks/…'
+        }
+      ],
       'drone-ci' => [
         {
           required: true,
@@ -677,6 +685,7 @@ class Services < Grape::API
       BuildkiteService,
       CampfireService,
       CustomIssueTrackerService,
+      DiscordService,
       DroneCiService,
       EmailsOnPushService,
       ExternalWikiService,
diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml
index a63f34b55365e3e7aad7a7793aa8fd9b18c87062..1f1d23e39ebe942d433cf2f5d9ae8710a427f533 100644
--- a/spec/lib/gitlab/import_export/all_models.yml
+++ b/spec/lib/gitlab/import_export/all_models.yml
@@ -198,6 +198,7 @@ project:
 - last_event
 - services
 - campfire_service
+- discord_service
 - drone_ci_service
 - emails_on_push_service
 - pipelines_email_service
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index 62a38c66d991dd2dc282d29ca465edc04d62d69f..77e747fcdc91781c55d45d097c56a854f63eff99 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -32,6 +32,7 @@
     it { is_expected.to have_one(:asana_service) }
     it { is_expected.to have_many(:boards) }
     it { is_expected.to have_one(:campfire_service) }
+    it { is_expected.to have_one(:discord_service) }
     it { is_expected.to have_one(:drone_ci_service) }
     it { is_expected.to have_one(:emails_on_push_service) }
     it { is_expected.to have_one(:pipelines_email_service) }