Skip to content
Methodology

How a RevOps job description gets its two scores

Two scores, 0–100Parser: OpenAI gpt-4o-miniCurrent record: n = 1,451, last collected 22 April 2026

Each posting gets two readings from 0 to 100. A language model assigns both against fixed bands and has to write down why. This page is the contract behind every figure on the dashboard.

The two scores

Franken-Stack

How disconnected is the tool stack this one role is asked to hold together? Higher is worse.

Reads
The tools named, overlap between them, and whether the posting mentions integration, a data model, or a system of record.
Raises it
More tools, two tools doing the same job, no integration plan, “manage all platforms” language.
Lowers it
Few tools, one CRM as the clear system of record, a named warehouse or integration approach.

Unicorn JD

How many distinct jobs is this posting, and is the title honest about it? Higher means less hireable as written.

Reads
The skill categories the role spans (not its tool count), the title, the reporting line, and team support.
Raises it
More skill categories, admin mixed with strategy or engineering with enablement, a junior title with senior scope, “own everything” with no team.
Lowers it
One or two skill categories, a clear reporting line, a scope one person can do.

Franken-Stack bands

10–25Clean stack1–3 tools, a single CRM, clear architecture.
25–45Moderate4–6 tools, some overlap, basic integration mentioned.
45–65Messy7–10 tools, competing categories, no clear integration strategy.
65–85Chaotic11–15 tools, multiple overlaps, migration or consolidation language.
85–100Extreme15+ tools, no integration mentioned, “manage all platforms” language.

The tool counts are heuristics for the model, not a formula. A 6-tool posting with two CRMs and no integration plan should land higher than a 6-tool posting with one CRM and a named warehouse.

Unicorn JD bands

10–25Focused1–2 skill categories, clear reporting line, realistic scope.
25–45Broad but reasonable3 skill categories.
45–65Overloaded4–5 categories, mixing admin with strategy, or engineering with enablement.
65–85Unicorn territory5–6 categories, junior title with senior scope, or “own everything” language.
85–100Impossible6+ categories: one person asked to be an entire department.

Skill categories, not tools, drive this score. The prompt notes that most RevOps roles span three to five of the eight categories. Mixing admin with strategy, or engineering with enablement, counts as overload even at four or five.

Low versus high

Two constructed postings, written to show how the bands apply. They are not rows from the record.

Low on both

Revenue Operations Analyst. Maintain Salesforce reports and dashboards, support the quarterly forecast, keep pipeline data clean. Reports to the Head of RevOps.
Tools
One (Salesforce), a single CRM
Skill categories
admin, analytics
Franken-Stack
10–25, Clean stack
Unicorn JD
10–25, Focused: two categories and a clear reporting line
Red flags
None

High on both

RevOps Manager, first hire. Own Salesforce and HubSpot, Outreach and Salesloft, ZoomInfo, Clay, Marketo, Zapier, Tableau, Gong, and our CPQ. Build the integrations, run rep enablement, design territories, and present the forecast to the board. Manage all platforms.
Tools
Eleven, with two CRMs and two engagement platforms
Skill categories
admin, engineering, enablement, strategy, analytics, leadership
Franken-Stack
65–85, Chaotic: 11–15 tools, multiple overlaps
Unicorn JD
65–85 or higher: six categories and “own everything” with no team
Red flags
tool_hoarding, no_architecture, role_overload, solo_operator

What the scores are not

  • Not a vendor ranking. The scores read job descriptions. They say nothing about whether a tool is good.
  • Not a closed-form formula. There is no score = 5 × tool count. A model assigns each score against the bands and must cite evidence from the posting in a written rationale.
  • Not Claude. The parser calls OpenAI gpt-4o-mini. An n8n node still carries an older name; see For the record.
  • Not a verdict on a company. An employer’s average is the average of the postings it published in the record, nothing more.
  • Not real-time. The record grows when the daily pipeline adds postings. The dashboard shows the date of the newest posting in it.

If a number cannot be traced back to a rationale, it should not be quoted.


The contract

What gets scored, and what gets counted

Before the model

  • Quality gate: the description must be at least 200 characters. Shorter rows never reach the model.
  • Duplicates are dropped before parsing.

What the model returns

  • relevant: postings with no operations connection come back false and are dropped.
  • Two integers, frankenstack_score and unicorn_jd_score, plus scoring_rationale citing the posting. The prompt tells the model to use the full range and not cluster around 50–70. The write step stores a finite number or null; it does not rescale.
  • tools_mentioned: every named tool, plus generics such as “CRM (unspecified)” when a posting asks for CRM experience with no vendor. tool_count is the length of that list. The prompt notes that a typical RevOps posting mentions 5–12 tools and asks the model to re-read if it finds fewer than 3. That is an extraction instruction, not a floor on the score.
  • skill_categories from the eight below, red_flags from the six below, and each tool filed under exactly one of the eleven tool categories.

