Nobody can say how many roles are approved, open, or quietly being recruited for. Here is the model behind a tracker that can, the prompts to build it, and what it takes to run it.
Your private status link is on its way to your inbox.
A headcount request tracker is four parts: a request tied to a budget line, an approval path that includes finance, one status model recruiting and finance both use, and reconciliation against the plan. The confusion in most companies is that recruiting tracks requisitions, finance tracks budgeted positions, and the two lists never match. The fix is one record with both views, not two systems kept in sync.
Headcount
9
Awaiting approval
14
Approved, not open
6
Off plan this quarter
2.1M
Annualised approved
Data Analyst, RevOps
new · off plan · with VP
Staff Engineer
new · with finance
Support Lead
backfill · funded from October
AE, EMEA
backfill · offer out
PMM
new · started September
You run people operations, recruiting or finance. You already have a headcount plan. What you want is a single answer to how many roles are approved and where each one is, that nobody has to reconcile before a meeting.
One record per role, from the moment somebody asks for it to the day someone starts.
With the level, the salary range, whether it is new or a backfill, and the month the budget funds it from.
Matching a plan line or not. Off-plan hiring is not wrong, it just has to be visible.
Routed by level and annualised cost, with deputies so nothing waits on someone travelling.
One status list, two views over it. No reconciliation, because there is nothing to reconcile.
Request to approval, approval to open, open to offer, offer to start. Most perceived recruiting delay happens before the role was opened.
So finance can see the in-year and annualised effect of everything currently approved.
A headcount tracker is not a list of open jobs. It is four parts, and the third is where two departments stop disagreeing.
Role, level, team, cost centre, salary range, new or backfill, funded start month, and the business case. The budget line is what makes it a finance object rather than a recruiting one.
Management chain plus finance, with thresholds that depend on level and cost. Finance approving after the offer is out is the failure this prevents.
A single set of states covering the whole life: requested, approved, open, in process, offer out, accepted, filled, and the closing states of withdrawn, on hold and cancelled. Both teams use the same list.
Approved roles against the plan, filled roles against approved, and the resulting cost impact by month. This is the report that ends the argument about how many people are being hired.
These prompts start from a Helix project, which is what handles sign-in, credentials and hosting. Start with Helix
Paste these into Claude Code, Codex or Cursor in order. Each one leaves you with something that runs, so you can stop after any step.
The budget line, and the field everybody forgets.
In this Helix project, build me a headcount request tracker.
A manager asks for a role, so capture: title, level, team, cost centre,
location, employment type, salary range, the business case, and the
priority. Require them to say whether it is a new role or a backfill at
the moment they create it, and treat those differently everywhere. They
have different approval paths and different budget consequences.
Now the field almost every tracker misses. Ask for the month the budget
funds the role from, not a target start date, and derive the in-year cost
from it. A role starting in month ten costs a quarter of one starting in
month one, and approving a role is not the same as approving twelve months
of salary.
Let me load the headcount plan, link each request to a plan line where one
exists, and flag requests that match nothing. Off-plan hiring is not wrong.
It just has to be visible.
I sign in through Helix, so do not build a login page. Read the signed-in
user from the runtime. And do not put any key or connection string in the
code: if this needs to reach another system, tell me and I will create the
connection in my workspace. Worth knowing. Funded start month is the field everyone skips and finance always needs.
Approval routing, and what happens when someone edits an approved request.
Route approvals through rules I can edit: based on level, cost centre and
annualised cost, producing an ordered list of required approvers. Always
include finance above a threshold I set. Finance approving after an offer
is out is the failure this whole app exists to prevent.
Give every approver a deputy with automatic reroute after a set number of
days, and show the requester exactly where their request is sitting and
with whom.
Record every decision with the approver, timestamp, reason, and a snapshot
of the request at that moment. Then do the unpopular but necessary thing:
if anyone edits the salary range, level or start month after approval,
reset the affected approval steps. Without that, roles get approved at one
level and recruited at another, and nobody notices until the offer. Where recruiting and finance stop disagreeing.
Use a single status list for the whole life of a role: requested, approved,
open, in process, offer out, offer accepted, filled, on hold, withdrawn,
cancelled. Do not create a parallel recruiting status. Two lists kept in
sync is the problem, not the solution.
Record every transition with a timestamp and who made it. Put the
recruiting fields on the same record: recruiter, posting link, candidate
count, current stage, offer details, accepted date, actual start date.
Then build two views over that one dataset. Recruiting sorts by stage and
age. Finance sorts by cost impact and funded start month.
And derive the timings separately: request to approval, approval to open,
open to offer, offer to accepted, accepted to start. Reporting those apart
changes the conversation in a hiring review more than any other number
here, because most of what gets called slow recruiting happened before the
role was opened. Worth knowing. Splitting request-to-approval from time-to-fill is the single most useful report in this app.
Reconciliation, and the screen you will want on a bad Tuesday.
Report plan versus approved versus filled, by team and quarter, with the
gap shown in both roles and money.
Project the monthly cost impact from funded start months, so finance can
see the in-year and annualised effect of everything currently approved.
List off-plan approvals separately with their approvers and reasons.
Age the pipeline: approved roles not yet open, and open roles past a
threshold, each with an owner.
Add a hiring freeze mode that puts every non-exempt request on hold with a
reason and notifies the requesters. You will need it one day and you will
not want to build it that morning.
And let me export a snapshot for a board pack, and keep it, so a later
correction does not change a number that has already been reported. The step that turns a working prototype into something with your data in it.
Now connect it to the systems we actually run, so it works on real data
rather than the rows you seeded.
Anything in angle brackets is a placeholder. Swap it for whatever we use
instead, and have the app name the connection it wants rather than assume
a vendor, so changing my mind later is a config change and not a rewrite.
<Workday>. Read the current org, managers and levels, and write filled
roles back when somebody starts.
<NetSuite>. Read the headcount plan and cost centres, which is what makes
a request more than a wish.
<Greenhouse>. Pull recruiter, stage and offer status onto the same record,
rather than a parallel list.
<Slack>. Chase approvers and tell requesters where their role sits.
<Okta>. Read the group that says who is in finance or HR, which is what
the app checks before showing a salary range. These are the most sensitive
fields in the library.
<Gusto>. Read actual payroll cost per role, so the in-year projection is
real rather than a band.
<Google Sheets>. Take the approved plan in the form finance built it, so
the tracker agrees with the file the CFO signed off.
Only write where I have said to write. Everything else is read only.
Do not write a key, a token or a connection string anywhere in the code,
and do not ask me to paste one. Tell me which connections you need and I
will create each as an authentication in my Helix workspace. Reference
them by alias. Worth knowing. Every name in angle brackets is a placeholder for whatever you run. Helix holds the credential as a workspace authentication, so the app references an alias and never the secret itself.
The last step of every build: a URL, and the right people on it.
Deploy my app. Worth knowing. Your assistant runs helix deploy underneath and the app comes back as a URL. Salary ranges and headcount plans are among the most sensitive data you hold, so set Access Control before sharing: managers see their own team, finance and people operations see everything.
This is the app where recruiting and finance stop disagreeing, so it has to read from both.
Workday
Read the current org, managers and levels, and write filled roles back when somebody starts.
NetSuite
Read the headcount plan and cost centres, which is what makes a request more than a wish.
Greenhouse
Pull recruiter, stage and offer status onto the same record, rather than a parallel list.
Slack
Chase approvers and tell requesters where their role sits.
Okta
Read the group that says who is in finance or HR, which is what the app checks before showing a salary range. These are the most sensitive fields in the library.
Gusto
Read actual payroll cost per role, so the in-year projection is real rather than a band.
Google Sheets
Take the approved plan in the form finance built it, so the tracker agrees with the file the CFO signed off.
Each line says whether the app reads, writes or both. Anything not described as writing should be read only.
Named systems are the ones most teams actually run, not a list of the only ones that work. Swap in whatever you use.
Each connection is an authentication in your Helix workspace, referenced by alias. The app names the connection it wants and never holds the credential, so nothing here ends up in your code and any of it can be rotated or revoked without a redeploy.
The build gets you a working tracker. It holds salary ranges, organisational plans and hiring decisions, so access control and ownership are part of the design rather than an afterthought.
AI Deployment
One command takes the app from your assistant to a live address, so the people who need it get a link rather than instructions for running it locally.
App Security
Salary ranges and headcount plans are among the most sensitive data a company holds. SSO means people sign in with their existing account, and access is scoped so a manager sees their own team while finance and people operations see everything.
App Security
Reading the headcount plan from finance and pushing filled roles to an HR system needs real access. Granting it to the app rather than pasting keys into it means credentials can be rotated or revoked without a redeploy.
App Registry
Every app carries a named owner and an entry IT can see, so the tool does not become nobody's problem when the person who built it changes role.
Cost Management
Per-app spend visibility, with budgets and caps, so an internal tool cannot quietly become a line item nobody can explain.
It holds one record per role from the initial request through approval, recruiting and start date, with a budget line attached and a status that finance and recruiting both use. Its purpose is a single answer to how many roles are approved and where each one is.
Because they track different objects: requisitions on one side, budgeted positions on the other, kept in sync manually. One record with two views over it removes the reconciliation rather than automating it.
Because approving a role and approving a year of salary are different decisions. A role starting in month ten costs a quarter of one starting in month one, and a tracker without that field cannot project cost impact.
For material fields, yes. Salary range, level and start month all change what was approved. Without a reset, roles get approved at one level and recruited at another, and nobody notices until the offer.
Split the timeline: request to approval, approval to open, open to offer, and offer to start. Most of what gets described as slow recruiting happened before the role was opened, and only a split timeline shows that.
Yes. The prompts here are written for Claude Code, Codex or Cursor and stage the build. The judgement calls are your approval thresholds and where finance enters the chain.
People
Generate the right task list per role, route each task to the team that owns it, and prove that access was actually removed. Prompts to build it, and what it takes to run it.
People
Score candidates against the competencies the role actually needs, collect evidence rather than impressions, and make the hiring decision from a comparable record. Prompts to build it, and what it takes to run it.
Finance
Show budget owners where they stand before the month closes: committed versus actual, variance by owner, and a forecast they can act on. Prompts to build it, and what it takes to run it.
Last reviewed September 2026.
Helix is the governed runtime for AI-built apps. Deploy what you build, put SSO in front of it, connect it to your systems with managed credentials, and give it a named owner.
Your private status link is on its way to your inbox.