diff --git a/spec/support/matchers/internal_events_matchers.rb b/spec/support/matchers/internal_events_matchers.rb
index dc471440e7aa5e643660c9d55e3ce7cde9648f05..7bb57ccc48ece1ca20464bc98b01e3d9992d4101 100644
--- a/spec/support/matchers/internal_events_matchers.rb
+++ b/spec/support/matchers/internal_events_matchers.rb
@@ -38,12 +38,12 @@
 #
 # expect { subject }
 #   .to trigger_internal_events('mr_created', 'member_role_created')
-#   .with(user: user, project: project, category: category, label: label)
+#   .with(user: user, project: project, category: category, additional_properties: { label: label } )
 #   .exactly(3).times
 #
 # expect { subject }
 #   .to trigger_internal_events('mr_created')
-#     .with(user: user, project: project, category: category, label: label)
+#     .with(user: user, project: project, category: category, additional_properties: { label: label } )
 #   .and increment_usage_metrics('counts.deployments')
 #     .at_least(:once)
 #   .and change { mr.notes.count }.by(1)
@@ -107,6 +107,7 @@ def apply_chain_methods(base_matcher, chained_methods)
       **args
     }
     @properties[:namespace] ||= @properties[:project]&.namespace
+    @additional_properties ||= @properties.fetch(:additional_properties, {})
   end
 
   %i[once twice thrice never at_most at_least times time exactly].each do |message|
@@ -205,7 +206,7 @@ def expect_snowplow(event_name)
           standard_context,
           service_ping_context_for(event_name)
         ),
-        **@properties.slice(:label, :property, :value).compact
+        **@additional_properties.slice(:label, :property, :value).compact
       )
     )
   end
@@ -250,7 +251,7 @@ def expect_product_analytics(event_name)
     return expect_any_product_analytics_call(event_name) if @properties.none?
 
     expected_context = { project_id: id_for(:project), namespace_id: id_for(:namespace) }
-    additional_properties = @properties.slice(:label, :property, :value)
+    additional_properties = @additional_properties.slice(:label, :property, :value)
     expected_context[:additional_properties] = additional_properties if additional_properties.any?
 
     expect(product_analytics_spy).to receive_expected_count_of(:track).with(
diff --git a/spec/support_specs/matchers/internal_events_matchers_spec.rb b/spec/support_specs/matchers/internal_events_matchers_spec.rb
index 5c6dc5af95cbda17dbcca5f1eb3c763319a8ecfe..7078d87d023bec655243e8463ce083336af23122 100644
--- a/spec/support_specs/matchers/internal_events_matchers_spec.rb
+++ b/spec/support_specs/matchers/internal_events_matchers_spec.rb
@@ -96,6 +96,35 @@ def track_event(event: nil, user: nil, group: nil)
           .with(user: user_2, namespace: group_2)
           .once
     end
+
+    context 'with additional properties' do
+      let(:additional_properties) { { label: 'label1', value: 123, property: 'property1' } }
+      let(:tracked_params) { { user: user_1, namespace: group_1, additional_properties: additional_properties } }
+      let(:expected_params) { tracked_params }
+
+      subject(:assertion) do
+        expect do
+          Gitlab::InternalEvents.track_event('g_edit_by_sfe', **tracked_params)
+        end.to trigger_internal_events('g_edit_by_sfe')
+            .with(expected_params)
+            .once
+      end
+
+      it 'accepts correct additional properties' do
+        assertion
+      end
+
+      context "with wrong label value" do
+        let(:expected_params) { tracked_params.deep_merge(additional_properties: { label: 'wrong_label' }) }
+
+        it "doesn't accept incorrect additional_properties" do
+          expect do
+            assertion
+          end.to raise_error RSpec::Expectations::ExpectationNotMetError,
+            /received :event with unexpected arguments/
+        end
+      end
+    end
   end
 
   describe ':increment_usage_metrics' do