Onboarding (scope)
IN SCOPE¶
Questions (17 screens)¶
| # | Question | Input type | Data source | Mandatory | Format |
|---|---|---|---|---|---|
| Q1 | Register (email + password + first name + last name) | 4 text inputs — creates the candidate account | User entry | Yes | Grouped |
| Q2 | Gender | Single select: Man / Woman / Non-binary / Other (free text) / Prefer not to say | Static | Yes | Solo (privacy) |
| Q3 | Date of birth | Date picker | User entry | Yes | Solo (privacy) |
| Q4 | Nationality | Searchable select | DB (nationalities table, seeded) | Yes | Solo (privacy) |
| Q5 | City of residence | Autocomplete | GeoNames (cities table) | Yes | Solo (privacy) |
| Q6 | Career snapshot: Current status + Market positioning | 2 single selects | Static | Yes | Grouped |
| Q7 | Target job titles | ROME autocomplete, up to 3 entries; domain-based chip suggestions | ROME (rome_job_appellations) | Yes | Solo |
| Q8 | Languages | Skill catalogue select + CEFR proficiency per language + flag emoji | DB (skills table, category = 'language') | Yes | Solo |
| Q9 | Expertise | Gateway → type selector (Academic degree / Self-taught), multiple entries, accordion | User entry | No (gateway) | Solo |
| Q11 | Experience + inline skills | Gateway → type selector (5 types), multiple entries, accordion. Inline skill suggestions (tech + knowledge only) after each entry with ROME code. | User entry + ROME + GeoNames + skills catalogue | No (gateway) | Solo |
| Q12 | Skills review (technical) | Top 5 + Your Skills + Suggestions for targets + Search bar (catalogue, categories=competence,knowledge) | skills catalogue (ROME-linked + full) | Yes (min 1) | Solo |
| Q13 | Soft skills | All soft skills from ROME catalogue (category=soft_skill) as chips. Top 3 designation. | skills catalogue (category=soft_skill) | Yes (min 1) | Solo |
| Q14 | Preferred work cities | Multi-entry (max 4): city (GeoNames autocomplete) + preference level + isOpenToRelocation toggle | GeoNames (cities table) | Yes | Solo |
| Q15 | Work preferences | Work modes (multi) + Company size (single) + Sectors (multi, opt.) + Culture values (multi, opt.) | Static + DB (culture_values table) | Yes (modes + size) | Solo |
| Q16 | Logistics: Availability + Salary | Single select + number input (brut euros) | Static + User entry | Yes | Grouped |
| Q17 | Professional profile | Textarea (free text, 500 chars soft guidance) | User entry | Yes | Solo |
| Q18 | Profile photo | Image picker (camera or gallery) | User upload | No (Skip) | Solo |
Progress bar and section labels¶
No step counter. Bar advances proportionally. Section labels:
| Section label | Questions |
|---|---|
| Account | Q1 |
| Personal | Q2–Q5 |
| Career | Q6–Q7 |
| Background | Q8–Q10 |
| Skills | Q12–Q13 |
| Preferences | Q14–Q16 |
| Profile | Q17–Q18 |
Q7 — Target job titles¶
- ROME-based autocomplete; up to 3 selections.
- After the first selection, up to 5 related titles from the same ROME domain are suggested as chips below the input. Tapping a chip adds it (subject to the 3-title cap).
- A "+ Add another target role" button is visible when fewer than 3 titles are selected.
Q10 gateway screen — "My expertise"¶
Displayed after Q9 (Languages). Two options presented as full-width cards (tap target ≥ 44pt on mobile). "I'll complete it later" is visually de-emphasised.
| Option | Outcome |
|---|---|
| Add my expertise | Opens the expertise type selector (Academic degree / Self-taught experience) |
| I'll complete it later | Sets Q10 completion flag. Advances to Q11 gateway. |
Q10 — Expertise type selector¶
Two entry types available. Both types can coexist in the same accordion, in any order.
Q10 — Academic degree form (multiple entries, accordion)¶
| Sub-field | Type | Mandatory |
|---|---|---|
| Highest education level | Single select (Lycée / Bac / Bac+2 / Bac+3 / Bac+4 / Bac+5 / Bac+8 / Other) | Yes |
| Field of study | Single select with emojis (static list) | Yes |
| Diploma name | Text input | Yes |
| Institution name | Text input | Yes |
| Year of obtention | Year dropdown | Yes |
Q10 — Self-taught experience form (multiple entries, accordion)¶
| Sub-field | Type | Mandatory |
|---|---|---|
| Domain of expertise | Text input | Yes |
| How did you learn? | Multi-select: Online courses / Personal projects / Books / Mentoring / Open source contributions / Other | Yes (min. 1) |
| Year of completion | Year picker | Yes |
| Describe your learning journey | Textarea | No |
Each completed entry collapses into a summary card with a type badge. Additional entries can be added via "+ Add another".
Q11 gateway screen — "My experience"¶
Displayed after Q10 (or its gateway). Two options presented as full-width cards. "I'll complete it later" is visually de-emphasised. The first entry is prompted as "Start with your current or most recent position".
| Option | Outcome |
|---|---|
| Add my experience | Opens the experience type selector |
| I'll complete it later | Sets Q11 completion flag. Advances to Q12. |
Q11 — Experience type selector¶
Five entry types available. Multiple types can coexist in the same accordion.
| Type | Description |
|---|---|
| Professional role | Salaried role in a company |
| Internship | Same fields as Professional role — "Contract type" pre-set to "Internship" |
| Freelance | Freelance mission — specific sub-fields (mission title, client name, key deliverables) |
| Personal project | Autonomous project — standalone type |
| Volunteer work | Role in a non-profit or community organisation |
Q11 — Professional role form (multiple entries, accordion)¶
| Sub-field | Type | Mandatory |
|---|---|---|
| Job title | ROME autocomplete (same catalogue as Q7) — catalogue selection required | Yes |
| Company name | Text input | Yes |
| Sector | Single select (Sector enum) | Yes |
| City | Autocomplete (GeoNames) — hidden if Remote is checked | No |
| Remote | Checkbox — when checked, city is hidden and cityId = null | No |
| Start date | Month + year picker | Yes |
| End date | Month + year picker, or "Current" toggle | Yes |
| Contract type | Single select (ContractType enum) | Yes |
| Key responsibilities | Textarea | No |
Note — Internship: uses the same form as Professional role. "Contract type" is pre-set to "Internship" and remains visible (can be overridden). Note — First entry: the "Current" toggle is active by default on the first entry.
Q11 — Freelance form (multiple entries, accordion)¶
| Sub-field | Type | Mandatory |
|---|---|---|
| Job title / Mission title | ROME autocomplete (same catalogue as Q7) — catalogue selection required | Yes |
| Client name | Text input | Yes |
| Sector | Single select (Sector enum) | Yes |
| City | Autocomplete (GeoNames) — hidden if Remote is checked | No |
| Remote | Checkbox | No |
| Start date | Month + year picker | Yes |
| End date | Month + year picker, or "Current" toggle | Yes |
| Key deliverables | Textarea | No |
Q11 — Personal project form (multiple entries, accordion)¶
| Sub-field | Type | Mandatory |
|---|---|---|
| Project name | Text input | Yes |
| Domain | Text input | Yes |
| Description | Textarea | Yes |
| Start date | Month + year picker | No |
| End date | Month + year picker | No |
| Link | URL input | No |
Q11 — Volunteer work form (multiple entries, accordion)¶
| Sub-field | Type | Mandatory |
|---|---|---|
| Role | Text input | Yes |
| Organisation | Text input | Yes |
| City | Autocomplete (GeoNames) — hidden if Remote is checked | No |
| Remote | Checkbox | No |
| Start date | Month + year picker | Yes |
| End date | Month + year picker, or "Current" toggle | Yes |
| Description | Textarea | No |
Each completed entry collapses into a summary card with a type badge. Additional entries can be added via "+ Add another", selecting the type for each new entry.
Q11 — Inline skills after experience¶
After each experience entry with a ROME code (Professional role, Internship, Freelance), a skill selection section appears. Only technical and knowledge skills are shown (categories=competence,knowledge — no soft skills).
- "Recommended" (open by default): skills at the intersection of this experience ROME AND any target job ROME codes. Accent color chips.
- "Other skills for [Job Title]" (accordion, closed): remaining skills from this ROME code.
- No pre-selection — candidate actively selects. Skills are saved as passport_skills.
- No search bar during experience entry — search is on Q12 review only.
Q12 — Skills review (technical + knowledge only)¶
Soft skills (category = 'soft_skill') are excluded — they have their own screen (Q13).
- Search bar (sticky): queries skills catalogue with categories=competence,knowledge. "Skill not found" message if no match.
- Top Skills (X/5): starred technical skills, displayed prominently. Tap ★ to toggle. Max 5. Toast if already 5.
- Your Skills (count): all selected technical/knowledge skills as chips with ★ toggle and × remove.
- Suggested for your target roles: skills from target job ROME codes not yet selected.
- No hard cap on total skills.
- Incentive banner (if experiences skipped): "Add your work experience to unlock personalized skill suggestions" with link to Q11 gateway.
- Message: "Your experience may include skills we haven't suggested — search here to add them."
Q13 — Soft skills¶
Dedicated screen for human qualities (savoir-être). "Vos qualités humaines".
- All soft skills from ROME catalogue (GET /v1/skills?categories=soft_skill, ~30-50 items) displayed as selectable chips.
- No search bar — finite browsable list.
- No per-experience suggestions — soft skills are personal traits, not job-specific.
- Top 3 designation — same star pattern as Q12 but max 3.
- Mandatory: at least 1 soft skill required.
- On the Passport: displayed as a separate section "🤝 Top 3 qualities" alongside "⚡ Top 5 skills".
Q14 — Preferred cities¶
Multi-entry (max 4): city (GeoNames autocomplete) + preference level (preferred / acceptable). - isOpenToRelocation toggle: "I'm open to relocating for work" — boolean, stored on Passport. - At least 1 city required.
Q15 — Work preferences¶
Single screen with four sub-sections.
Work modes (multi-select — mandatory, min. 1): Full remote / Hybrid / On-site / Flexible
Company size (single select — mandatory): Startup (< 10) / Small (10–50) / Medium (50–250) / Large (250–1 000) / Enterprise (1 000+) / No preference
Target sectors (multi-select — optional, max. 5): Sector enum values
Professional values (multi-select — optional, max. 5): controlled vocabulary from culture_values table (GET /v1/culture-values)
The Continue button is enabled once work modes (min. 1) and company size are filled.
Q16 — Logistics (grouped)¶
Two fields on one screen: Availability (single select — mandatory): Now / < 2 weeks / < 1 month / < 2 months / < 3 months / 6+ months Minimum expected salary (number input — mandatory): free input in euros brut. No brut/net toggle.
Q17 — Professional profile¶
- Textarea: free-text self-description (placeholder: "Describe yourself professionally: your motivations, work personality, what drives you…")
- Soft guidance: 500 characters (counter turns orange then red, no hard block)
- No tags — profile tags removed (overlap with soft skills Q13 and culture values Q15)
Q18 — Profile photo¶
Optional. The candidate can upload a photo from their camera or gallery (image picker). The photo is stored and displayed on the Employment Passport. If skipped, a default avatar is shown. A Skip link is displayed alongside the Continue button.
Reusable Q10/Q11 components¶
The gateway screens, type selectors, and all entry forms are implemented as reusable components. When instantiated outside of onboarding (e.g. in a completion flow), the "I'll complete it later" option is not rendered.
Privacy toggles (Q2, Q3, Q4, Q5)¶
Each of these questions displays a "Hide this information on my Employment Passport" checkbox below the answer field. Default state: unchecked (visible).
Save strategy¶
Answers are saved locally on the device at each step (Zustand store keyed by step id, not index — reordering questions does not break saved data). Q1 (Register) is the only API call before Finish — it creates the account and returns a JWT stored locally. The full dataset is synced to the backend in a single request when the candidate taps Finish, authenticated with the Q1 JWT. If the candidate exits and returns before completing, answers are restored from local storage.
Config-driven question order¶
The question sequence is defined in a TypeScript configuration array (onboarding/config/steps.ts). Each step has an id, a component, a section label, and optional dependsOn constraints. Reordering = moving lines in the array. Adding = new component + new entry. Removing = delete entry. The register step is fixed (always first). skills_review depends on target_jobs and experience_gateway being completed. soft_skills depends on skills_review.
Computed fields (not asked during onboarding)¶
- Seniority level: computed at scoring time from total professional experience years (employment + freelance + internship, overlapping periods merged). Thresholds: 0–2 → junior, 2–5 → mid, 5–10 → senior, 10+ → executive. Returns 'junior' by default (never null).
- Current job: extracted from the experience with
is_current = true. No dedicated question — absorbed into Q11. - is_reconverting: ROME distance between current job domain and target jobs domains. Different domain = reconversion. Computed at sync time, stored on Passport.
- hasExperiences: nullable boolean —
null= skipped,false= "I have none",true= has entries. Used for UX nudging only, not for matching. - hasQualifications: nullable boolean — same semantics as hasExperiences.
Static data seeding¶
All reference data lives in the database, seeded via Symfony fixtures or SQL files, served to the frontend via standard API Platform GET collection endpoints.
| Data | Source | Method |
|---|---|---|
| Cities | GeoNames cities1000 (~167K cities, all countries) | Offline import → cities table (pg_trgm index) |
| Nationalities | ISO 3166-1 (~250 entries) | SQL seed in migration |
| Job titles | ROME referential (France Travail) | Offline extraction → seed |
| Skills | ROME 4.0 + WonderWork custom skills | Offline extraction → seed |
| Languages | ~40 common languages with ISO 639-1 codes | SQL seed in migration (skills table, category = 'language') |
| Culture values | WonderWork-defined (~15 values) | SQL seed in migration |
| Sectors | ~26 values | PHP enum (Sector) — no DB table |
| Education levels | 8 French system values | PHP enum (EducationLevel) — no DB table |
| Contract types | 6 standard French types | PHP enum (ContractType) — no DB table |
Passport reveal screen¶
- Displayed after the backend confirms Employment Passport generation (triggered by Finish)
- A fake generation loader plays for a short duration, then the Employment Passport is revealed on screen (transition light → dark — intentional "wow" moment where the purple premium world appears)
- After the reveal sequence, the frontend calls
GET /v1/me/passportto display the real passport data - The candidate is then automatically transitioned to the "Verify your email" screen — no interaction required
- No CTA to the dashboard is available on this screen
Loading states¶
- Q1 Register: spinner on Continue during
POST /v1/auth/register. Double-submit prevention. Rate limited: 5/IP/hour. - Target roles autocomplete (Q7) and experience job title autocomplete (Q11): suggestions appear after a 300 ms debounce — field remains editable during fetch.
- City autocomplete (Q5, Q14, Q11 experience city): GeoNames suggestions appear after a 300 ms debounce.
- "Finish" CTA: spinner + disabled state on tap, for the duration of the in-flight backend sync request. Double-submit prevention: CTA remains disabled until the API confirms passport creation or returns an error.
- Passport reveal screen: intentional UI animation — fake generation loader plays after backend confirms creation. Not a real loading state.
- Step navigation (Continue / Back): synchronous — answers saved locally at each step, no API call between steps (except Q1).
Empty states¶
- Q12 skills search with no result: "Skill not found" message displayed (AC36). No custom skill entry allowed.
- Q12 skills review with no experiences: incentive banner displayed (AC38).
- Q7 target roles: "+ Add another target role" button hidden when 3 titles are already selected (AC15).
Pagination¶
N/A — step-by-step flow, no paginated lists.
Feedback¶
- No toast — the passport reveal screen followed by automatic transition to "Verify your email" serves as completion confirmation (AC45).
- Error on "Finish" backend sync: error message displayed, CTA re-enabled, candidate can retry.