Product Requirements Document

JobSignals

The canonical dataset for job market intelligence — aggregating, enriching, and serving hiring signals as a reusable data product.

Version
1.0 — Draft
Date
2026-03-13
Type
Data Product
Domain
Labor Markets
MVP Target
W10 from Kickoff
Status
In Review
1

Product Overview

JobSignals is a reusable, governed data product that ingests job postings from multiple sources — LinkedIn, Indeed, YC Jobs, and company career pages — and transforms raw listings into a structured, enriched, and queryable dataset. It surfaces hiring trends, skill demand signals, salary benchmarks, and company hiring velocity for a broad range of downstream consumers.

Core Principle
JobSignals is not a job board. It is an intelligence layer built on top of job markets. The output is a set of curated, versioned datasets and APIs that any team can build on without re-solving data collection, cleaning, or normalization.

Core Outputs

Output TypeDescription
Canonical DatasetNormalized job postings, deduplicated and enriched across all sources
Signals DatasetDerived aggregations: skill trends, salary bands, company hiring velocity
REST + GraphQL APIProgrammatic access to raw and derived datasets with versioned contracts
Embedded DashboardsPre-built visualizations for non-technical consumers
Data Catalog EntryDiscoverable, documented, versioned entry in the internal data catalog
2

Problem Statement

The Core Problem

Job market data is fragmented, noisy, and inaccessible as a reusable asset. Today, any team that wants to answer a question like "Which ML skills are companies hiring for most in Q1 2026?" has to manually scrape or purchase data, spend weeks cleaning it, build bespoke pipelines, and produce an answer that goes stale within days.

This work is being done redundantly — by bootcamps building curriculum, by VCs doing diligence, by job seekers benchmarking salaries, and by HR teams setting headcount budgets. Each consumer solves the same underlying data problem independently, with no shared standard or infrastructure.

Consequences

  • Wasted engineering effort: Every consumer rebuilds the same extraction and normalization logic
  • Low data quality: One-off scrapes lack deduplication, standardized taxonomy, or historical depth
  • Stale intelligence: Without continuous pipelines, job market signals decay within days
  • No shared language: Skill names, job titles, and company identifiers are inconsistent across sources
The Solution
A governed, reusable data product solves this once, centrally. JobSignals becomes the single authoritative source for job market data — maintained with clear ownership, documented contracts, versioned schemas, and accessible via APIs.
3

Market Opportunity

Total Addressable Market

SegmentExample PlayersRelevant TAM
Talent Intelligence PlatformsLightcast, Burning Glass, TalentNeuron~$3B
HR Analytics & Workforce PlanningVisier, Workday, Eightfold~$5B
Recruiting & Sourcing ToolsLinkedIn Recruiter, Greenhouse~$8B
Education & UpskillingCoursera, Lambda, Springboard~$10B
Economic Research & PolicyGovernment, academia, think tanksNon-commercial

Why Now

  • LLM-native tools have dramatically lowered the cost of parsing unstructured job descriptions into structured data
  • The rise of Data Mesh architecture has increased organizational appetite for owned, governed data products
  • Real-time labor market intelligence has become a strategic asset as hiring cycles compress and skills shift rapidly
4

Target Users & Personas

Persona Map

PersonaRolePrimary NeedTech LevelAccess Mode
Career NavigatorIndividual job seekerBenchmark salary; understand in-demand skillsLowDashboard
Talent StrategistIn-house recruiter / TA leadPipeline health, competitor hiring activityMediumDashboard + API
Curriculum ArchitectBootcamp / edtech PMIdentify skill gaps to build courses aroundMediumDataset + API
Workforce AnalystHR analytics / people opsHeadcount planning, attrition risk benchmarkingHighAPI + raw dataset
Investment AnalystVC / PE analystHiring velocity as proxy for company growthMediumAPI + Dashboard
Labor EconomistAcademic / policy researcherLongitudinal skill demand and wage trendsHighRaw dataset + bulk export

