diff --git a/ee/app/services/incident_management/oncall_rotations/base_service.rb b/ee/app/services/incident_management/oncall_rotations/base_service.rb
new file mode 100644
index 0000000000000000000000000000000000000000..2421e48388af6953421e58cb4271cb9901e1902f
--- /dev/null
+++ b/ee/app/services/incident_management/oncall_rotations/base_service.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module IncidentManagement
+  module OncallRotations
+    class BaseService
+      def allowed?
+        user&.can?(:admin_incident_management_oncall_schedule, project)
+      end
+
+      def available?
+        ::Gitlab::IncidentManagement.oncall_schedules_available?(project)
+      end
+
+      def error(message)
+        ServiceResponse.error(message: message)
+      end
+
+      def success(oncall_rotation)
+        ServiceResponse.success(payload: { oncall_rotation: oncall_rotation })
+      end
+
+      def error_no_license
+        error(_('Your license does not support on-call rotations'))
+      end
+    end
+  end
+end
diff --git a/ee/app/services/incident_management/oncall_rotations/create_service.rb b/ee/app/services/incident_management/oncall_rotations/create_service.rb
index f818f44f4e189d11f6393cb10b56c808e0583b2d..66b95b2230445f1373ae8e780c5748f5b897fbf6 100644
--- a/ee/app/services/incident_management/oncall_rotations/create_service.rb
+++ b/ee/app/services/incident_management/oncall_rotations/create_service.rb
@@ -2,12 +2,12 @@
 
 module IncidentManagement
   module OncallRotations
-    class CreateService
+    class CreateService < BaseService
       MAXIMUM_PARTICIPANTS = 100
 
       # @param schedule [IncidentManagement::OncallSchedule]
       # @param project [Project]
-      # @param current_user [User]
+      # @param user [User]
       # @param params [Hash<Symbol,Any>]
       # @param params - name [String] The name of the on-call rotation.
       # @param params - length [Integer] The length of the rotation.
@@ -17,10 +17,10 @@ class CreateService
       # @option opts  - participant [User] The user who is part of the rotation
       # @option opts  - color_palette [String] The color palette to assign to the on-call user, for example: "blue".
       # @option opts  - color_weight [String] The color weight to assign to for the on-call user, for example "500". Max 4 chars.
-      def initialize(schedule, project, current_user, params)
+      def initialize(schedule, project, user, params)
         @schedule = schedule
         @project = project
-        @current_user = current_user
+        @user = user
         @rotation_params = params.except(:participants)
         @participants_params = Array(params[:participants])
       end
@@ -49,15 +49,7 @@ def execute
 
       private
 
-      attr_reader :schedule, :project, :current_user, :rotation_params, :participants_params
-
-      def allowed?
-        Ability.allowed?(current_user, :admin_incident_management_oncall_schedule, project)
-      end
-
-      def available?
-        ::Gitlab::IncidentManagement.oncall_schedules_available?(project)
-      end
+      attr_reader :schedule, :project, :user, :rotation_params, :participants_params
 
       def duplicated_users?
         users = participants_params.map { |participant| participant[:user] }
@@ -98,14 +90,6 @@ def insert_participants(participants)
         OncallParticipant.insert_all(participant_rows(participants))
       end
 
-      def error(message)
-        ServiceResponse.error(message: message)
-      end
-
-      def success(oncall_rotation)
-        ServiceResponse.success(payload: { oncall_rotation: oncall_rotation })
-      end
-
       def error_participant_has_no_permission
         error('A participant has insufficient permissions to access the project')
       end
@@ -122,10 +106,6 @@ def error_no_permissions
         error(_('You have insufficient permissions to create an on-call rotation for this project'))
       end
 
-      def error_no_license
-        error(_('Your license does not support on-call rotations'))
-      end
-
       def error_in_validation(object)
         error(object.errors.full_messages.to_sentence)
       end
diff --git a/ee/app/services/incident_management/oncall_rotations/destroy_service.rb b/ee/app/services/incident_management/oncall_rotations/destroy_service.rb
index 3f89b9900544cb42d6fcdd042bc1435b749138db..83dc6893c9b044a2e0ca4fd1b2926e67b96b06dc 100644
--- a/ee/app/services/incident_management/oncall_rotations/destroy_service.rb
+++ b/ee/app/services/incident_management/oncall_rotations/destroy_service.rb
@@ -2,7 +2,7 @@
 
 module IncidentManagement
   module OncallRotations
-    class DestroyService
+    class DestroyService < BaseService
       # @param oncall_schedule [IncidentManagement::OncallRotation]
       # @param user [User]
       def initialize(oncall_rotation, user)
@@ -16,7 +16,7 @@ def execute
         return error_no_permissions unless allowed?
 
         if oncall_rotation.destroy
-          success
+          success(oncall_rotation)
         else
           error(oncall_rotation.errors.full_messages.to_sentence)
         end
@@ -26,29 +26,9 @@ def execute
 
       attr_reader :oncall_rotation, :user, :project
 
-      def allowed?
-        user&.can?(:admin_incident_management_oncall_schedule, project)
-      end
-
-      def available?
-        ::Gitlab::IncidentManagement.oncall_schedules_available?(project)
-      end
-
-      def error(message)
-        ServiceResponse.error(message: message)
-      end
-
-      def success
-        ServiceResponse.success(payload: { oncall_rotation: oncall_rotation })
-      end
-
       def error_no_permissions
         error(_('You have insufficient permissions to remove an on-call rotation from this project'))
       end
-
-      def error_no_license
-        error(_('Your license does not support on-call rotations'))
-      end
     end
   end
 end
