Skip to main content
The Data Dictionary has the most up-to-date field definitions for all RevenueBase tables. Use it as your primary reference for column names and descriptions.
The historical_experience table tracks career history for contacts in the RevenueBase database. Each row represents one LinkedIn profile with a nested array structure: a jobs array containing job objects, each with an experience array of position records. Use it to understand career trajectories, identify recent job changers, find alumni of specific organizations, and build more personalized outreach.

Where the data comes from

Historical experience is derived from professional profiles and public career history. Positions are normalized to titles, seniority, and department where possible. Start and end dates are captured with the precision available from the source (sometimes year-only for older roles). Tenure is calculated from those dates.

Counts and coverage

Each row represents one LinkedIn profile with nested arrays: a jobs array containing job objects, each with an experience array of position records. Not every contact has historical experience; fill rates are higher for recent roles and for people with detailed public profiles. Use the fill-rate query below to see coverage and average positions per profile.

Table stats

Data dictionary

For the complete and most current field reference, see the Data Dictionary. Fill rates for historical data are typically lower than for current-position data. Older positions, smaller organizations, and non-US contacts tend to have less complete records. The table structure uses one row per LinkedIn profile with an array of job positions.

Top-level fields

Jobs array structure

Each element in the jobs array is an object containing:

Experience array structure

Each element in the experience array within a job object contains:
One row per LinkedIn profile with nested arrays. Each row contains a jobs array. Each job object contains an experience array with one or more position records. A person may have multiple positions at the same organization (different roles over time), which is why experience is an array. Use nested array functions to query and filter individual positions.
The experience array structure may include additional fields like start_date, end_date, and other position-related attributes depending on data availability. Query the nested arrays to access individual job positions.

Joining to other tables

The jobs array contains rbid, rbid_org, and email_address that you can use to join to other tables. The experience array within each job contains position-specific details:
To analyze “contacts who worked in California” or “alumni of organizations in EMEA,” flatten both the jobs and experience arrays, join to org_latest on rbid_org, and filter on organization location fields.
Fill rates for historical data are inherently lower than for current-position data. Older positions, smaller organizations, and non-US contacts tend to have less complete records. The experience object may not contain all fields for every position, and rbid_org may be null when the employer is not in the RevenueBase organizations table.

Common use cases

People who just started a new role are often more receptive to new tools. Flatten both the jobs and experience arrays and filter for positions where experience.job_is_current = TRUE. Join to the person table and filter by UPDATED_AT to find recently updated profiles.
Find everyone who used to work at a specific organization by flattening both arrays and filtering for experience.job_org_linkedin_url matching the target organization, or use jobs[].rbid_org to join to the organization table. Filter for experience.job_is_current = FALSE. Useful for selling to former champions who already know your space.
Flatten both arrays and compare job_title, job_function, and job_org_name across positions for a profile. Use job_count to identify profiles with multiple positions, then analyze the progression in the nested arrays.
Some profiles may have multiple entries in the experience array within the same job object, representing different roles at the same organization over time. Flatten both arrays to see all positions and their progression.

Joining this table

Join HISTORICAL_EXPERIENCE_LATEST to PER_LATEST table on linkedin_url to get current contact info. Flatten both the jobs and experience arrays to access individual positions. Join to org_latest table using jobs[].rbid_org when you need firmographics or HQ address for a specific role.

Flattening the nested arrays

To work with individual positions, you need to flatten both the jobs array and the experience array within each job. Here’s a pattern for Snowflake:

Historical experience + contacts (recent job changers with contact info)

Historical experience + contacts + organizations (alumni with HQ location)

How to calculate fill rates

Use this to see how many profiles you have, how many positions total, and how complete key fields are.

Sample queries

Recent job changers (last 90 days)

What you’re finding: People who started a new job in the last 90 days, for outreach or lead scoring. Why these fields: We need current contact info from the person table and the new role from the flattened jobs array. Filter for current positions with recent start dates. Logic: Flatten both the jobs and experience arrays, filter to current positions (job_is_current = TRUE). Join to person table for contact info. Use UPDATED_AT to identify recently updated profiles.

Alumni of a specific organization

What you’re finding: People who used to work at a given organization (e.g. Salesforce), with current contact info, for alumni campaigns or competitive targeting. Why these fields: Filter the jobs array for the target organization’s domain and non-current positions. Join to person table for current contact info. Logic: Flatten both arrays, filter by target organization LinkedIn URL pattern and non-current positions. Join to person table for email and current context. Order by profile update date descending.

Profiles with multiple positions

What you’re finding: Profiles that have held multiple positions, useful for career trajectory analysis. Why these fields: Use job_count to identify profiles with multiple positions, then flatten to see all positions. Logic: Filter for profiles with job_count > 1, then flatten both arrays to see all positions.