Persona Deep Dives

Career Navigator
Individual Job Seeker
"I'm transitioning from backend to ML. Which skills should I prioritize to maximize offers and salary?"
Pain:Advice is anecdotal; no structured view of skills vs. comp
JTBD:Ranked view of high-demand ML skills, filtered by location
Success:Makes learning investment based on real signal, not Reddit
Talent Strategist
In-house Recruiter / TA Lead
"We're hiring 12 senior data engineers. How hot is the market and what compensation is competitive?"
Pain:Manually monitors competitor boards; no unified market view
JTBD:Track competitor hiring, benchmark JD requirements, set comp
Success:Reduces time-to-offer using market benchmarks not intuition
Curriculum Architect
Bootcamp / EdTech Product Manager
"We're redesigning our data engineering bootcamp. What do employers actually want right now?"
Pain:Curriculum changes are slow; demand shifts faster than response
JTBD:Quarterly ranked list of in-demand skills by role from live postings
Success:Placement rates improve; curriculum anchored to employer demand
Investment Analyst
VC / PE Firm Analyst
"We're doing diligence on a Series B. Does their hiring velocity match their claimed growth?"
Pain:Pieces together hiring patterns manually from LinkedIn
JTBD:Pull hiring velocity, role composition, skill investment patterns
Success:Hiring data becomes a diligence input alongside revenue metrics
5

Key Use Cases

IDUse CasePrimary PersonaPriorityMVP
UC-01Salary benchmarking by role, location, company stageCareer NavigatorP0Yes
UC-02Skill demand ranking by role and time periodNavigator, CurriculumP0Yes
UC-03Company hiring velocity trackingTA Lead, VC AnalystP0Yes
UC-04JD requirements comparison across companiesTalent StrategistP1No
UC-05Longitudinal skill trend analysis (12–24 months)Economist, CurriculumP1No
UC-06Remote vs. on-site distribution by role/industryCareer NavigatorP1No
UC-07Competitor hiring pattern alertsTalent StrategistP2No
UC-08New role emergence detectionEconomist, VC AnalystP2No
UC-09Bulk dataset export for model trainingResearcherP2No
6

Data Product Definition

This section defines JobSignals according to Data Mesh and data-as-a-product principles.

Product Identity

AttributeValue
Product NameJobSignals
DomainTalent & Labor Markets
Owner (Team)Data Platform — Market Intelligence Squad
Product TypeSource-aligned + Aggregated Data Product
Output PortsREST API, GraphQL API, Data Warehouse (BigQuery/Snowflake), Dashboard embed
SLA TierTier 2 — 99.5% uptime, 24h freshness (standard); 1h freshness (premium)
Schema VersioningSemantic versioning (MAJOR.MINOR.PATCH); breaking changes require MAJOR + 90-day deprecation
Data Catalog Entryjobsignals.v1 — discoverable via internal data catalog

Data Product Contracts

Contract 1 — Core Job Postings Dataset
Schema stability guaranteed for 12 months on MINOR versions. Freshness SLA: ingested within 24 hours of source publication. Completeness SLA: ≥95% of required fields populated.
Contract 2 — Signals Aggregations Dataset
Updated daily at 06:00 UTC. Covers rolling 90-day, 12-month, and all-time windows. Skill taxonomy pinned to versioned ontology skills_taxonomy.v2.
Contract 3 — API
Versioned under /v1/, /v2/ etc. Backward-compatible changes do not bump major version. Deprecation notices minimum 90 days before any breaking change.

Ownership Model

RoleResponsible PartyResponsibilities
Product OwnerPM, Market IntelligenceRoadmap, prioritization, consumer onboarding
Data Engineer LeadPlatform EngineeringPipeline reliability, freshness SLA
Data StewardAnalytics EngineeringSchema design, taxonomy governance, quality checks
Security & PrivacyData Governance TeamPII handling, scraping compliance review
API OwnerBackend EngineeringAPI versioning, rate limiting, auth
7

