diff --git a/ee/app/services/ee/groups/group_links/destroy_service.rb b/ee/app/services/ee/groups/group_links/destroy_service.rb
index edff33b18e3f2415a819fa59ef140949c00f13f1..9317e3ebc82c2489f4baf2b617292fc5f556540e 100644
--- a/ee/app/services/ee/groups/group_links/destroy_service.rb
+++ b/ee/app/services/ee/groups/group_links/destroy_service.rb
@@ -9,17 +9,18 @@ module DestroyService
         override :execute
         def execute(one_or_more_links, skip_authorization: false)
           super.tap do |links|
-            log_audit_events(links)
+            next unless links.is_a?(Array)
+
+            perform_after_destroy_actions(links)
           end
         end
 
         private
 
-        def log_audit_events(links)
-          return unless links.is_a?(Array)
-
+        def perform_after_destroy_actions(links)
           links.each do |link|
             log_audit_event(link.shared_group, link.shared_with_group)
+            enqueue_refresh_add_on_assignments_worker(link)
           end
         end
 
@@ -36,6 +37,13 @@ def log_audit_event(group, shared_with_group)
 
           ::Gitlab::Audit::Auditor.audit(audit_context)
         end
+
+        def enqueue_refresh_add_on_assignments_worker(link)
+          return unless ::Feature.enabled?(:hamilton_seat_management)
+
+          GitlabSubscriptions::AddOnPurchases::RefreshUserAssignmentsWorker
+            .perform_async(link.shared_group.root_ancestor.id)
+        end
       end
     end
   end
diff --git a/ee/app/services/ee/projects/group_links/destroy_service.rb b/ee/app/services/ee/projects/group_links/destroy_service.rb
index 6fbea796ba364f1bf64c2e73ce3ad6ed65728343..c0f5219c40068daf7a3803bfdbd6dcb46dd7846f 100644
--- a/ee/app/services/ee/projects/group_links/destroy_service.rb
+++ b/ee/app/services/ee/projects/group_links/destroy_service.rb
@@ -9,7 +9,11 @@ module DestroyService
         override :execute
         def execute(group_link)
           super.tap do |link|
-            send_audit_event(link) if link && !link&.persisted?
+            if link && !link&.persisted?
+              send_audit_event(link)
+
+              enqueue_refresh_add_on_assignments_woker(link)
+            end
           end
         end
 
@@ -32,6 +36,13 @@ def send_audit_event(group_link)
 
           ::Gitlab::Audit::Auditor.audit(audit_context)
         end
+
+        def enqueue_refresh_add_on_assignments_woker(link)
+          return unless ::Feature.enabled?(:hamilton_seat_management)
+
+          GitlabSubscriptions::AddOnPurchases::RefreshUserAssignmentsWorker
+            .perform_async(link.project.root_ancestor.id)
+        end
       end
     end
   end
diff --git a/ee/spec/services/ee/groups/group_links/destroy_service_spec.rb b/ee/spec/services/ee/groups/group_links/destroy_service_spec.rb
index fed513392ce6c72301e6469852fb94b8061900f1..e66b3d52f716ac1284ea41b3caf580bdd2a823c5 100644
--- a/ee/spec/services/ee/groups/group_links/destroy_service_spec.rb
+++ b/ee/spec/services/ee/groups/group_links/destroy_service_spec.rb
@@ -32,6 +32,30 @@
 
       subject.execute(link)
     end
+
+    context 'for refresh user addon assignments' do
+      let(:sub_group_shared) { create(:group, :private, parent: shared_group) }
+      let!(:link) { create(:group_group_link, shared_group: sub_group_shared, shared_with_group: group) }
+      let(:worker) { GitlabSubscriptions::AddOnPurchases::RefreshUserAssignmentsWorker }
+
+      it 'enqueues RefreshUserAssignmentsWorker with correct arguments' do
+        expect(worker).to receive(:perform_async).with(sub_group_shared.root_ancestor.id).and_call_original
+
+        subject.execute(link)
+      end
+
+      context 'when the feature flag is not enabled' do
+        before do
+          stub_feature_flags(hamilton_seat_management: false)
+        end
+
+        it 'does not enqueue CleanupUserAddOnAssignmentWorker' do
+          expect(worker).not_to receive(:perform_async)
+
+          subject.execute(link)
+        end
+      end
+    end
   end
 
   context 'with multiple links' do
@@ -54,5 +78,14 @@
 
       subject.execute(links)
     end
+
+    it 'enqueues multiple CleanupUserAddOnAssignmentWorker' do
+      expect(GitlabSubscriptions::AddOnPurchases::RefreshUserAssignmentsWorker).to receive(:perform_async)
+        .exactly(links.size).times do |arg|
+          expect(arg).to eq(shared_group.id).or eq(another_shared_group.id)
+        end.and_call_original
+
+      subject.execute(links)
+    end
   end
 end
diff --git a/ee/spec/services/projects/group_links/destroy_service_spec.rb b/ee/spec/services/projects/group_links/destroy_service_spec.rb
index 4591a3912c28a28b709cb48cf9cf18a93ff2e1aa..0613051ed8292db3824c8c543ad5686fbbe7a0f3 100644
--- a/ee/spec/services/projects/group_links/destroy_service_spec.rb
+++ b/ee/spec/services/projects/group_links/destroy_service_spec.rb
@@ -53,4 +53,26 @@
       subject.execute(group_link)
     end
   end
+
+  context 'for refresh user addon assignments' do
+    let(:worker) { GitlabSubscriptions::AddOnPurchases::RefreshUserAssignmentsWorker }
+
+    it 'enqueues RefreshUserAssignmentsWorker with correct arguments' do
+      expect(worker).to receive(:perform_async).with(project.root_ancestor.id).and_call_original
+
+      subject.execute(group_link)
+    end
+
+    context 'when the feature flag is not enabled' do
+      before do
+        stub_feature_flags(hamilton_seat_management: false)
+      end
+
+      it 'does not enqueue CleanupUserAddOnAssignmentWorker' do
+        expect(worker).not_to receive(:perform_async)
+
+        subject.execute(group_link)
+      end
+    end
+  end
 end