diff --git a/.rubocop_todo/rails/strong_params.yml b/.rubocop_todo/rails/strong_params.yml
index 1ec833b7a5030d4d351810f28e722bc900db8ec2..b56b15f36acd7c996001913d7dbc9da1a769a23a 100644
--- a/.rubocop_todo/rails/strong_params.yml
+++ b/.rubocop_todo/rails/strong_params.yml
@@ -237,7 +237,6 @@ Rails/StrongParams:
     - 'ee/app/controllers/concerns/ee/analytics/cycle_analytics/stage_actions.rb'
     - 'ee/app/controllers/concerns/ee/analytics/cycle_analytics/value_stream_actions.rb'
     - 'ee/app/controllers/concerns/ee/issuable_collections.rb'
-    - 'ee/app/controllers/concerns/ee/onboarding/status.rb'
     - 'ee/app/controllers/concerns/epic_relations.rb'
     - 'ee/app/controllers/concerns/insights_actions.rb'
     - 'ee/app/controllers/country_states_controller.rb'
diff --git a/.rubocop_todo/rspec/be_eq.yml b/.rubocop_todo/rspec/be_eq.yml
index a6470c8c591c5281fe36c298fd7776b4a98a3775..51c5f437b18f2b3bf434e473b40848f01143ccda 100644
--- a/.rubocop_todo/rspec/be_eq.yml
+++ b/.rubocop_todo/rspec/be_eq.yml
@@ -574,7 +574,6 @@ RSpec/BeEq:
     - 'spec/controllers/application_controller_spec.rb'
     - 'spec/controllers/autocomplete_controller_spec.rb'
     - 'spec/controllers/concerns/internal_redirect_spec.rb'
-    - 'spec/controllers/concerns/onboarding/status_spec.rb'
     - 'spec/controllers/concerns/routable_actions_spec.rb'
     - 'spec/controllers/dashboard_controller_spec.rb'
     - 'spec/controllers/groups/application_controller_spec.rb'
diff --git a/app/controllers/concerns/onboarding/redirectable.rb b/app/controllers/concerns/onboarding/redirectable.rb
index 15c1847ebe473d15d35cd87b324cde336ef8cf23..cf25d33c62e1e72396190fab81f03d38a69ce3f8 100644
--- a/app/controllers/concerns/onboarding/redirectable.rb
+++ b/app/controllers/concerns/onboarding/redirectable.rb
@@ -7,9 +7,9 @@ module Redirectable
     private
 
     def after_sign_up_path
-      if onboarding_status.single_invite?
-        flash[:notice] = helpers.invite_accepted_notice(onboarding_status.last_invited_member)
-        polymorphic_path(onboarding_status.last_invited_member_source)
+      if onboarding_status_presenter.single_invite?
+        flash[:notice] = helpers.invite_accepted_notice(onboarding_status_presenter.last_invited_member)
+        polymorphic_path(onboarding_status_presenter.last_invited_member_source)
       else
         # Invites will come here if there is more than 1.
         path_for_signed_in_user
@@ -21,9 +21,9 @@ def path_for_signed_in_user
     end
 
     def last_member_source_path
-      return dashboard_projects_path unless onboarding_status.last_invited_member_source.present?
+      return dashboard_projects_path unless onboarding_status_presenter.last_invited_member_source.present?
 
-      polymorphic_path(onboarding_status.last_invited_member_source)
+      polymorphic_path(onboarding_status_presenter.last_invited_member_source)
     end
   end
 end
diff --git a/app/controllers/omniauth_callbacks_controller.rb b/app/controllers/omniauth_callbacks_controller.rb
index d6a39f19a3def9f3075effd2b4edaf0f0b74c647..551134c9d5caf2387b2d156083601160e1b1e1f9 100644
--- a/app/controllers/omniauth_callbacks_controller.rb
+++ b/app/controllers/omniauth_callbacks_controller.rb
@@ -385,11 +385,11 @@ def perform_registration_tasks(_user, _provider)
     store_location_for(:user, after_sign_up_path)
   end
 
-  def onboarding_status
-    Onboarding::Status
+  def onboarding_status_presenter
+    Onboarding::StatusPresenter
       .new(request.env.fetch('omniauth.params', {}).deep_symbolize_keys, session['user_return_to'], @user)
   end
-  strong_memoize_attr :onboarding_status
+  strong_memoize_attr :onboarding_status_presenter
 
   # overridden in EE
   def sign_in_and_redirect_or_verify_identity(user, _, _)
diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb
index 5b1172332885bc955fa7b091fcb320194b445aeb..b86322da7d4dcc864122244dbb6b183d18fd0715 100644
--- a/app/controllers/registrations_controller.rb
+++ b/app/controllers/registrations_controller.rb
@@ -28,7 +28,7 @@ class RegistrationsController < Devise::RegistrationsController
 
   feature_category :instance_resiliency
 
-  helper_method :arkose_labs_enabled?, :preregistration_tracking_label, :onboarding_status
+  helper_method :arkose_labs_enabled?, :preregistration_tracking_label, :onboarding_status_presenter
 
   def new
     @resource = build_resource
@@ -146,21 +146,21 @@ def after_inactive_sign_up_path_for(resource)
 
   private
 
-  def onboarding_status
-    Onboarding::Status.new(onboarding_status_params, session['user_return_to'], resource)
+  def onboarding_status_presenter
+    Onboarding::StatusPresenter.new(onboarding_status_params, session['user_return_to'], resource)
   end
-  strong_memoize_attr :onboarding_status
+  strong_memoize_attr :onboarding_status_presenter
 
   # rubocop:disable Gitlab/NoCodeCoverageComment -- Fully tested in EE and tested in Foss through feature specs in spec/features/invites_spec.rb
   # :nocov:
   def onboarding_status_params
-    # Onboarding::Status does not use any params in CE, we'll override in EE
+    # Onboarding::StatusPresenter does not use any params in CE, we'll override in EE
     {}
   end
   # rubocop:enable Gitlab/NoCodeCoverageComment
 
   def allow_flash_content?(user)
-    user.blocked_pending_approval? || onboarding_status.single_invite?
+    user.blocked_pending_approval? || onboarding_status_presenter.single_invite?
   end
 
   def track_successful_user_creation(user)
diff --git a/app/controllers/concerns/onboarding/status.rb b/app/presenters/onboarding/status_presenter.rb
similarity index 89%
rename from app/controllers/concerns/onboarding/status.rb
rename to app/presenters/onboarding/status_presenter.rb
index 405591ec70cef6b8b09c22b5424bbd7546fa9421..b8d1eaaf042fede3d4c8f151d0a0102ca856cfdc 100644
--- a/app/controllers/concerns/onboarding/status.rb
+++ b/app/presenters/onboarding/status_presenter.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 module Onboarding
-  class Status
+  class StatusPresenter
     def self.registration_path_params(params:) # rubocop:disable Lint/UnusedMethodArgument -- overridden in EE
       {}
     end
@@ -15,7 +15,7 @@ def initialize(params, user_return_to, user)
     def single_invite?
       # If there are more than one member it will mean we have been invited to multiple projects/groups and
       # are not able to distinguish which one we should putting the user in after registration
-      members.count == 1
+      members.size == 1
     end
 
     def last_invited_member
@@ -41,4 +41,4 @@ def members
   end
 end
 
-Onboarding::Status.prepend_mod_with('Onboarding::Status')
+Onboarding::StatusPresenter.prepend_mod
diff --git a/app/views/devise/registrations/new.html.haml b/app/views/devise/registrations/new.html.haml
index ba2633b22f9c0bc0742a1b2b1469dae5602271c6..87583746967f7af86a6617a18ea5ba5b3c93b7aa 100644
--- a/app/views/devise/registrations/new.html.haml
+++ b/app/views/devise/registrations/new.html.haml
@@ -10,7 +10,7 @@
 .signup-page
   .gl-mb-3.gl-p-4
     = render 'signup_box_form',
