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:
duration_minutes: 60
- type: offer
name: "Offer"
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 | Candidate metadata fields (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 |
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 | false | Hold submissions for manual review before advancing |
screening_message |
string | — | Message shown to candidates while screening is active |
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 |
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 |
- type: application_form
name: "Application"
config:
candidate_description: "Tell us about yourself."
screening_enabled: true
screening_message: "We'll review your application shortly."
fields:
- name: resume
type: file
required: true
- 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.
| 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 | — | Days allowed to complete (min: 1) |
estimated_hours |
string | — | Estimated effort (e.g. "3-8") |
Compensation: Payouts are configured per-stage in the stage settings UI, not in the template YAML. Any stage type can offer compensation. See Candidate Payouts for details.
- 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: "3-6"
portfolio_upload
Candidates upload work samples (design files, writing samples, etc.). Supports file type restrictions and upload limits.
| Config Key | Type | Default | Description |
|---|---|---|---|
candidate_description |
string | — | Instructions shown to the candidate |
accept |
array | — | Allowed file extensions (e.g. pdf, png, figma) |
max_files |
integer | — | Maximum number of files (min: 1) |
- type: portfolio_upload
name: "Portfolio Review"
config:
candidate_description: "Share 3-5 examples of your best work."
accept:
- pdf
- png
- jpg
- figma
max_files: 5
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 |
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.
| Config Key | Type | Default | Description |
|---|---|---|---|
candidate_description |
string | — | Instructions shown to the candidate |
video_source_type |
string | — | mux (uploaded) or oembed (external embed) |
video_oembed_url |
string | — | URL for embedded video (when source is oembed) |
video_description |
string | — | Description or context for the video |
video_min_watch_percentage |
integer | — | 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
video_oembed_url: "https://www.youtube.com/watch?v=example"
video_description: "A 5-minute overview of our engineering team."
video_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.
| Config Key | Type | Default | Description |
|---|---|---|---|
candidate_description |
string | — | Instructions shown to the candidate |
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."
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 | — | 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 | — | Interview length in minutes (min: 15) |
interviewers_required |
integer | — | Number of interviewers needed (min: 1) |
includes_roleplay |
boolean | false | Whether the interview includes a role-play exercise |
- type: live_interview
name: "Technical Interview"
config:
candidate_description: "A conversation about your technical skills."
duration_minutes: 60
interviewers_required: 2
reference_check
Collect and verify candidate references.
| 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 capture candidate metadata at the top level of the template. These are displayed in the candidate sidebar for fast reference.
| Key | Required | Type | Description |
|---|---|---|---|
key |
Yes | string | Unique identifier |
label |
Yes | string | Display label |
field_type |
No | string | text (default), textarea, select, date |
placeholder |
No | string | Placeholder text |
options |
No | array | Choices for select fields |
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"
Complete Example
A full template for hiring a software engineer, including screening, a code assignment, team review, two interview rounds, references, and an offer. To add compensation to the assignment stage, configure payouts in the stage settings UI — see Candidate Payouts.
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
- key: notice_period
label: "Notice Period"
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."
fields:
- name: resume
type: file
required: true
- 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: "3-8"
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: 75
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
interviewers_required: 1
- 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 — configure payouts in the stage settings to compensate candidates. 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 — candidates see this message, so clear communication reduces confusion and support requests.