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 18a0ea4519d16df96fc8fd1df654ae80ccd5928c..bd8d61011dbfd4a72f61cf39d1911fda5857f8d6 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
@@ -70,6 +70,7 @@ def assigned_seats
       def user_already_assigned?
         add_on_purchase.already_assigned?(user)
       end
+      strong_memoize_attr :user_already_assigned?
 
       def eligible_for_gitlab_duo_pro_seat?
         raise NotImplementedError, 'Subclasses must implement the eligible_for_gitlab_duo_pro_seat? method'
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 c3987198622891508000d21238e1e8e6ad26225e..4c7601692253cb928451b10c4bce385f2a22a737 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
@@ -6,6 +6,12 @@ module Saas
       class CreateService < ::GitlabSubscriptions::UserAddOnAssignments::BaseCreateService
         include Gitlab::Utils::StrongMemoize
 
+        def execute
+          super.tap do |response|
+            create_iterable_trigger if should_trigger_duo_pro_iterable? response
+          end
+        end
+
         private
 
         attr_reader :add_on_purchase, :user
@@ -22,6 +28,26 @@ def namespace
         def base_log_params
           super.merge(namespace: add_on_purchase.namespace.full_path)
         end
+
+        def should_trigger_duo_pro_iterable?(response)
+          response.success? && add_on_purchase.add_on.code_suggestions? && !user_already_assigned?
+        end
+
+        def create_iterable_trigger
+          ::Onboarding::CreateIterableTriggerWorker.perform_async(iterable_params)
+        end
+
+        def iterable_params
+          {
+            first_name: user.first_name,
+            last_name: user.last_name,
+            work_email: user.email,
+            namespace_id: namespace.id,
+            product_interaction: "duo_pro_add_on_seat_assigned",
+            opt_in: user.onboarding_status_email_opt_in,
+            preferred_language: ::Gitlab::I18n.trimmed_language_name(user.preferred_language)
+          }
+        end
       end
     end
   end
diff --git a/ee/spec/services/gitlab_subscriptions/user_add_on_assignments/saas/create_service_spec.rb b/ee/spec/services/gitlab_subscriptions/user_add_on_assignments/saas/create_service_spec.rb
index 6f4888005c54de74c169ca6f3710af4a2e3411c2..11c1cb64f4c0fdab8582f2cf2eb755cc86a4e873 100644
--- a/ee/spec/services/gitlab_subscriptions/user_add_on_assignments/saas/create_service_spec.rb
+++ b/ee/spec/services/gitlab_subscriptions/user_add_on_assignments/saas/create_service_spec.rb
@@ -43,6 +43,22 @@
 
         expect { subject }.to change { Rails.cache.read(cache_key) }.from(false).to(nil)
       end
+
+      it 'creates an iterable trigger' do
+        expect(::Onboarding::CreateIterableTriggerWorker).to receive(:perform_async).with(
+          hash_including(
+            first_name: user.first_name,
+            last_name: user.last_name,
+            work_email: user.email,
+            namespace_id: namespace.id,
+            product_interaction: "duo_pro_add_on_seat_assigned",
+            preferred_language: 'English',
+            opt_in: user.onboarding_status_email_opt_in
+          )
+        )
+
+        subject
+      end
     end
 
     shared_examples 'error response' do |error|
@@ -62,6 +78,14 @@
       end
     end
 
+    shared_examples 'does not create an iterable trigger' do
+      it do
+        expect(::Onboarding::CreateIterableTriggerWorker).not_to receive(:perform_async)
+
+        subject
+      end
+    end
+
     it_behaves_like 'success response'
 
     context 'when user is already assigned' do
@@ -73,6 +97,8 @@
         expect { response }.not_to change { add_on_purchase.assigned_users.count }
         expect(response).to be_success
       end
+
+      it_behaves_like 'does not create an iterable trigger'
     end
 
     context 'when seats are not available' do
@@ -179,5 +205,12 @@
         end
       end
     end
+
+    context 'with add_on other than duo_pro' do
+      let(:add_on) { create(:gitlab_subscription_add_on, :product_analytics) }
+      let(:add_on_purchase) { create(:gitlab_subscription_add_on_purchase, namespace: namespace, add_on: add_on) }
+
+      it_behaves_like 'does not create an iterable trigger'
+    end
   end
 end