diff --git a/app/controllers/ide_controller.rb b/app/controllers/ide_controller.rb
index 4a4d41f3e6fe735d1cb451a07d2c802fe6f1c3dc..474593cdacefad0210e562986dc877c2d02100cb 100644
--- a/app/controllers/ide_controller.rb
+++ b/app/controllers/ide_controller.rb
@@ -4,6 +4,7 @@ class IdeController < ApplicationController
   include WebIdeCSP
   include StaticObjectExternalStorageCSP
   include Gitlab::Utils::StrongMemoize
+  include ProductAnalyticsTracking
 
   before_action :authorize_read_project!, only: [:index]
   before_action :ensure_web_ide_oauth_application!, only: [:index]
@@ -17,13 +18,10 @@ class IdeController < ApplicationController
 
   urgency :low
 
-  def index
-    Gitlab::UsageDataCounters::WebIdeCounter.increment_views_count
+  track_internal_event :index, name: 'web_ide_viewed'
 
-    if project
-      Gitlab::Tracking.event(self.class.to_s, 'web_ide_views', namespace: project.namespace, user: current_user)
-      @fork_info = fork_info(project, params[:branch])
-    end
+  def index
+    @fork_info = fork_info(project, params[:branch])
 
     render layout: helpers.use_new_web_ide? ? 'fullscreen' : 'application'
   end
@@ -71,4 +69,12 @@ def project
       Project.find_by_full_path(params[:project_id])
     end
   end
+
+  def tracking_namespace_source
+    project.namespace
+  end
+
+  def tracking_project_source
+    project
+  end
 end
diff --git a/config/events/web_ide_viewed.yml b/config/events/web_ide_viewed.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6126d7788bf9846d0f3bb94ac34bc9defc6b01ca
--- /dev/null
+++ b/config/events/web_ide_viewed.yml
@@ -0,0 +1,24 @@
+---
+description: Tracks when Web IDE is viewed
+category: InternalEventTracking
+action: web_ide_viewed
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+- project
+- user
+- namespace
+product_section: dev
+product_stage: create
+product_group: ide
+milestone: "16.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/143495
+distributions:
+- ce
+- ee
+tiers:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210216180244_web_ide_views.yml b/config/metrics/counts_all/20210216180244_web_ide_views.yml
index 84c1455f8ade635ed82cb8f7eb6cfe6dc2fd8409..bad4c3ad534c3a4f9598bb1b84dd4a553417be0d 100644
--- a/config/metrics/counts_all/20210216180244_web_ide_views.yml
+++ b/config/metrics/counts_all/20210216180244_web_ide_views.yml
@@ -8,12 +8,12 @@ product_group: ide
 value_type: number
 status: active
 time_frame: all
-data_source: redis
-instrumentation_class: RedisMetric
+data_source: internal_events
+events:
+  - name: web_ide_viewed
 options:
-  prefix: web_ide
-  event: views_count
-  include_usage_prefix: false
+  events:
+    - web_ide_viewed
 distribution:
 - ce
 - ee
diff --git a/lib/gitlab/internal_events.rb b/lib/gitlab/internal_events.rb
index c216f2583a6209d662447b0b866c67b153a46e2d..fc60d1b719e89133a26e5f2891e74f5f53f0a9af 100644
--- a/lib/gitlab/internal_events.rb
+++ b/lib/gitlab/internal_events.rb
@@ -11,6 +11,7 @@ module InternalEvents
     class << self
       include Gitlab::Tracking::Helpers
       include Gitlab::Utils::StrongMemoize
+      include Gitlab::UsageDataCounters::RedisCounter
 
       def track_event(event_name, category: nil, send_snowplow_event: true, **kwargs)
         raise UnknownEventError, "Unknown event: #{event_name}" unless EventDefinitions.known_event?(event_name)
@@ -50,15 +51,15 @@ def validate_property!(kwargs, property_name, *class_names)
       end
 
       def increase_total_counter(event_name)
-        redis_counter_key =
-          Gitlab::Usage::Metrics::Instrumentations::TotalCountMetric.redis_key(event_name)
-        Gitlab::Redis::SharedState.with { |redis| redis.incr(redis_counter_key) }
+        redis_counter_key = Gitlab::Usage::Metrics::Instrumentations::TotalCountMetric.redis_key(event_name)
+
+        increment(redis_counter_key)
       end
 
       def increase_weekly_total_counter(event_name)