-      url: registration_path(resource_name, ::Onboarding::Status.registration_path_params(params: params)),
+      url: registration_path(resource_name, ::Onboarding::StatusPresenter.registration_path_params(params: params)),
       button_text: _('Continue')
 
     - if signup_button_based_providers_enabled?
@@ -20,7 +20,7 @@
         .gl-flex.gl-flex-col.gl-gap-3
           - enabled_button_based_providers_for_signup.each do |provider|
             = render 'devise/shared/omniauth_provider_button',
-              href: omniauth_authorize_path(:user, provider, onboarding_status.registration_omniauth_params),
+              href: omniauth_authorize_path(:user, provider, onboarding_status_presenter.registration_omniauth_params),
               provider: provider,
               classes: 'js-track-omni-auth',
               data: { provider: provider, track_action: "#{provider}_sso", track_label: preregistration_tracking_label }
diff --git a/ee/app/controllers/concerns/ee/onboarding/redirectable.rb b/ee/app/controllers/concerns/ee/onboarding/redirectable.rb
index a3e0d210fa172de57af94ff730b585e33c4e082b..7ada3b42582e096d10e7e7528bc4fb62ccca8f07 100644
--- a/ee/app/controllers/concerns/ee/onboarding/redirectable.rb
+++ b/ee/app/controllers/concerns/ee/onboarding/redirectable.rb
@@ -14,7 +14,7 @@ def onboarding_first_step_path
       end
 
       def onboarding_params
-        ::Onboarding::Status.glm_tracking_params(params) # rubocop:disable Rails/StrongParams -- strong params are used in the method being called
+        ::Onboarding::StatusPresenter.glm_tracking_params(params) # rubocop:disable Rails/StrongParams -- strong params are used in the method being called
       end
 
       override :after_sign_up_path
diff --git a/ee/app/controllers/concerns/gitlab_subscriptions/trials/duo_common.rb b/ee/app/controllers/concerns/gitlab_subscriptions/trials/duo_common.rb
index bf1f9c6f6763b7d2abadac9e872c874e6050cd8e..ac18d42fcd497a31a39119572be8b8fe73bd8d2c 100644
--- a/ee/app/controllers/concerns/gitlab_subscriptions/trials/duo_common.rb
+++ b/ee/app/controllers/concerns/gitlab_subscriptions/trials/duo_common.rb
@@ -46,7 +46,7 @@ def general_params
 
       def lead_params
         params.permit(
-          *::Onboarding::Status::GLM_PARAMS,
+          *::Onboarding::StatusPresenter::GLM_PARAMS,
           :company_name, :company_size, :first_name, :last_name, :phone_number,
           :country, :state, :website_url
         ).to_h
diff --git a/ee/app/controllers/ee/omniauth_callbacks_controller.rb b/ee/app/controllers/ee/omniauth_callbacks_controller.rb
index 0cac1f67058a64c9a34730ed141655aab1cc1999..cb071dded6bea7421dc0cd483465d853e6821c82 100644
--- a/ee/app/controllers/ee/omniauth_callbacks_controller.rb
+++ b/ee/app/controllers/ee/omniauth_callbacks_controller.rb
@@ -50,14 +50,14 @@ def perform_registration_tasks(user, provider)
             user,
             onboarding_first_step_path
           ).execute
-        clear_memoization(:onboarding_status) # clear since registration_type is now set
+        clear_memoization(:onboarding_status_presenter) # clear since registration_type is now set
 
         # We need to do this here since the subscription flow relies on what was set
         # in the stored_location_for(:user) that was set on initial redirect from
         # the GitlabSubscriptions::SubscriptionsController#new and super will wipe that out.
         # Then the RegistrationsIdentityVerificationController#success will get
         # whatever is set in super instead of the subscription path we desire.
-        super unless onboarding_status.preserve_stored_location?
+        super unless onboarding_status_presenter.preserve_stored_location?
       else
         super
       end
diff --git a/ee/app/controllers/ee/registrations_controller.rb b/ee/app/controllers/ee/registrations_controller.rb
index bf4b092698cdc31d0c605d117a5625cdeb63fd98..21f26b063e5b96e71bb3bbb3fbe8287d4cca5162 100644
--- a/ee/app/controllers/ee/registrations_controller.rb
+++ b/ee/app/controllers/ee/registrations_controller.rb
@@ -108,21 +108,21 @@ def after_successful_create_hook(user)
 
       ::Onboarding::StatusCreateService
         .new(onboarding_status_params, session['user_return_to'], resource, onboarding_first_step_path).execute
-      clear_memoization(:onboarding_status) # clear since registration_type is now set
+      clear_memoization(:onboarding_status_presenter) # clear since registration_type is now set
 
       log_audit_event(user)
       # This must come after user has been onboarding to properly detect the label from the onboarded user.
       ::Gitlab::Tracking.event(
         self.class.name,
         'successfully_submitted_form',
-        label: onboarding_status.tracking_label,
+        label: onboarding_status_presenter.tracking_label,
         user: user
       )
     end
 
     override :onboarding_status_params
     def onboarding_status_params
-      base_params = params.permit(:invite_email, *::Onboarding::Status::GLM_PARAMS)
+      base_params = params.permit(:invite_email, *::Onboarding::StatusPresenter::GLM_PARAMS)
 
       return base_params.to_h.deep_symbolize_keys unless params[:user].present? # rubocop:disable Rails/StrongParams -- false positive, we are really checking here just need to detect difference on get vs post
 
@@ -199,7 +199,7 @@ def arkose_labs_enabled?(user:)
 
     override :preregistration_tracking_label
     def preregistration_tracking_label
-      onboarding_status.preregistration_tracking_label
+      onboarding_status_presenter.preregistration_tracking_label
     end
 
     override :track_error
diff --git a/ee/app/controllers/ee/sessions_controller.rb b/ee/app/controllers/ee/sessions_controller.rb
index a9980f3db2d0c71fb288b115fde4a565439b0dac..ad8009167ab09fa88abf9dfe51dd384d8269caf5 100644
--- a/ee/app/controllers/ee/sessions_controller.rb
+++ b/ee/app/controllers/ee/sessions_controller.rb
@@ -78,13 +78,13 @@ def complete_identity_verification
 
     override :onboarding_status_tracking_label
     def onboarding_status_tracking_label
-      onboarding_status.preregistration_tracking_label
+      onboarding_status_presenter.preregistration_tracking_label
     end
 
-    def onboarding_status
-      ::Onboarding::Status
+    def onboarding_status_presenter
+      ::Onboarding::StatusPresenter
         .new(params.permit(:invite_email).to_h.deep_symbolize_keys, session['user_return_to'], resource)
     end
-    strong_memoize_attr :onboarding_status
+    strong_memoize_attr :onboarding_status_presenter
   end
 end
diff --git a/ee/app/controllers/gitlab_subscriptions/trials/duo_enterprise_controller.rb b/ee/app/controllers/gitlab_subscriptions/trials/duo_enterprise_controller.rb
index 0ec43f84b183134eb056b3b897de20eafd67ca00..afd80e26a593138336254d7cc43ea1e25681aa76 100644
--- a/ee/app/controllers/gitlab_subscriptions/trials/duo_enterprise_controller.rb
+++ b/ee/app/controllers/gitlab_subscriptions/trials/duo_enterprise_controller.rb
@@ -76,7 +76,7 @@ def track_event(action)
       end
 
       def trial_params
-        params.permit(*::Onboarding::Status::GLM_PARAMS, :namespace_id).to_h
+        params.permit(*::Onboarding::StatusPresenter::GLM_PARAMS, :namespace_id).to_h
       end
 
       def success_flash_message(add_on_purchase)
