Skip to main content
DoneThat

AI Adoption GuideHRDevelop

Internal opportunity matcher

Pushes open roles, gigs, and stretch projects to employees ranked by skills fit and career goals.

HR processPlanSourceSelectHireOnboardDevelopRewardExit

By Don, DoneThat’s AI coach · updated

Rank is a notification with two cites

A ranked internal opportunity is a notification, not a staffing decision. You may tell an employee that an open role, gig, or stretch project is a plausible next step only when the system can cite two records: the role requirements, and that employee's consented skills or goals file. If either cite is missing, the match stays empty for that person. The employee still applies. The manager still nominates. Rank never moves someone onto a new team.

Rank is a sorting hint for a human who already owns apply and nominate. It is not a transfer order. It is not a fitness score invented so the list looks measured.

Talent marketplace and mobility products such as Gloat, Workday, Eightfold, and Lattice sit in this class of tools: they can push internal work to people who might want it. Specify the two-cite rule yourself. Do not assume a vendor will refuse a match that lacks a skills cite, or that it will refuse to print a percentage. Those are process choices, not features to invent on their behalf.

People exploring what exists for someone with their background, without a live ranked push, belong on a different surface, closer to a conversational career site agent. Do not write those chats back into the ranked list unless the same two cites exist.

Load the requisition and the consented file before anyone is ranked

Two loads, then rank. Skip either load and you do not have a matcher.

Load the requisition, gig brief, or stretch charter until it names the skills, scope, and constraints the work needs. A job title and a hiring manager are not requirements. If the req is a stub, you have nothing to cite on the role side, so nobody gets a match row.

Load the employee side only from a consented skills or goals file. Consent means the person granted this file for internal matching, not that they signed a handbook. Skills guessed from tickets, pull requests, or documents stay in the inference pipeline (skills inference from work artifacts) until the employee accepts them into that file. Goals a manager wrote about them, or a model inferred from one-to-one notes, do not count.

If the req is complete and the file is missing, that person is not ranked. If the file is complete and the req has no requirement lines, nobody is ranked. Empty stays empty. Do not fill the blank from a public profile scrape, a resume parser you ran without consent, or a likely-skills overlay.

Cite both sides or leave the match blank

A match row is valid only when both cites are present and inspectable.

The role cite is the requirement line the ranker used: a skill, a level, a constraint, or a stated outcome of the stretch. The employee cite is the entry in the consented file the ranker used: a skill the person claimed or accepted, or a goal they wrote. A mobility lead should be able to open both records and see the same words.

The failure mode to design for first is a match with no skills cite. The ranker has a req and a name, and nothing to cite on the employee side. Shipping that row trains hiring managers to treat the list as ground truth. The correct output is an empty match field, not "likely fit," not a muted badge, not a guessed percent.

Do not invent a fit percent. A percentage implies a calibrated measurement you do not have. Among people who already have two cites, rank order is enough: A appears above B because more of the cited req lines have a corresponding file entry, or because the stated goal is closer to the stretch. If someone asks why A is above B, show the cites. A number is not a cite.

Partial rows are allowed only if the empty field stays visible. You may notify on a skills cite while the goals cite is blank, but the goals cell stays blank. You may not average the missing side into a made-up percent so the dashboard looks complete.

Three people against one stretch charter

Here is the pattern in one stretch, not a case study and not a measured outcome.

A product org posts a twelve-week stretch: own the accessibility backlog for the customer portal. The charter cites two requirement lines: prior delivery against accessibility work of the WCAG kind, and a written interest in harder product craft, the kind of stretch that points toward staff-level work.

Priya's consented file lists accessibility remediation she shipped on checkout and a goal about taking on harder product problems. Both cites exist. She is ranked first and notified. She still submits an application. If the process requires a manager nomination, her manager still nominates. The rank did not assign her.

Omar's file lists the accessibility work and no goal that mentions craft, a staff path, or harder product problems. The role's goal line has nothing to attach to. That match cell stays empty. Depending on policy, he can be notified with the empty goals field shown, or omitted from this ranked push until he updates the file. He is not labeled with an invented fit percent. He is not quietly dropped from his current team because the matcher found him.

Lin has a strong reputation and a resume line about inclusive design. She has not consented a skills or goals file for matching. There is no employee cite. She is not ranked. The matcher does not fill the blank from chat praise or a skip-level rumor. If her manager wants her considered, the manager nominates her through the ordinary process, the same as if the matcher did not exist.

The stretch does not start because a name sat at the top of a list. The hiring manager reads the cites, talks to people who applied or were nominated, and decides. If Omar updates his goals file, he can appear on the next ranked run. Lin never becomes a silent transfer.

Humans apply and nominate; rank does not transfer

The second failure mode is treating rank as a transfer. Once a name is first on a list, operations is tempted to pre-assign the seat, freeze current work, or tell a manager the move is already matched. That collapses apply and nominate into an automated outcome. Do not do it.

The push is a message: here is open work, here are the cites, here is how to apply, here is how a manager nominates. Current assignment, backfill, and compensation stay in the existing mobility process. The matcher does not write a new manager, a new cost center, or a start date.

Do not pipe the ranked list into a workforce plan as if those people were already free. Who might be movable over a quarter is a supply question, for an internal mobility supply forecaster, not a reason to auto-route today's top rank. If open work outruns people with a cited skill, that is strategic skills-gap analysis. A gap is a hiring or development signal. It is not permission to invent cites so every req looks fully matched.

When you review tools in this class (Gloat, Workday, Eightfold, Lattice), ask to see a ranked row with both cites visible, a row that stays empty when a cite is missing, and a path that still requires apply and nominate. If the demo leads with a fitness percentage and a one-click move, you are looking at a different operating model than this page describes.

Empty rows are the operating signal

Empty is a first-class output. Log the reason: stub req, no consented file, no skills cite, no goals cite, consent withdrawn. Mobility leads use that log to ask someone to update a file, or to tell a hiring manager to source the ordinary way.

Do not backfill empty rows from inferred skills, public profiles, or a generated percent so completeness dashboards stay green. Completeness theater is how auto-transfer culture starts. A blank that stays blank, with apply and nominate still available, is the matcher working as designed.

Is this worth automating for you?

Whether this pays back depends on how much time it takes your team today. Most teams estimate that from memory, and the estimate is usually wrong in one direction or the other. This one is rated high effort to implement, so the baseline matters more than usual.

DoneThat reconstructs where the time actually went, with no timers to forget, so you can measure the baseline before committing to a project and check the gain afterward.

Measure the baseline first