diff --git a/ee/app/services/incident_management/oncall_schedules/base_service.rb b/ee/app/services/incident_management/oncall_schedules/base_service.rb
new file mode 100644
index 0000000000000000000000000000000000000000..94a193afe7b00c013aeb982335fb8d65e42fd2f3
--- /dev/null
+++ b/ee/app/services/incident_management/oncall_schedules/base_service.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module IncidentManagement
+  module OncallSchedules
+    class BaseService
+      def allowed?
+        user&.can?(:admin_incident_management_oncall_schedule, project)
+      end
+
+      def available?
+        ::Gitlab::IncidentManagement.oncall_schedules_available?(project)
+      end
+
+      def error(message)
+        ServiceResponse.error(message: message)
+      end
+
+      def success(oncall_schedule)
+        ServiceResponse.success(payload: { oncall_schedule: oncall_schedule })
+      end
+
+      def error_no_license
+        error(_('Your license does not support on-call schedules'))
+      end
+    end
+  end
+end
diff --git a/ee/app/services/incident_management/oncall_schedules/create_service.rb b/ee/app/services/incident_management/oncall_schedules/create_service.rb
index 1abba374727fd455dfe9095c89f38a650161b5da..b03c2ee26da16ea7972787d00f502a9b3cd14d3d 100644
--- a/ee/app/services/incident_management/oncall_schedules/create_service.rb
+++ b/ee/app/services/incident_management/oncall_schedules/create_service.rb
@@ -2,7 +2,7 @@
 
 module IncidentManagement
   module OncallSchedules
-    class CreateService
+    class CreateService < BaseService
       # @param project [Project]
       # @param user [User]
       # @param params [Hash]
@@ -26,30 +26,10 @@ def execute
 
       attr_reader :project, :user, :params
 
-      def allowed?
-        user&.can?(:admin_incident_management_oncall_schedule, project)
-      end
-
-      def available?
-        ::Gitlab::IncidentManagement.oncall_schedules_available?(project)
-      end
-
-      def error(message)
-        ServiceResponse.error(message: message)
-      end
-
-      def success(oncall_schedule)
-        ServiceResponse.success(payload: { oncall_schedule: oncall_schedule })
-      end
-
       def error_no_permissions
         error(_('You have insufficient permissions to create an on-call schedule for this project'))
       end
 
-      def error_no_license
-        error(_('Your license does not support on-call schedules'))
-      end
-
       def error_in_create(oncall_schedule)
         error(oncall_schedule.errors.full_messages.to_sentence)
       end
diff --git a/ee/app/services/incident_management/oncall_schedules/destroy_service.rb b/ee/app/services/incident_management/oncall_schedules/destroy_service.rb
index d050268fc7405c8b09eec182570bc32c96b23275..d0b11cfb995a69bc6a328ab6a6f4aca736240ff2 100644
--- a/ee/app/services/incident_management/oncall_schedules/destroy_service.rb
+++ b/ee/app/services/incident_management/oncall_schedules/destroy_service.rb
@@ -2,7 +2,7 @@
 
 module IncidentManagement
   module OncallSchedules
-    class DestroyService
+    class DestroyService < BaseService
       # @param oncall_schedule [IncidentManagement::OncallSchedule]
       # @param user [User]
       def initialize(oncall_schedule, user)
@@ -16,7 +16,7 @@ def execute
         return error_no_permissions unless allowed?
 
         if oncall_schedule.destroy
-          success
+          success(oncall_schedule)
         else
           error(oncall_schedule.errors.full_messages.to_sentence)
         end
@@ -26,29 +26,9 @@ def execute
 
       attr_reader :oncall_schedule, :user, :project
 
-      def allowed?
-        user&.can?(:admin_incident_management_oncall_schedule, project)
-      end
-
-      def available?
-        ::Gitlab::IncidentManagement.oncall_schedules_available?(project)
-      end
-
-      def error(message)
-        ServiceResponse.error(message: message)
-      end
-
-      def success
-        ServiceResponse.success(payload: { oncall_schedule: oncall_schedule })
-      end
-
       def error_no_permissions
         error(_('You have insufficient permissions to remove an on-call schedule from this project'))
       end
-
-      def error_no_license
-        error(_('Your license does not support on-call schedules'))
-      end
     end
   end
 end
diff --git a/ee/app/services/incident_management/oncall_schedules/update_service.rb b/ee/app/services/incident_management/oncall_schedules/update_service.rb
index 1ea78a5d9c89375ce0d1eb5ecaeeca21d7c0188e..bfb4e51126b2cc8837cb366ecbc353c8623e5fb4 100644
--- a/ee/app/services/incident_management/oncall_schedules/update_service.rb
+++ b/ee/app/services/incident_management/oncall_schedules/update_service.rb
@@ -2,7 +2,7 @@
 
 module IncidentManagement
   module OncallSchedules
-    class UpdateService
+    class UpdateService < BaseService
       # @param oncall_schedule [IncidentManagement::OncallSchedule]
       # @param user [User]
       # @param params [Hash]
@@ -28,29 +28,9 @@ def execute
 
       attr_reader :oncall_schedule, :user, :params, :project
 
-      def allowed?
-        user&.can?(:admin_incident_management_oncall_schedule, project)
-      end
-
-      def available?
-        ::Gitlab::IncidentManagement.oncall_schedules_available?(project)
-      end
-
-      def error(message)
-        ServiceResponse.error(message: message)
-      end
-
-      def success(oncall_schedule)
-        ServiceResponse.success(payload: { oncall_schedule: oncall_schedule })
-      end
-
       def error_no_permissions
         error(_('You have insufficient permissions to update an on-call schedule for this project'))
       end
-
-      def error_no_license
-        error(_('Your license does not support on-call schedules'))
-      end
     end
   end
 end