Hiring Manager

Why Your GIS Job Won't Fill: 7 JD Patterns That Kill Apply Rates

Article

You have a GIS req that's been open 60 days. Six applications total — and two of those aren't qualified. Your recruiter says the candidates are out there, but they're not coming through your funnel.

Across 1,366 GIS postings in our database, we keep seeing the same seven patterns in the reqs that sit. Most of them aren't about market scarcity. They're about what the job description tells a senior candidate in the thirty seconds they spend on it.

Here's the part that makes this fixable: every pattern below has a specific, named cause. None of them require a budget increase, an org change, or a market that doesn't exist. They require editing the req.

938 of 1,366. That's how many GIS postings in our database — 68.7% — list no salary number anywhere in the body. For unspecified-seniority postings the rate is 81%. For entry-level it's 73%. LinkedIn Talent's pay-transparency research finds posts with pay attract roughly twice the qualified applicants. Two-thirds of GIS reqs are competing with one hand tied behind their back.

Why this matters now, specifically

Three things are stacking on top of each other. As of Q1 2026, pay-transparency laws cover California, Colorado, New York, Washington, Illinois, Maryland, Minnesota, and Rhode Island, with more states phasing in (Wikipedia summarizes the state-by-state map). Candidate-side preference for pay-shown postings is well-documented across Indeed Hiring Lab's pay-transparency coverage and LinkedIn Talent's research — both find majorities of seekers screen on pay before reading further. And the GIS hiring pool is small enough that experienced candidates know each other's last salary — they're not guessing what your band should be.

The compounding effect: candidates who do see your req are a self-selecting subset who either don't know better or didn't have a pay-shown option to compare against. Your funnel is narrowing before HR ever sees a resume.

The seven patterns

1. Invisible-comp

The big one. Two-thirds of postings in our database list no number. The hidden-pay rate is highest at the bottom of the seniority ladder — 73% of entry-level reqs and 81% of unspecified-level reqs go out without a band — which is the opposite of what makes sense. Senior candidates can guess your range. New grads can't, and they're the ones most likely to skip.

The fix is mechanically simple and the data already gives you the bands. Across the 419 postings in our DB that did list pay, the medians by level are: entry $86,000, mid $103,390, senior $147,500, leadership $170,000. P25–P75 spread by level runs $25K–$50K wide. You don't have to commit to a single number. You have to commit to a 25K-wide window.

If your hesitation is "but our internal range varies by location and experience," that's what the range is for. A real range you'd actually pay beats no range every time. Candidates aren't trying to lock you to the floor — they're trying to find out if you're in their universe at all.

The candidate-facing version of this pay data lives in our GIS salaries 2026 analysis — that's what your candidates are reading when they evaluate whether your blank salary line is hiding a competitive number or a low one. Right now they're assuming low.

2. Stack-overload

13.3% of postings in our DB — 182 of 1,366 — require five or more distinct technical tools. Stack-overload by itself isn't the problem. The 52 stack-overload postings that did list pay had a median midpoint of $142,500. That's an honest senior engineering ask at an honest senior engineering price.

The damage shows up at the junior end, where five-tool reqs get attached to $70K–$90K bands. Three real DB examples:

  • Geospatial Data Analyst at Lynker, $78K–$92K — requires ArcGIS Pro + Python + PostgreSQL + ArcGIS Online + ArcGIS Enterprise. Five distinct platforms.
  • Geospatial Analyst II (SkillBridge) at Dewberry, $65K–$84K — ArcGIS Pro + ArcGIS Online + Python + FME + QGIS + PostGIS. Six.
  • Research/Data Analyst at the American Enterprise Institute, $65K–$85K — Python + R + PostgreSQL + Leaflet + ArcGIS + QGIS + JavaScript + Tableau + Docker. Nine.

A senior candidate looks at the AEI listing and divides $85K by nine tools. A junior candidate looks at it and counts the tools they don't yet have. Both groups skip. The req isn't filtering for the right candidate — it's filtering out everyone.