Data Sources

Source Registry

SourceTypeMethodCadenceCoverage
LinkedIn JobsPublic job boardOfficial API + structured crawlEvery 6hGlobal, all industries
IndeedPublic job boardStructured crawl (robots.txt compliant)Every 6hGlobal
YC JobsCurated startup boardHTML scrape + RSSDailyUS startups
Company Career PagesCompany-ownedTargeted crawl (tier-1 list)DailyConfigurable
Glassdoor Salary DataSalary intelligenceData partnership / crawlWeeklyGlobal
BLS / O*NETGovernment dataPublic APIMonthlyUS occupational
HN "Who's Hiring"Community threadHTML parseMonthlyTech-focused

Source Tiering

TierSourcesSLA TreatmentFallback
Tier 1 — CoreLinkedIn, IndeedFailure alert within 15 minCached last-known-good dataset
Tier 2 — EnrichmentYC Jobs, Career Pages, GlassdoorFailure alert within 1 hourExcluded from that ingestion cycle
Tier 3 — SupplementalBLS, HNBest effort, batchNo fallback required
Legal & Compliance
All scraping must respect robots.txt and rate-limit to avoid DoS. No PII (recruiter names, poster identities) will be stored. LinkedIn and Indeed ToS restrict commercial scraping — data partnership agreements should be pursued for Tier 1 sources as the product scales.
8

Data Model

Entity Relationship Overview

job_postings (raw → normalized)
    │
    ├── job_skills (extracted from description)
    ├── job_salaries (extracted / inferred)
    └── companies (resolved entity)
            │
            └── company_signals (aggregated per company)
                        │
                        └── skill_trends (time-series aggregations)

Core Table: job_postings

ColumnTypeDescriptionNullable
job_idSTRING (UUID)Globally unique identifier (JobSignals-assigned)No
source_platformENUMlinkedin | indeed | yc_jobs | career_page | otherNo
title_rawSTRINGJob title as posted, unmodifiedNo
title_normalizedSTRINGMapped to JobSignals title taxonomyNo
title_familySTRINGRole family: Engineering, Data, Product, Design…Yes
company_idSTRING (FK)Reference to companies.company_idNo
location_citySTRINGParsed cityYes
location_countrySTRINGISO 3166-1 alpha-2Yes
work_modalityENUMremote | hybrid | onsite | unspecifiedNo
seniority_levelENUMintern | junior | mid | senior | staff | principal | executiveYes
salary_minINTEGERMinimum salary (USD, annualized)Yes
salary_maxINTEGERMaximum salary (USD, annualized)Yes
salary_sourceENUMposted | inferred | glassdoor_enrichmentYes
posted_atTIMESTAMPDate/time of original postingNo
ingested_atTIMESTAMPDate/time JobSignals first ingested itNo
is_activeBOOLEANWhether the listing is currently liveNo
dataset_versionSTRINGJobSignals schema version at ingest timeNo

Core Table: job_skills

ColumnTypeDescription
skill_idSTRING (UUID)Unique row ID
job_idSTRING (FK)Reference to job_postings
skill_nameSTRINGCanonical skill name (from taxonomy)
skill_categoryENUMtechnical | soft | domain | tool | certification
is_requiredBOOLEANRequired vs. preferred
extraction_methodENUMrule_based | llm_extracted | manual
confidence_scoreFLOAT0.0–1.0 extraction confidence

Derived Table: skill_trends

ColumnTypeDescription
skill_nameSTRINGCanonical skill name
title_familySTRINGRole family filter (optional grouping)
periodDATEStart of the aggregation window
windowENUM7d | 30d | 90d | 365d
posting_countINTEGERPostings requiring this skill in window
posting_shareFLOAT% of all postings in context requiring skill
mom_changeFLOATMonth-over-month change in posting_share
yoy_changeFLOATYear-over-year change in posting_share
Wireframe — Entity Relationship Diagram
JobSignals — Data Model
job_postings job_idPK UUID company_idFK title_normalized seniority_level work_modality salary_min / max posted_at job_skills skill_idPK job_idFK skill_name skill_category confidence_score companies company_idPK company_name industry company_stage employee_count_range skill_trends skill_name period + window posting_share mom_change company_signals company_idFK hiring_velocity_score total_postings top_skills[] aggregates to aggregates to
9

