diff --git a/app/assets/javascripts/tracking.js b/app/assets/javascripts/tracking.js
index 7c0097fbe371e774d9ac396d51f8b054ba206b51..2566c0fb273006d639c43c051ba936c7b782a1b3 100644
--- a/app/assets/javascripts/tracking.js
+++ b/app/assets/javascripts/tracking.js
@@ -102,6 +102,7 @@ export function initUserTracking() {
   window.snowplow('enableActivityTracking', 30, 30);
   window.snowplow('trackPageView'); // must be after enableActivityTracking
 
+  if (opts.userId) window.snowplow('setUserId', opts.userId);
   if (opts.formTracking) window.snowplow('enableFormTracking');
   if (opts.linkClickTracking) window.snowplow('enableLinkClickTracking');
 
diff --git a/app/views/layouts/_snowplow.html.haml b/app/views/layouts/_snowplow.html.haml
index d7ff5ad109411964e57cc4c988bbe11d8a1c1e56..3c06bca0f95c2f1fd86ca76598339225b9b23821 100644
--- a/app/views/layouts/_snowplow.html.haml
+++ b/app/views/layouts/_snowplow.html.haml
@@ -7,4 +7,4 @@
     };p[i].q=p[i].q||[];n=l.createElement(o);g=l.getElementsByTagName(o)[0];n.async=1;
     n.src=w;g.parentNode.insertBefore(n,g)}}(window,document,"script","#{asset_url('snowplow/sp.js')}","snowplow"));
 
-    window.snowplowOptions = #{Gitlab::Tracking.snowplow_options(@group).to_json}
+    window.snowplowOptions = #{Gitlab::Tracking.snowplow_options(@group, current_user).to_json}
diff --git a/lib/gitlab/tracking.rb b/lib/gitlab/tracking.rb
index 2470685bc00ac3857552d1a8f2a616aee658fb8e..d254d64dad2eafae21805fc027ea78d77955d614 100644
--- a/lib/gitlab/tracking.rb
+++ b/lib/gitlab/tracking.rb
@@ -39,7 +39,7 @@ def self_describing_event(schema_url, event_data_json, context: nil)
         snowplow.track_self_describing_event(event_json, context, Time.now.to_i)
       end
 
-      def snowplow_options(group)
+      def snowplow_options(group, user)
         additional_features = Feature.enabled?(:additional_snowplow_tracking, group)
         {
           namespace: SNOWPLOW_NAMESPACE,
@@ -47,7 +47,8 @@ def snowplow_options(group)
           cookie_domain: Gitlab::CurrentSettings.snowplow_cookie_domain,
           app_id: Gitlab::CurrentSettings.snowplow_site_id,
           form_tracking: additional_features,
-          link_click_tracking: additional_features
+          link_click_tracking: additional_features,
+          user_id: user&.id
         }.transform_keys! { |key| key.to_s.camelize(:lower).to_sym }
       end
 
diff --git a/spec/frontend/tracking_spec.js b/spec/frontend/tracking_spec.js
index 964f8b8787e08e85ec86870e19aa33ba5077e355..d9cc71041394d9dd766f52de3e908707d3dfc154 100644
--- a/spec/frontend/tracking_spec.js
+++ b/spec/frontend/tracking_spec.js
@@ -11,6 +11,7 @@ describe('Tracking', () => {
       namespace: '_namespace_',
       hostname: 'app.gitfoo.com',
       cookieDomain: '.gitfoo.com',
+      userId: null,
     };
     snowplowSpy = jest.spyOn(window, 'snowplow');
   });
@@ -34,6 +35,7 @@ describe('Tracking', () => {
         contexts: { webPage: true },
         formTracking: false,
         linkClickTracking: false,
+        userId: null,
       });
     });
 
@@ -41,15 +43,18 @@ describe('Tracking', () => {
       initUserTracking();
       expect(snowplowSpy).toHaveBeenCalledWith('enableActivityTracking', 30, 30);
       expect(snowplowSpy).toHaveBeenCalledWith('trackPageView');
+      expect(snowplowSpy).not.toHaveBeenCalledWith('setUserId');
       expect(snowplowSpy).not.toHaveBeenCalledWith('enableFormTracking');
       expect(snowplowSpy).not.toHaveBeenCalledWith('enableLinkClickTracking');
 
       window.snowplowOptions = Object.assign({}, window.snowplowOptions, {
         formTracking: true,
         linkClickTracking: true,
+        userId: '1',
       });
 
       initUserTracking();
+      expect(snowplowSpy).toHaveBeenCalledWith('setUserId', '1');
       expect(snowplowSpy).toHaveBeenCalledWith('enableFormTracking');
       expect(snowplowSpy).toHaveBeenCalledWith('enableLinkClickTracking');
     });
diff --git a/spec/lib/gitlab/tracking_spec.rb b/spec/lib/gitlab/tracking_spec.rb
index 50488dba48c82d6d4c12522efacbfa84736510a2..4615599be7e70170640af1bf370f915f0b5da3a3 100644
--- a/spec/lib/gitlab/tracking_spec.rb
+++ b/spec/lib/gitlab/tracking_spec.rb
@@ -13,14 +13,17 @@
 
   describe '.snowplow_options' do
     it 'returns useful client options' do
-      expect(described_class.snowplow_options(nil)).to eq(
+      expected_fields = {
         namespace: 'gl',
         hostname: 'gitfoo.com',
         cookieDomain: '.gitfoo.com',
         appId: '_abc123_',
         formTracking: true,
-        linkClickTracking: true
-      )
+        linkClickTracking: true,
+        userId: nil
+      }
+
+      expect(subject.snowplow_options(nil, nil)).to match(expected_fields)
     end
 
     it 'enables features using feature flags' do
@@ -29,11 +32,12 @@
         :additional_snowplow_tracking,
         '_group_'
       ).and_return(false)
-
-      expect(described_class.snowplow_options('_group_')).to include(
+      addition_feature_fields = {
         formTracking: false,
         linkClickTracking: false
-      )
+      }
+
+      expect(subject.snowplow_options('_group_', nil)).to include(addition_feature_fields)
     end
   end