Add Step 2 profile form, update action, and EE opt-in/country fields
What does this MR do and why?
Implements the Step 2 "Set up your profile" form for the self-managed welcome onboarding flow.
- Adds a profile form with first name, last name, email, and organization name (CE)
- Adds country selector and communication opt-in checkbox (EE, via onboarding_status JSONB — no new columns required)
- Adds an update action that saves profile changes and redirects to the created project (or dashboard as fallback)
- Adds a skip action that shares the same redirect logic as update
- Country is stored as ISO 3166-1 alpha-2 in user_details.onboarding_status alongside the existing email_opt_in field
- Opt-in checkbox label uses legal-approved copy from https://gitlab.com/gitlab-org/gitlab/-/issues/573614
- Removes duplicate Skip/Continue buttons from the groups/new (Step 1) view
- Aligns profile card width with the project card layout
Note: Marketing cadence enrollment
The communication opt-in consent flag is persisted to onboarding_status.email_opt_in, but the product interaction event and Marketo enrollment are not wired in this MR. That work is tracked in https://gitlab.com/gitlab-org/gitlab/-/issues/595944 and will ship as a follow-up MR branching off this one. Iterable is intentionally not used for SM — marketing ops routes SM welcome contacts through Marketo (see gitlab-com/marketing/marketing-operations#11626).
Database queries
The only database query introduced is in post_onboarding_redirect_path:
Project.find_by_id(project_id)SELECT "projects".* FROM "projects" WHERE "projects"."id" = $1 LIMIT 1Limit (cost=0.14..2.16 rows=1 width=1443) (actual time=0.017..0.017 rows=1 loops=1)
-> Index Scan using idx_projects_on_repository_storage_last_repository_updated_at on projects
(cost=0.14..2.16 rows=1 width=1443) (actual time=0.016..0.016 rows=1 loops=1)
Index Cond: (id = 1)
Planning Time: 5.901 ms
Execution Time: 0.038 msUses a primary key index scan. Called at most once per form submission/skip.
References
- Relates to https://gitlab.com/gitlab-org/gitlab/-/issues/595896
- !233104 (merged) (Preceding MR)
- Legal copy approval: https://gitlab.com/gitlab-org/gitlab/-/issues/573614
- UX spec: https://gitlab.com/gitlab-org/gitlab/-/issues/592127
- Follow-up tracking: https://gitlab.com/gitlab-org/gitlab/-/issues/595944
Screenshots or screen recordings
| Before | After |
|---|---|
![]() |
![]() |
How to set up and validate locally
- Enable the feature flag in rails console:
Feature.enable(:self_managed_welcome_onboarding) - Sign in as an admin on a fresh instance (or one without a group/project created via the welcome flow)
- Complete Step 1 (create group/project) — you should be redirected to /admin/registrations/profile/new
- Fill in the profile form and submit — verify redirect to the created project
- Repeat and click Skip — verify same redirect behavior
MR acceptance checklist
Evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.
Related to https://gitlab.com/gitlab-org/gitlab/-/issues/595896