Data Pipeline Architecture

┌──────────────────────────────────────────────────────────────┐
│                      SOURCE LAYER                             │
│  LinkedIn  │  Indeed  │  YC Jobs  │  Career Pages  │  BLS    │
└──────────────────────┬───────────────────────────────────────┘
                        │ HTTP / API / RSS
                        ▼
┌──────────────────────────────────────────────────────────────┐
│                   INGESTION LAYER (Airflow)                    │
│  ├── Source adapters (Python, async, per-source)              │
│  ├── Rate limiting + retry with exponential backoff           │
│  └── Raw landing zone → GCS / S3 (Bronze / partitioned)      │
└──────────────────────┬───────────────────────────────────────┘
                        │
                        ▼
┌──────────────────────────────────────────────────────────────┐
│              TRANSFORMATION LAYER (dbt on BigQuery)           │
│  ├── Deduplication (fingerprint + LSH near-duplicate)         │
│  ├── Normalization (title taxonomy, company resolution)       │
│  ├── Skill extraction (LLM pipeline + rule-based fallback)    │
│  ├── Salary parsing + currency normalization                  │
│  └── Aggregations → skill_trends, company_signals            │
└──────────────────────┬───────────────────────────────────────┘
                        │
                        ▼
┌──────────────────────────────────────────────────────────────┐
│                    SERVING LAYER                              │
│  ├── Data Warehouse (BigQuery) — Analytics consumers          │
│  ├── Operational DB (PostgreSQL) — API backend                │
│  ├── Search Index (Elasticsearch) — Faceted search            │
│  └── Cache (Redis) — Hot path API responses                   │
└──────────────────────┬───────────────────────────────────────┘
                        │
             ┌──────────┴──────────┐
             ▼                     ▼
       REST / GraphQL          Dashboard
            API               (Metabase /
         (FastAPI)              Superset)

Pipeline Stage Summary

StageToolOwnerSLA
Crawling & ingestionPython + Playwright + AirflowData Engineering< 1h per source cycle
Raw storage (Bronze)GCS / S3 (partitioned by source + date)Data EngineeringDurable; no query SLA
Deduplicationdbt model stg_job_postings_dedupedAnalytics EngineeringDaily
Normalizationdbt + external enrichment APIsAnalytics EngineeringDaily
Skill extractionLLM micro-service (Claude API, batch)ML PlatformDaily
Aggregationsdbt incremental modelsAnalytics EngineeringDaily by 06:00 UTC
Serving DB syncAirbyte / custom sync jobData EngineeringHourly
APIFastAPI on GKE / Cloud RunBackend Engineering99.5% uptime

Deduplication Strategy

Job postings are duplicated across sources frequently. JobSignals uses multi-signal fingerprinting:

  1. Exact match: (company_id, title_normalized, location_city, posted_at_date) — strongest signal
  2. Near-duplicate: Locality-sensitive hashing (LSH) on description_cleaned — catches reposts with minor edits
  3. Cross-source linking: If source URLs differ but fingerprint matches, merge into canonical record with an array of originating sources
Wireframe — Skill Extraction Sub-Pipeline
Skill Extraction Flow
description _cleaned Rule-based keyword match High confidence > 0.85 → insert direct Ambiguous send to LLM Claude API structured output → job_skills taxonomy-mapped
10

API Design