-        redis_counter_key =
-          Gitlab::Usage::Metrics::Instrumentations::TotalCountMetric.redis_key(event_name, Date.today)
-        Gitlab::Redis::SharedState.with { |redis| redis.incr(redis_counter_key) }
+        redis_counter_key = Gitlab::Usage::Metrics::Instrumentations::TotalCountMetric.redis_key(event_name, Date.today)
+
+        increment(redis_counter_key)
       end
 
       def update_unique_counters(event_name, kwargs)
diff --git a/lib/gitlab/usage_data_counters/redis_counter.rb b/lib/gitlab/usage_data_counters/redis_counter.rb
index 3f16681b6427cb87e1d6ac279a1221e9bbc3e8f7..5b28d7b579858eb4b992d450c772ad56cb830456 100644
--- a/lib/gitlab/usage_data_counters/redis_counter.rb
+++ b/lib/gitlab/usage_data_counters/redis_counter.rb
@@ -6,17 +6,37 @@
 module Gitlab
   module UsageDataCounters
     module RedisCounter
+      include Gitlab::Utils::StrongMemoize
+
+      # This file overrides (or aliases) some keys for legacy Redis metric counters to delay migrating them to new
+      # names for now, because doing that in bulk will be a lot easier.
+      KEY_OVERRIDES_PATH = Rails.root.join('lib/gitlab/usage_data_counters/total_counter_redis_key_overrides.yml')
+
       def increment(redis_counter_key)
-        Gitlab::Redis::SharedState.with { |redis| redis.incr(redis_counter_key) }
+        legacy_redis_counter_key = legacy_key(redis_counter_key)
+        Gitlab::Redis::SharedState.with { |redis| redis.incr(legacy_redis_counter_key) }
       end
 
       def increment_by(redis_counter_key, incr)
-        Gitlab::Redis::SharedState.with { |redis| redis.incrby(redis_counter_key, incr) }
+        legacy_redis_counter_key = legacy_key(redis_counter_key)
+        Gitlab::Redis::SharedState.with { |redis| redis.incrby(legacy_redis_counter_key, incr) }
       end
 
       def total_count(redis_counter_key)
-        Gitlab::Redis::SharedState.with { |redis| redis.get(redis_counter_key).to_i }
+        legacy_redis_counter_key = legacy_key(redis_counter_key)
+        Gitlab::Redis::SharedState.with { |redis| redis.get(legacy_redis_counter_key).to_i }
+      end
+
+      private
+
+      def legacy_key(redis_key)
+        key_overrides.fetch(redis_key, redis_key)
+      end
+
+      def key_overrides
+        YAML.safe_load(File.read(KEY_OVERRIDES_PATH))
       end
+      strong_memoize_attr :key_overrides
     end
   end
 end
diff --git a/lib/gitlab/usage_data_counters/total_counter_redis_key_overrides.yml b/lib/gitlab/usage_data_counters/total_counter_redis_key_overrides.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f882ee768bab6b89adb43b25f8402e15867e1a36
--- /dev/null
+++ b/lib/gitlab/usage_data_counters/total_counter_redis_key_overrides.yml
@@ -0,0 +1,10 @@
+# This file holds a list of Redis keys for Internal Events tracking total
+# counters in the new format, mapped to the existing legacy keys, in order
+# to keep the continuity of past data and not have to migrate the keys.
+#
+# Format:
+# NEW_KEY_1: LEGACY_KEY_1
+# NEW_KEY_2: LEGACY_KEY_2
+# ...
+#
+'{event_counters}_web_ide_viewed': WEB_IDE_VIEWS_COUNT
diff --git a/lib/gitlab/usage_data_counters/web_ide_counter.rb b/lib/gitlab/usage_data_counters/web_ide_counter.rb
index 904729f114fab436bff848eeb580a99f6ea63117..5c5b58f3f38926cbaaec2f4c09a940aa0e8a1f2f 100644
--- a/lib/gitlab/usage_data_counters/web_ide_counter.rb
+++ b/lib/gitlab/usage_data_counters/web_ide_counter.rb
@@ -15,10 +15,6 @@ def increment_merge_requests_count
           count('merge_requests')
         end
 
-        def increment_views_count
-          count('views')
-        end
-
         def increment_terminals_count
           count('terminals')
         end
