Employer self-service
Let approved employers claim companies, manage jobs, and review applicants.
A
JBuild an employer portal around board.me.companies. Every method is authenticated and scoped to a company membership; public company data remains under board.companies.
Prerequisites
board.context().features.employersistrue.- A server-owned employer session.
- A protected account area with
cache: 'no-store'. - UI states for
approved,pending_work_email,awaiting_admin, andrejectedmemberships.
Claim a company
If the membership is pending_work_email, send the verification link. Consume the emailed token with board.auth.verifyWorkEmail — the link carries only a token, so there is no company slug and no board-user session:
Do not unlock management screens until the returned membership is approved.
Create and publish a job
New jobs are held drafts. publish works only while an existing paid window permits it. A held draft that needs billing must use jobs.checkout; branch on checkout, published, pending_approval, or invoice_sent. A free post (or invoice publish-on-issue) returns pending_approval when the board requires free-job approval — show an awaiting-review state. The job’s status becomes pending_approval; like a draft, it is not public, and only the board operator can publish it. Bundle, subscription, and member-credit posts still return published. Never infer publication from a browser redirect.
Load the applicant pipeline
Use the stage order returned by the pipeline. Do not maintain a second ordering model in local storage.
Source candidates onto a job
A job's sourced shortlist is the talent list (saved search) linked to it; a job has at most one. Shortlist a candidate by saving them to that list with board.me.companies.talentLists.members.add, and take them off with members.remove, which also removes their pipeline row while it is a sourced row still at Shortlisted. The pipeline row has source sourced and stays hidden from the candidate until they apply themselves. Move shortlisted people on through the pipeline as usual. Do not add a sourced stage to the pipeline rail. The sourcedCandidates methods are deprecated and forward to these calls.
Expected result
An employer sees membership state before any private controls. Approved members can create held drafts, publish or check them out, and read a pipeline whose stages and applicants come from one server response.
Verify the result
- A pending or rejected membership cannot edit a company or job.
- Claim confirmation produces the membership state shown in the portal.
- A created job appears as a draft before publication or checkout.
- A free checkout on a board that requires free-job approval returns
pending_approval, and the job’s status ispending_approvaluntil the operator approves or rejects it. - Applicant writes re-read the pipeline after the 204 response.
- One employer cannot access another company’s private records.
Errors and edge cases
- Claiming can approve immediately on a domain match or enter a pending state.
- Work-email links expire after 24 hours.
- Employer job updates are merge patches; omitted fields remain unchanged.
- Remote timezone values auto-derive on create when omitted, but do not re-derive on update.
- Custom stages are capped and protected stages cannot be removed or arbitrarily reordered.
Production cautions
- Treat applicant data, notes, and signed resume URLs as private.
- Keep every employer response out of public caches and logs.
- Use the API’s authorization decision even if the UI already hid a control.
- Re-read state after void-returning mutations rather than simulating server changes.
Next, add an anonymous purchase path with Job posting and checkout.