Article
Ghost jobs: how to tell a listing is dead before you spend an hour applying
You found the posting, it read like it was written for you, and you spent an hour tailoring the resume and drafting a cover letter that referenced the team by name. You hit submit. Three weeks later — nothing. Not a rejection, not an auto-reply bounce, just silence. You go back to check the listing and it is still there, still "actively hiring," exactly as it was the day you applied.
It was never going to reply. The role closed two weeks before you found it, or it never had a real headcount behind it at all. Your application was not weak. It was aimed at nothing.
The hour you can't get back
A dead listing does not look dead. It has a title, a description, a "posted 3 days ago" badge, an apply button that works. Nothing about the page tells you the requisition closed, the hire already happened internally, or the posting was never tied to a real opening in the first place. So you do the same work you would do for a live role: research the company, mirror their language back in the cover letter, follow up a week later when you hear nothing.
That is the asymmetry that makes ghost jobs expensive. Applying costs you real time. Leaving a posting up costs the company nothing. There is no meter running on a stale job listing — no bounced email, no support ticket, no automatic expiry in most systems. So the incentives are lopsided: you have every reason to verify before you apply, and almost nobody on the other end has any reason to take the posting down. Once you internalize that asymmetry, the fix stops being "write better cover letters" and starts being "spend two minutes confirming the role is real before you spend an hour on it."
Why dead listings stay up
None of this is malicious. It is just what happens when nobody's job is to clean up job postings.
- ATS reposting. Applicant tracking systems often "refresh" a listing's posted date automatically to keep it visible in board search results, even when the underlying requisition hasn't changed. A posting that shows "posted this week" can be a role that opened months ago.
- Evergreen pipelines. Some companies keep a posting live year-round for roles they hire on a rolling basis — not because a specific seat is open right now, but to keep a pool of resumes warm for whenever one opens. The listing is honest in intent but misleading in urgency.
- Agencies farming resumes. Recruiting agencies post roles to build a candidate database, sometimes for a job that was filled, sometimes for a client relationship that never firmed up. The posting exists to generate applicants, not to fill a specific seat.
- Board syndication lag. Aggregators pull from company career pages and ATS feeds on their own schedule. A role closed on the company's site can keep circulating on three other boards for weeks because nobody re-syncs the feed that fast.
- Nobody is paid to take it down. Closing a requisition is an extra click for a recruiter who is already juggling twenty open roles. Leaving it up is the path of least resistance, and there is no cost to them for doing so.
The common thread: a listing staying visible after it's dead is never anyone's job to prevent. It is a byproduct of how these systems are built, not a decision anyone made about your application specifically.
Signals a listing is probably dead
None of these alone is proof. Together, they are a pattern worth trusting.
- Reposted date churn. The "posted" date keeps resetting without the description ever changing — a strong sign the ATS is auto-refreshing it rather than a human re-opening the role.
- Old on an aggregator, gone from the source. The listing shows 30+ days old on a job board, but you cannot find it anywhere on the company's own careers page. If the company itself no longer lists it, the aggregator is showing you a stale copy.
- Vague team and manager language. Real, currently-open roles usually name a team, a manager, or a specific project. A description that reads generically — "join our growing team" with no team named — is more often boilerplate that has outlived the opening it was written for.
- Agency fingerprints with no client named. A posting from a staffing agency that won't say which company you'd actually work for, paired with a job title that could describe a dozen different companies, is built to collect resumes rather than fill one seat.
The two-minute manual check
Before you write a single sentence of a cover letter, do this:
- Find the posting on the company's own ATS or careers page, not the board where you found it. Search
site:boards.greenhouse.io [company]or[company] careersand look for the exact title. - If it's not there, it's very likely closed. The board is showing you a cached copy of a listing the company already took down.
- If it is there, click apply and confirm the form actually loads. Some stale listings stay indexed with a working title and description page, but the apply link 404s or redirects to a generic "no open roles" page — the tell that the requisition closed after the listing was cached.
Two minutes, and you now know whether the hour you're about to spend has anywhere to land.
Automating the check
Doing that lookup by hand for every promising posting adds up fast, especially if you are applying broadly. We built Oink to take that step out of your hands: it pulls fresh postings from 28 sources — LinkedIn, Hacker News "Who's hiring," curated remote boards, and company career pages — scores each one 1–5 against your resume or a single preference line, with a written reason for the score, and verifies your top matches are still open before they ever reach you, so what lands in your feed is worth the hour.
Oink runs this kind of search for you around the clock — upload a resume, describe what you want, and an AI pipeline scores fresh postings against your profile and pings you on the web or Telegram.
Check the door before you knock. Save the letter for the roles that can actually open it.