/hr/recruitment/offers/new (composer), /hr/recruitment/offers/:id (detail)
📷 Screenshot: Prepare Offer composer with the live letter preview — to be added.
Before you start
- Which business am I in? Offers belong to the business selected in the switcher, and the offer carries the candidate’s salary, so it stays isolated to that business. An offer cannot be raised against a candidate or opening that belongs to a different business.
- Start from the candidate. The cleanest path is Prepare Offer from the applicant detail page — it carries the applicant and their opening through to the composer. You can also open the composer directly and pick the candidate.
- One live offer per candidate. A candidate can only have one non-cancelled offer at a time. If there’s already an active offer (draft, sent, accepted, or declined), you must cancel it before raising another.
- You can’t offer to a rejected candidate. If the applicant has been Rejected, the system refuses the offer.
The offer lifecycle (statuses)
An offer carries both a workflow stage (drafted → sent) and a response status.
Two things to hold onto:
- Sending requires approval. Composing and saving a draft is a
:writeaction, but sending the offer to the candidate (and recording their Accept/Decline) needshr-recruitment:approve. - An accepted offer can’t be cancelled. Once accepted, the employee exists — to undo it you terminate the employee, not cancel the offer.
Building an offer (the composer)
The Prepare Offer page is a two-pane composer: the form on the left, a live letter preview on the right showing exactly what the candidate will receive (watermarked DRAFT until sent).📷 Screenshot: Prepare Offer — left form, right live preview — to be added.At the top, a candidate banner shows who the offer is for, the linked opening, and — if they’ve been interviewed — their average interview score and interview count, pulled straight from their interviews. If you opened the composer without a candidate, pick one from the Candidate selector first. The form is organised in steps:
1 · Role & department
The employment type and place of work are shown for context, taken from the job opening.
2 · Compensation & timeline
To help you pitch the right number, compensation rails appear when the data exists: the opening’s salary band, the candidate’s salary expectation, and a chip telling you whether your figure is below, within, or above the band — plus quick-fill buttons for the band minimum, midpoint, and the candidate’s ask.
3 · Key terms
Pull a set of terms from an offer term template (the dropdown lists your templates), then tailor each line, or add term lines by hand. Each line is a term and its value (e.g. “Annual leave” → “21 days”). These print as a list on the letter.4 · Letter content
A rich-text opening paragraph and a terms & conditions block. An Insert standard clauses button drops in a boilerplate conditions block (probation, confidentiality, contingencies) you can then edit.Saving & sending
- Save draft (needs
hr-recruitment:write) — saves the offer as a draft and opens its detail page. - Save & send (needs
hr-recruitment:approve) — saves the draft and immediately sends it to the candidate.
The offer detail page
The detail page renders the finished letter (the same document the candidate sees) alongside a status & actions rail.📷 Screenshot: Offer detail with the letter and the actions rail — to be added.
- Status tracker — Drafted → Sent to candidate → Accepted / Declined / Awaiting response.
- Candidate card — name, email, phone, with a link to the applicant.
- Summary — position, offer date, expected start, basic salary.
- Print / PDF — print the letter (use your browser’s “Save as PDF”).
- Send to candidate — on a draft (needs
:approve). - Accept (create employee) and Mark declined — while Awaiting Response (need
:approve). - Cancel offer — while Awaiting Response (needs
:write).
Accepting an offer (this creates the employee)
This is the load-bearing moment. Choosing Accept (create employee) and confirming will:- Create a new employee from the candidate’s details (and invite/link a self-service account where the candidate has an email).
- Create an employment contract for that employee, using the opening’s employment type, the offer’s start date, position, unit, and currency. This goes through the exact same path as manually adding an employment record, so it automatically fires off the employment-contract e-signature envelope too — see The e-signature envelope. If the business hasn’t configured a template/signatory yet, the contract is still created fine; the envelope just shows “Not sent” until someone sends it (manually, or via the settings-page backfill).
- Seed a salary assignment from the offer’s base salary and suggested structure where both are present, so the next payroll run can pick the new hire up.
- Mark the applicant Accepted and link the offer to the new employee and contract.
- Fire the onboarding process (see Onboarding) and audit-log the conversion.
This is the confirmation of employment itself; it’s separate from the job offer letter above, which is the pre-hire proposal. See Appointment letters for how post-acceptance confirmation has changed.After accepting, the detail page shows an “Employee & contract created” card with an Open new employee button that deep-links to their new employee profile. A few safeguards:
- You cannot accept twice — once an applicant is Accepted with a linked employee, a second accept is refused (it would create a duplicate person).
- If contract creation fails after the employee is created, the system rolls the employee back so you don’t end up with an orphaned record.
⚠️ Current state: If the offer has no salary structure suggestion or no positive base salary, the accept still succeeds and the employee + contract are created, but no salary assignment is seeded — the new hire will be skipped by payroll until you assign a salary structure to them manually. Watch for this when accepting offers that were saved without a base salary.
Declining an offer
Mark declined records that the candidate said no. The applicant is marked Rejected. This is reversible in spirit — they can be re-offered later if it was a mistake (cancel any leftover offer first, since one live offer per candidate is enforced).Permissions
Note: the offer routes themselves load for anyone with hr-recruitment:read; the individual save/send/respond buttons are gated by the finer permissions above, so a read-only user sees the offer but no action buttons.
Related
- Job applicants — where you start an offer from
- Offer term templates — reusable offer terms
- Appointment letters — how post-acceptance confirmation has changed
- Employment records & contracts — the e-signature envelope — what actually gets sent when the contract is created
- Onboarding — what fires when an offer is accepted
- Employee profile & its tabs — the record an accepted offer creates
- Recruitment overview & dashboard — offer KPIs (offers out, acceptance rate)