diff --git a/app/services/event_create_service.rb b/app/services/event_create_service.rb
index 2ab4bb47462497dac780c190491d62a53d721df7..019246dfc9f36afe687620c9258ef41e899ef6e4 100644
--- a/app/services/event_create_service.rb
+++ b/app/services/event_create_service.rb
@@ -25,14 +25,18 @@ def reopen_issue(issue, current_user)
   def open_mr(merge_request, current_user)
     create_record_event(merge_request, current_user, :created).tap do
       track_event(event_action: :created, event_target: MergeRequest, author_id: current_user.id)
-      track_mr_snowplow_event(merge_request, current_user, :create)
+      track_snowplow_event(merge_request, current_user,
+                           Gitlab::UsageDataCounters::TrackUniqueEvents::MERGE_REQUEST_ACTION,
+                           :create, 'merge_requests_users')
     end
   end
 
   def close_mr(merge_request, current_user)
     create_record_event(merge_request, current_user, :closed).tap do
       track_event(event_action: :closed, event_target: MergeRequest, author_id: current_user.id)
-      track_mr_snowplow_event(merge_request, current_user, :close)
+      track_snowplow_event(merge_request, current_user,
+                           Gitlab::UsageDataCounters::TrackUniqueEvents::MERGE_REQUEST_ACTION,
+                           :close, 'merge_requests_users')
     end
   end
 
@@ -43,7 +47,9 @@ def reopen_mr(merge_request, current_user)
   def merge_mr(merge_request, current_user)
     create_record_event(merge_request, current_user, :merged).tap do
       track_event(event_action: :merged, event_target: MergeRequest, author_id: current_user.id)
-      track_mr_snowplow_event(merge_request, current_user, :merge)
+      track_snowplow_event(merge_request, current_user,
+                           Gitlab::UsageDataCounters::TrackUniqueEvents::MERGE_REQUEST_ACTION,
+                           :merge, 'merge_requests_users')
     end
   end
 
@@ -67,7 +73,9 @@ def leave_note(note, current_user)
     create_record_event(note, current_user, :commented).tap do
       if note.is_a?(DiffNote) && note.for_merge_request?
         track_event(event_action: :commented, event_target: MergeRequest, author_id: current_user.id)
-        track_mr_snowplow_event(note, current_user, :comment)
+        track_snowplow_event(note, current_user,
+                             Gitlab::UsageDataCounters::TrackUniqueEvents::MERGE_REQUEST_ACTION,
+                             :comment, 'merge_requests_users')
       end
     end
   end
@@ -100,12 +108,27 @@ def save_designs(current_user, create: [], update: [])
     records = create.zip([:created].cycle) + update.zip([:updated].cycle)
     return [] if records.empty?
 
+    if create.any?
+      track_snowplow_event(create.first, current_user,
+                           Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION,
+                           :create, 'design_users')
+    end
+
+    if update.any?
+      track_snowplow_event(update.first, current_user,
+                           Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION,
+                           :update, 'design_users')
+    end
+
     create_record_events(records, current_user)
   end
 
   def destroy_designs(designs, current_user)
     return [] unless designs.present?
 
+    track_snowplow_event(designs.first, current_user,
+                         Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION,
+                         :destroy, 'design_users')
     create_record_events(designs.zip([:destroyed].cycle), current_user)
   end
 
@@ -230,14 +253,14 @@ def track_event(**params)
     Gitlab::UsageDataCounters::TrackUniqueEvents.track_event(**params)
   end
 