Design Principles

  • RESTful with resource-oriented URLs; GraphQL endpoint for flexible consumer queries (Phase 3)
  • All responses return JSON with consistent envelope: { data, meta, errors }
  • Pagination: cursor-based for large result sets, offset-based for fixed queries
  • Authentication: API key (external) + service account JWT (internal)
  • All timestamps in ISO 8601 UTC
Base URL
https://api.jobsignals.io/v1/

Endpoint: GET /v1/jobs

// Search and filter job postings
// Query params: q, title_family, company_id, location, modality,
//   seniority, salary_min, posted_after, skills[], page_size, cursor

// Response 200
{
  "data": [{
    "job_id": "jb_01HXYZ...",
    "title_normalized": "Senior Data Engineer",
    "company": {
      "company_name": "Stripe",
      "industry": "Fintech",
      "company_stage": "public"
    },
    "location": { "city": "San Francisco", "modality": "hybrid" },
    "seniority_level": "senior",
    "salary": { "min": 180000, "max": 240000, "currency": "USD" },
    "skills": ["Apache Spark", "dbt", "Python", "Kafka"],
    "posted_at": "2026-03-10T14:22:00Z"
  }],
  "meta": { "total_count": 4820, "next_cursor": "eyJqb2Ii..." }
}

Endpoint: GET /v1/skills/trends

// Ranked skill demand over time
// Query params: title_family, country, window (7d|30d|90d|365d), limit, order_by

{
  "data": [{
    "skill_name": "dbt",
    "skill_category": "tool",
    "posting_count": 12480,
    "posting_share": 0.34,
    "mom_change": 0.08,
    "yoy_change": 0.31,
    "rank": 1,
    "rank_previous_period": 3
  }],
  "meta": {
    "window": "30d",
    "title_family": "Data Engineering",
    "total_postings_in_scope": 36708
  }
}

Endpoint: GET /v1/companies/{id}/signals

{
  "data": {
    "company_name": "Stripe",
    "window": "90d",
    "total_postings": 143,
    "active_postings": 58,
    "hiring_velocity_score": 82.4,
    "top_skills": ["Python", "Go", "Kubernetes", "PostgreSQL", "dbt"],
    "salary_benchmarks": { "median_min": 170000, "median_max": 230000 },
    "trend": [
      { "period": "2025-12-01", "postings": 38 },
      { "period": "2026-01-01", "postings": 52 },
      { "period": "2026-02-01", "postings": 53 }
    ]
  }
}

Endpoint: GET /v1/salaries/benchmark

{
  "data": {
    "title_family": "Data Engineering",
    "seniority": "senior",
    "country": "US",
    "percentile_10": 140000,
    "percentile_25": 165000,
    "percentile_50": 195000,
    "percentile_75": 230000,
    "percentile_90": 270000,
    "sample_size": 2840
  }
}

Error Codes

HTTP StatusCodeDescription
400INVALID_PARAMSMalformed or missing required parameters
401UNAUTHORIZEDMissing or invalid API key
403PLAN_LIMITEndpoint not available on current plan
404NOT_FOUNDResource does not exist
429RATE_LIMITEDRate limit exceeded; Retry-After header included
500INTERNAL_ERRORServer-side error; auto-reported to on-call

Product Wireframes

