Feature: Expert Acquisition (Landing Page)
Last updated: 2026-06-27 (closes #1338 — docs gap for the public Expert acquisition surface shipped in #1297, closes #1081).
Expert Acquisition is the public, unauthenticated front of the Expert
recruiting funnel: a marketing landing page that pitches the h.work Expert
network and an application form that captures a candidate's details into the
expert_applications pipeline. It is the top of the funnel whose downstream
review/interview/promotion lifecycle is documented separately in
expert-application.md.
This page exists so AMs and SuperAdmins know the public surface is live, what it
captures, and where submitted applications land for review
(/ops/expert-applications). It is not part of the client portal and has no
auth — anyone on the public web can reach it.
What shipped
| PR | Change | Date |
|---|---|---|
| #1297 | Public Expert acquisition landing page (/experts/join) + application form page (/experts/apply) wired to the marketing API. Closes #1081 | 2026-05 |
The downstream review/interview/promotion machinery (AI screening, Tavus video interviews, Ops review queue, email side-effects) shipped under a separate set of PRs tracked in expert-application.md.
The two public surfaces
| Route | File | What it does |
|---|---|---|
/experts/join | frontend/src/app/experts/join/page.tsx | Marketing landing page. Hero + Why + How-it-works + Who-we're-looking-for + Social proof + FAQ + footer CTA. Every CTA links to /experts/apply. |
/experts/apply | frontend/src/app/experts/apply/page.tsx | Single-page application form (no wizard, mobile-first). Component: _components/expert-application-form.tsx. |
Landing-page section components live in
frontend/src/app/experts/_components/ (hero.tsx, why-section.tsx,
how-it-works.tsx, who-looking-for.tsx, social-proof.tsx, faq.tsx,
footer-cta.tsx, navbar.tsx).
Domain note: these are public marketing routes — they are not gated to the platform host the way
/ops/*and/workspace/*are. See root CLAUDE.md § Domain configuration and frontend/CLAUDE.md § Platform host vs portal zone.
Lead-capture flow
[Public web]
│
│ /experts/join (landing) ── CTA ──▶ /experts/apply (form)
│
│ on submit → GET /marketing/experts/application/status?email=…
│ └─ duplicate / reapply-cooldown gate; runs before the POST below
│
│ POST /marketing/experts/application
▼
expert_applications row (status = pending)
│
└─▶ enters the review pipeline → see expert-application.md
Form fields
Captured by CreateExpertApplicationDto
(api/src/marketing/dto/expert-application.dto.ts):
| Field | Required | Notes |
|---|---|---|
| Full name | ✅ | 1–200 chars |
| ✅ | unique; lowercased + trimmed | |
| LinkedIn URL | ⚠️ | required unless a resume URL is given |
| Resume URL | ⚠️ | required unless a LinkedIn URL is given (paste a link — direct file upload is not wired yet) |
| Current role / headline | ✅ | ≤ 80 chars, e.g. "VP Product, Stripe" |
| Primary domain | ✅ | one of: Strategy · Finance · Product · Engineering · Marketing · Operations · Legal |
| Years of experience | ✅ | one of: 3-5 · 6-10 · 10-15 · 15+ |
| Impact statement | ✅ | 10–300 chars — the highest-signal field for AI screening |
Cross-field rule: at least one of LinkedIn URL or resume URL must be present.
Public API endpoints
All under MarketingController (api/src/marketing/marketing.controller.ts,
@Controller("marketing")) — unauthenticated, IP rate-limited:
| Method & path | Purpose |
|---|---|
POST /marketing/experts/application | Submit an application → creates the expert_applications row (status = pending). |
GET /marketing/experts/application/status?email=… | Duplicate / reapply-cooldown gate the form runs at submit time, before the POST (blocks an existing application or shows the reapply-eligible date). |
GET /marketing/experts/application/:id | Fetch a single application's public status (confirmation screen). |
POST /marketing/experts/rejoin-waitlist | Lets a previously-waitlisted candidate rejoin the waitlist. |
(POST /marketing/companies/lead on the same controller is the client-side
lead form — a different funnel, not Expert acquisition.)
Where applications surface
Submitted applications land in the SuperAdmin-only Ops review surface:
/ops/expert-applications(frontend/src/app/ops/expert-applications/page.tsx, guarded byRequireRole allow={["superadmin"]}) — the funnel inbox with Waitlist / Interviews / All tabs, AI scores, and the Send-to-interview / Approve / Decline / Reply / Delete actions.- Backed by
api/src/admin/admin-marketing-leads.controller.ts(/admin/marketing/leads/experts/*).
Full treatment of the review surface, the status machine
(pending → qualified | waitlisted | rejected → invited → interview_completed → approved), Tavus video interviews, and email
side-effects: expert-application.md and
USER_OPERATIONS_MANUAL.md § 7.3 /ops/expert-applications.
/ops/expert-applicationsis the applications inbox;/ops/expertsis a different surface — it manages already-active Experts and their per-client assignments. Don't conflate them.
Related
- expert-application.md — the downstream review/interview/promotion lifecycle this form feeds.
- USER_OPERATIONS_MANUAL.md — § 5 (Expert role) and § 7.3 / § 7.6 (SuperAdmin Expert workflow + golden path).
- onboarding.md — client-side onboarding (a distinct funnel); shares the Expert email-template table.
- expert-workspace.md — the
/workspace/*surface an applicant reaches only after approval.