The fix is a separator most JDs don't have: split required to do the job day one from nice to have over the first year. If the role genuinely needs nine tools at $85K, the title and band are wrong, not the tool list. Our analysis of which skills actually justify which pay bands is the closest thing to a calibration tool — read it before you publish your next stacked req.

3. Vendor-stack overlap

Forty-six postings in our DB require both ArcGIS and QGIS as named skills. Eight list ArcGIS and ArcGIS Pro as separate required skills. The pattern reads, to a candidate, as one of two things: either the team genuinely runs dual stacks (rare and worth explaining) or HR copied every tool the team has ever used into a single requirements list.

Real teams pick a stack. If you're an Esri shop, say so. If you genuinely use both because Esri runs production maps and QGIS handles ad-hoc field analysis, write that — the why matters. Listing both with no context tells the candidate HR doesn't know what the team uses.

The five-minute action: open the req. For every named tool, write the name of the person on the team who'd onboard the new hire on it. If that column has blanks, the tool isn't a real requirement — it's wishlist. Strip anything that hasn't been touched in the last six months, and anything used by only one person on a five-person team.

4. Title-mismatch

Of the 311 non-senior "Analyst / Specialist / Technician / Coordinator" postings in our DB, 22 — about 7% — require ten or more total skills. The titles are saying "junior individual contributor." The skills are saying "senior engineer." The salary band is usually saying "junior."

The clearest example: a composite "GIS Specialist / GIS Analyst / GIS Coordinator" posting at the City of Stuart, Florida, banded at $55,827–$89,336, requiring JavaScript and Python. Posting one req under three different titles is itself the tell — HR doesn't know what they're hiring, and the candidate has no idea which job they'd actually be doing.

The fix runs in both directions. If the role really needs an engineer-level stack, give it an engineer-level title and band — and you'll attract engineers. If the budget is genuinely $70K, prune the stack to what a $70K analyst can deliver. The thing you can't do is keep all three (junior title, senior stack, junior pay) and expect anyone to apply.

Our GIS job titles taxonomy is what your candidates use to translate ambiguous titles into expected scope. If your title doesn't match what that taxonomy says it should, candidates will either skip or come in misaligned on level.

5. Credential-pile

166 of 1,366 postings (12%) say "Master's preferred." Most concentrate in federal contracting, NGO, and academic-adjacent roles. Layer that on top of an experience floor and a low salary cap and you get a credential pile that nobody in the actual labor market satisfies.

In our DB, 7% of entry-level postings (10 of 140) demand three or more years of experience in the description body. Six demand five-plus years. These aren't entry-level positions. They're senior reqs with an entry-level cap, and every senior candidate who reads them sees that immediately.

