Workable BI Data Link - Database Structure v1.6
Workable BI Data Link - Database Structure v1.6
Database structure
Release v1.6
Mar 13rd, 2023
Contents
Contents 2
About This Document 2
Audience 2
Revision History 2
DB structure 4
activities 4
answers 18
attendances 19
candidates 19
candidate_evaluations 23
candidate_referrals 23
custom_attributes 24
custom_attributes_settings 25
departments 25
education_records 25
eeoc_profiles 26
events 27
experience_records 28
fields 28
field_choices 29
field_choice_translations 30
field_translations 30
field_values 30
field_value_choices 31
hiring_team 32
invoices 32
job_views 33
jobs 34
job_boards 37
members 37
offers 38
offer_variables 39
offer_templates 40
postings 40
pipelines 41
pseudo_boards 41
questions 42
Audience
This document is intended for Redshift administrators and software or data engineers that will
produce the reports on the customer's side, and Workable Professional Services engineers.
This document assumes a certain level of familiarity with databases.
Revision History
activities
The activities table contains all the important actions that took place in Workable and tended to
result in a change of status for the job (e.g. when the job is published) or
a candidate (e.g. when the candidate is moved to another stage). The table also logs information
about email exchanges (both incoming and outgoing), event scheduling and feedback.
The two columns that help us understand what the record is about are action and action_type.
The following table explains how to interpret each record according to the values given for
action and action_type.
Candidate moved to stage “X” Candidate Hired The stage is of type Hired.
Candidate moved to stage “X” Candidate Offer The stage is of type Offer.
Member {member_name} with
id {member_id} moved
candidate {candidate_name}
with id {candidate_id} to stage
named {X}.
Possible values:
shortlisted
phone-screen
assessment
interview
offer
stage_kind hired
The id of the stage at which the action took
place.
If the action was the movement of a candidate
from one stage to another, this is the id of the
stage_id source stage.
The id of the job or the job of the candidate
job_id affected by the action.
The current title of the job or the job of the
job_title candidate affected by the action.
candidate_id The id of the candidate affected by the action.
The full name of the candidate affected by the
candidate_name action.
The id of the account member who performed
member_id the action.
The full name of the account member who
member_name performed the action.
A boolean flag indicating whether the account
member who performed the action is an
member_is_recruiter external recruiter.
The id of the entity that the action is associated
with, other than candidate or job (e.g.
requisition, event etc). See the activities
trackable_id section for specific activity details.
The type of the entity that the action is
associated with, other than candidate or job.
Possible values:
trackable_type Assessment
answers
The table contains the answers provided by the candidates in their application
id Unique identifier
A timestamp indicating when the answer was
answer_created_at given by the candidate.
The id of the job for which the candidate gave
job_id the given answer.
The current title of the job for which the
job_title candidate gave the given answer.
The id of the question for which the answer
question_id was given.
The current text of the question for which the
question answer was given.
The type of the answer.
Possible values:
BooleanAnswer
MultipleChoiceAnswer
FreeTextAnswer
DateAnswer
ShortTextAnswer
NumericAnswer
FileAnswer
type DropDownAnswer
The answer given. The format of this field
answer varies depending on the type.
candidate_id The id of the candidate that gave the answer.
attendances
The table contains the attendance requests of each event
id Unique identifier
The id of the event associated with the
event_id attendance request.
The status of attendance request.
Possible values:
accepted
declined
needs-action
status tentative
The timestamp of when the attendance request
created_at was created.
The id of the time slot that has been assigned
event_slot_id to the event.
candidates
This table stores the information of all candidates, such as which job they’re applying for and
how they’ve been sourced.
id Unique identifier
A timestamp indicating when the candidate was
created in the job.
If the candidate moved to this job from another,
candidate_created_at then the date reflects the move.
The id of the job for which the candidate is/was
job_id considered.
job_title The current title of the job.
A timestamp indicating when the job (for which
the candidate is/was considered) was first
job_first_published_at published or opened for internal use.
name The full name of the candidate.
firstname The first name of the candidate.
lastname The last name of the candidate.
Possible values:
Applied: The candidate applied on their own.
Uploaded: Passive candidate uploaded by an
account member or external recruiter.
Referred: Candidate was recommended by an
account member by means of the workable
chrome addon (by ticking the “I know and
recommend this candidate” during the upload)
or through the “Refer candidates” functionality
of workable.
Copied: Candidate was copied / moved from
application_method another job.
A wide classification of the source of candidate.
Possible values:
Sourced: Uploaded by a member of the
account.
Recruiters: Uploaded by a recruiter.
Referrals: Recommended by a member of the
account.
Company Marketing: Applied via the workable
Facebook app or the Careers site of the
company.
Job Boards: Applied through a job board.
source_category Other: Anything else.
The domain of the website from which the
candidate was redirected to the application
source_domain form.
Possible values:
<The name of the job board from which
the candidate was redirected to work-
able>
<The domain of the website where the
candidate was clipped by use of workable
Chrome addon>
Copied
source <The name of the recruiter who sourced
Possible values:
Free posting: Applied through a posting to a
free job board that was published through
workable.
Premium posting: Applied through a posting
to a paid (premium) job board that was
published through workable.
API: Uploaded with the use of workable API.
Referrals: Uploaded through the “refer a
candidate” section of workable.
Facebook app: Applied through the workable
Facebook app.
Chrome clipper: Uploaded through workable
clipper (Chrome addon).
People Search: Sourced via People Search
Posting: Applied through a posting
Referrals: Candidate was referred via Referral
portal
<Anything else that has not been classified to
outlet the above>
current_stage_id The id of the stage the candidate is currently at.
current_stage_name The name of the stage.
In case the candidate was uploaded or
referred, the id of the account member who
source_member_id sourced the candidate.
In case the last email exchanged with the
candidate was incoming (i.e it is unanswered)
and not outgoing from an account_member, a
timestamp indicating when was that.
If null, then the last email exchanged was
last_unanswered_email_at outgoing, i.e from an account member.
A timestamp indicating when the candidate
first_screened_at moved to a screening stage, i.e a stage of type
candidate_evaluations
The table contains the candidate evaluations at various stages in the hiring process
id Unique identifier.
A timestamp indicating when the evaluation
evaluation_created_at was given by the account member.
candidate_id The id of the candidate who was evaluated.
candidate_name The name of the candidate who was evaluated.
The id of the stage at which the candidate was
stage_id evaluated.
The current name of the stage at which the
stage_name candidate was evaluated.
The id of the account member who evaluated
member_id the candidate.
The name of the account member who
member_name evaluated the candidate.
The score given.
Possible values:
yes
no
score definitely
candidate_referrals
This table contains information about candidate referrals.
candidate_id The id of the candidate to which this referral
relates.
id Unique identifier
custom_attributes
This table contains information about custom attributes which exist in your account. These would
have been enabled by your Account Manager. Custom attributes may be queried in conjunction
with the Fields table for more information.
provider 0 - Candidate
1 - User
2 - Referrals Applicant
enabled Boolean
id Unique identifier
id Unique identifier
departments
This table keeps information on the departments and their hierarchy.
id Unique identifier.
name Name of the department.
A timestamp indicating when the record was
created_at created.
A timestamp indicating when the record was
updated_at updated.
parent_id The id of the parent department.
education_records
This table keeps information about the education of candidates. Each record represents a
different school/institution attended, along with all the related information (start/end dates,
qualification acquired, etc.
id Unique identifier
A timestamp indicating when the record was
education_record_created_at created.
The id of the job for which the candidate is/was
job_id considered
job_title The current title of the job
candidate_id The id of the candidate
candidate_name The name of the candidate.
degree Degree acquired.
eeoc_profiles
This table contains information about EEOC when submitted during the application process (if this
feature is or was ever enabled in your account).
candidate_id The id of the candidate to which this
eeoc_profile belongs.
id Unique identifier
Possible values:
Meeting
Call
Interview
type Internal
starts_at The scheduled start of the event.
ends_at The scheduled end of the event.
title The title given by the organizer.
location The location as specified in the invitation.
A boolean flag indicating whether the event
cancelled was cancelled or took place/ is still on.
The id of the account member who scheduled
organizer_id the event and sent the invitations.
organizer_name The name of the account member.
The id of the stage where the candidate was at
stage_id when the event was scheduled.
stage_name The current name of the stage.
Information on the conference (meeting URL,
type of conference, e.g. google_meet,
conference zoom_meeting and etc)
experience_records
This table stores information about the previous work experience of candidates.
id Unique identifier
A timestamp indicating when the record was
experience_record_created_at created.
job_id The id of the job for which the candidate is/was
fields
This table contains descriptive information for custom fields in your account (Offer Variables,
Custom Fields, Requisition Attributes)
id Unique identifier.
field_choices
This table contains the options available for custom attributes of a particular type, ie. Dropdown
field_choices, etc.
field_id The id to which the field_value corresponds.
id Unique identifier
field_choice_translations
This table contains the options available for custom attributes of a particular type, such as
dropdown fields, in various languages.
id Unique identifier
field_translations
This table contains fields of a Field that are translated into various languages.
id Unique identifier
field_values
This table contains the data entered (answered) for a Field, as entered by a candidate or a
member of the account.
type Possible values:
DateFieldValue
FreeTextFieldValue
MultipleChoiceFieldValue
SalaryFieldValue
NumericFieldValue
BooleanFieldValue
ShortTextFieldValue
FileFieldValue
DropdownFieldValue
id Unique identifier
field_value_choices
This table is a join table which accounts for responses to custom attributes of a particular type (ie.
MultipleChoiceField).
field_choice_id Unique identifier of field_choice object.
id Unique identifier
hiring_team
The table contains information about which account members take part in the hiring process of
each job.
id Unique identifier
A timestamp indicating when member joined
member_joined_job_hiring_team_at the hiring team of the job.
job_id The id of the job.
Possible values:
admin: The user is an admin (Super Admin
privileges) of the account and therefore is also
a hiring manager to the job.
simple: The member is a non-admin user of the
account and was granted “Standard Member’
access to the job.
reviewer: The member is a non-admin user of
the account and was granted “Reviewer”
access to the job.
hiring_manager: The member is a non-admin
user of the account but was granted “Hiring
Manager” access to the job.
recruiting_admin: The member is a member
with limited admin privileges and granted
“Recruiter Admin” access to the specific job.
Recruiter: The member is a non-admin user
role with “External Recruiter” access to the job.
invoices
The table contains the invoices issued and the billing information contained there.
id Unique identifier.
A timestamp indicating when the invoice was
invoice_created_at created.
reference_code The code of the invoice, usually WOR-xxxx
Possible values:
subscription: When the invoice was for the
monthly or annual payment for the subscription
of the account.
posting: When the item purchased was a
posting to a premium job board
background_check: When the invoice was for
purchase_type charges of a background check conducted to a
job_views
For each job, this table explains the different domains that referred candidates to the application
form and the number of views from each.
id Unique identifier
A timestamp indicating when we recorded the
first view from the given domain was recorded
first_view_at for the given job.
job_id The id of the job.
The domain from which the candidates were
redirected to the application form of the job.
In case the referred couldn’t be identified, the
referrer_domain value is unknown.
The medium (type of posting) that the views
came from. For example:
Free_posting: The views came from a posting
outlet to a free board that was published through
jobs
The table keeps the information related to the jobs of the company.
id Unique identifier
A timestamp indicating when the job was
job_created_at created.
title The current title of the job.
Any internal reference code attached to the
code job.
The status of the job.
Possible values:
draft
open for internal use
published
state archived
The unique identifier that is used for the
construction of the job’s shortlink (the last ten
shortcode characters of the job’s shortlink).
country_code
state_code Information about where the given position is
city located.
Possible values:
Associate Degree
Bachelor’s Degree
High School or equivalent
Master’s Degree
Professional
education Unspecified
salary_from
salary_to
salary_currency Information about the offered salary.
job_boards
The table keeps information regarding Job Boards.
id Unique identifier.
name The name of the Job Board.
slug String identifier for internal usage.
domain The domain of the Job Board.
A boolean flag indicating whether the Job
available Board is available.
A boolean flag indicating whether the Job
free Board is free.
A boolean flag indicating whether the Job
is_feed Board is feed.
provider_slug String identifier for internal usage.
Type of the Job Board.
Possible values:
standard
ppa
recruiting
job_board_type social
A boolean flag indicating whether the Job
affiliate Board is affiliated.
members
Columns regarding account member activity
id Unique identifier
A timestamp indicating when the account
member_created_at member was created.
Possible values:
simple: i.e non-admin
admin
recruiter: i.e external recruiter invited to the
account
role reviewer
A boolean flag indicating whether the member
active still has access to the account.
offers
This table contains information about offers which have been created for candidates.
candidate_id The id of the candidate to which this offer has
been made.
id Unique identifier
offer_variables
This table contains information about offer variables which exist in your account for use in offers.
Offer variables may be queried in conjunction with the Fields table for more information.
id Unique identifier
kind 1 - adhoc
0 - initial
offer_templates
This table contains information for all of the offer templates created in your account.
id Unique identifier
active Boolean
code_generation Boolean
postings
Columns relevant to postings to job boards via Workable
id Unique identifier.
A timestamp indicating when the job was
posting_created_at posted to the job board.
job_id The id of the job.
job_title The current title of the job.
job_board The job_board to which the job was published.
If the posting was in a premium board, this is
the maximum days the job is/was allowed to
max_duration remain published.
The type of the posting.
Possible values:
FreePosting: Job was posted to a free board
PaidPosting: Job was posted to a premium
board and purchased through workable. For this
posting an entry exists in table Invoices with
type ‘posting’.
OwnedPosting: Job was posted to a premium
board but using their own Recruiter account and
inventory instead of buying directly through
type workable. No invoices exist for this posting.
If type is PaidPosting, the price of the posting
price (excl. vat).
This is the url at which the job is published in the
job board.
It is null for postings to job boards other than
url CareerBuilder, Monster and Stack Overflow.
Possible values:
published
closed
expired
checkout_pending
discarded
Initiated
paused
publish_pending
purchased
state update_pending
Number of candidates attracted by the given
candidates_count posting to the job board.
pipelines
This table contains information about all of the recruiting pipelines in your account. This includes
custom pipelines if they have been implemented.
active Boolean indicating whether a pipeline is active
or not.
default Boolean
id Unique identifier
pseudo_boards
This table keeps information regarding the sites that act as (pseudo) Job Boards.
id Unique identifier.
domain The domain of the pseudo Job Board.
questions
These columns are for information regarding job application forms
id Unique identifier
A timestamp indicating when the question was
question_created_at created.
The id of the job that the question is attached
job_id to.
job_title The title of the job.
Possible values:
BooleanQuestion
MultipleChoiceQuestion
FreeTextQuestion
NumericQuestion
DateQuestion
DropdownQuestion
ShortTextQuestion
type FileQuestion
A boolean flag indicating whether candidates
answering ‘no’ are auto-disqualified. Only
rejecting applies to questions of type ‘BooleanQuestion’.
The order in which the given question is being
position displayed in the application form of the job.
body The text of the question.
ratings
This table contains information about ratings created for candidates.
candidate_id Candidate id to which this rating belongs.
id Unique identifier
{“settings”: {"questions_rateable":false},
“sections”: [{
“id”: 1234,
“name”: “section name”,
“traits”: [{
“id”: 1234,
“name”: “trait name”,
“questions”: [ {
“id”: 1234,
“body”: “question body”,
“note”: “answer”}]}]}]}
score 0 - negative
1 - positive
2 - definite
redsync_metro_source
This table contains information about the job statistics regarding views and visitor’s source.
job_id Unique identifier of the job.
requisitions
This table contains information about requisitions in your account. This data only exists if you
use the Hiring Plan add on.
requisition_template_id Unique identifier of the requisition template.
reason 0 - new_hire
1 - replacement
2 - backfill
id Unique identifier
requisition_attributes
This table contains information about requisition attributes which exist in your account for use in
requisitions. This data only exists if you use the Hiring Plan add on. Requisition attributes may be
queried in conjunction with the Fields table for more information.
enabled Boolean
id Unique identifier
active Boolean
code_generation Boolean
id Unique identifier
stages
This table contains information about all of the stages in each of the recruiting pipelines in your
account. This includes stages that exist in custom pipelines if they have been implemented.
confidential Boolean - whether or not the stage falls under
a confidential zone in the Recruiting Pipeline.
id Unique identifier
Offers
Fields
The following SQL statements are returning the values of all Custom Attributes per Candidate Id
-- Returns field values for Custom Attributes
-- Multiple answers are delimited by ' | '
WITH filtered_translation AS
(SELECT 'en' AS "language"),
filtered_fields AS
(SELECT f.id,
ca.id AS custom_attribute_id,
ca.provider,
f."type",
ft.label AS field_label
FROM custom_attributes ca
JOIN fields f ON f.owner_id = ca.id
AND f.owner_type = 'CustomAttribute'
JOIN field_translations ft ON ft.field_id = f.id
AND ft.language =
(SELECT "language"
FROM filtered_translation)),
filtered_field_values AS
(SELECT fv.id AS field_value_id,
ff.id AS field_id,
ff.custom_attribute_id,
ff.field_label,
ff."type" AS field_type,
CASE
WHEN ff.provider = 1 THEN 'User'
WHEN ff.provider = 0 THEN 'Candidate'
END AS provider,
fv.resource_id AS candidate_id,
CASE
WHEN ff."type" NOT IN ('MultipleChoiceField',
'DropdownField') THEN fv."data"
ELSE LISTAGG(fct.label, ' | ')
END AS value
FROM field_values fv
JOIN filtered_fields ff ON fv.field_id = ff.id
LEFT JOIN field_value_choices fvc ON fvc.field_value_id = fv.id
LEFT JOIN field_choices fc ON fc.id = fvc.field_choice_id
SELECT *
FROM filtered_field_values
The following SQL statements are returning the values all (custom) Requisition Attributes per
Requisition Id:
-- Returns field values for Requisition Attributes
-- Multiple answers are delimited by ' | '
WITH filtered_translation AS
(SELECT 'en' AS "language"),
filtered_fields AS
(SELECT f.id,
ra.id AS requisition_attribute_id,
f."type",
ft.label AS field_label
FROM requisition_attributes ra
JOIN fields f ON f.owner_id = ra.id
AND f.owner_type = 'RequisitionAttribute'
JOIN field_translations ft ON ft.field_id = f.id
AND ft.language =
(SELECT "language"
FROM filtered_translation)),
filtered_field_values AS
(SELECT fv.id AS field_value_id,
ff.id AS field_id,
ff.requisition_attribute_id,
ff.field_label,
ff."type" AS field_type,
fv.resource_id AS requisition_id,
CASE
WHEN ff."type" NOT IN ('MultipleChoiceField',
'DropdownField') THEN fv."data"
ELSE LISTAGG(fct.label, ' | ')
END AS value
FROM field_values fv
JOIN filtered_fields ff ON fv.field_id = ff.id
LEFT JOIN field_value_choices fvc ON fvc.field_value_id = fv.id
LEFT JOIN field_choices fc ON fc.id = fvc.field_choice_id
LEFT JOIN field_choice_translations fct ON fct.field_choice_id = fc.id
AND fct.language =
(SELECT "language"
FROM filtered_translation)
GROUP BY fv.id,
ff.id,
ff.requisition_attribute_id,
ff.field_label,
ff."type",
fv.resource_id,
fv."data") --------------------------------------------------
SELECT *
FROM filtered_field_values
The following SQL statements are returning the values all Offer Variables per Candidate Id:
-- Returns field values for Document Variables
WITH filtered_translation AS
(SELECT 'en' AS "language"),
filtered_field_owners AS
(SELECT id
FROM offer_variables),
filtered_fields AS
(SELECT f.id,
ov.id AS document_variable_id,
f."type",
ft.label AS field_label
FROM offer_variables ov
JOIN fields f ON f.owner_id = ov.id
AND f.owner_type = 'DocumentVariable'
JOIN field_translations ft ON ft.field_id = f.id
AND ft.language =
(SELECT "language"
FROM filtered_translation)),
filtered_field_values AS
(SELECT fv.id AS field_value_id,
ff.id AS field_id,
ff.document_variable_id,
ff.field_label,
ff."type" AS field_type,
o.id AS offer_id,
o.candidate_id
FROM field_values fv
JOIN filtered_fields ff ON fv.field_id = ff.id
JOIN offers o ON o.id = fv.resource_id
GROUP BY fv.id,
ff.id,
ff.document_variable_id,
ff.field_label,
ff."type",
fv."data",
o.id,
o.candidate_id)
--------------------------------------------------
SELECT *
FROM filtered_field_values