Track employer hiring demand and investment priorities through daily and weekly posting totals and classified dimensions.
Supported classified observations reconcile to directly observed company totals over compatible coverage. Filled company active totals do not imply reconstructed breakdowns. Compatible classifier, taxonomy and rule-set identities make methodology changes traceable.
Daily collection and purpose-built classification
Hiring demand is observed directly from employer career sites and refreshed each day rather than assembled from third-party posting aggregators.
SoftwareIQ captures openings directly from covered employers and maintains daily and weekly hiring histories.
For new postings, zero means a valid comparison found no additions. Null means the comparison is unavailable. Active-posting counts can remain available while a new-posting comparison restarts.
Collection events and baseline metadata identify changes that affect period comparability. These controls help separate shifts in source coverage from changes in employer demand.
Classifications cover software-industry functions, commercial roles, customer success, segments and geographies.
Commercial-role classifications distinguish sales investment across the supported role categories.
Company-specific taxonomies attribute product, engineering, and GTM roles to disclosed products, initiatives, motions, and customer relationships.
The purpose-built SI tracker assembles hiring across major global systems integrators and Big Four firms, with a focus on selected priority onshore and nearshore markets. Vendor-practice attribution is conservative; unsubstantiated associations remain unclassified.
Classification reference
Each posting is evaluated in the context of software-industry roles, the covered company, and the evidence available in the source posting.
Purpose-built classifications organize postings into functions, commercial roles, geographies and investment themes. Explicit not_applicable, unallocated and unknown states preserve the distinction between classification coverage and observed activity.
| Dimension | Published field | Interpretation |
|---|---|---|
| Function | function_id / summary_function_id | Occupational function at detailed and summary levels. Use this dimension to separate sales, engineering, product, customer success, marketing, and other work rather than relying on title keywords. |
| Sales role | sales_role_id | Commercial responsibility within the sales function, including account executive, SDR, channel, renewals, and leadership. Quota-bearing or full-cycle designations require supporting title or responsibility evidence. |
| Customer success role | customer_success_role_id | Role type within customer success, separating post-sale coverage and leadership patterns where the source provides enough evidence. |
| AE segment | ae_segment_id | Customer or market segment associated with an account-executive role, such as enterprise or commercial, when the posting supports that distinction. |
| Geography | geography_id | One mutually exclusive geographic leaf derived from the advertised location. Grouping nodes are supplied in the taxonomy for rollups but do not appear as fact values. |
| Development investment | development_* | Company-specific product, platform, infrastructure, or engineering area supported by the role. These fields identify advertised labor allocation, not realized expenditure. |
| GTM investment | gtm_* | Company-specific go-to-market area, motion, or customer relationship supported by the posting. Attribution is made only when the available evidence meets the maintained rule set. |
| SI activity | company and GTM dimensions | Hiring across selected global systems integrators and Big Four firms, with emphasis on priority onshore and nearshore markets and conservative vendor-practice attribution. |
Company-specific allocation states
| State | Meaning |
|---|---|
| allocated | The posting contains sufficient evidence for a maintained company-specific taxonomy member. |
| emerging | Evidence supports a recurring investment theme being monitored separately from the established taxonomy. |
| unallocated | The dimension is relevant, but evidence is insufficient for a defensible company-specific assignment. |
| not_applicable | The dimension does not apply to the posting's normalized function or role. |
| unknown | The classification state cannot be resolved from the available input. |
Versioned methodology and historical consistency
Use a compatible classification_version_id with its taxonomy references for reproducible analysis.
When a methodology release changes historical classifications, SoftwareIQ may restate the supported classified history under the new version. The underlying direct-source posting observations and observed_total series remain unchanged. Prior classified versions are kept distinct, allowing research teams to pin a version, reproduce an earlier result, and adopt a restatement on their own schedule. Classified observations from different versions should never be spliced into one time series.
Fact semantics
Observed totals and classified intersections answer different questions and must not be added together.
| Record type | Version | Meaning |
|---|---|---|
| observed_total | None | Company total for a period and measure, including eligible short-gap active estimates in bulk delivery. Independent of classifier releases. |
| classified_count | Required | Nonzero count for one complete intersection of every published dimension under a classification version. |
Every posting in a classified row belongs to one function, role-state tuple, company-allocation tuple, and mutually exclusive geography leaf. Therefore filtering one or several dimensions is valid, and supported classified observations reconcile to directly observed company totals over compatible coverage. Filled bulk company totals do not imply reconstructed dimensional breakdowns. It is not a collection of independent marginal totals.
- Geography leaves are
united_states,canada,latin_america,europe,apac,mea,other_international, andunknown. internationalis a taxonomy grouping node and never appears in a fact row; expand it to its leaf members.newis based on posting-identity change only when adjacent observations are comparable. At a baseline, the value is null.- Unavailable measures remain null, except eligible filled bulk company active totals. Collection availability can remain unavailable when that total is estimated. A legitimate observed count of zero remains zero.
- Daily facts are the primary observation grain. Weekly facts represent the same population; active stock is not the sum of daily stocks and must not be summed with daily rows.
period_startandperiod_enddescribe the observation interval. Collection and publication timestamps describe when SoftwareIQ processed the data, not when an employer created the underlying role.
MCP access
Use MCP for filtered research queries and bulk delivery for full historical panels.
get_job_posting_series returns one count per period after applying the selected dimensions. Each row contains period_start, period_end, count, availability_status, continuity_status, and is_comparable_to_previous. API/MCP also returns estimated_count, estimate_method, estimate_anchor_dates, collection_event_ids and continuity_segment_id. Estimate values are separate from count; the bulk projection has one count field. Metadata retains company, measure, grain, classifier selection, freshness, and pagination.
Date bounds select period_start. Observed totals remain separate from classified intersections; missing or outage totals remain null. Retain the compatible classifier and taxonomy versions for classified queries.
MCP setup and agent access · Discuss S3 or Snowflake bulk delivery.
Daily and weekly fact tables
JOB_POSTINGS_DAILY and JOB_POSTINGS_WEEKLY share one contract; only period grain differs.
Bulk company active totals can include linear interpolation across eligible closed collection gaps of at most 14 calendar days with compatible reliable anchors, rounded to whole postings with halves up. These rows retain the legacy observed_total selector and use continuity_status=estimated. Collection availability and comparison flags remain authoritative. New-posting flows and unsupported dimensional breakdowns are never filled; long/open outages and unsupported migration gaps remain null. Collection events explain affected dates and anchors.
JOB_POSTINGS_DAILY
Grain: one observed total or nonzero classified dimension intersection per company, date, measure, and applicable version. Stable key: job_posting_row_id.
| Field | Logical type | Nullable | Definition |
|---|---|---|---|
| job_posting_row_id | STRING | No | Stable ID for one published row. |
| record_type | STRING | No | observed_total or classified_count. |
| classification_version_id | STRING | Yes | Complete classifier/taxonomy/rule-set version; null for invariant observed totals. |
| classifier_version_id | STRING | Yes | Core classifier version for classified rows. |
| taxonomy_version_id | STRING | Yes | Taxonomy dictionary version for classified rows. |
| rule_set_version_id | STRING | Yes | Company-allocation rule-set version for classified rows. |
| company_id | STRING | No | Stable company identifier. |
| ticker | STRING | Yes | Convenience ticker. |
| period_type | STRING | No | daily or weekly. |
| period_start | DATE | No | Start of the observation interval. |
| period_end | DATE | No | Inclusive end of the observation interval. |
| measure | STRING | No | active or new. New is null at a non-comparable baseline. |
| function_id | STRING | Yes | Detailed normalized function. |
| summary_function_id | STRING | Yes | Summarized normalized function. |
| sales_role_id | STRING | Yes | Normalized sales-role classification. |
| customer_success_role_id | STRING | Yes | Normalized customer-success classification. |
| ae_segment_id | STRING | Yes | Account-executive market segment when supported. |
| development_allocation_state | STRING | Yes | Classification state for company-specific development investment. |
| development_root_id | STRING | Yes | Company-specific development taxonomy root. |
| development_area_id | STRING | Yes | Company-specific development area. |
| development_emerging_area_id | STRING | Yes | Emerging development theme when supported. |
| gtm_allocation_state | STRING | Yes | Classification state for company-specific GTM investment. |
| gtm_root_id | STRING | Yes | Company-specific GTM taxonomy root. |
| gtm_area_id | STRING | Yes | Company-specific GTM area. |
| gtm_relationship_id | STRING | Yes | Normalized customer relationship. |
| gtm_motion_id | STRING | Yes | Normalized GTM motion. |
| geography_id | STRING | Yes | One mutually exclusive geography leaf for each classified posting. |
| count | INTEGER | Yes | Integer count. Bulk company active totals can include eligible short-gap estimates; other unavailable measures remain null. |
| availability_status | STRING | No | available, partial, or unavailable. |
| continuity_status | STRING | No | continuous, new_baseline, gap, gap_affected, or estimated for a filled bulk company active total. |
| is_comparable_to_previous | BOOLEAN | No | Whether a change from the prior observation is valid. |
| content_hash | STRING | No | Deterministic publication hash. |
JOB_POSTINGS_WEEKLY
Grain: one observed total or nonzero classified dimension intersection per company, week, measure, and applicable version. Use the availability and comparability fields when comparing periods.
| Field | Logical type | Nullable | Definition |
|---|---|---|---|
| job_posting_row_id | STRING | No | Stable ID for one published row. |
| record_type | STRING | No | observed_total or classified_count. |
| classification_version_id | STRING | Yes | Complete classifier/taxonomy/rule-set version; null for invariant observed totals. |
| classifier_version_id | STRING | Yes | Core classifier version for classified rows. |
| taxonomy_version_id | STRING | Yes | Taxonomy dictionary version for classified rows. |
| rule_set_version_id | STRING | Yes | Company-allocation rule-set version for classified rows. |
| company_id | STRING | No | Stable company identifier. |
| ticker | STRING | Yes | Convenience ticker. |
| period_type | STRING | No | daily or weekly. |
| period_start | DATE | No | Start of the observation interval. |
| period_end | DATE | No | Inclusive end of the observation interval. |
| measure | STRING | No | active or new. New is null at a non-comparable baseline. |
| function_id | STRING | Yes | Detailed normalized function. |
| summary_function_id | STRING | Yes | Summarized normalized function. |
| sales_role_id | STRING | Yes | Normalized sales-role classification. |
| customer_success_role_id | STRING | Yes | Normalized customer-success classification. |
| ae_segment_id | STRING | Yes | Account-executive market segment when supported. |
| development_allocation_state | STRING | Yes | Classification state for company-specific development investment. |
| development_root_id | STRING | Yes | Company-specific development taxonomy root. |
| development_area_id | STRING | Yes | Company-specific development area. |
| development_emerging_area_id | STRING | Yes | Emerging development theme when supported. |
| gtm_allocation_state | STRING | Yes | Classification state for company-specific GTM investment. |
| gtm_root_id | STRING | Yes | Company-specific GTM taxonomy root. |
| gtm_area_id | STRING | Yes | Company-specific GTM area. |
| gtm_relationship_id | STRING | Yes | Normalized customer relationship. |
| gtm_motion_id | STRING | Yes | Normalized GTM motion. |
| geography_id | STRING | Yes | One mutually exclusive geography leaf for each classified posting. |
| count | INTEGER | Yes | Integer count. Bulk company active totals can include eligible short-gap estimates; other unavailable measures remain null. |
| availability_status | STRING | No | available, partial, or unavailable. |
| continuity_status | STRING | No | continuous, new_baseline, gap, gap_affected, or estimated for a filled bulk company active total. |
| is_comparable_to_previous | BOOLEAN | No | Whether a change from the prior observation is valid. |
| content_hash | STRING | No | Deterministic publication hash. |
Taxonomy, versions, and collection state
These tables are required inputs for reproducible queries, labels, and continuity controls.
JOB_TAXONOMY_MEMBERS
Stable key: (taxonomy_version_id, dimension_id, member_id).
| Field | Logical type | Nullable | Definition |
|---|---|---|---|
| taxonomy_version_id | STRING | No | Taxonomy version. |
| dimension_id | STRING | No | Dimension such as geography or sales_role. |
| member_id | STRING | No | Stable member within its dimension and version. |
| display_name | STRING | No | Human-readable label. |
| parent_member_id | STRING | Yes | Parent for hierarchical rollups. |
| member_type | STRING | Yes | Leaf, group, or taxonomy-specific type. |
| display_order | INTEGER | Yes | Suggested presentation order. |
| content_hash | STRING | No | Publication hash. |
CLASSIFIER_VERSIONS
Stable key: classification_version_id.
| Field | Logical type | Nullable | Definition |
|---|---|---|---|
| classification_version_id | STRING | No | Stable compatibility tuple and join key. |
| classifier_version_id | STRING | No | Core role classifier version. |
| taxonomy_version_id | STRING | No | Taxonomy dictionary version. |
| rule_set_version_id | STRING | No | Company-specific allocation rules version. |
| ticker | STRING | Yes | Scope ticker where version is company-specific. |
| status | STRING | No | stable, retired, or other lifecycle status. |
| parent_classification_version_ids | STRING | Yes | Canonical JSON list of predecessor versions. |
| content_hash | STRING | No | Publication hash. |
JOB_COLLECTION_EVENTS
Stable key: event_id. Join to facts by company and overlapping period.
| Field | Logical type | Nullable | Definition |
|---|---|---|---|
| event_id | STRING | No | Stable collection-event identifier. |
| company_id | STRING | No | Affected company. |
| ticker | STRING | Yes | Convenience ticker. |
| event_type | STRING | No | Gap, ATS/provider migration, or other collection event. |
| started_on | DATE | No | Start of the event window. |
| ended_on | DATE | Yes | Inclusive event end; null while open. |
| availability_status | STRING | No | Availability during the event. |
| comparability | STRING | No | Impact on comparison with adjacent observations. |
| public_message | STRING | Yes | Research-facing explanation. |
| review_status | STRING | No | Operational review state. |
| content_hash | STRING | No | Publication hash. |
DATASET_CATALOG
Stable key: dataset_id. Discover the active classifier here; do not hard-code it for current-view applications.
| Field | Logical type | Nullable | Definition |
|---|---|---|---|
| dataset_id | STRING | No | Dataset identifier. |
| active_classification_version_id | STRING | Yes | Default current version for classified queries. |
| data_updated_at | TIMESTAMP | No | Latest accepted publication time. |
| company_count | INTEGER | No | Companies in the publication. |
| content_hash | STRING | No | Publication hash. |
Research conventions
Use the version, record type, and continuity fields as part of the analytical contract.
- Pin
classification_version_idfor reproducible research and adopt restated classifications as a complete versioned history. - Use
observed_totalfor the collected population andclassified_countfor dimensional analysis; these are two views of the same postings. - Apply continuity and comparability fields before calculating changes across collection events or new baselines. An ATS migration can change observed coverage and requires a continuity check before comparing counts.
- Interpret postings as employer demand and investment intent rather than realized hires or financial performance.