diff --git a/spec/lib/gitlab/usage_data_counters/base_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/base_counter_spec.rb
index 9cecaa01885937718f026d3a4adcaeade630eb3c..4a31191d75f6de0caaa83c5fed00bad2c2fe1624 100644
--- a/spec/lib/gitlab/usage_data_counters/base_counter_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/base_counter_spec.rb
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 
-require 'fast_spec_helper'
+require 'spec_helper'
 
 RSpec.describe Gitlab::UsageDataCounters::BaseCounter do
   describe '.fetch_supported_event' do
diff --git a/spec/lib/gitlab/usage_data_counters/redis_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/redis_counter_spec.rb
index 39d48b7b938ad7f10f16aab0e5df050f5a30b587..d04f43bfb3ade5456630ac2e75ef3ceb0e98b4c4 100644
--- a/spec/lib/gitlab/usage_data_counters/redis_counter_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/redis_counter_spec.rb
@@ -13,6 +13,14 @@
         subject.increment(redis_key)
       end.to change { subject.total_count(redis_key) }.by(1)
     end
+
+    context 'with aliased legacy key' do
+      let(:redis_key) { '{event_counters}_web_ide_viewed' }
+
+      it 'counter is increased for a legacy key' do
+        expect { subject.increment(redis_key) }.to change { subject.total_count('WEB_IDE_VIEWS_COUNT') }.by(1)
+      end
+    end
   end
 
   describe '.increment_by' do
diff --git a/spec/lib/gitlab/usage_data_counters/web_ide_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/web_ide_counter_spec.rb
index d79fa66b9832ff7bf33ef530797d65b60458f511..5e04deb95c091814742e99ac38037719b1b57e40 100644
--- a/spec/lib/gitlab/usage_data_counters/web_ide_counter_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/web_ide_counter_spec.rb
@@ -22,10 +22,6 @@
     it_behaves_like 'counter examples', 'merge_requests'
   end
 
-  describe 'views counter' do
-    it_behaves_like 'counter examples', 'views'
-  end
-
   describe 'terminals counter' do
     it_behaves_like 'counter examples', 'terminals'
   end
@@ -37,14 +33,12 @@
   describe '.totals' do
     commits = 5
     merge_requests = 3
-    views = 2
     terminals = 1
     pipelines = 2
 
     before do
       commits.times { described_class.increment_commits_count }
       merge_requests.times { described_class.increment_merge_requests_count }
-      views.times { described_class.increment_views_count }
       terminals.times { described_class.increment_terminals_count }
       pipelines.times { described_class.increment_pipelines_count }
     end
@@ -52,7 +46,6 @@
     it 'can report all totals' do
       expect(described_class.totals).to include(
         web_ide_commits: commits,
-        web_ide_views: views,
         web_ide_merge_requests: merge_requests,
         web_ide_terminals: terminals
       )
diff --git a/spec/lib/gitlab/usage_data_counters_spec.rb b/spec/lib/gitlab/usage_data_counters_spec.rb
index 040b5deca540e5105e187be35aed7879fadc7ace..0696b375eb55c077115a19495b003d064cdb36c0 100644
--- a/spec/lib/gitlab/usage_data_counters_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters_spec.rb
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 
-require 'fast_spec_helper'
+require 'spec_helper'
 
 RSpec.describe Gitlab::UsageDataCounters do
   describe '.usage_data_counters' do
diff --git a/spec/requests/ide_controller_spec.rb b/spec/requests/ide_controller_spec.rb
index 20d890fadbf12a4f8d03373284ef5e65bd39c1c5..925484810e9c24906c9e71613558eacb1b8ffb27 100644
--- a/spec/requests/ide_controller_spec.rb
+++ b/spec/requests/ide_controller_spec.rb
@@ -30,7 +30,13 @@
     shared_examples 'user access rights check' do
       context 'when user can read project' do
         it 'increases the views counter' do
-          expect(Gitlab::UsageDataCounters::WebIdeCounter).to receive(:increment_views_count)
+          expect(Gitlab::InternalEvents).to receive(:track_event)
+            .with(
+              'web_ide_viewed',
+              user: user,
+              project: project,
+              namespace: project.namespace
+            ).once
 
           subject
         end
@@ -141,19 +147,6 @@
         end
       end
 
-      describe 'Snowplow view event', :snowplow do
-        it 'is tracked' do
-          subject
-
-          expect_snowplow_event(
-            category: described_class.to_s,
-            action: 'web_ide_views',
-            namespace: project.namespace,
-            user: user
-          )
-        end
-      end
-
       describe 'legacy Web IDE' do
         before do
           stub_feature_flags(vscode_web_ide: false)