-  def track_mr_snowplow_event(record, current_user, action)
+  def track_snowplow_event(record, current_user, category, action, label)
     return unless Feature.enabled?(:route_hll_to_snowplow_phase2)
 
     project = record.project
     Gitlab::Tracking.event(
-      Gitlab::UsageDataCounters::TrackUniqueEvents::MERGE_REQUEST_ACTION.to_s,
+      category.to_s,
       action.to_s,
-      label: 'merge_requests_users',
+      label: label,
       project: project,
       namespace: project.namespace,
       user: current_user
diff --git a/config/events/1655179428_design_actions_create_.yml b/config/events/1655179428_design_actions_create_.yml
new file mode 100644
index 0000000000000000000000000000000000000000..25e03a08a7a9bf89cab68d291801fd454cc7f3d1
--- /dev/null
+++ b/config/events/1655179428_design_actions_create_.yml
@@ -0,0 +1,25 @@
+---
+description: Triggered from backend layer when design is created
+category: design_actions
+action: create
+label_description: Constant string that match with ServicePing metric name of action_monthly_active_users_design_management
+property_description:
+value_description:
+extra_properties:
+identifiers:
+- project
+- user
+- namespace
+product_section: dev
+product_stage: plan
+product_group: group::product_planning
+product_category: design_management
+milestone: "15.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90107
+distributions:
+- ce
+- ee
+tiers:
+- free
+- premium
+- ultimate
diff --git a/config/events/1655179485_design_actions_update_.yml b/config/events/1655179485_design_actions_update_.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7648e51f0ae676ef6878f013f6829dee5ddea25b
--- /dev/null
+++ b/config/events/1655179485_design_actions_update_.yml
@@ -0,0 +1,25 @@
+---
+description: Triggered from backend layer when design is updated
+category: design_actions
+action: update
+label_description: Constant string that match with ServicePing metric name of action_monthly_active_users_design_management
+property_description:
+value_description:
+extra_properties:
+identifiers:
+- project
+- user
+- namespace
+product_section: dev
+product_stage: plan
+product_group: group::product_planning
+product_category: design_management
+milestone: "15.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90107
+distributions:
+- ce
+- ee
+tiers:
+- free
+- premium
+- ultimate
diff --git a/config/events/1655179517_design_actions_destroy_.yml b/config/events/1655179517_design_actions_destroy_.yml
new file mode 100644
index 0000000000000000000000000000000000000000..fd75f698e5e7ade7c5dbb6ff7b878ebd234617d7
--- /dev/null
+++ b/config/events/1655179517_design_actions_destroy_.yml
@@ -0,0 +1,25 @@
+---
+description: Triggered from backend layer when design is deleted
+category: design_actions
+action: destroy
+label_description: Constant string that match with ServicePing metric name of action_monthly_active_users_design_management
+property_description:
+value_description:
+extra_properties:
+identifiers:
+- project
+- user
+- namespace
+product_section: dev
+product_stage: plan
+product_group: group::product_planning
+product_category: design_management
+milestone: "15.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90107
+distributions:
+- ce
+- ee
+tiers:
+- free
+- premium
+- ultimate
diff --git a/spec/graphql/mutations/design_management/delete_spec.rb b/spec/graphql/mutations/design_management/delete_spec.rb
index 93fff5e5103a402ce9066fe9f7d3918dbadd65fc..79196d4965d6af7177cc64ddf3471fd7c9d0a407 100644
--- a/spec/graphql/mutations/design_management/delete_spec.rb
+++ b/spec/graphql/mutations/design_management/delete_spec.rb
@@ -86,9 +86,11 @@ def run_mutation
           end
         end
 
-        it 'runs no more than 29 queries' do
+        it 'runs no more than 30 queries' do
+          allow(Gitlab::Tracking).to receive(:event) # rubocop:disable RSpec/ExpectGitlabTracking
+
           filenames.each(&:present?) # ignore setup
-          # Queries: as of 2021-07-22
+          # Queries: as of 2022-06-15
           # -------------
           # 01. routing query
           # 02. find project by id
@@ -106,20 +108,21 @@ def run_mutation
           # 15. current designs by filename and issue
           # 16, 17 project.authorizations for user (same query as 5)
           # 18. find route by id and source_type
+          # 19. find plan for standard context
           # ------------- our queries are below:
-          # 19. start transaction 1
-          # 20.   start transaction 2
-          # 21.     find version by sha and issue
-          # 22.     exists version with sha and issue?
-          # 23.   leave transaction 2
-          # 24.   create version with sha and issue
-          # 25.   create design-version links
-          # 26.   validate version.actions.present?
-          # 27.   validate version.issue.present?
-          # 28.   validate version.sha is unique
-          # 29. leave transaction 1
+          # 20. start transaction 1
+          # 21.   start transaction 2
+          # 22.     find version by sha and issue
+          # 23.     exists version with sha and issue?
+          # 24.   leave transaction 2
+          # 25.   create version with sha and issue
+          # 26.   create design-version links
+          # 27.   validate version.actions.present?
+          # 28.   validate version.issue.present?
+          # 29.   validate version.sha is unique
+          # 30. leave transaction 1
           #
-          expect { run_mutation }.not_to exceed_query_limit(29)
+          expect { run_mutation }.not_to exceed_query_limit(30)
         end
       end
 
diff --git a/spec/services/event_create_service_spec.rb b/spec/services/event_create_service_spec.rb
index 56da85cc4a0b3daeb4395c50a1fa2da487ebedcb..e66b413a5c9517e5a3a2e6e28f889caf837e72b4 100644
--- a/spec/services/event_create_service_spec.rb
+++ b/spec/services/event_create_service_spec.rb
@@ -379,10 +379,14 @@ def create_event
     end
   end
 
-  describe 'design events' do
+  describe 'design events', :snowplow do
     let_it_be(:design) { create(:design, project: project) }
     let_it_be(:author) { user }
 
+    before do
+      allow(Gitlab::Tracking).to receive(:event) # rubocop:disable RSpec/ExpectGitlabTracking
+    end
+
     describe '#save_designs' do
       let_it_be(:updated) { create_list(:design, 5) }
       let_it_be(:created) { create_list(:design, 3) }
@@ -411,6 +415,44 @@ def create_event
       it_behaves_like "it records the event in the event counter" do
         let(:event_action) { Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION }
       end
+
+      it 'records correct create payload with Snowplow event' do
+        service.save_designs(author, create: [design])
+
+        expect_snowplow_event(
+          category:  Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION.to_s,
+          action: 'create',
+          namespace:  design.project.namespace,
+          user: author,
+          project: design.project,
+          label: 'design_users'
+        )
+      end
+
+      it 'records correct update payload with Snowplow event' do
+        service.save_designs(author, update: [design])
+
+        expect_snowplow_event(
+          category:  Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION.to_s,
+          action: 'update',
+          namespace:  design.project.namespace,
+          user: author,
+          project: design.project,
+          label: 'design_users'
+        )
+      end
+
+      context 'when FF is disabled' do
+        before do
+          stub_feature_flags(route_hll_to_snowplow_phase2: false)
+        end
+
+        it 'doesnt emit snowwplow events', :snowplow do
+          subject
+
+          expect_no_snowplow_event
+        end
+      end
     end
 
     describe '#destroy_designs' do
@@ -434,6 +476,31 @@ def create_event
       it_behaves_like "it records the event in the event counter" do
         let(:event_action) { Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION }
       end
+
+      it 'records correct payload with Snowplow event' do
+        service.destroy_designs([design], author)
+
+        expect_snowplow_event(
+          category:  Gitlab::UsageDataCounters::TrackUniqueEvents::DESIGN_ACTION.to_s,
+          action: 'destroy',
+          namespace:  design.project.namespace,
+          user: author,
+          project: design.project,
+          label: 'design_users'
+        )
+      end
+
+      context 'when FF is disabled' do
+        before do
+          stub_feature_flags(route_hll_to_snowplow_phase2: false)
+        end
+
+        it 'doesnt emit snowwplow events', :snowplow do
+          subject
+
+          expect_no_snowplow_event
+        end
+      end
     end
   end