diff --git a/ee/app/controllers/gitlab_subscriptions/trials/duo_pro_controller.rb b/ee/app/controllers/gitlab_subscriptions/trials/duo_pro_controller.rb
index d2612c50f5b63df177d98b8ad2813915af74f302..15857b86f97f7364e2daed160a0ce57278ce4504 100644
--- a/ee/app/controllers/gitlab_subscriptions/trials/duo_pro_controller.rb
+++ b/ee/app/controllers/gitlab_subscriptions/trials/duo_pro_controller.rb
@@ -66,7 +66,7 @@ def track_event(action)
       end
 
       def trial_params
-        params.permit(*::Onboarding::Status::GLM_PARAMS, :namespace_id, :trial_entity).to_h
+        params.permit(*::Onboarding::StatusPresenter::GLM_PARAMS, :namespace_id, :trial_entity).to_h
       end
 
       def success_flash_message(add_on_purchase)
diff --git a/ee/app/controllers/gitlab_subscriptions/trials_controller.rb b/ee/app/controllers/gitlab_subscriptions/trials_controller.rb
index 7b28c21e39eb27acd2182744beecfcb0dca5b332..45ad5194d13c4c12a7b463cda294bc1a247d14e2 100644
--- a/ee/app/controllers/gitlab_subscriptions/trials_controller.rb
+++ b/ee/app/controllers/gitlab_subscriptions/trials_controller.rb
@@ -81,7 +81,7 @@ def authenticate_user!
       return if current_user
 
       redirect_to(
-        new_trial_registration_path(::Onboarding::Status.glm_tracking_params(params)), # rubocop:disable Rails/StrongParams -- method performs strong params
+        new_trial_registration_path(::Onboarding::StatusPresenter.glm_tracking_params(params)), # rubocop:disable Rails/StrongParams -- method performs strong params
         alert: I18n.t('devise.failure.unauthenticated')
       )
     end
@@ -92,14 +92,14 @@ def general_params
 
     def lead_params
       params.permit(
-        *::Onboarding::Status::GLM_PARAMS,
+        *::Onboarding::StatusPresenter::GLM_PARAMS,
         :company_name, :company_size, :first_name, :last_name, :phone_number,
         :country, :state, :website_url
       ).to_h
     end
 
     def trial_params
-      params.permit(*::Onboarding::Status::GLM_PARAMS, :new_group_name, :namespace_id, :trial_entity)
+      params.permit(*::Onboarding::StatusPresenter::GLM_PARAMS, :new_group_name, :namespace_id, :trial_entity)
       .with_defaults(organization_id: Current.organization_id).to_h
     end
 
diff --git a/ee/app/controllers/registrations/company_controller.rb b/ee/app/controllers/registrations/company_controller.rb
index cf5600a167cab38ebb3e1a01d84194293632241f..d520834253c55bca4a8dae7c684dcdd01d261498 100644
--- a/ee/app/controllers/registrations/company_controller.rb
+++ b/ee/app/controllers/registrations/company_controller.rb
@@ -14,26 +14,26 @@ class CompanyController < ApplicationController
 
     feature_category :onboarding
 
-    helper_method :onboarding_status
+    helper_method :onboarding_status_presenter
 
     def new
-      track_event('render', onboarding_status.tracking_label)
+      track_event('render', onboarding_status_presenter.tracking_label)
     end
 
     def create
       result = GitlabSubscriptions::CreateCompanyLeadService.new(user: current_user, params: permitted_params).execute
 
       if result.success?
-        track_event('successfully_submitted_form', onboarding_status.tracking_label)
+        track_event('successfully_submitted_form', onboarding_status_presenter.tracking_label)
 
         response = Onboarding::StatusStepUpdateService.new(
-          current_user, new_users_sign_up_group_path(::Onboarding::Status.glm_tracking_params(params))
+          current_user, new_users_sign_up_group_path(::Onboarding::StatusPresenter.glm_tracking_params(params))
         ).execute
 
         redirect_to response[:step_url]
       else
         result.errors.each do |error|
-          track_event("track_#{onboarding_status.tracking_label}_error", error.parameterize.underscore)
+          track_event("track_#{onboarding_status_presenter.tracking_label}_error", error.parameterize.underscore)
         end
 
         flash.now[:alert] = result.errors.to_sentence
@@ -45,8 +45,8 @@ def create
 
     def permitted_params
       params.permit(
-        *::Onboarding::Status::GLM_PARAMS,
-        *::Onboarding::Status::PASSED_THROUGH_PARAMS,
+        *::Onboarding::StatusPresenter::GLM_PARAMS,
+        *::Onboarding::StatusPresenter::PASSED_THROUGH_PARAMS,
         :company_name,
         :company_size,
         :first_name,
@@ -62,9 +62,9 @@ def track_event(action, label)
       ::Gitlab::Tracking.event(self.class.name, action, user: current_user, label: label)
     end
 
-    def onboarding_status
-      ::Onboarding::Status.new({}, nil, current_user)
+    def onboarding_status_presenter
+      ::Onboarding::StatusPresenter.new({}, nil, current_user)
     end
-    strong_memoize_attr :onboarding_status
+    strong_memoize_attr :onboarding_status_presenter
   end
 end
diff --git a/ee/app/controllers/registrations/groups_controller.rb b/ee/app/controllers/registrations/groups_controller.rb
index f663b449f4aab3700776097fb727f52580e1739b..4bd075a9412e5dc08abe167cbe5474e86e48e020 100644
--- a/ee/app/controllers/registrations/groups_controller.rb
+++ b/ee/app/controllers/registrations/groups_controller.rb
@@ -96,7 +96,7 @@ def import?
     end
 
     def tracking_label
-      onboarding_status.tracking_label
+      onboarding_status_presenter.tracking_label
     end
 
     def track_event(action, label)
@@ -132,10 +132,10 @@ def experiment_project_templates_during_registration(project, name, label)
       ).track(name, label: label)
     end
 
-    def onboarding_status
-      ::Onboarding::Status.new({}, nil, current_user)
+    def onboarding_status_presenter
+      ::Onboarding::StatusPresenter.new({}, nil, current_user)
     end
