diff --git a/app/services/merge_requests/approval_service.rb b/app/services/merge_requests/approval_service.rb
index dcc4cf4bb1ec54f20630b0ce7ae68b5ecbd738f9..05bdc7dec9ce10b94031767b6494e669e1e6cb25 100644
--- a/app/services/merge_requests/approval_service.rb
+++ b/app/services/merge_requests/approval_service.rb
@@ -17,19 +17,11 @@ def execute(merge_request)
       # utilizing the `Gitlab::EventStore`.
       #
       # Workers can subscribe to the `MergeRequests::ApprovedEvent`.
-      if Feature.enabled?(:async_after_approval, project)
-        Gitlab::EventStore.publish(
-          MergeRequests::ApprovedEvent.new(
-            data: { current_user_id: current_user.id, merge_request_id: merge_request.id }
-          )
+      Gitlab::EventStore.publish(
+        MergeRequests::ApprovedEvent.new(
+          data: { current_user_id: current_user.id, merge_request_id: merge_request.id }
         )
-      else
-        create_event(merge_request)
-        stream_audit_event(merge_request)
-        create_approval_note(merge_request)
-        mark_pending_todos_as_done(merge_request)
-        execute_approval_hooks(merge_request, current_user)
-      end
+      )
 
       success
     end
@@ -49,29 +41,6 @@ def save_approval(approval)
     def reset_approvals_cache(merge_request)
       merge_request.approvals.reset
     end
-
-    def create_event(merge_request)
-      event_service.approve_mr(merge_request, current_user)
-    end
-
-    def stream_audit_event(merge_request)
-      # Defined in EE
-    end
-
-    def create_approval_note(merge_request)
-      SystemNoteService.approve_mr(merge_request, current_user)
-    end
-
-    def mark_pending_todos_as_done(merge_request)
-      todo_service.resolve_todos_for_target(merge_request, current_user)
-    end
-
-    def execute_approval_hooks(merge_request, current_user)
-      # Only one approval is required for a merge request to be approved
-      notification_service.async.approve_mr(merge_request, current_user)
-
-      execute_hooks(merge_request, 'approved')
-    end
   end
 end
 
diff --git a/config/feature_flags/development/async_after_approval.yml b/config/feature_flags/development/async_after_approval.yml
deleted file mode 100644
index db53454b88f5200eacd43d50c4394d96acaab9b2..0000000000000000000000000000000000000000
--- a/config/feature_flags/development/async_after_approval.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: async_after_approval
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92520
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/368098
-milestone: '15.3'
-type: development
-group: group::code review
-default_enabled: false
diff --git a/ee/app/services/ee/merge_requests/approval_service.rb b/ee/app/services/ee/merge_requests/approval_service.rb
index c2fd157412c3866b88372bd9f9c117090aa1fde7..19d7feb0d1ad668379cf9daa1e0fa79a4060d0b6 100644
--- a/ee/app/services/ee/merge_requests/approval_service.rb
+++ b/ee/app/services/ee/merge_requests/approval_service.rb
@@ -30,45 +30,6 @@ def can_be_approved?(merge_request)
       def reset_approvals_cache(merge_request)
         merge_request.reset_approval_cache!
       end
-
-      override :create_event
-      def create_event(merge_request)
-        # Making sure MergeRequest::Metrics updates are in sync with
-        # Event creation.
-        ::Event.transaction do
-          super
-          calculate_approvals_metrics(merge_request)
-        end
-      end
-
-      override :stream_audit_event
-      def stream_audit_event(merge_request)
-        audit_context = {
-          name: 'merge_request_approval_operation',
-          stream_only: true,
-          author: current_user,
-          scope: merge_request.project,
-          target: merge_request,
-          message: 'Approved merge request'
-        }
-
-        ::Gitlab::Audit::Auditor.audit(audit_context)
-      end
-
-      override :execute_approval_hooks
-      def execute_approval_hooks(merge_request, current_user)
-        if merge_request.approvals_left == 0
-          super
-        else
-          execute_hooks(merge_request, 'approval')
-        end
-      end
-
-      def calculate_approvals_metrics(merge_request)
-        return unless merge_request.project.licensed_feature_available?(:code_review_analytics)
-
-        ::Analytics::RefreshApprovalsData.new(merge_request).execute
-      end
     end
   end
 end
diff --git a/ee/spec/services/merge_requests/approval_service_spec.rb b/ee/spec/services/merge_requests/approval_service_spec.rb
index 56999a4e06a35098cb312dbc7b124b674617a442..165dda1093f472c5e61ab01870c1c42fab33b837 100644
--- a/ee/spec/services/merge_requests/approval_service_spec.rb
+++ b/ee/spec/services/merge_requests/approval_service_spec.rb
@@ -33,116 +33,6 @@
 
         service.execute(merge_request)
       end
-
-      context 'async_after_approval feature flag is disabled' do
-        before do
-          stub_feature_flags(async_after_approval: false)
-        end
-
-        it 'creates approve MR event' do
-          expect_next_instance_of(EventCreateService) do |instance|
-            expect(instance).to receive(:approve_mr)
-              .with(merge_request, user)
-          end
-
-          service.execute(merge_request)
-        end
-
-        it 'sends the audit streaming event' do
-          audit_context = {
-            name: 'merge_request_approval_operation',
-            stream_only: true,
-            author: user,
-            scope: merge_request.project,
-            target: merge_request,
-            message: 'Approved merge request'
-          }
-          expect(::Gitlab::Audit::Auditor).to receive(:audit).with(audit_context)
-
-          service.execute(merge_request)
-        end
-
-        it 'creates an approval note' do
-          allow(merge_request).to receive(:approvals_left).and_return(1)
-
-          expect(SystemNoteService).to receive(:approve_mr).with(merge_request, user)
-
-          service.execute(merge_request)
-        end
-
-        it 'marks pending todos as done' do
-          allow(merge_request).to receive(:approvals_left).and_return(1)
-
-          service.execute(merge_request)
-
-          expect(todo.reload).to be_done
-        end
-
-        context 'with remaining approvals' do
-          it 'fires an approval webhook' do
-            expect(merge_request).to receive(:approvals_left).and_return(5)
-            expect(service).to receive(:execute_hooks).with(merge_request, 'approval')
-
-            service.execute(merge_request)
-          end
-
-          it 'does not send an email' do
-            expect(merge_request).to receive(:approvals_left).and_return(5)
-            expect(service).not_to receive(:notification_service)
-
-            service.execute(merge_request)
-          end
-        end
-
-        context 'with required approvals' do
-          let(:notification_service) { NotificationService.new }
-
-          before do
-            expect(merge_request).to receive(:approvals_left).and_return(0)
-            allow(service).to receive(:execute_hooks)
-            allow(service).to receive(:notification_service).and_return(notification_service)
-          end
-
-          it 'fires an approved webhook' do
-            expect(service).to receive(:execute_hooks).with(merge_request, 'approved')
-
-            service.execute(merge_request)
-          end
-
-          it 'sends an email' do
-            expect(notification_service).to receive_message_chain(:async, :approve_mr).with(merge_request, user)
-
-            service.execute(merge_request)
-          end
-        end
-
-        context 'approvals metrics calculation' do
-          context 'when code_review_analytics project feature is available' do
-            before do
-              stub_licensed_features(code_review_analytics: true)
-            end
-
-            it 'schedules RefreshApprovalsData' do
-              expect(::Analytics::RefreshApprovalsData)
-                .to receive_message_chain(:new, :execute)
-
-              service.execute(merge_request)
-            end
-          end
-
-          context 'when code_review_analytics is not available' do
-            before do
-              stub_licensed_features(code_review_analytics: false)
-            end
-
-            it 'does not schedule for RefreshApprovalsData' do
-              expect(::Analytics::RefreshApprovalsData).not_to receive(:new)
-
-              service.execute(merge_request)
-            end
-          end
-        end
-      end
     end
 
     context 'when project requires force auth for approval' do
diff --git a/spec/services/merge_requests/approval_service_spec.rb b/spec/services/merge_requests/approval_service_spec.rb
index ab98fad5d73f7c3ed33211d29d7ca13334c78fb7..dd6c049028423fd382c1051fc6176461314123b7 100644
--- a/spec/services/merge_requests/approval_service_spec.rb
+++ b/spec/services/merge_requests/approval_service_spec.rb
@@ -36,30 +36,6 @@
       it 'does not publish MergeRequests::ApprovedEvent' do
         expect { service.execute(merge_request) }.not_to publish_event(MergeRequests::ApprovedEvent)
       end
-
-      context 'async_after_approval feature flag is disabled' do
-        before do
-          stub_feature_flags(async_after_approval: false)
-        end
-
-        it 'does not create approve MR event' do
-          expect(EventCreateService).not_to receive(:new)
-
-          service.execute(merge_request)
-        end
-
-        it 'does not create an approval note' do
-          expect(SystemNoteService).not_to receive(:approve_mr)
-
-          service.execute(merge_request)
-        end
-
-        it 'does not mark pending todos as done' do
-          service.execute(merge_request)
-
-          expect(todo.reload).to be_pending
-        end
-      end
     end
 
     context 'with valid approval' do
@@ -81,51 +57,6 @@
           .to publish_event(MergeRequests::ApprovedEvent)
           .with(current_user_id: user.id, merge_request_id: merge_request.id)
       end
-
-      context 'async_after_approval feature flag is disabled' do
-        let(:notification_service) { NotificationService.new }
-
-        before do
-          stub_feature_flags(async_after_approval: false)
-          allow(service).to receive(:notification_service).and_return(notification_service)
-        end
-
-        it 'creates approve MR event' do
-          expect_next_instance_of(EventCreateService) do |instance|
-            expect(instance).to receive(:approve_mr)
-              .with(merge_request, user)
-          end
-
-          service.execute(merge_request)
-        end
-
-        it 'creates an approval note' do
-          expect(SystemNoteService).to receive(:approve_mr).with(merge_request, user)
-
-          service.execute(merge_request)
-        end
-
-        it 'marks pending todos as done' do
-          service.execute(merge_request)
-
-          expect(todo.reload).to be_done
-        end
-
-        it 'sends a notification when approving' do
-          expect(notification_service).to receive_message_chain(:async, :approve_mr)
-            .with(merge_request, user)
-
-          service.execute(merge_request)
-        end
-
-        context 'with remaining approvals' do
-          it 'fires an approval webhook' do
-            expect(service).to receive(:execute_hooks).with(merge_request, 'approved')
-
-            service.execute(merge_request)
-          end
-        end
-      end
     end
 
     context 'user cannot update the merge request' do