diff --git a/ee/app/services/gitlab_subscriptions/user_add_on_assignments/base_create_service.rb b/ee/app/services/gitlab_subscriptions/user_add_on_assignments/base_create_service.rb
index 6463a7fcae1e3b1a662fb4c0adbe96791aae9127..727dd7ac15624ad5a0a41d6acbe9c8157be94b13 100644
--- a/ee/app/services/gitlab_subscriptions/user_add_on_assignments/base_create_service.rb
+++ b/ee/app/services/gitlab_subscriptions/user_add_on_assignments/base_create_service.rb
@@ -38,9 +38,11 @@ def execute
           Rails.cache.delete(user.duo_pro_cache_key_formatted)
 
           log_event('User AddOn assignment created')
-
-          ServiceResponse.success
         end
+
+        after_success_hook
+
+        ServiceResponse.success
       rescue NoSeatsAvailableError => error
         Gitlab::ErrorTracking.log_exception(
           error, base_log_params.merge({ message: 'User AddOn assignment creation failed' })
@@ -53,6 +55,10 @@ def execute
 
       attr_reader :add_on_purchase, :user
 
+      def after_success_hook
+        # overridden in inheriting classes.
+      end
+
       def validate
         return ERROR_NO_SEATS_AVAILABLE unless seats_available?
 
diff --git a/ee/app/services/gitlab_subscriptions/user_add_on_assignments/saas/create_service.rb b/ee/app/services/gitlab_subscriptions/user_add_on_assignments/saas/create_service.rb
index b86990aae502f56cfe24729853ede3bd9ed2d50f..8d9d8588720be49063af8416470ceb34a9165de8 100644
--- a/ee/app/services/gitlab_subscriptions/user_add_on_assignments/saas/create_service.rb
+++ b/ee/app/services/gitlab_subscriptions/user_add_on_assignments/saas/create_service.rb
@@ -4,16 +4,15 @@ module GitlabSubscriptions
   module UserAddOnAssignments
     module Saas
       class CreateService < ::GitlabSubscriptions::UserAddOnAssignments::Saas::CreateWithoutNotificationService
-        def execute
-          super.tap do |response|
-            create_iterable_trigger if should_trigger_duo_iterable? response
-          end
-        end
+        extend ::Gitlab::Utils::Override
 
         private
 
-        def should_trigger_duo_iterable?(response)
-          response.success? && duo_pro_or_enterprise? && !user_already_assigned?
+        override :after_success_hook
+        def after_success_hook
+          super
+
+          create_iterable_trigger if duo_pro_or_enterprise?
         end
 
         def duo_pro_or_enterprise?
diff --git a/ee/app/services/gitlab_subscriptions/user_add_on_assignments/saas/create_without_notification_service.rb b/ee/app/services/gitlab_subscriptions/user_add_on_assignments/saas/create_without_notification_service.rb
index ab334abf40a14ee9f1242bd6f69ef5909faa01a1..f79a45c8ab3ef027d385b19ee66b6502992863ca 100644
--- a/ee/app/services/gitlab_subscriptions/user_add_on_assignments/saas/create_without_notification_service.rb
+++ b/ee/app/services/gitlab_subscriptions/user_add_on_assignments/saas/create_without_notification_service.rb
@@ -8,8 +8,6 @@ class CreateWithoutNotificationService < ::GitlabSubscriptions::UserAddOnAssignm
 
         private
 
-        attr_reader :add_on_purchase, :user
-
         def eligible_for_gitlab_duo_pro_seat?
           namespace.eligible_for_gitlab_duo_pro_seat?(user)
         end
diff --git a/ee/app/services/gitlab_subscriptions/user_add_on_assignments/self_managed/create_service.rb b/ee/app/services/gitlab_subscriptions/user_add_on_assignments/self_managed/create_service.rb
index 57d91f078bb69a780ca27215b26f194fd262f9e4..88704aff0aa4bb27a6b9a13262df8acfbf2efa04 100644
--- a/ee/app/services/gitlab_subscriptions/user_add_on_assignments/self_managed/create_service.rb
+++ b/ee/app/services/gitlab_subscriptions/user_add_on_assignments/self_managed/create_service.rb
@@ -5,16 +5,16 @@ module UserAddOnAssignments
     module SelfManaged
       class CreateService < ::GitlabSubscriptions::UserAddOnAssignments::BaseCreateService
         include Gitlab::Utils::StrongMemoize
-
-        def execute
-          super.tap do |response|
-            send_duo_seat_assignment_email if should_send_duo_seat_assignment_email? response
-          end
-        end
+        extend ::Gitlab::Utils::Override
 
         private
 
-        attr_reader :add_on_purchase, :user
+        override :after_success_hook
+        def after_success_hook
+          super
+
+          send_duo_seat_assignment_email if Feature.enabled?(:duo_seat_assignment_email_for_sm, :instance)
+        end
 
         def eligible_for_gitlab_duo_pro_seat?
           user.eligible_for_self_managed_gitlab_duo_pro?
@@ -25,12 +25,6 @@ def send_duo_seat_assignment_email
           DuoSeatAssignmentMailer.duo_pro_email(user).deliver_later if add_on_purchase.add_on.code_suggestions?
           DuoSeatAssignmentMailer.duo_enterprise_email(user).deliver_later if add_on_purchase.add_on.duo_enterprise?
         end
-
-        def should_send_duo_seat_assignment_email?(response)
-          Feature.enabled?(:duo_seat_assignment_email_for_sm, :instance) &&
-            !user_already_assigned? &&
-            response.success?
-        end
       end
     end
   end