What the dashboard counts

Figures on the dashboard come from materialized views over the current job_postings table. A posting is counted when it is marked relevant, its description is longer than 200 characters, its Franken-Stack is above 0, it names at least one tool, and it has a linked company. Postings from 16 job boards are excluded by name: Lensa, Jobs via Dice, myGwork, RemoteHunter, Crossover, Ladders, Jobot, Dice, CyberCoders, Patterned Learning AI, Patterned Learning Career, Motion Recruitment, Harnham, RemoteWorker UK, Talent.com, SimplyHired. Today that leaves 1,451 scored postings, the newest collected 22 April 2026.

The employer views keep only names with two or more postings. Recruiters and boards that are not on the exclusion list stay in the data; the dashboard lists them apart from employers.

The eight skill categories

The only values the model may use. Their count drives Unicorn JD. Descriptions are plain-language glosses.

  • adminConfiguring and maintaining systems: fields, permissions, page layouts, data hygiene.
  • analyticsReporting, dashboards, forecasting, and analysis of funnel or revenue data.
  • engineeringBuilding integrations, writing code or SQL, automation that needs a developer’s hands.
  • strategyGo-to-market planning, territory and quota design, pricing or packaging input.
  • process_designDesigning lead routing, deal stages, handoffs, and the rules between teams.
  • enablementTraining reps, writing playbooks, onboarding people onto tools and process.
  • project_managementRunning implementations, migrations, and cross-team rollouts.
  • leadershipManaging people, owning budget, reporting to the executive team.

The six red flags

A multi-select from a fixed list; the model includes every one that applies. They are labels, not extra points, and should appear in the rationale when they fire.

  • role_overloadThe seat mixes functions that are usually separate teams (admin + strategy + engineering in one JD).
  • comp_mismatchScope and seniority do not match stated pay, or pay is missing on a senior/lead seat.
  • no_architectureMany tools named, no data model, integration strategy, or system-of-record language.
  • tool_hoardingOverlapping tools in the same category (two CRMs, two engagement platforms) without a consolidation plan.
  • solo_operator“You will own” language with no team, budget, or reporting support.
  • vague_scopeNo reporting line, no success metric, and a scope that could mean anything.

The eleven parser tool categories

The keys in the JSON the model returns. One tool, one key. The stack map shows twelve categories instead: it splits out ABM & Intent and Conversational for browsing, and has no page for other.

Dashboard tiers and colors

The dashboard groups postings into four tiers per score. The cutoffs are fixed in the database view, and they are not the scoring bands:

  • Franken-Stack tiersMinimal below 35 · Low risk 35–49 · Moderate risk 50–64 · High risk 65 and up
  • Unicorn JD tiersFocused below 40 · Reasonable 40–59 · Stretched 60–74 · Unicorn 75 and up

So a posting with a Franken-Stack of 62 is “Messy” on the scoring band (45–65) and “Moderate risk” on the dashboard (50–64). Tiers are shaded on one blue scale, light to dark as the tier rises. The headline figures carry no color verdict; next to each average the dashboard names the scoring band it falls in.


For the record

Pipeline details

  1. 01Schedulen8n, daily at 07:00 Berlin
  2. 02CollectApify LinkedIn job search
  3. 03CleanNormalize, merge, dedupe, quality gate
  4. 04Parse and scoreOpenAI gpt-4o-mini, JSON output
  5. 05StoreSupabase job_postings
  6. 06AggregateRefresh the dashboard views
  7. 07PublishThis site re-reads the views at most every 30 minutes
  • The n8n workflow runs daily at 07:00 Europe/Berlin. It writes new rows to job_postings, then refreshes the dashboard views. This site re-reads the views at most every 30 minutes, so a new run shows up shortly after the refresh.
  • Node order in the workflow: Apify (LinkedIn job search) → normalize → merge → dedupe → quality gate (description ≥ 200 characters) → parser → write to Supabase.
  • The parser node is still named “Claude Parser” from an earlier version. It calls OpenAI gpt-4o-mini at temperature 0.1 in JSON mode. A small set of early rows carry parse_model = claude-sonnet-4 from that first version.
  • The write node allowlists the source values adzuna, serpapi, wttj, wellfound, glassdoor, and manual. Not all of them are wired as fetch nodes; in the current record, almost every scored posting comes from LinkedIn.
  • The dashboard reads mv_dashboard_overview, mv_dashboard_regions, mv_dashboard_seniority, mv_dashboard_remote, mv_dashboard_companies, mv_dashboard_score_tiers, and the function get_tool_distribution, all built on mv_analysis_ready. Reads use the public anonymous key.
  • Regions come from the parsed location, with a fallback on the country code in the raw location. Postings in NL, FR, IE, ES, IT, BE, and PT are stored under EU_remote.