diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 12a6dd2d7b239e153f35bdcc43c93f1bff431c85..c26d40c57037dd67fd29816e24e5153a5d758910 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -177,15 +177,8 @@ def unmerged_commits
   end
 
   def merge!(user_id)
+    self.author_id_of_changes = user_id
     self.merge
-
-    Event.create(
-      project: self.project,
-      action: Event::MERGED,
-      target_id: self.id,
-      target_type: "MergeRequest",
-      author_id: user_id
-    )
   end
 
   def automerge!(current_user)
diff --git a/app/observers/activity_observer.rb b/app/observers/activity_observer.rb
index 919a50f00c84b1c9048a9b414bd74f94fa76fd6f..152e497794b329d8a2133c4233e006f2dbc7b160 100644
--- a/app/observers/activity_observer.rb
+++ b/app/observers/activity_observer.rb
@@ -39,4 +39,18 @@ def after_reopen(record, transition)
       author_id: record.author_id_of_changes
     )
   end
+
+  def after_merge(record, transition)
+    # Since MR can be merged via sidekiq
+    # to prevent event duplication do this check
+    return true if record.merge_event
+
+    Event.create(
+      project: record.project,
+      target_id: record.id,
+      target_type: record.class.name,
+      action: Event::MERGED,
+      author_id: record.author_id_of_changes
+    )
+  end
 end