-    strong_memoize_attr :onboarding_status
+    strong_memoize_attr :onboarding_status_presenter
 
     def group_params
       params.require(:group).permit(
@@ -159,11 +159,11 @@ def project_params
     end
 
     def general_params
-      params.permit(*::Onboarding::Status::GLM_PARAMS, :import_url)
+      params.permit(*::Onboarding::StatusPresenter::GLM_PARAMS, :import_url)
     end
 
     def glm_params
-      ::Onboarding::Status.glm_tracking_params(params) # rubocop:disable Rails/StrongParams -- strong params are used in the method being called.
+      ::Onboarding::StatusPresenter.glm_tracking_params(params) # rubocop:disable Rails/StrongParams -- strong params are used in the method being called.
     end
   end
 end
diff --git a/ee/app/controllers/registrations/welcome_controller.rb b/ee/app/controllers/registrations/welcome_controller.rb
index 1ee27befffe00504baa26de24ac57a5a457400b6..5b6e84d5146a20c6b0589ab281642b92435c9c92 100644
--- a/ee/app/controllers/registrations/welcome_controller.rb
+++ b/ee/app/controllers/registrations/welcome_controller.rb
@@ -19,7 +19,7 @@ class WelcomeController < ApplicationController
 
     before_action :set_update_onboarding_status_params, only: :update
 
-    helper_method :onboarding_status
+    helper_method :onboarding_status_presenter
 
     feature_category :onboarding
 
@@ -30,13 +30,13 @@ def update
                  .new(current_user, user_return_to: session['user_return_to'], params: update_params).execute
 
       if result.success?
-        clear_memoization(:onboarding_status) # needed in case registration_type is changed on update
+        clear_memoization(:onboarding_status_presenter) # needed in case registration_type is changed on update
         track_event('successfully_submitted_form')
         track_joining_a_project_event
 
         redirect_to update_success_path
       else
-        track_event("track_#{onboarding_status.tracking_label}_error", label: 'failed_submitting_form')
+        track_event("track_#{onboarding_status_presenter.tracking_label}_error", label: 'failed_submitting_form')
 
         render :show
       end
@@ -69,11 +69,11 @@ def update_params
             .permit(:role, :setup_for_company, :registration_objective)
             .merge(params.permit(:jobs_to_be_done_other))
             .merge(user_onboarding_status_params)
-            .merge(onboarding_in_progress: onboarding_status.continue_full_onboarding?)
+            .merge(onboarding_in_progress: onboarding_status_presenter.continue_full_onboarding?)
     end
 
     def user_onboarding_status_params
-      return {} unless onboarding_status.convert_to_automatic_trial?
+      return {} unless onboarding_status_presenter.convert_to_automatic_trial?
 
       # Now we are in automatic trial and we'll update our status as such, initial_registration_type
       # will be how we know if they weren't a trial originally from here on out.
@@ -81,16 +81,16 @@ def user_onboarding_status_params
     end
 
     def passed_through_params
-      update_params.slice(*::Onboarding::Status::PASSED_THROUGH_PARAMS)
-                   .merge(::Onboarding::Status.glm_tracking_params(params))
+      update_params.slice(*::Onboarding::StatusPresenter::PASSED_THROUGH_PARAMS)
+                   .merge(::Onboarding::StatusPresenter.glm_tracking_params(params))
     end
 
     def update_success_path
-      if onboarding_status.continue_full_onboarding? # trials/regular registration on .com
+      if onboarding_status_presenter.continue_full_onboarding? # trials/regular registration on .com
         signup_onboarding_path
-      elsif onboarding_status.single_invite? # invites w/o tasks due to order
-        flash[:notice] = helpers.invite_accepted_notice(onboarding_status.last_invited_member)
-        polymorphic_path(onboarding_status.last_invited_member_source)
+      elsif onboarding_status_presenter.single_invite? # invites w/o tasks due to order
+        flash[:notice] = helpers.invite_accepted_notice(onboarding_status_presenter.last_invited_member)
+        polymorphic_path(onboarding_status_presenter.last_invited_member_source)
       else
         # Subscription registrations goes through here as well.
         # Invites will come here too if there is more than 1.
@@ -99,10 +99,10 @@ def update_success_path
     end
 
     def signup_onboarding_path
-      if onboarding_status.joining_a_project?
+      if onboarding_status_presenter.joining_a_project?
         Onboarding::FinishService.new(current_user).execute
         path_for_signed_in_user
-      elsif onboarding_status.redirect_to_company_form?
+      elsif onboarding_status_presenter.redirect_to_company_form?
         Onboarding::StatusStepUpdateService
           .new(current_user, new_users_sign_up_company_path(passed_through_params)).execute[:step_url]
       else
@@ -111,14 +111,14 @@ def signup_onboarding_path
     end
 
     def track_joining_a_project_event
-      return unless onboarding_status.joining_a_project?
+      return unless onboarding_status_presenter.joining_a_project?
 
       cookies[:signup_with_joining_a_project] = { value: true, expires: 30.days }
 
       track_event('select_button', label: 'join_a_project')
     end
 
-    def track_event(action, label: onboarding_status.tracking_label)
+    def track_event(action, label: onboarding_status_presenter.tracking_label)
       ::Gitlab::Tracking.event(
         helpers.body_data_page,
         action,
@@ -127,10 +127,10 @@ def track_event(action, label: onboarding_status.tracking_label)
       )
     end
 
-    def onboarding_status
-      Onboarding::Status.new(@onboarding_status_params, session['user_return_to'], current_user)
+    def onboarding_status_presenter
+      Onboarding::StatusPresenter.new(@onboarding_status_params, session['user_return_to'], current_user)
     end
-    strong_memoize_attr :onboarding_status
+    strong_memoize_attr :onboarding_status_presenter
 
     def set_update_onboarding_status_params
       @onboarding_status_params = params.require(:user).permit(:setup_for_company)
diff --git a/ee/app/controllers/users/registrations_identity_verification_controller.rb b/ee/app/controllers/users/registrations_identity_verification_controller.rb
index 539e7db7f07857ffa31175b1879b67253b2506d7..a37b6702eaa92f831815a4364e29748de539ba6f 100644
--- a/ee/app/controllers/users/registrations_identity_verification_controller.rb
+++ b/ee/app/controllers/users/registrations_identity_verification_controller.rb
@@ -8,7 +8,7 @@ class RegistrationsIdentityVerificationController < BaseIdentityVerificationCont
     include ::Gitlab::InternalEventsTracking
     extend ::Gitlab::Utils::Override
 
-    helper_method :onboarding_status
+    helper_method :onboarding_status_presenter
 
     skip_before_action :authenticate_user!
 
@@ -69,7 +69,7 @@ def success
       session.delete(:verification_user_id)
 
       # order matters here because set_redirect_url removes our ability to detect trial in the tracking label
-      @tracking_label = onboarding_status.tracking_label
+      @tracking_label = onboarding_status_presenter.tracking_label
 
       set_redirect_url
     end
@@ -124,16 +124,16 @@ def send_rate_limited?
       ::Gitlab::ApplicationRateLimiter.throttled?(:email_verification_code_send, scope: @user)
     end
 
-    def onboarding_status
-      Onboarding::Status.new({}, session['user_return_to'], @user)
+    def onboarding_status_presenter
+      Onboarding::StatusPresenter.new({}, session['user_return_to'], @user)
     end
-    strong_memoize_attr :onboarding_status
+    strong_memoize_attr :onboarding_status_presenter
 
     def set_redirect_url
-      @redirect_url = if onboarding_status.read_from_stored_user_location?
+      @redirect_url = if onboarding_status_presenter.read_from_stored_user_location?
                         # Since we need this value to stay in the stored_location_for(user) in order for
                         # us to be properly redirected for subscription signups.
-                        onboarding_status.user_return_to
+                        onboarding_status_presenter.user_return_to
                       else
                         after_sign_in_path_for(@user)
                       end
diff --git a/ee/app/helpers/gitlab_subscriptions/trials_helper.rb b/ee/app/helpers/gitlab_subscriptions/trials_helper.rb
index 7ad48ae10292d395338d4786a561b7370164f03f..80574ab63a8712fce6c226bd2e02de8f6453fd40 100644
--- a/ee/app/helpers/gitlab_subscriptions/trials_helper.rb
+++ b/ee/app/helpers/gitlab_subscriptions/trials_helper.rb
@@ -7,7 +7,7 @@ module TrialsHelper
     def create_lead_form_data
       submit_path = trials_path(
         step: GitlabSubscriptions::Trials::CreateService::LEAD,
-        **params.permit(:namespace_id).merge(::Onboarding::Status.glm_tracking_attributes(params))
+        **params.permit(:namespace_id).merge(::Onboarding::StatusPresenter.glm_tracking_attributes(params))
       )
 
       _lead_form_data.merge(
@@ -37,7 +37,7 @@ def create_duo_enterprise_lead_form_data(eligible_namespaces)
     end
 
     def should_ask_company_question?
-      TRIAL_ONBOARDING_SOURCE_URLS.exclude?(::Onboarding::Status.glm_tracking_attributes(params)[:glm_source])
+      TRIAL_ONBOARDING_SOURCE_URLS.exclude?(::Onboarding::StatusPresenter.glm_tracking_attributes(params)[:glm_source])
     end
 
     def trial_namespace_selector_data(namespaces, namespace_create_errors)
diff --git a/ee/app/helpers/registrations/company_helper.rb b/ee/app/helpers/registrations/company_helper.rb
index 4c349ff95bd9e8cac6777275282af5066e7fb331..1c8963e775ec91377370af1ecbad0a60588bf003 100644
--- a/ee/app/helpers/registrations/company_helper.rb
+++ b/ee/app/helpers/registrations/company_helper.rb
@@ -2,17 +2,18 @@
 
 module Registrations
   module CompanyHelper
-    def create_company_form_data(onboarding_status)
+    def create_company_form_data(onboarding_status_presenter)
       submit_path = users_sign_up_company_path(
-        ::Onboarding::Status.glm_tracking_attributes(params).merge(::Onboarding::Status.passed_through_params(params))
+        ::Onboarding::StatusPresenter
+          .glm_tracking_attributes(params).merge(::Onboarding::StatusPresenter.passed_through_params(params))
       )
 
       {
         submit_path: submit_path,
         first_name: current_user.first_name,
         last_name: current_user.last_name,
-        form_type: onboarding_status.company_form_type,
-        track_action_for_errors: onboarding_status.tracking_label
+        form_type: onboarding_status_presenter.company_form_type,
+        track_action_for_errors: onboarding_status_presenter.tracking_label
       }
     end
   end
diff --git a/ee/app/controllers/concerns/ee/onboarding/status.rb b/ee/app/presenters/ee/onboarding/status_presenter.rb
similarity index 99%
rename from ee/app/controllers/concerns/ee/onboarding/status.rb
rename to ee/app/presenters/ee/onboarding/status_presenter.rb
index 849e390eb8bd6200096c2d153c2d61c213115a50..3238525b7a4f68ee7d25fc85524809f0ef299d64 100644
--- a/ee/app/controllers/concerns/ee/onboarding/status.rb
+++ b/ee/app/presenters/ee/onboarding/status_presenter.rb
@@ -2,7 +2,7 @@
 
 module EE
   module Onboarding
-    module Status
+    module StatusPresenter
       extend ::Gitlab::Utils::Override
 
       GLM_PARAMS = [:glm_source, :glm_content].freeze
diff --git a/ee/app/services/gitlab_subscriptions/trials/base_create_service.rb b/ee/app/services/gitlab_subscriptions/trials/base_create_service.rb
index 546888751540ef6ae4637e967cb5e4ea1e470265..7fdc8991be3f0c4cc20fba18db594e14d5bb4bbc 100644
--- a/ee/app/services/gitlab_subscriptions/trials/base_create_service.rb
+++ b/ee/app/services/gitlab_subscriptions/trials/base_create_service.rb
@@ -53,7 +53,7 @@ def after_lead_success_hook
           # trigger new creation for next step...
           trial_selection_params = {
             step: TRIAL
-          }.merge(lead_params.slice(*::Onboarding::Status::GLM_PARAMS))
+          }.merge(lead_params.slice(*::Onboarding::StatusPresenter::GLM_PARAMS))
            .merge(trial_params.slice(:namespace_id))
 
           ServiceResponse.error(
diff --git a/ee/app/views/devise/registrations/_opt_in_to_email.html.haml b/ee/app/views/devise/registrations/_opt_in_to_email.html.haml
index 569e135232a3b9e3aaa85418e4e183c786f6276f..54d195726449d4bc76ca00c88e851a640a34d8f6 100644
--- a/ee/app/views/devise/registrations/_opt_in_to_email.html.haml
+++ b/ee/app/views/devise/registrations/_opt_in_to_email.html.haml
@@ -3,4 +3,4 @@
 = f.gitlab_ui_checkbox_component :onboarding_status_email_opt_in,
   _('I agree that GitLab can contact me by email or telephone about its product, services, or events.'),
   content_wrapper_options: { class: 'gl-text-gray-500' },
-  checkbox_options: { checked: onboarding_status.email_opt_in? }
+  checkbox_options: { checked: onboarding_status_presenter.email_opt_in? }
diff --git a/ee/app/views/gitlab_subscriptions/trials/_select_namespace_form.html.haml b/ee/app/views/gitlab_subscriptions/trials/_select_namespace_form.html.haml
index 87e6590565a25f019a61c3a26433b897f101643b..a09c4ef6f0ce36b00c27ceca0b7f9937f8af273d 100644
--- a/ee/app/views/gitlab_subscriptions/trials/_select_namespace_form.html.haml
+++ b/ee/app/views/gitlab_subscriptions/trials/_select_namespace_form.html.haml
@@ -18,7 +18,7 @@
 
     = yield :before_form
 
-    = form_tag trials_path(**::Onboarding::Status.glm_tracking_attributes(params), step: GitlabSubscriptions::Trials::CreateService::TRIAL), method: :post, class: 'js-saas-trial-group', data: { testid: 'trial-form' } do
+    = form_tag trials_path(**::Onboarding::StatusPresenter.glm_tracking_attributes(params), step: GitlabSubscriptions::Trials::CreateService::TRIAL), method: :post, class: 'js-saas-trial-group', data: { testid: 'trial-form' } do
       .js-namespace-selector{ data: trial_namespace_selector_data(@eligible_namespaces, local_assigns[:namespace_create_errors]) }
       - if should_ask_company_question?
         .form-group
diff --git a/ee/app/views/registrations/company/new.html.haml b/ee/app/views/registrations/company/new.html.haml
index afd986e9a18c2922ebcd9f913aafbf763e3ac285..b410ab908fd415e020f5b35692471d6141d6d747 100644
--- a/ee/app/views/registrations/company/new.html.haml
+++ b/ee/app/views/registrations/company/new.html.haml
@@ -10,9 +10,9 @@
   .col-md-6.m-sm-6.gl-px-3
     %h2.gl-pb-5.gl-my-0
       = _("About your company")
-    #js-registrations-company-form{ data: create_company_form_data(onboarding_status) }
+    #js-registrations-company-form{ data: create_company_form_data(onboarding_status_presenter) }
 
-  - if onboarding_status.show_company_form_illustration?
+  - if onboarding_status_presenter.show_company_form_illustration?
     .col-md-4.company-illustration{ data: { testid: 'trial-registration-column' } }
       = image_tag 'illustrations/saas-trial-illustration.svg', alt: '', class: 'gl-hidden md:gl-inline gl-w-full'
   - else
diff --git a/ee/app/views/registrations/groups/new.html.haml b/ee/app/views/registrations/groups/new.html.haml
index 391e45e5442419559abf16c020ba83d279c82f02..bb4fa425cce82fea5face1fd3295ac7185caa6ff 100644
--- a/ee/app/views/registrations/groups/new.html.haml
+++ b/ee/app/views/registrations/groups/new.html.haml
@@ -28,7 +28,7 @@
 
         .tab-content.gitlab-tab-content.gl-bg-white.js-group-project-tab-contents
           #blank-project-pane.tab-pane.js-toggle-container.active{ role: 'tabpanel' }
-            = gitlab_ui_form_for :project_group, url: users_sign_up_groups_path(::Onboarding::Status.glm_tracking_params(params)), html: { class: 'gl-show-field-errors gl-w-full gl-p-4 js-groups-projects-form' } do |f|
+            = gitlab_ui_form_for :project_group, url: users_sign_up_groups_path(::Onboarding::StatusPresenter.glm_tracking_params(params)), html: { class: 'gl-show-field-errors gl-w-full gl-p-4 js-groups-projects-form' } do |f|
               = form_errors(@group, type: "Group")
               = form_errors(@project, type: "Project")
               = render 'layouts/flash'
@@ -49,7 +49,7 @@
 
           #import-project-pane.tab-pane.import-project-pane.js-toggle-container{ role: 'tabpanel' }
             - if import_sources_enabled?
-              = form_tag users_sign_up_groups_path(::Onboarding::Status.glm_tracking_params(params)), class: 'gl-show-field-errors gl-w-full gl-p-4 js-import-project-form' do
+              = form_tag users_sign_up_groups_path(::Onboarding::StatusPresenter.glm_tracking_params(params)), class: 'gl-show-field-errors gl-w-full gl-p-4 js-import-project-form' do
                 = form_errors(@group, type: "Group")
                 = render 'layouts/flash'
 
diff --git a/ee/app/views/registrations/welcome/_joining_project.html.haml b/ee/app/views/registrations/welcome/_joining_project.html.haml
index 1d6a2f27467579c26c90d6eb4e683d4aa025bccd..0e0260d3b77eea5d09086829c992e33d28f862f2 100644
--- a/ee/app/views/registrations/welcome/_joining_project.html.haml
+++ b/ee/app/views/registrations/welcome/_joining_project.html.haml
@@ -1,4 +1,4 @@
-- return unless onboarding_status.show_joining_project?
+- return unless onboarding_status_presenter.show_joining_project?
 
 .row
   .form-group.col-sm-12
@@ -8,7 +8,7 @@
           label: _('Create a new project'),
           help_text: _('Create a new project on GitLab. Store your files, plan your work, and collaborate on code.'),
           value: false,
-          radio_options: { required: true, class: 'js-track-error', data: { track_action_for_errors: onboarding_status.tracking_label } },
+          radio_options: { required: true, class: 'js-track-error', data: { track_action_for_errors: onboarding_status_presenter.tracking_label } },
           label_options: { data: { testid: 'create-a-new-project-radio' } })
     %div
       = render Pajamas::RadioTagComponent.new(name: :joining_project,
diff --git a/ee/app/views/registrations/welcome/_setup_for_company.html.haml b/ee/app/views/registrations/welcome/_setup_for_company.html.haml
index e94cd4f8b09fb2f7d65235501b44cc968e88d47a..e43bbb15fe750be924d8492d2b43ae1e028f476d 100644
--- a/ee/app/views/registrations/welcome/_setup_for_company.html.haml
+++ b/ee/app/views/registrations/welcome/_setup_for_company.html.haml
@@ -1,14 +1,14 @@
-- if onboarding_status.hide_setup_for_company_field?
+- if onboarding_status_presenter.hide_setup_for_company_field?
   = f.hidden_field :setup_for_company, value: true
 - else
   .row
     .form-group.col-sm-12
-      = f.label :setup_for_company, onboarding_status.setup_for_company_label_text, class: 'label-bold'
+      = f.label :setup_for_company, onboarding_status_presenter.setup_for_company_label_text, class: 'label-bold'
       .gl-flex.gl-flex-col
         .gl-grow{ data: { testid: 'setup-for-just-me-content' } }
           = f.gitlab_ui_radio_component :setup_for_company, false, _('Just me'),
             radio_options: { required: true, data: { testid: 'setup-for-just-me-radio' } }
         .gl-grow
           = f.gitlab_ui_radio_component :setup_for_company, true, _('My company or team'),
-            help_text: onboarding_status.setup_for_company_help_text, radio_options: { required: true,
+            help_text: onboarding_status_presenter.setup_for_company_help_text, radio_options: { required: true,
             class: "js-track-error", data: { track_action_for_errors: 'welcome_form' } }
diff --git a/ee/app/views/registrations/welcome/show.html.haml b/ee/app/views/registrations/welcome/show.html.haml
index 6e17e5aee07d9dc0dc7b2090c76e927ca0bd2f53..04aabbb362f1fcd296806e83092f077be50e5694 100644
--- a/ee/app/views/registrations/welcome/show.html.haml
+++ b/ee/app/views/registrations/welcome/show.html.haml
@@ -7,14 +7,14 @@
   = render "layouts/bizible"
 = render "layouts/google_tag_manager_body"
 
-.row.gl-grow{ data: { track_action: 'render', track_label: onboarding_status.tracking_label } }
+.row.gl-grow{ data: { track_action: 'render', track_label: onboarding_status_presenter.tracking_label } }
   .gl-flex.gl-flex-col.gl-items-center.gl-w-full.gl-px-5.gl-pb-5
     .edit-profile.gl-flex.flex-column.gl-items-center
       %h2.gl-text-center= html_escape(_('Welcome to GitLab,%{br_tag}%{name}!')) % { name: html_escape(current_user.first_name), br_tag: '<br/>'.html_safe }
       %p.gl-text-center
         = _('To personalize your GitLab experience, we\'d like to know a bit more about you. We won\'t share this information with anyone.')
       = gitlab_ui_form_for(current_user,
-        url: users_sign_up_welcome_path(::Onboarding::Status.glm_tracking_params(params)),
+        url: users_sign_up_welcome_path(::Onboarding::StatusPresenter.glm_tracking_params(params)),
         html: { class: '!gl-w-full gl-p-5 js-users-signup-welcome',
                 'aria-live' => 'assertive',
                 data: { testid: 'welcome-form' } }) do |f|
@@ -25,7 +25,7 @@
             .row
               .form-group.col-sm-12
                 = f.label :role, _('Role'), class: 'label-bold'
-                = f.select :role, ::User.roles.keys.map { |role| [role.titleize, role] }, { include_blank: _('Select a role') }, class: 'form-control js-user-role-dropdown js-track-error', required: true, data: { testid: 'role-dropdown', track_action_for_errors: onboarding_status.tracking_label }
+                = f.select :role, ::User.roles.keys.map { |role| [role.titleize, role] }, { include_blank: _('Select a role') }, class: 'form-control js-user-role-dropdown js-track-error', required: true, data: { testid: 'role-dropdown', track_action_for_errors: onboarding_status_presenter.tracking_label }
             = render 'jobs_to_be_done', f: f
             = render 'joining_project'
             = render 'setup_for_company', f: f
@@ -34,4 +34,4 @@
                 = render Pajamas::ButtonComponent.new(variant: :confirm, block: true,
                   button_options: { type: :submit, data: { testid: 'get-started-button' },
                   class: 'js-trial-welcome-btn'}) do
-                  = onboarding_status.welcome_submit_button_text
+                  = onboarding_status_presenter.welcome_submit_button_text
diff --git a/ee/app/views/trial_registrations/new.html.haml b/ee/app/views/trial_registrations/new.html.haml
index 8e7e3a2d09bb68c1e844ad0d3d07556284572263..7efd24811677e69472bc2e8eae39555486b2987a 100644
--- a/ee/app/views/trial_registrations/new.html.haml
+++ b/ee/app/views/trial_registrations/new.html.haml
@@ -25,7 +25,7 @@
     .signup-box.gl-max-w-75
       .gl-mb-3.gl-p-6.gl-border-gray-100.gl-border-1.gl-border-solid.gl-rounded-base.gl-bg-white
         = render 'signup_box_form',
-          url: trial_registrations_path(::Onboarding::Status.glm_tracking_params(params)),
+          url: trial_registrations_path(::Onboarding::StatusPresenter.glm_tracking_params(params)),
           button_text: _('Continue'),
           button_class: 'black-btn'
 
@@ -38,7 +38,7 @@
           .gl-flex.gl-gap-3.gl-justify-center
             - popular_enabled_button_based_providers.each do |provider|
               = render 'devise/shared/omniauth_provider_button',
-                href: omniauth_authorize_path(:user, provider, onboarding_status.trial_registration_omniauth_params),
+                href: omniauth_authorize_path(:user, provider, onboarding_status_presenter.trial_registration_omniauth_params),
                 provider: provider,
                 classes: 'js-track-omni-auth',
                 data: { provider: provider, track_action: "#{provider}_sso", track_label: preregistration_tracking_label }
diff --git a/ee/app/views/users/registrations_identity_verification/show.html.haml b/ee/app/views/users/registrations_identity_verification/show.html.haml
index 5a94a4aef6546f0145da9fecdeb0860d506a468c..29457522583cc0edfcd14c36dbd229f0f019affd 100644
--- a/ee/app/views/users/registrations_identity_verification/show.html.haml
+++ b/ee/app/views/users/registrations_identity_verification/show.html.haml
@@ -2,5 +2,5 @@
 
 = render_if_exists 'devise/shared/delete_unconfirmed_users_flash'
 
-%div{ data: { track_action: 'render', track_label: onboarding_status.tracking_label } }
+%div{ data: { track_action: 'render', track_label: onboarding_status_presenter.tracking_label } }
   #js-identity-verification{ data: signup_identity_verification_data(@user) }
diff --git a/ee/spec/controllers/registrations/company_controller_spec.rb b/ee/spec/controllers/registrations/company_controller_spec.rb
index 51cb60cd0ef30c413f190aa606fd92fcc2817f09..9d72efb8e5bb10db41b97e0516cf8ea896bd495d 100644
--- a/ee/spec/controllers/registrations/company_controller_spec.rb
+++ b/ee/spec/controllers/registrations/company_controller_spec.rb
@@ -137,7 +137,7 @@
           post :create, params: params
         end
 
-        context 'when driving from the onboarding_status.initial_registration_type' do
+        context 'when driving from the onboarding_status_presenter.initial_registration_type' do
           before do
             user.update!(onboarding_status_initial_registration_type: 'trial')
           end
diff --git a/ee/spec/helpers/registrations/company_helper_spec.rb b/ee/spec/helpers/registrations/company_helper_spec.rb
index dfb2c5d54bbea62d37509044f8a328e8a666595b..131a686c12ac2d81826f737e5a3bd8ae98a6bdd4 100644
--- a/ee/spec/helpers/registrations/company_helper_spec.rb
+++ b/ee/spec/helpers/registrations/company_helper_spec.rb
@@ -30,7 +30,7 @@
         track_action_for_errors: 'trial_registration'
       }
 
-      expect(helper.create_company_form_data(::Onboarding::Status.new({}, {}, user))).to match(attributes)
+      expect(helper.create_company_form_data(::Onboarding::StatusPresenter.new({}, {}, user))).to match(attributes)
     end
   end
 end
diff --git a/ee/spec/controllers/concerns/ee/onboarding/status_spec.rb b/ee/spec/presenters/ee/onboarding/status_presenter_spec.rb
similarity index 98%
rename from ee/spec/controllers/concerns/ee/onboarding/status_spec.rb
rename to ee/spec/presenters/ee/onboarding/status_presenter_spec.rb
index dda3e5c2b276030f8f07cf86322a7fdfdd778809..1fc50f5f0acfe15e67091edf3e6c409d67b78edb 100644
--- a/ee/spec/controllers/concerns/ee/onboarding/status_spec.rb
+++ b/ee/spec/presenters/ee/onboarding/status_presenter_spec.rb
@@ -2,12 +2,9 @@
 
 require 'spec_helper'
 
-RSpec.describe Onboarding::Status, feature_category: :onboarding do
+RSpec.describe Onboarding::StatusPresenter, feature_category: :onboarding do
   using RSpec::Parameterized::TableSyntax
 
-  let_it_be(:member) { create(:group_member) }
-  let_it_be(:user) { member.user }
-
   context 'for delegations' do
     subject { described_class.new({}, nil, nil) }
 
diff --git a/ee/spec/support/shared_examples/views/unconfirmed_user_deletion_shared_examples.rb b/ee/spec/support/shared_examples/views/unconfirmed_user_deletion_shared_examples.rb
index 701f196e45a9ea139cf92fda19259ab227dac81a..ff12dc0724a28b2da53b9e71f49d1e4627ef970f 100644
--- a/ee/spec/support/shared_examples/views/unconfirmed_user_deletion_shared_examples.rb
+++ b/ee/spec/support/shared_examples/views/unconfirmed_user_deletion_shared_examples.rb
@@ -5,14 +5,16 @@
 
   describe 'delete unconfirmed users is set' do
     let_it_be(:delete_after_days) { 7 }
-    let(:onboarding_status) { instance_double(::Onboarding::Status, tracking_label: 'free_registration') }
+    let(:onboarding_status_presenter) do
+      instance_double(::Onboarding::StatusPresenter, tracking_label: 'free_registration')
+    end
 
     before do
       stub_licensed_features(delete_unconfirmed_users: true)
       stub_application_setting(delete_unconfirmed_users: true)
       stub_application_setting(delete_unconfirmed_users_after_days: delete_after_days)
       stub_application_setting_enum('email_confirmation_setting', 'hard')
-      allow(view).to receive(:onboarding_status).and_return(onboarding_status)
+      allow(view).to receive(:onboarding_status_presenter).and_return(onboarding_status_presenter)
     end
 
     it "shows the unconfirmed users text" do
diff --git a/ee/spec/views/devise/registrations/new.html.haml_spec.rb b/ee/spec/views/devise/registrations/new.html.haml_spec.rb
index a4c2a5f8814e296e824ef3e108052df4c7b40ca4..9c4ad4757616fc9d802ff89f80c8fba6947445f0 100644
--- a/ee/spec/views/devise/registrations/new.html.haml_spec.rb
+++ b/ee/spec/views/devise/registrations/new.html.haml_spec.rb
@@ -8,12 +8,14 @@
   let(:arkose_labs_domain) { "domain" }
   let(:resource) { Users::RegistrationsBuildService.new(nil, {}).execute }
   let(:params) { controller.params }
-  let(:onboarding_status) { ::Onboarding::Status.new(params.to_unsafe_h.deep_symbolize_keys, nil, resource) }
+  let(:onboarding_status_presenter) do
+    ::Onboarding::StatusPresenter.new(params.to_unsafe_h.deep_symbolize_keys, nil, resource)
+  end
 
   subject { render && rendered }
 
   before do
-    allow(view).to receive(:onboarding_status).and_return(onboarding_status)
+    allow(view).to receive(:onboarding_status_presenter).and_return(onboarding_status_presenter)
     allow(view).to receive(:resource).and_return(resource)
     allow(view).to receive(:resource_name).and_return(:user)
 
diff --git a/ee/spec/views/registrations/company/new.html.haml_spec.rb b/ee/spec/views/registrations/company/new.html.haml_spec.rb
index 031853f51ab659d4443979a5483e3d3d51e871ce..9fcd0f23979c8205aeb77fc981925a793df7312e 100644
--- a/ee/spec/views/registrations/company/new.html.haml_spec.rb
+++ b/ee/spec/views/registrations/company/new.html.haml_spec.rb
@@ -5,9 +5,9 @@
 RSpec.describe 'registrations/company/new', feature_category: :onboarding do
   let(:user) { build_stubbed(:user) }
   let(:show_company_form_illustration?) { false }
-  let(:onboarding_status) do
+  let(:onboarding_status_presenter) do
     instance_double(
-      ::Onboarding::Status,
+      ::Onboarding::StatusPresenter,
       company_form_type: 'registration',
       show_company_form_illustration?: show_company_form_illustration?,
       tracking_label: 'free_registration'
@@ -15,7 +15,7 @@
   end
 
   before do
-    allow(view).to receive_messages(current_user: user, onboarding_status: onboarding_status)
+    allow(view).to receive_messages(current_user: user, onboarding_status_presenter: onboarding_status_presenter)
   end
 
   describe 'Google Tag Manager' do
diff --git a/ee/spec/views/registrations/welcome/show.html.haml_spec.rb b/ee/spec/views/registrations/welcome/show.html.haml_spec.rb
index 408bb157cf090a208c72afa0236196570fdd887f..9b04abc1418181fe5a46b7d057d360e2ff1d440c 100644
--- a/ee/spec/views/registrations/welcome/show.html.haml_spec.rb
+++ b/ee/spec/views/registrations/welcome/show.html.haml_spec.rb
@@ -5,9 +5,9 @@
 RSpec.describe 'registrations/welcome/show', feature_category: :onboarding do
   let(:hide_setup_for_company_field?) { false }
   let(:show_joining_project?) { true }
-  let(:onboarding_status) do
+  let(:onboarding_status_presenter) do
     instance_double(
-      ::Onboarding::Status,
+      ::Onboarding::StatusPresenter,
       hide_setup_for_company_field?: hide_setup_for_company_field?,
       setup_for_company_label_text: '_text_',
       setup_for_company_help_text: '_help_text_',
@@ -18,7 +18,7 @@
   end
 
   before do
-    allow(view).to receive(:onboarding_status).and_return(onboarding_status)
+    allow(view).to receive(:onboarding_status_presenter).and_return(onboarding_status_presenter)
     allow(view).to receive(:current_user).and_return(build_stubbed(:user))
     controller.params[:glm_content] = '_glm_content_'
     controller.params[:glm_source] = '_glm_source_'
diff --git a/ee/spec/views/trial_registrations/new.html.haml_spec.rb b/ee/spec/views/trial_registrations/new.html.haml_spec.rb
index 84bb9242596ff7b47fc98aff048dcc8d355c27f8..9b76cf5168ee59de02b1905ba652b42ddaba2baf 100644
--- a/ee/spec/views/trial_registrations/new.html.haml_spec.rb
+++ b/ee/spec/views/trial_registrations/new.html.haml_spec.rb
@@ -5,10 +5,12 @@
 RSpec.describe 'trial_registrations/new', feature_category: :acquisition do
   let(:resource) { Users::AuthorizedBuildService.new(nil, {}).execute }
   let(:params) { controller.params }
-  let(:onboarding_status) { ::Onboarding::Status.new(params.to_unsafe_h.deep_symbolize_keys, nil, resource) }
+  let(:onboarding_status_presenter) do
+    ::Onboarding::StatusPresenter.new(params.to_unsafe_h.deep_symbolize_keys, nil, resource)
+  end
 
   before do
-    allow(view).to receive(:onboarding_status).and_return(onboarding_status)
+    allow(view).to receive(:onboarding_status_presenter).and_return(onboarding_status_presenter)
     allow(view).to receive(:arkose_labs_enabled?).and_return(false)
     allow(view).to receive(:resource).and_return(resource)
     allow(view).to receive(:resource_name).and_return(:user)
diff --git a/spec/controllers/concerns/onboarding/status_spec.rb b/spec/presenters/onboarding/status_presenter_spec.rb
similarity index 68%
rename from spec/controllers/concerns/onboarding/status_spec.rb
rename to spec/presenters/onboarding/status_presenter_spec.rb
index 7296080e60109f06070cf127326214caffff7b59..b8b2e55fee128cfc45773afab53248a8f455d1f8 100644
--- a/spec/controllers/concerns/onboarding/status_spec.rb
+++ b/spec/presenters/onboarding/status_presenter_spec.rb
@@ -2,10 +2,10 @@
 
 require 'spec_helper'
 
-RSpec.describe Onboarding::Status, feature_category: :onboarding do
-  let_it_be(:member) { create(:group_member) }
-  let_it_be(:user) { member.user }
-  let_it_be(:source) { member.group }
+RSpec.describe Onboarding::StatusPresenter, feature_category: :onboarding do
+  let(:member) { build_stubbed(:group_member) }
+  let(:members) { [member] }
+  let(:user) { build_stubbed(:user, members: members) }
 
   describe '.registration_path_params' do
     let(:params) { { some: 'thing' } }
@@ -28,22 +28,20 @@
 
     context 'when there is only one member for the user' do
       context 'when the member source exists' do
-        it { is_expected.to eq(true) }
+        it { is_expected.to be(true) }
       end
     end
 
     context 'when there is more than one member for the user' do
-      before do
-        create(:group_member, user: user)
-      end
+      let(:members) { [member, build_stubbed(:group_member)] }
 
-      it { is_expected.to eq(false) }
+      it { is_expected.to be(false) }
     end
 
     context 'when there are no members for the user' do
       let(:user) { build_stubbed(:user) }
 
-      it { is_expected.to eq(false) }
+      it { is_expected.to be(false) }
     end
   end
 
@@ -53,13 +51,14 @@
     it { is_expected.to eq(member) }
 
     context 'when another member exists and is most recent' do
-      let!(:last_member) { create(:group_member, user: user) }
+      let(:last_member) { build_stubbed(:group_member) }
+      let(:members) { [member, last_member] }
 
       it { is_expected.to eq(last_member) }
     end
 
     context 'when there are no members' do
-      let_it_be(:user) { build_stubbed(:user) }
+      let(:members) { [] }
 
       it { is_expected.to be_nil }
     end
@@ -69,19 +68,20 @@
     subject { described_class.new(nil, nil, user).last_invited_member_source }
 
     context 'when a member exists' do
-      it { is_expected.to eq(source) }
+      it { is_expected.to eq(member.group) }
     end
 
     context 'when no members exist' do
-      let_it_be(:user) { build_stubbed(:user) }
+      let(:members) { [] }
 
       it { is_expected.to be_nil }
     end
 
     context 'when another member exists and is most recent' do
-      let!(:last_member_source) { create(:group_member, user: user).group }
+      let(:last_member) { build_stubbed(:group_member) }
+      let(:members) { [member, last_member] }
 
-      it { is_expected.to eq(last_member_source) }
+      it { is_expected.to eq(last_member.group) }
     end
   end
 end
diff --git a/spec/views/devise/registrations/new.html.haml_spec.rb b/spec/views/devise/registrations/new.html.haml_spec.rb
index 40bae17ccb7ae9c9154adcfc29c9f2920711d708..8cfe70debf12aea41042e8b0b0cd3a2e86ea52dd 100644
--- a/spec/views/devise/registrations/new.html.haml_spec.rb
+++ b/spec/views/devise/registrations/new.html.haml_spec.rb
@@ -5,12 +5,12 @@
 RSpec.describe 'devise/registrations/new', feature_category: :system_access do
   let(:resource) { Users::RegistrationsBuildService.new(nil, {}).execute }
   let(:tracking_label) { '_some_registration_' }
-  let(:onboarding_status) { instance_double(::Onboarding::Status, registration_omniauth_params: {}) }
+  let(:onboarding_status_presenter) { instance_double(::Onboarding::StatusPresenter, registration_omniauth_params: {}) }
 
   subject { render && rendered }
 
   before do
-    allow(view).to receive(:onboarding_status).and_return(onboarding_status)
+    allow(view).to receive(:onboarding_status_presenter).and_return(onboarding_status_presenter)
     allow(view).to receive(:resource).and_return(resource)
     allow(view).to receive(:resource_name).and_return(:user)
     allow(view).to receive(:preregistration_tracking_label).and_return(tracking_label)
diff --git a/tests.yml b/tests.yml
index c44701f90cb0e58e9e456999a09ac42556faad8d..bc5e3b1ca38980d12634acbb9f41e77d4d950611 100644
--- a/tests.yml
+++ b/tests.yml
@@ -297,8 +297,8 @@ mapping:
   # Registration/Onboarding
   - source:
     - 'ee/app/(controllers|services)/registrations/.*'
-    - 'ee/app/controllers/concerns/ee/onboarding/status\.rb'
-    - 'app/controllers/concerns/onboarding/status\.rb'
+    - 'ee/app/presenters/ee/onboarding/status_presenter\.rb'
+    - 'app/presenters/onboarding/status_presenter\.rb'
     test:
     - 'ee/spec/features/registrations/saas/*_spec.rb'
     - ee/spec/features/registrations/email_opt_in_registration_spec.rb