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 api/src/common/env.ts and the frontend middleware/domain-routing code.

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 nameโœ…1โ€“200 chars
Emailโœ…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 & 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.