> ## Documentation Index
> Fetch the complete documentation index at: https://docs.hitaji360.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Job openings

> A job opening is the advertised role — the live posting that candidates apply to.

A job opening is the *advertised role* — the live posting that candidates apply to. Where a [requisition](/hr/user/recruitment/job-requisitions) is the internal request to hire, the opening is the outward-facing vacancy. It carries the job title, employment type, location, salary range, and description, and it can be published to your public [careers site](/hr/user/recruitment/careers-site) so that anyone can apply. Every [applicant](/hr/user/recruitment/job-applicants) is attached to an opening, and the opening is what your recruitment dashboard counts as an "open role".

This page covers creating an opening, its Open/Closed lifecycle, publishing to the careers site, and how openings feed the rest of the funnel.

**You'll find this at:** `/hr/recruitment/openings` (list), `/hr/recruitment/openings/new` (create), `/hr/recruitment/openings/:id` (detail)

> 📷 *Screenshot: Job Openings list with the "New Opening" button — to be added.*

***

## Before you start

* **Which business am I in?** Openings belong to the business selected in the switcher and are only visible within it. Creating an opening requires a business to be selected.
* **Each opening gets a reference number** automatically (a tenant-wide series, e.g. `HR-JOP-2026-0001`).

***

## The opening lifecycle (statuses)

An opening has just two statuses:

| Status     | Meaning                         | What you can do                       |
| ---------- | ------------------------------- | ------------------------------------- |
| **Open**   | Live and accepting applicants.  | Edit, publish, close, add applicants. |
| **Closed** | No longer accepting applicants. | Reopen.                               |

The transitions are guarded on the server:

* **Close** an Open opening → *Closed*, and stamps the close date. (Closing an opening that's already closed is refused: *"Opening is already closed."*)
* **Reopen** a Closed opening → *Open*, clearing the close date.

> **Closing fills the requisition:** If the opening was created from a [requisition](/hr/user/recruitment/job-requisitions), closing it automatically marks that requisition **Filled** and records its time-to-fill. This is how the dashboard's *average time to fill* gets its data.

***

## Creating an opening

There are two ways to start an opening:

1. **From a requisition** — open an *Open & Approved* requisition and choose **Create Job Opening**. This pre-fills the title, positions, department, position, salary minimum, and description. See [Job requisitions](/hr/user/recruitment/job-requisitions).
2. **From scratch** — from the openings list choose **New Opening** (needs `hr-recruitment:write`).

> 📷 *Screenshot: New opening form — Position Details, Compensation, Timeline & Source, Job Description — to be added.*

The form is grouped into cards:

### Position details

| Field                   | Required | Notes                                                                                 |
| ----------------------- | -------- | ------------------------------------------------------------------------------------- |
| **Job Title**           | Yes      | The role title (up to 255 characters).                                                |
| **Department**          | No       | Org unit; quick-create available inline.                                              |
| **Position**            | No       | A defined position from your [org structure](/hr/user/getting-started/org-structure). |
| **Employment Type**     | No       | Full-time, Part-time, Contract, or Intern.                                            |
| **Number of Positions** | No       | Minimum 1; defaults to 1.                                                             |
| **Location**            | No       | e.g. "Kampala, Remote".                                                               |

### Compensation

| Field                           | Required | Notes                               |
| ------------------------------- | -------- | ----------------------------------- |
| **Currency**                    | No       | ISO currency code; defaults to UGX. |
| **Salary Min** / **Salary Max** | No       | The pay range.                      |

> ⚠️ **Current state:** The salary range is **not** validated to ensure the minimum is less than the maximum — you can enter an inverted range and it will save. Double-check the figures yourself. (Flagged for the team.)

### Timeline & source

| Field              | Required | Notes                                               |
| ------------------ | -------- | --------------------------------------------------- |
| **Posted On**      | No       | Defaults to today.                                  |
| **Source of Hire** | No       | Free text, e.g. "Internal", "LinkedIn", "Referral". |

### Job description

A rich-text editor for responsibilities, qualifications, and skills.

New openings are created in **Open** status. To reuse a standard setup, see [opening templates](/hr/user/recruitment/opening-templates).

***

## The opening detail page

The detail page has two tabs:

* **Overview** — employment type, source of hire, currency, posted/closed dates, status, and the full job description.
* **Applicants** — every applicant attached to this opening, with their status, contact details, and applied date. A **New Applicant** button lets you add a candidate straight onto this opening (it pre-selects this opening). Clicking a row opens the [applicant](/hr/user/recruitment/job-applicants).

Action buttons across the top depend on status and your permissions:

| Button                 | Shown when                            | Permission               |
| ---------------------- | ------------------------------------- | ------------------------ |
| **Close** / **Reopen** | Always (toggles by status)            | `hr-recruitment:write`   |
| **Publish**            | Opening is Open and not yet published | `hr-recruitment:approve` |
| **Unpublish**          | Opening is currently published        | `hr-recruitment:approve` |

> ⚠️ **Current state:** An **Edit** button is wired on the detail page but only appears for openings whose document state is still "draft" — and every opening is created already submitted, so the Edit button effectively never shows, and the link it points to isn't implemented. To change an opening's details today, the practical workaround is to close it and create a fresh one (or have it adjusted via the API). (Flagged for the team.)

***

## Publishing to the careers site

Publishing pushes an opening onto your public [careers site](/hr/user/recruitment/careers-site) so external candidates can see it and apply. Choose **Publish** on an Open opening (needs `hr-recruitment:approve`). When you publish:

* A public **slug** (URL-friendly link) is generated from the job title.
* The opening becomes visible on the public careers pages and shows a **Published** badge in the app.

**Unpublish** pulls it back off the public site. You cannot publish a **Closed** opening — close means it's no longer recruiting.

Two settings on the opening control what the public sees:

* **Publish salary range** — whether the pay range is shown on the public posting (off by default).
* **Publish applications received** — whether the count of applications is shown (on by default).

Applications submitted through the public careers site automatically become [applicants](/hr/user/recruitment/job-applicants) against the opening.

***

## Permissions

| Action                                              | Permission               |
| --------------------------------------------------- | ------------------------ |
| View openings                                       | `hr-recruitment:read`    |
| Create, edit, close, reopen, delete; add applicants | `hr-recruitment:write`   |
| Publish / unpublish to the careers site             | `hr-recruitment:approve` |

***

## Related

* [Recruitment overview & dashboard](/hr/user/recruitment/overview) — where openings sit in the funnel
* [Job requisitions](/hr/user/recruitment/job-requisitions) — the request a opening can be created from
* [Opening templates](/hr/user/recruitment/opening-templates) — reusable starting points for openings
* [Job applicants](/hr/user/recruitment/job-applicants) — the candidates who apply
* [The public careers site](/hr/user/recruitment/careers-site) — where published openings appear
