Process Template Configuration
Complete reference for configuring hiring process templates with YAML — stage types, config options, reviewers, and examples.
Overview
A process template defines the stages a candidate moves through during your hiring pipeline. Templates are written in YAML and consist of an ordered list of stages, each with a type, name, and optional configuration.
When you create a job posting and select a template, the stages are instantiated in order. Candidates progress through each stage sequentially — from application to offer.
Basic Structure
name: My Hiring Process
description: |
A short description of this template.
Supports **Markdown** formatting.
tags:
- engineering
- remote
stages:
- type: application_form
name: "Application"
config:
candidate_description: "Tell us about yourself."
- type: live_interview
name: "Interview"
config:
candidate_description: "A conversation about your background."
- type: offer
name: "Offer"
Templates are validated when you save them, and config keys are strictly checked — a misspelled or unsupported key fails validation with an error instead of being silently ignored, so typos surface immediately.
Top-Level Keys
| Key | Required | Description |
|---|---|---|
stages |
Yes | Ordered list of stage definitions (at least one) |
name |
No | Template name (can also be set in the form field) |
description |
No | Markdown-formatted description of the process |
tags |
No | List of string tags for categorization |
quick_fields |
No | Quick fields for capturing candidate info (see Quick Fields below) |
Stage Keys
Every stage requires name and type. The optional config hash and reviewers list vary by stage type.
| Key | Required | Description |
|---|---|---|
name |
Yes | Display name for the stage |
type |
Yes | One of the 10 stage types listed below |
config |
No | Type-specific configuration options |
reviewers |
No | List of reviewer assignments |
Compensating Candidates
Any stage can pay candidates for their time — most commonly a take-home assignment, but a paid design exercise or interview works the same way. Add a nested payout block to the stage’s config; when a candidate completes the stage, a payout is created for the configured amount. See Candidate Payouts for how payouts are reviewed and sent.
| Key | Type | Default | Description |
|---|---|---|---|
enabled |
boolean | false | Turn on compensation for this stage |
amount |
integer | — | Amount to pay, in the given currency (e.g. 250) |
currency |
string | USD | Three-letter currency code |
- type: code_assignment
name: "Take-Home Assignment"
config:
candidate_description: "Complete a practical coding exercise."
payout:
enabled: true
amount: 250
currency: USD
Private Task Briefs
candidate_description is published: it renders on the job page, on the template gallery, and in candidate email. A take-home task and the links that come with it belong in the nested brief block instead, which only a candidate who reached the stage and started the task can read. The block is read on portfolio_upload stages, where it becomes the take-home task the candidate starts; on other stage types it is ignored. See Stage Description vs Brief.
| Key | Type | Default | Description |
|---|---|---|---|
body |
string | — | The task itself, as plain text. Pasted URLs are linked when the candidate reads it |
estimated_hours |
integer | — | Effort shown to the candidate before they start (min: 1) |
due_days |
integer | 5 | Days from the moment the candidate starts to the deadline (min: 1) |
grace_hours |
integer | 24 | Hours uploads stay open past the deadline, flagged late |
allow_extension |
boolean | false | Offer one self-serve extension before the deadline passes |
extension_hours |
integer | 72 | Length of that extension (min: 1) |
- type: portfolio_upload
name: "Paid Test Project"
config:
candidate_description: "A short paid exercise, roughly half a day of work."
brief:
body: |
Retouch the five raw files in https://drive.google.com/drive/folders/example
and hand back web-ready JPEGs plus your layered file.
estimated_hours: 4
due_days: 5
grace_hours: 24
allow_extension: true
payout:
enabled: true
amount: 150
currency: PLN
There is no flat spelling of these keys — brief is always nested, so its estimated_hours and allow_extension never collide with the code_assignment keys of the same name.
Stage Types Reference
application_form
The entry point for candidates. Collects structured information via custom form fields. Optionally holds candidates in a screening state before advancing.
| Config Key | Type | Default | Description |
|---|---|---|---|
candidate_description |
string | — | Instructions shown to the candidate |
screening_enabled |
boolean | true | Hold submissions for manual review before advancing. Enabled by default — set to false explicitly to disable screening |
screening_message |
string | — | Message shown to candidates while screening is active |
resume_required |
boolean | false | Require a CV or résumé — candidates cannot submit without attaching a PDF or Word document (max 10 MB) |
fields |
array | — | List of form field definitions (see below) |
Form field options:
| Key | Required | Type | Description |
|---|---|---|---|
name |
Yes | string | Field identifier |
type |
Yes | string |
text, textarea, file, url, select, checkbox, email, phone
|
required |
No | boolean | Whether the field must be filled — enforced when the candidate submits, on every apply surface including the public API |
label |
No | string | Display label (defaults to name) |
placeholder |
No | string | Placeholder text |
max_length |
No | integer | Maximum character count (min: 1) |
options |
No | array | Choices for select fields |
Important: To require a CV, set
resume_required: trueon the stage config. A form field namedresumeis ignored — the resume has its own upload on the application form and attaches separately from custom fields, so declaring- name: resumewithtype: fileandrequired: truehas no effect.
- type: application_form
name: "Application"
config:
candidate_description: "Tell us about yourself."
screening_enabled: true
screening_message: "We'll review your application shortly."
resume_required: true
fields:
- name: experience_level
type: select
required: true
options:
- "Junior (0-2 years)"
- "Mid (2-5 years)"
- "Senior (5+ years)"
- name: cover_letter
type: textarea
required: false
max_length: 500
code_assignment
A take-home coding exercise. When GitHub is connected, a private repo is created from a template for each candidate. Includes deadline management.
Important: The repository specified in
github_templatemust be marked as a template on GitHub. See GitHub Template Repository Setup for requirements and setup instructions.
| Config Key | Type | Default | Description |
|---|---|---|---|
candidate_description |
string | — | Instructions shown to the candidate |
github_template |
string | — | GitHub template repo (e.g. org/hiring-assignment) |
duration_days |
integer | 7 | Days allowed to complete (min: 1) |
estimated_hours |
integer | — | Estimated effort in hours (e.g. 5) |
instructions |
string | — | Instructions committed into the candidate’s repository |
grace_period_hours |
integer | 24 | Hours accepted past the deadline before it becomes final |
allow_extension |
boolean | true | Candidates may request a deadline extension |
To pay candidates for the assignment, add a payout block — see Compensating Candidates above. The legacy paid, payment_amount, and payment_currency keys are still accepted on code_assignment and are converted into an equivalent payout, but prefer payout in new templates.
- type: code_assignment
name: "Take-Home Assignment"
config:
candidate_description: "Complete a practical coding exercise."
github_template: "mycompany/hiring-challenge"
duration_days: 7
estimated_hours: 5
payout:
enabled: true
amount: 250
currency: USD
portfolio_upload
Candidates upload work samples (design files, writing samples, etc.). Supports file type restrictions, upload limits, and external links. Add a brief block to turn the stage into a take-home task with a deadline — see Private Task Briefs.
| Config Key | Type | Default | Description |
|---|---|---|---|
candidate_description |
string | — | Instructions shown to the candidate |
accept |
array | pdf, png, jpg, jpeg, gif, webp |
Accepted file extensions, without a leading dot. Name them explicitly to take task deliverables — zip, mp4, mov, webm, tiff, tif and psd are also recognized. An extension Kit does not recognize is ignored rather than accepted |
max_files |
integer | 10 | Maximum number of files (min: 1) |
max_file_size_mb |
integer | 25 | Maximum size per file in MB |
allow_links |
boolean | true | Candidates may also submit external links (e.g. Figma, Behance) |
- type: portfolio_upload
name: "Portfolio Review"
config:
candidate_description: "Share 3-5 examples of your best work."
accept:
- pdf
- png
- jpg
max_files: 5
max_file_size_mb: 50
allow_links: true
questionnaire
Written questions for candidates to respond to asynchronously. Useful for scenario-based screening in support, sales, or writing roles.
| Config Key | Type | Default | Description |
|---|---|---|---|
candidate_description |
string | — | Instructions shown to the candidate |
questions |
array | — | List of question definitions |
duration_days |
integer | — | Suggested days to respond — shown on the template preview only, not enforced |
Question options:
| Key | Required | Type | Description |
|---|---|---|---|
type |
Yes | string | Question category (e.g. scenario) |
prompt |
Yes | string | The question text |
- type: questionnaire
name: "Written Scenarios"
config:
candidate_description: "Respond to these real-world scenarios."
questions:
- type: scenario
prompt: "A customer reports a billing error. Walk us through your response."
- type: scenario
prompt: "You discover a bug affecting 10% of users. What do you do?"
video
Presents a video to candidates. Supports uploaded videos (via Mux) or embedded videos from external platforms.
Video settings are grouped under a nested video key inside config.
| Config Key | Type | Default | Description |
|---|---|---|---|
candidate_description |
string | — | Instructions shown to the candidate |
video |
hash | — | Video settings (see below) |
video options:
| Key | Type | Default | Description |
|---|---|---|---|
source_type |
string | mux |
mux (uploaded) or oembed (external embed) |
oembed_url |
string | — | URL for embedded video (when source is oembed) |
description |
string | — | Description or context for the video |
min_watch_percentage |
integer | 15 | Minimum watch percentage required (1-100) |
- type: video
name: "Company Introduction"
config:
candidate_description: "Watch this video about our team and culture."
video:
source_type: oembed
oembed_url: "https://www.youtube.com/watch?v=example"
description: "A 5-minute overview of our engineering team."
min_watch_percentage: 80
video_recording
Candidates record or upload a video response to a prompt. Useful for video introductions, video cover letters, or async video interviews. Requires Mux integration.
Recording settings are grouped under a nested video_recording key inside config.
| Config Key | Type | Default | Description |
|---|---|---|---|
candidate_description |
string | — | Instructions shown to the candidate |
video_recording |
hash | — | Recording settings (see below) |
video_recording options:
| Key | Type | Default | Description |
|---|---|---|---|
max_duration_seconds |
integer | 120 | Maximum recording length in seconds |
allow_upload |
boolean | true | Allow candidates to upload a pre-recorded video file |
max_retakes |
integer | — | Number of re-recordings allowed (blank = unlimited) |
- type: video_recording
name: "Video Introduction"
config:
candidate_description: "Record a 2-minute video introducing yourself."
video_recording:
max_duration_seconds: 120
allow_upload: true
max_retakes: 3
team_review
An internal review stage where your team evaluates a candidate. Supports voting thresholds and veto rules.
| Config Key | Type | Default | Description |
|---|---|---|---|
candidate_description |
string | — | Message shown to the candidate during this stage |
voting |
hash | — | Voting configuration (see below) |
Voting options:
| Key | Type | Default | Description |
|---|---|---|---|
threshold |
integer | 2 | Minimum yes votes to advance (1-10) |
require_all_reviewers |
boolean | false | All assigned reviewers must vote |
veto_auto_rejects |
boolean | false | A single veto automatically rejects the candidate |
- type: team_review
name: "Code Review"
config:
candidate_description: "Our team is reviewing your submission."
voting:
threshold: 2
require_all_reviewers: true
veto_auto_rejects: true
live_interview
A synchronous interview conducted over video call or in person. Integrates with calendar scheduling.
| Config Key | Type | Default | Description |
|---|---|---|---|
candidate_description |
string | — | Instructions shown to the candidate |
duration_minutes |
integer | 60 | Interview length in minutes (min: 15) |
interviewers_required |
integer | 1 | Number of interviewers who must attend |
includes_roleplay |
boolean | false | Interview includes a role-play exercise |
- type: live_interview
name: "Technical Interview"
config:
candidate_description: "A conversation about your technical skills."
duration_minutes: 90
interviewers_required: 2
reference_check
Collect and verify candidate references. There is no reference-submission flow yet — candidates see the stage description, and references_required appears on the template preview but is not enforced.
| Config Key | Type | Default | Description |
|---|---|---|---|
candidate_description |
string | — | Instructions shown to the candidate |
references_required |
integer | — | Number of references needed (min: 1) |
- type: reference_check
name: "References"
config:
candidate_description: "Provide contact details for your references."
references_required: 2
offer
The final stage where you extend an offer to the candidate. Typically has minimal configuration.
| Config Key | Type | Default | Description |
|---|---|---|---|
candidate_description |
string | — | Message shown to the candidate |
- type: offer
name: "Offer"
config:
candidate_description: "We'd love to have you join the team."
Reviewers
You can assign reviewers to any stage. Each reviewer needs an email address and a role.
| Key | Required | Description |
|---|---|---|
email |
Yes | Email address of the reviewer (must match a team member) |
role |
Yes |
reviewer (standard) or lead (primary decision-maker) |
- type: team_review
name: "Code Review"
config:
voting:
threshold: 2
reviewers:
- email: [email protected]
role: lead
- email: [email protected]
role: reviewer
- email: [email protected]
role: reviewer
Quick Fields
Quick fields define structured metadata that your team captures for each applicant — things like salary expectations, availability, location preference, or any custom signal relevant to your role. Fields appear in the candidate sidebar.
For managing field definitions directly in the UI, see Candidate Data Fields.
Schema
| Key | Required | Type | Description |
|---|---|---|---|
key |
Yes | string | Unique identifier (lowercase, underscores only, e.g. salary_expectation) |
label |
Yes | string | Display label shown to your team |
field_type |
No | string | One of the 4 field types below (default: text) |
placeholder |
No | string | Placeholder text for the input |
options |
No | array | Choices for select fields |
Note: Richer field types and options — such as numbers, ratings, AI extraction, and visibility rules — are configured under
metafield_definitions, a separate top-level key. See Candidate Data Fields.
Field Types
| Type | Description |
|---|---|
text |
Single-line text input |
textarea |
Multi-line text input |
select |
Dropdown from a fixed list of choices |
date |
Date picker |
Examples
quick_fields:
- key: salary_expectation
label: "Salary Expectation"
field_type: text
placeholder: "$80,000 - $100,000"
- key: start_date
label: "Earliest Start Date"
field_type: date
- key: work_authorization
label: "Work Authorization"
field_type: select
options:
- "US Citizen"
- "Permanent Resident"
- "Requires Sponsorship"
- key: source
label: "Source / Referral"
field_type: text
placeholder: "e.g. LinkedIn, referral from..."
Complete Example
A full template for hiring a software engineer, including screening, a paid code assignment, team review, two interview rounds, references, and an offer.
name: Software Engineer - Standard
description: |
Comprehensive process for mid-to-senior software engineers.
Includes a take-home assignment with team code review.
tags:
- engineering
- technical
- assignment
quick_fields:
- key: salary_expectation
label: "Salary Expectation"
field_type: text
placeholder: "e.g. $120k - $150k"
- key: notice_period
label: "Notice Period"
field_type: text
- key: location_preference
label: "Location Preference"
field_type: text
stages:
- type: application_form
name: "Application"
config:
candidate_description: "Tell us about yourself and your experience."
screening_enabled: true
screening_message: "We're reviewing your application."
resume_required: true
fields:
- name: github_url
type: url
required: false
- name: motivation
type: textarea
required: true
max_length: 500
- type: code_assignment
name: "Take-Home Assignment"
config:
candidate_description: "Complete a practical coding exercise at your own pace."
github_template: "mycompany/hiring-assignment"
duration_days: 8
estimated_hours: 6
payout:
enabled: true
amount: 250
currency: USD
reviewers:
- email: [email protected]
role: lead
- type: team_review
name: "Code Review"
config:
candidate_description: "Our team reviews your code submission."
voting:
threshold: 2
require_all_reviewers: true
veto_auto_rejects: true
reviewers:
- email: [email protected]
role: lead
- email: [email protected]
role: reviewer
- type: live_interview
name: "Technical Interview"
config:
candidate_description: "A conversation about your technical skills."
duration_minutes: 90
interviewers_required: 2
- type: live_interview
name: "Culture & Values"
config:
candidate_description: "Get to know the team and learn about our culture."
duration_minutes: 45
- type: reference_check
name: "References"
config:
references_required: 2
- type: offer
name: "Offer"
config:
candidate_description: "We'll present you with an offer to join the team."
Tips
-
Start with
application_form— it’s the natural entry point and lets you collect resumes and basic info. -
End with
offer— keeps the pipeline clean and gives you a final stage for tracking. - Use screening on the application form to manually review candidates before they advance. This prevents unqualified candidates from receiving assignments.
-
Pay for take-home assignments — add a
payoutblock to the stage config to compensate candidates for their time (it works on any stage type). See Candidate Payouts. - Keep processes under 7 stages — long pipelines lead to candidate drop-off.
- Assign reviewers to team_review and code_assignment stages so the right people are notified automatically.
-
Use
candidate_descriptionon every stage — it’s the public summary candidates read on the job page, so clear communication reduces confusion and support requests. -
Put the actual task in
brief— instructions, file links, and anything you don’t want on the public job page. See Private Task Briefs. -
Capture common signals with
quick_fields— add fields like salary expectation, availability, and location so your team records them consistently in the candidate sidebar. -
Need richer types or AI extraction? — numbers, ratings, AI auto-population, and visibility rules live under
metafield_definitions. See Candidate Data Fields.