Skip to main content

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

PRChangeDate
#1297Public Expert acquisition landing page (/experts/join) + application form page (/experts/apply) wired to the marketing API. Closes #10812026-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

RouteFileWhat it does
/experts/joinfrontend/src/app/experts/join/page.tsxMarketing landing page. Hero + Why + How-it-works + Who-we're-looking-for + Social proof + FAQ + footer CTA. Every CTA links to /experts/apply.
/experts/applyfrontend/src/app/experts/apply/page.tsxSingle-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):

FieldRequiredNotes
Full name1–200 chars
Emailunique; 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 domainone of: Strategy · Finance · Product · Engineering · Marketing · Operations · Legal
Years of experienceone of: 3-5 · 6-10 · 10-15 · 15+
Impact statement10–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 & pathPurpose
POST /marketing/experts/applicationSubmit 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/:idFetch a single application's public status (confirmation screen).
POST /marketing/experts/rejoin-waitlistLets 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 by RequireRole 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-applications is the applications inbox; /ops/experts is a different surface — it manages already-active Experts and their per-client assignments. Don't conflate them.

  • 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.