Wireframe 1 — Skill Demand Dashboard
jobsignals.io/dashboard/skills
JobSignals Overview Skill Trends Companies Salaries Data Engineering ▾ United States ▾ Last 30 days ▾ TOTAL POSTINGS 36,708 ↑ 12% vs last month UNIQUE COMPANIES 4,291 ↑ 8% vs last month MEDIAN SALARY $195k ↔ flat vs last month FASTEST RISING SKILL dbt +31% YoY · Rank #1 ↑ from #3 Top Skills — Data Engineering RANK SKILL SHARE MOM YOY 1 dbt tool 34% +8% +31% 2 Apache Spark tool 29% +3% +14% 3 Python technical 27% +1% +9% 4 Kafka tool 22% -2% +5% 5 Kubernetes tool 19% +4% +18% 6 SQL technical 17% 0% -3% 7 Airflow tool 14% +6% +22% Skill Share Over Time — dbt 40% 30% 20% 10% 0% Sep Oct Nov Dec Jan Feb Mar Mar 2026 34% ↑ +31% YoY
Wireframe 2 — Job Search & Filter
jobsignals.io/jobs?q=data+engineer&modality=remote
JobSignals 🔍 data engineer Remote ▾ Senior ▾ Search Filters TITLE FAMILY Data Engineering Data Science ML Engineering SALARY RANGE $120k — $300k+ SKILLS (required) Python ✕ dbt ✕ COMPANY STAGE Startup (A–C) Growth / Public Enterprise S Senior Data Engineer Stripe · San Francisco, CA · Remote remote senior dbt Python Kafka $180–240k 3 days ago A Data Engineer, Platform Anthropic · San Francisco, CA · Remote remote mid Spark $160–210k 1 day ago L Staff Data Engineer Linear · New York, NY · Remote remote staff $220–290k 5 days ago Showing 1–20 of 4,820 results 1 2 3
Wireframe 3 — Company Signals View
jobsignals.io/companies/stripe
S Stripe Fintech · Public · 5,000+ employees Watch ☆ ACTIVE POSTINGS 58 90-DAY POSTINGS 143 VELOCITY SCORE 82.4 MEDIAN SALARY $200k TOP ROLE FAMILY Backend Eng Hiring Velocity (Monthly) Aug Sep Oct Nov Dec Jan Feb Top Skills Hired For (90 days) Python 85% Go 72% Kubernetes 60% PostgreSQL 50% dbt 40% Kafka 30%
Wireframe 4 — Salary Benchmark Tool
jobsignals.io/salaries?role=data-engineering&seniority=senior
JobSignals Salary Intelligence Role: Data Engineering ▾ Level: Senior ▾ Country: United States ▾ Stage: All Stages ▾ Salary Distribution — Senior Data Engineer · US Based on 2,840 postings (last 90 days) P10 $140k P25 $165k P50 $195k P75 $230k P90 $270k Salary Summary 10th percentile $140,000 25th percentile $165,000 Median (P50) $195,000 75th percentile $230,000 90th percentile $270,000 Sample: 2,840 postings · last 90 days Salary source: posted + inferred
11

Product Features

Feature Registry

IDFeatureConsumerPriorityMVP
F-01Job Search API (filtered, paginated)AllP0Yes
F-02Skill Trends API (ranked demand with trend signals)AllP0Yes
F-03Company Signals API (velocity + patterns)TA, VCP0Yes
F-04Salary Benchmark API (percentile ranges)Seekers, TAP0Yes
F-05Skill Taxonomy Browser UIInternalP1No
F-06Bulk Dataset Export (Parquet / CSV)Researcher, AnalystP1No
F-07Hiring Trend Dashboard (Metabase/Superset)Non-technicalP1No
F-08Company Hiring Alerts (webhook/email)TA, VCP2No
F-09Data Catalog Auto-sync (DataHub/Atlan)InternalP1No
F-10GraphQL APIDeveloperP2No
F-11Embeddings / Semantic Search APIML / DeveloperP2No

Access Tiers

FeatureFreeStandardPremium
Job Search API100 req/day10,000 req/dayUnlimited
Skill TrendsLast 30 daysLast 12 monthsFull history
Company SignalsTop 500 companiesAll companiesAll companies
Salary Benchmarks5 queries/dayUnlimitedUnlimited
Bulk ExportNoNoYes
Webhooks / AlertsNoNoYes
Uptime SLABest effort99.5%99.9% + dedicated support
12

Non-Functional Requirements

Performance

RequirementTargetMeasurement
API P50 latency< 80msMeasured at API gateway
API P99 latency< 400msMeasured at API gateway
Search query P50< 200msElasticsearch response time
Dashboard load time< 3 secondsLighthouse FCP metric
Bulk export generation< 10 minutesRequest to download ready