(GISP "required" turns out to be rarer than the legend suggests — only 21 postings mention it at all. The 2026 credential pile is Master's + experience-years + low band, not GISP.)

The fix: pick one bar. Master's or five years of experience or a specific credential. Not all three at $70K. The federal civilian contracting space, in particular, has muscle memory for stacking every nice-to-have into "required" because it lets the contracting officer disqualify candidates faster — that filter is downstream of the apply-rate problem you're trying to solve.

6. Poison phrases

The 2014 vocabulary is dead. Across 1,366 GIS postings, "rockstar" appears in zero. "Ninja" in zero. "Wear many hats" in effectively zero. "Unicorn" in two. The poison phrases now wear softer clothes:

  • "Passionate" — 283 postings (20.7%). Reads to experienced candidates as "we'll pay below market because you'll love this work."
  • "Family" — 200 postings (14.6%). Reads as "weekends and after-hours messages are normal."
  • "Fast-paced" — 120 postings (8.8%). Reads as "understaffed."
  • "Self-starter" — 47 postings (3.4%). Lower-prevalence than the others but higher-signal: it almost always means "no onboarding, no mentorship, figure it out."

External JD-language research consistently flags this softer vocabulary as predictive of lower apply rates among experienced candidates — the Gaucher, Friesen & Kay (2011) study indexed by the Harvard Kennedy School Gender Action Portal is the canonical reference for how loaded adjectives narrow the applicant pool. The pattern isn't unique to GIS, but the phrases land harder in a small industry where every senior candidate has already worked at the kind of place that uses them.

The fix is specificity. "Deep curiosity about urban hydrology" beats "passionate." "Quarterly project cycles with public deadlines" beats "fast-paced." "Comfortable owning the ETL workstream end-to-end" beats "self-starter." The replacements are concrete behaviors. The originals are mood lighting.

The five-minute action: find/replace "passionate," "fast-paced," "family," and "self-starter" in your draft. For each hit, write the concrete behavior you actually mean. If you can't, the line wasn't load-bearing — delete it.

7. Invisible-employer

145 postings in our DB (10.6%) come from companies whose names match staffing-shell patterns — names ending in "Solutions," "Consulting," "Staffing," "Partners," "Talent." A single staffing firm in our dataset accounts for 75 GIS reqs on its own — 5.5% of the entire DB — and the next four staffing-shell employers add another 60 between them. The pattern is concentrated, not distributed.

When a senior candidate Googles the company, they get another req. No team page. No project portfolio. No engineering blog. No public hires on LinkedIn that say "I work on the X team at Y." For a federal-contract pass-through this is structural — the staffing firm legitimately can't name the end client until contract award. But the listing has to compensate for the trust the company name doesn't carry.

The fix, for staffing firms and unrecognized brands: name the program even if you can't name the client ("Federal civilian agency, geospatial intelligence portfolio"), name the team's public work where one exists, and name a real contact (a human, with a title, on LinkedIn). ATS-only contact plus zero context plus an unrecognized name equals automatic skip from senior candidates. If the company name doesn't carry the req, the req has to carry itself — and most don't.

An eighth pattern our database can't fully see: Location-bait

We didn't number this one with the seven above because our DB only catches its outline, not its body — 196 postings (14.3%) are tagged "Hybrid" but only four explicitly say "5 days" or "in office daily" in the body, and 181 (13.2%) are tagged "Remote" but only one mentions a state-residency restriction. The bait happens at the recruiter screen, not in the JD, which is exactly why a tag-level scan undercounts it.

Recurring threads in r/gis describe the same shape repeatedly: candidate applies to "Hybrid," gets to phone screen, learns it's five days onsite "for the first six months," candidate withdraws. If your role is onsite, write onsite. If "remote" only means residents of one state, write that. The candidate finds out at the screen anyway. Surfacing it in the JD costs you the candidates who weren't going to take the role; hiding it costs you their referral and their LinkedIn opinion of your company too.

The 30-second skim test

Print your req. Read it for 30 seconds. Cover the first half of every line — what tools jump out? Cover the company name — what does the rest tell you? Look for the salary number — how long did it take to find?

This is the test your candidates run, except they're doing it on a phone screen between meetings, and they have a list of twelve other reqs to skim after yours.

The seven patterns aren't separate failures — they cluster. The req that has invisible-comp usually also has stack-overload and a credential pile. The req that has the staffing-shell employer usually also has location-bait. Fix one pattern and you'll move the apply rate. Audit all seven before posting and you'll stop running the experiment one req at a time.

What to do about the candidate side

The people you want already have jobs and aren't reading job boards. You can fix every pattern in the seven above and still have an open req, because the next move isn't a different post — it's a different channel.

If you'd rather see the candidates than wait for them to find you, browse the GEO CAREERS Resume Book — a curated pool of GIS professionals you can filter by skills, location, and seniority, then reach out to directly. This solves the channel problem, not the JD problem: even when you reach out directly, the candidate clicks through to your req before replying, and the seven patterns above still decide whether they reply at all.

If you'd rather post a role, /employers/job-posts/ is where that lives. But the patterns above apply there too — fix the req before you post it.

Get the free GIS Career Roadmap

Subscribe for weekly GIS jobs + career insights, and get our career roadmap — 3 tracks from entry to senior with salary data.