Availability & Reliability

RequirementTarget
API uptime (Standard tier)99.5% monthly
API uptime (Premium tier)99.9% monthly
Pipeline recovery from failureResume from last checkpoint within 30 min
Data freshness (Standard)All sources ingested within 24 hours
Data freshness (Premium)Core sources within 1 hour

Security

  • All data in transit encrypted (TLS 1.3); at rest (AES-256)
  • No PII stored — recruiter/poster identity stripped at ingestion
  • RBAC for internal warehouse access: read_raw, read_curated, admin
  • API keys rotatable; 90-day audit log of all key usage retained
  • API layer is read-only; no write paths exposed publicly

Observability

SignalTooling
Pipeline healthAirflow / Prefect DAG monitoring + Datadog
Data qualitydbt tests + Great Expectations
API metricsDatadog APM (latency, error rate, throughput)
Freshness alertsdbt freshness checks → PagerDuty
Data lineagedbt lineage graph in DataHub/Atlan catalog
13

Data Governance & Quality

Data Quality Dimensions

DimensionDefinitionTargetHow Measured
CompletenessRequired fields populated≥ 95%dbt: not_null on required fields
FreshnessData age relative to SLA≤ 24h lagdbt freshness check on ingested_at
AccuracyNormalized fields map correctly to taxonomy≥ 98%Manual sample audit (weekly, n=100)
UniquenessNo duplicate job_id in canonical table100%dbt: unique on job_id
ConsistencySame company resolves to same company_id≥ 99%dbt test on entity resolution
ValiditySalary in plausible range; dates parseable≥ 99%dbt: accepted_range on salary fields

Schema Change Management

Change TypeProcess
Add new optional columnMINOR version bump; published to changelog; no consumer action required
Rename or remove columnMAJOR version bump; 90-day deprecation window; both versions served in parallel
Change enum valuesMINOR if additive; MAJOR if removing existing value
Change aggregation logicMAJOR; recomputation of historical values required; changelog explanation
Privacy & Compliance
No PII policy: recruiter names, poster emails stripped at ingestion. Right to erasure: company blocklist suppresses records from all serving paths within 24 hours. Legal review of scraping ToS: quarterly cadence; any source ToS update triggers immediate review before next crawl.
14

Product Metrics

North Star Metric
Weekly Active Dataset Consumers (WADC) — the number of distinct teams or external API consumers that make at least one meaningful query to JobSignals data within a rolling 7-day window. Rewards breadth of adoption; penalizes data products that are built but not consumed.

Supply-Side Metrics (Data Quality)

MetricTargetRationale
Pipeline success rate≥ 99% dailyData product is only valuable if fresh
Data freshness SLA adherence≥ 98%Trust is broken by stale data
Schema test pass rate100%Contract reliability
Skill extraction accuracy≥ 95% (audited sample)Core value depends on extraction quality

Demand-Side Metrics (Adoption)

MetricTarget (EOY)Rationale
Unique API consumers25 teams / accountsBreadth of reuse
API calls per week500KVolume signal
Dataset export downloads / month50Research / bulk usage
Dashboard weekly active viewers200Non-technical reach
Consumer-reported data issues / week< 5Quality perception

Anti-Metrics

  • Number of job postings ingested: Volume ≠ quality. More noise reduces product value.
  • Dashboard pageviews: Vanity metric — does not reflect whether data is informing decisions.
  • Number of data sources: More sources create maintenance burden without proportional signal gain.
15

MVP Scope

MVP Hypothesis
A standardized, governed job postings dataset with a thin API layer will be actively reused by at least 3 distinct consumer teams within 60 days of launch.

MVP Inclusions

ComponentScope
Data sourcesLinkedIn + Indeed only (Tier 1)
GeographiesUnited States only
Role families5: Data Engineering, Data Science, ML Engineering, Software Engineering, Product Management
Refresh cadenceDaily (no intraday updates)
Tables deliveredjob_postings, job_skills, companies, skill_trends
API endpointsGET /v1/jobs, GET /v1/skills/trends, GET /v1/companies/{id}/signals, GET /v1/salaries/benchmark
AuthAPI key only
Dashboard1 pre-built Metabase dashboard: Skill Demand Overview
Data catalogManual entry (no automated sync)
Consumer supportOffice hours + Slack channel #jobsignals-users

MVP Timeline

MilestoneWeekDeliverable
Kickoff + source contractsW1LinkedIn / Indeed crawl access confirmed
Bronze pipeline liveW2–W3Raw data landing in GCS; DAGs running
dbt models + canonical datasetW4–W5job_postings, job_skills, companies populated
Skill extraction pipelineW5–W6LLM extraction running; job_skills validated
API v1 (core endpoints)W6–W74 endpoints live; auth working
Aggregations + trendsW7skill_trends, company_signals daily refresh live
Internal soft launchW82 pilot teams onboarded; feedback collected
Dashboard liveW9Metabase dashboard published
GA launchW10Announced to internal consumers; catalog entry published

MVP Success Criteria

  • ≥ 3 distinct internal teams making regular API queries by day 30 post-launch
  • Pipeline success rate ≥ 98% in first 30 days
  • Zero P0 data quality incidents (schema breaks, widespread nulls in required fields)
  • Consumer NPS ≥ 30 in post-launch survey (n ≥ 10)
16

Risks & Mitigation

IDRiskLikelihoodImpactMitigation
R-01 LinkedIn/Indeed blocks scraping via ToS or IP blocking High High Pursue official data partnerships; proxy rotation + rate limiting; adapter layer makes source swappable
R-02 Skill extraction quality too low, degrading trust Medium High Ship rule-based extraction first; use LLM as enrichment layer; publish confidence scores for consumer filtering
R-03 Consumer adoption lower than expected; teams build their own Medium High Onboard 2 pilot teams pre-GA; invest in consumer DX (docs, office hours, Slack); tie roadmap to feedback
R-04 Salary data too sparse to be statistically meaningful High Medium Suppress benchmarks below n=30; show confidence intervals; add Glassdoor enrichment post-MVP
R-05 Schema churn creates breaking changes for consumers Low High Enforce semantic versioning strictly; schema change review in weekly governance meeting; 90-day deprecation window
R-06 LLM extraction costs scale non-linearly with volume Medium Medium Batch processing (not real-time); cache results; rule-based pre-filter reduces LLM call volume by 60–70%
R-07 PII inadvertently captured from career pages / niche sources Low High PII scan step in ingestion pipeline (regex + model-based); never store; legal review for all new source types
17

Future Roadmap

PhaseTimelineKey Deliverables
MVP Now → Month 2.5 US-only · LinkedIn + Indeed · 4 API endpoints · Daily refresh · 1 dashboard
Phase 2 — Expansion Month 3–6 EU + APAC geographies · YC Jobs + career pages · Bulk export · GraphQL API · Glassdoor salary enrichment · Data catalog auto-sync
Phase 3 — Intelligence Layer Month 6–12 Emerging Skills Detector · Company Growth Score · Role Evolution Tracking · Intraday refresh (1h SLA for premium) · Alerts API
Phase 4 — Platform Month 12–18 External API launch (tiered pricing) · Self-serve data catalog · Embeddings API · Custom report builder · Data sharing partnerships

Visual Timeline

MVP Now US · 2 sources 4 APIs · Daily Phase 2 Month 3–6 EU/APAC · 5+ sources Bulk export · GraphQL Phase 3 Month 6–12 Intelligence layer Growth score · Alerts Phase 4 Month 12–18 External API Self-serve · Embeddings

Document Owner: [Product Owner Name]  ·  Last Reviewed: 2026-03-13  ·  Next Review: 2026-04-13
Questions: #jobsignals-team (Slack)  ·  jobsignals-pm@[company].com