Ada ATS – A Retro, Gamified ATS (Applicant Tracking System) for WordPress
For support, visit: wilcosky.com/contact
A comprehensive Applicant Tracking System built as a WordPress theme, featuring resume parsing, candidate management, requisition workflows, gamification, and embeddable job listings.
To test Ada out, tap the login button above. Then, see that light blue bar at the top? It lists usernames and a password you may use. Each username lets you demo a different type of user with different permissions.
- Log in as the Hiring Manager to submit a new requisition
- Log in as the Req Approver to approve a new requisition
- Log in as the Recruiter for everything else
This is a demo which is periodically reset. Still, please be professional and do not publish anything nasty.
Key Features:
- ✅ Fully dynamic candidate status system (no hardcoded status names required)
- ✅ Custom requisition and application form fields
- ✅ Intelligent resume parsing with automatic field population
- ✅ Per-requisition candidate status tracking
- ✅ Gamification system with points and achievements
- ✅ Game Mode for engaging candidate interactions
- ✅ Embeddable job listings for external websites
Table of Contents
- Installation
- Initial Setup
- User Roles & Permissions
- Resume Parsing
- Requisition Management
- Candidate Management
- Public Job Listings
- Embed System
- Gamification System
- Settings & Configuration
- Testing the System
- Troubleshooting
Installation
Prerequisites
- WordPress 5.0 or higher
- PHP 7.4 or higher
- MySQL 5.6 or higher
- Required PHP extensions:
gdorimagick(for image processing)mbstring(for text processing)zip(for file handling)xml(for PDF parsing)
Step 1: Install WordPress
If you don’t have WordPress installed:
- Download WordPress from wordpress.org
- Extract and upload to your web server
- Create a MySQL database for WordPress
- Run the WordPress installation wizard
- Complete the initial WordPress setup
Step 2: Install the Ada Theme
- Upload the
Adatheme folder to/wp-content/themes/ - Log in to your WordPress admin dashboard
- Navigate to Appearance > Themes
- Find “Ada” in the theme list
- Click Activate
Step 3: Flush Permalinks
After activation:
- Go to Settings > Permalinks
- Click Save Changes (even if you don’t change anything)
- This registers the custom ATS routes (
/ats/*)
Step 4: Verify Installation
- Visit
http://yoursite.com/wp-admin/themes.php?page=ada-theme-settings - You should see the Ada Settings page
- If you see a 404, go to Settings > Permalinks and save again
Initial Setup
1. Configure Basic Settings
Navigate to Appearance > Ada Settings (or directly to wp-admin/themes.php?page=ada-theme-settings).
General Tab
- Logo: Upload your company logo (recommended: 45px height)
- Favicon: Upload a favicon for browser tabs
- Timezone: Set your timezone for accurate timestamps
- Cloudflare Turnstile (optional):
- Site Key: Your Turnstile site key
- Secret Key: Your Turnstile secret key
- Leave blank if not using Turnstile (for development/testing)
Application Form Tab
Configure the fields that appear on public job application forms:
- Default Fields: Name, Email, Phone, Cover Letter, Resume
- Add Custom Fields: Click “Add Field” to add text, textarea, select, checkbox, or file upload fields
- Field Options:
- Type: text, email, textarea, select, checkbox, file
- Label: Display name for the field
- Name: Internal field name (lowercase, no spaces)
- Required: Check if field is mandatory
Requisition Form Tab
Configure the fields that appear when submitting new requisitions:
- Default Fields: Job Title, Location, Department, Salary Range, Job Description (used if no custom fields configured)
- Add Custom Fields: Click “Add Field” to add text, email, textarea, select, checkbox, file, number, tel, url, or date fields
- Field Options:
- Type: text, email, textarea, select, checkbox, file, number, tel, url, date
- Label: Display name for the field
- Name: Internal field name (lowercase, no spaces)
- Required: Check if field is mandatory
- Options: For select fields, enter options one per line
- Dynamic Rendering: All configured fields automatically appear on the requisition submission form
- Note: Job Title and Job Description fields are always required (if they exist in your configuration)
Candidate Statuses Tab
Configure the status workflow for candidates:
- Default Statuses: Review, Screened, Interview, Offer, Hired, Rejected (used if none configured)
- Add Status: Click “Add Status” to create new statuses
- Add Steps: Each status can have sub-steps (e.g., Interview can have Interview 1, Interview 2, Interview 3)
- Reorder: Drag statuses to reorder them
- Status Options:
- Name: Display name (e.g., “Phone Screen”)
- Slug: Internal identifier (e.g., “phone_screen”)
Status Requirements:
- Minimum: At least one status is required (becomes the default starting status)
- Recommended: Include a status with “rejected” in the name/slug for proper rejection handling
- Recommended: Include a status with “hire” or “hired” in the name/slug for hiring functionality
- Note: The system intelligently detects these statuses by searching for keywords in names/slugs (case-insensitive)
- Fallback: If no “rejected” status is found, the system uses the last status in your list
- Fallback: If no “hired” status is found, hiring features will be unavailable
See STATUS_REQUIREMENTS.md for detailed information about status configuration.
Gamification Tab
Configure the points system for recruiters:
- Points Map: Set points awarded for each action:
hourly: Points per hour logged in (default: 1)candidate_reviewed: Points for reviewing a candidate (default: 0.5)status_progression: Points for moving a candidate forward (default: 0.5)- Custom status points: Points for moving to specific statuses
- Spend Points Email: Email address to receive notifications when recruiters spend points
Embed Settings Tab
Configure the embed system for external job listings:
- API Key: Generate a unique API key for embed authentication
- Whitelist Domains: Add domains allowed to embed your jobs (one per line)
- Example:
example.com,jobs.example.com - Leave blank to allow all domains (not recommended for production)
- Example:
Retro Theme Tab
Customize the retro terminal aesthetic:
- Colors: Adjust color scheme
- Font: Choose font family
- Scanlines: Toggle scanline effect
2. Create User Accounts
Navigate to Users > Add New to create user accounts for your team.
Adding a User
- Username: Choose a unique username
- Email: Enter a valid email address
- Password: Set a strong password (or let WordPress generate one)
- Role: Select one of the following:
- Administrator: Full access to WordPress and ATS
- Editor: Full ATS access (can manage all candidates and requisitions)
- Recruiter: Can manage candidates, update statuses, view requisitions
- Hiring Manager: Can view candidates, create and edit requisitions
- ATS Approver: Can approve requisitions and assign recruiters
- Click Add New User
Setting User Roles
After creating a user, you can change their role:
- Go to Users > All Users
- Find the user
- Click Edit
- Change the Role dropdown
- Click Update User
User Roles & Permissions
Administrator
WordPress Role: administrator
Capabilities:
- ✅ Full WordPress access
- ✅ Manage all ATS settings
- ✅ Create, edit, delete candidates
- ✅ Create, edit, delete requisitions
- ✅ Approve requisitions
- ✅ Assign recruiters
- ✅ Update candidate statuses
- ✅ Manage gamification settings
- ✅ View all data
Use Case: Site owners, IT administrators, system managers
Editor
WordPress Role: editor
Capabilities:
- ✅ Manage all ATS settings
- ✅ Create, edit, delete candidates
- ✅ Create, edit, delete requisitions
- ✅ Approve requisitions
- ✅ Assign recruiters
- ✅ Update candidate statuses
- ✅ Manage gamification settings
- ✅ View all data
- ❌ Limited WordPress access (no plugin/theme management)
Use Case: HR managers, ATS administrators who need full ATS control without WordPress admin access
Recruiter
WordPress Role: ada_recruiter
Capabilities:
- ✅ View all candidates
- ✅ Edit all candidates (including others’ candidates)
- ✅ View all requisitions
- ✅ Edit requisitions
- ✅ Submit new requisitions
- ✅ Update candidate statuses
- ✅ Screen candidates
- ✅ Move candidates to interview
- ✅ Move candidates to offer
- ✅ Hire candidates
- ✅ Rate candidates (star ratings)
- ✅ Add notes and timeline events
- ✅ Assign tags to candidates
- ✅ View and earn points
- ❌ Cannot delete candidates
- ✅ Can approve requisitions
- ✅ Can assign recruiters
- ❌ Cannot manage settings
Use Case: Recruiters who actively manage candidates through the hiring process
Access Points:
- Dashboard:
/ats/dashboard - Candidates:
/ats/candidates - Candidate Details:
/ats/candidate/{id} - Requisitions:
/ats/requisitions - Requisition Details:
/ats/requisition/{id} - Submit Requisition:
/ats/submit-requisition - Points:
/ats/points
Hiring Manager
WordPress Role: ada_hiring_manager
Capabilities:
- ✅ View all candidates
- ✅ View all requisitions
- ✅ Create new requisitions
- ✅ Edit requisitions
- ❌ Cannot edit candidates
- ❌ Cannot update candidate statuses
- ❌ Cannot approve requisitions
- ❌ Cannot assign recruiters
- ❌ Cannot manage settings
Use Case: Department managers who need to create job postings and view applicants
Access Points:
- Dashboard:
/ats/dashboard - Candidates:
/ats/candidates(view only) - Candidate Details:
/ats/candidate/{id}(view only) - Requisitions:
/ats/requisitions - Requisition Details:
/ats/requisition/{id} - Submit Requisition:
/ats/submit-requisition
ATS Approver
WordPress Role: ada_approver
Capabilities:
- ✅ View all requisitions
- ✅ Edit requisitions
- ✅ Submit new requisitions
- ✅ Approve requisitions
- ✅ Assign recruiters to requisitions
- ✅ Can view candidates
- ❌ Cannot manage settings
Use Case: HR directors or executives who approve job postings and assign recruiters
Access Points:
- Dashboard:
/ats/dashboard - Requisitions:
/ats/requisitions - Requisition Details:
/ats/requisition/{id} - Submit Requisition:
/ats/submit-requisition
Resume Parsing
How It Works
The Ada ATS automatically parses uploaded resumes to extract:
- Contact Information:
- Name (from header section)
- Email address
- Phone number
- Skills:
- Programming languages (JavaScript, Python, Java, etc.)
- Frameworks (React, Angular, Django, etc.)
- Design tools (Photoshop, Figma, etc.)
- Business tools (Excel, Salesforce, etc.)
- Soft skills (Leadership, Communication, etc.)
- Industry-specific skills (Accounting, Healthcare, etc.)
- Extracted Text:
- Full text content of the resume
- Preserved formatting and structure
- Available for search and review
Supported File Formats
- PDF (
.pdf): Text-based and image-based PDFs- Uses Smalot/PdfParser library for extraction
- Word Documents:
.docx(Word 2007+): Full support via ZIP/XML extraction.doc(Word 97-2003): Basic support via text extraction (may have limitations with complex formatting)
Parsing Process
When a candidate uploads a resume:
- Upload: File is uploaded to WordPress media library
- Parse: System extracts text using appropriate parser (PDF or Word)
- Extract Contact Info: Name, email, and phone are identified
- Extract Skills: Comprehensive skill patterns are matched against resume text
- Store: All data is saved to the candidate profile
- Auto-fill: Application form fields are automatically populated
Step-by-Step Feedback
During resume upload, candidates see real-time progress:
- “Uploading resume…”
- “Resume uploaded.”
- “Parsing resume…”
- “Saving extracted text…”
- “Pulling out skills…”
- “Looking at the application fields…”
- “These fields were detected: [list]”
- “I see a name in the extracted resume text…”
- “Populating the name field…”
- “I see an email…”
- “Populating the email field…”
- “I see a phone number…”
- “Populating the phone field…”
- “Success!”
Viewing Parsed Data
On the candidate detail page (/ats/candidate/{id}):
- Extracted Text: Scrollable box showing the full parsed resume text
- Tags: Automatically extracted skills displayed as tags
- Contact Info: Name, email, and phone (if extracted)
Troubleshooting Parsing
If parsing fails:
- Check File Format: Ensure file is PDF or Word document
- Check File Size: Large files (>10MB) may timeout
- Check File Type: Image-only PDFs may not parse correctly
- Check Server Logs: Review PHP error logs for parsing errors
- Check PHP Extensions: Ensure required extensions are installed
Requisition Management
Requisition Workflow
- Submit: Hiring Manager, Recruiter, ATS Approver, Administrator, or Editor creates a requisition
- Pending: Requisition awaits approval
- Approved: ATS Approver approves the requisition
- Assign Recruiter: ATS Approver assigns a recruiter (optional)
- Post: Requisition becomes visible on public job listings
- Close: Requisition is closed (no longer accepting applications)
Creating a Requisition
Who Can Create: Hiring Managers, Recruiters, ATS Approvers, Administrators, Editors
Steps:
- Navigate to
/ats/submit-requisition(or click “New Requisition” in sidebar) - Fill in the form fields. The form dynamically displays all fields configured in Settings > Requisition Form:
- Default Fields: Job Title, Location, Department, Salary Range, Job Description
- Custom Fields: Any additional fields you’ve configured (automatically rendered)
- Field types supported: text, email, textarea, select, checkbox, file, number, tel, url, date
- Job Description: Uses rich text editor (Quill) for formatted content
- All configured fields are automatically included and validated
- Click Submit Requisition
Status After Submission: pending
Note: The requisition form supports dynamic custom fields. Add custom fields in Appearance > Ada Settings > Requisition Form, and they will automatically appear on the submission form.
Approving a Requisition
Who Can Approve: ATS Approvers, Administrators, Editors
Steps:
- Navigate to
/ats/requisitions - Find the requisition with status “Pending”
- Click on the requisition to view details
- Click Approve Requisition
- (Optional) Assign a recruiter from the dropdown
- Click Save
Status After Approval: approved (visible on public listings) or approved_unposted (not visible)
Assigning a Recruiter
Who Can Assign: ATS Approvers, Administrators, Editors
Steps:
- Open the requisition detail page
- Find the “Assigned Recruiter” field
- Select a recruiter from the dropdown
- Click Save
Note: Recruiters can view all requisitions regardless of assignment. Assignment is for organizational purposes.
Adding Knockout Questions
Who Can Add: Anyone who can edit requisitions
Steps:
- Open the requisition detail page
- Scroll to “Knockout Questions” section
- Click Add Question
- Enter:
- Question: The question text
- Options: Multiple choice options (one per line)
- Correct Answer: The correct answer option
- Click Save
How It Works:
- Knockout questions appear on the public application form
- If a candidate answers incorrectly, they are automatically rejected for that requisition
- The application is still submitted, but status is set to “rejected”
- A timeline note is added: “Rejected due to answering ‘[answer]’ to the knockout question ‘[question]'”
- Candidates are not shown an error message (application appears successful)
Requisition Statuses
- Pending: Awaiting approval
- Approved: Approved and visible on public listings
- Approved – Unposted: Approved but not visible on public listings
- Closed: No longer accepting applications
Viewing Requisitions
Navigate to /ats/requisitions to see:
- Requisition number
- Job title
- Location
- Department
- Status
- Number of candidates
- Assigned recruiter
Filters:
- Requisition ID
- Status
- Location
- Department
Requisition Detail Page
Click on a requisition to view:
- Details:
- Job Title
- Hiring Manager
- Assigned Recruiter
- Location
- Department
- Salary Range
- Status
- Job Description: Full formatted description
- Knockout Questions: List of questions and correct answers
- Candidates Table: All candidates who applied to this requisition
- Name
- Phone
- Status (per-requisition)
- Resume (View link)
- Applied Date
Candidate Management
Candidate Status System
The candidate status system is fully dynamic – you can configure any status names you want. The system intelligently detects special statuses by searching for keywords in status names/slugs (case-insensitive).
Key Features:
- ✅ Fully customizable status names (no hardcoded requirements)
- ✅ Supports status sub-steps for granular tracking
- ✅ Intelligent detection of “rejected” and “hire”/”hired” statuses
- ✅ Per-requisition status tracking (candidates can have different statuses per job)
Candidates have per-requisition statuses, meaning the same candidate can have different statuses for different jobs they applied to.
Example:
- Candidate applies to Job A → Status: “New”
- Candidate applies to Job B → Status: “Interview”
- On Job A detail page: Status shows “New”
- On Job B detail page: Status shows “Interview”
Default Statuses (Fallback)
If no custom statuses are configured, the system uses these defaults:
- Review: Initial status when candidate applies
- Screened: Candidate has been screened
- Interview: Candidate is in interview process
- Offer: Offer has been extended
- Hired: Candidate has been hired
- Rejected: Candidate has been rejected
Note: You can completely customize these statuses. The system intelligently detects statuses with “rejected” or “hire”/”hired” in their names for special functionality. See STATUS_REQUIREMENTS.md for details.
Customizing Statuses
- Go to Appearance > Ada Settings > Candidate Statuses
- Add Status: Click “Add Status”
- Add Steps: Click “Add Step” within a status (sub-steps for granular tracking)
- Reorder: Drag statuses to change order
- Edit: Click on status name or slug to edit
- Click Save Changes
Dynamic Status System: The system is fully dynamic and doesn’t require specific status names. However, for optimal functionality:
- Include a status with “rejected” in the name for proper rejection handling
- Include a status with “hire” or “hired” in the name for hiring features
- The system automatically detects these by searching keywords in names/slugs (case-insensitive)
- See
STATUS_REQUIREMENTS.mdfor complete details on status configuration
Viewing Candidates
Navigate to /ats/candidates to see:
- Candidate name
- Phone
- Tags (skills)
- Rating (star rating average)
- “Incomplete Application” badge (if applicable)
- Applied date
Filters:
- Search: Search by name, email, phone, tags, or parsed resume text
- Supports boolean operators:
AND,OR,NOT,+term,-term,(term) - Example:
JavaScript AND React OR Vue
- Supports boolean operators:
- Requisition: Filter by requisition
- Tags: Filter by tags
Candidate Detail Page
Navigate to /ats/candidate/{id} to view full candidate information.
Candidate Information
- Basic Info: Name, email, phone
- Resume: View/download resume
- Parsed Resume Text: Scrollable box with extracted text
- Tags: Skills extracted from resume (click to remove)
- Rating: Star rating (average of all recruiter ratings)
- Assigned Recruiter: Currently assigned recruiter
Requisitions Section
- Requisition Dropdown: Select a requisition to view candidate’s status for that requisition
- Status: Current status for selected requisition
- Timeline: Activity history for selected requisition
Updating Candidate Status
- Select a requisition from the dropdown
- Use the Status dropdown to change status
- Click Update Status
- A timeline event is automatically added
Adding Notes
- Scroll to “Notes” section
- Enter note in rich text editor
- Click Add Note
- Note appears in timeline
Rating Candidates
- Click stars (1-5) to rate candidate
- Rating is saved immediately
- Displayed rating is the average of all recruiter ratings
Adding Tags
- Scroll to “Tags” section
- Enter tags in the input field (comma-separated)
- Click Save Tags
- Tags are added to candidate profile
Note: Tags input is for adding new tags only. Existing tags are displayed above the input.
Assigning Recruiter
- Scroll to “Assigned Recruiter” section
- Select recruiter from dropdown
- Click Save
Uploading Resume
- Scroll to “Resume” section
- Click Choose File
- Select PDF or Word document
- Click Upload Resume
- Resume is parsed automatically
- Tags are updated with extracted skills
- Parsed text is updated
Note: Uploading a new resume does not change the candidate’s status.
Bulk Actions
On the candidates list page (/ats/candidates):
- Select candidates using checkboxes
- Choose action from “Bulk Actions” dropdown:
- Update Status: Change status for multiple candidates
- Assign Recruiter: Assign recruiter to multiple candidates
- Assign Requisition: Link candidates to a requisition
- Delete: Delete candidates (Administrators only)
- Click Apply
Incomplete Applications
If a candidate uploads a resume but doesn’t complete the application form, they are marked as “Incomplete Application”.
Identifying Incomplete Applications:
- Badge appears on candidate list: “⚠ Incomplete Application”
- Notice appears on candidate detail page
Alerting Candidates:
- On candidate detail page, find “Incomplete Application” notice
- Click Alert Candidate
- Confirm in dialog
- Email is sent to candidate with:
- Subject: “Incomplete Application”
- Body: Link to public job posting and application form
Completing Incomplete Applications:
- Candidate can return and complete the application
- If they submit with the same name/email for the same requisition, their existing candidate profile is updated (not duplicated)
Public Job Listings
Public Job Board
Navigate to /ats/jobs to see the public job listings page.
Features:
- List of all approved requisitions
- Search by keyword
- Filter by location, department, salary range
- Click on job to view details and apply
Individual Job Page
Navigate to /ats/job/{id} to view a specific job posting.
Features:
- Full job description
- Location, department, salary range
- Application form
- Resume upload with parsing
- Auto-filled fields after resume upload
Application Process
- View Job: Candidate views job posting
- Upload Resume (optional):
- Click “Upload Resume”
- Select PDF or Word document
- Watch step-by-step parsing progress
- Fields auto-populate with extracted contact info
- Complete Form: Fill in any remaining fields
- Answer Knockout Questions: If applicable
- Submit: Click “Submit Application”
After Submission:
- Candidate sees success message
- Application is saved (even if knockout questions failed)
- If knockout questions failed, candidate status is set to “rejected” for that requisition
- Timeline note is added with rejection reason
Duplicate Application Detection
The system checks for duplicate applications based on:
- Email address
- Name (exact match)
- Requisition ID
If Duplicate Found:
- If existing application is incomplete, it is updated (not duplicated)
- If existing application is complete, candidate sees error: “You have already applied for this position”
Embed System
Overview
The embed system allows you to display job listings and application forms on external websites using a simple JavaScript snippet.
Setup
- Go to Appearance > Ada Settings > Embed Settings
- Generate API Key: Click “Generate” to create a unique API key
- Whitelist Domains: Add domains allowed to embed your jobs (one per line)
- Example:
example.com - Leave blank to allow all domains (not recommended)
- Example:
Getting the Embed Code
- Go to Appearance > Ada Settings > Embed Settings
- Copy the embed snippet displayed on the page
- Paste into your external website’s HTML
Embed Code Format
<script type="text/javascript">
(function() {
var adaEmbed = document.createElement('script');
adaEmbed.type = 'text/javascript';
adaEmbed.async = true;
adaEmbed.src = 'https://yoursite.com/wp-content/themes/Ada/public/js/embed.js';
adaEmbed.setAttribute('data-api-url', 'https://yoursite.com/wp-json/ada/v1/');
adaEmbed.setAttribute('data-api-key', 'YOUR_API_KEY');
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(adaEmbed, s);
})();
</script>
Embed Features
- Job Listings: Display all approved jobs
- Search: Search jobs by keyword
- Filters: Filter by location, department, salary range
- Job Details: View full job description
- Application Form: Complete application inline (not in modal)
- Resume Parsing: Same step-by-step parsing as main site
- Auto-fill: Fields auto-populate after resume upload
Embed Container
The embed will automatically create a container element. You can style it with CSS:
.ada-embed-container {
/* Your custom styles */
}
Security
- Embed requests are validated against whitelisted domains
- API key is required for authentication
- Nonce validation is optional for embeds (handled by whitelist)
Gamification System
Overview
The gamification system awards points to recruiters for various actions, encouraging engagement and productivity.
Earning Points
Points are awarded for:
- Hourly Login: 1 point per hour logged in (default)
- Candidate Reviewed: 0.5 points per candidate reviewed (default)
- Status Progression: 0.5 points per status change (default)
- Custom Status Points: Configurable points for moving to specific statuses
Viewing Points
- Navigate to
/ats/points - View:
- Current points balance
- Points history (transactions)
- Points earned per action
Spending Points
Recruiters can “spend” points to request rewards:
- Navigate to
/ats/points - Enter points to spend
- Enter message/request
- Click Spend Points
- Email is sent to admin (configured in Gamification settings)
Configuring Points
- Go to Appearance > Ada Settings > Gamification
- Set points for each action:
hourly: Points per hourcandidate_reviewed: Points per reviewstatus_progression: Points per status change- Custom status slugs: Points for specific statuses
- Set Spend Points Email: Email to receive spending requests
- Click Save Changes
Settings & Configuration
Settings Tabs
Navigate to Appearance > Ada Settings to access all configuration options.
1. Gamification
- Points map (points per action)
- Spend points email
2. Requisition Form
- Custom fields for requisition submission (dynamically rendered on form)
- Field types: text, email, textarea, select, checkbox, file, number, tel, url, date
- Fields automatically appear on the
/ats/submit-requisitionpage - Supports required/optional field configuration
3. Application Form
- Custom fields for public application forms
- Field types: text, email, textarea, select, checkbox, file
4. Candidate Statuses
- Configure status workflow (fully dynamic – no hardcoded status names)
- Add/edit statuses and sub-steps
- Reorder statuses
- System intelligently detects “rejected” and “hire”/”hired” statuses
- Supports any custom status names you configure
5. Embed Settings
- API key generation
- Domain whitelist
6. Retro Theme
- Color customization
- Font selection
- Scanline effect toggle
7. General
- Logo upload
- Favicon upload
- Timezone setting
- Cloudflare Turnstile keys
8. Email Templates
- Configure email templates for system notifications
- Available templates:
- Requisition assigned (to recruiters)
- Requisition submitted (to approvers)
- Points spending (to admin)
- Incomplete application (to candidates)
Testing the System
Test Workflow
Follow this complete workflow to test all features:
1. Create Test Users
- Create a Hiring Manager user
- Create a Recruiter user
- Create an ATS Approver user
2. Create a Requisition
Option A – Hiring Manager:
- Log in as Hiring Manager
- Navigate to
/ats/submit-requisition - Fill in job details (all configured fields will appear dynamically)
- Submit requisition
- Verify status is “Pending”
Option B – Recruiter:
- Log in as Recruiter
- Navigate to
/ats/submit-requisition - Fill in job details
- Submit requisition
- Verify status is “Pending”
Option C – ATS Approver:
- Log in as ATS Approver
- Navigate to
/ats/submit-requisition - Fill in job details
- Submit requisition
- Verify status is “Pending”
3. Approve Requisition
- Log in as ATS Approver
- Navigate to
/ats/requisitions - Open the pending requisition
- Click Approve Requisition
- Assign a recruiter
- Verify status is “Approved”
4. Add Knockout Questions
- Still on requisition detail page
- Add a knockout question:
- Question: “Do you have 5+ years of experience?”
- Options: “Yes”, “No”
- Correct Answer: “Yes”
- Save
5. Apply as Candidate (Public)
- Log out
- Navigate to
/ats/jobs - Click on the job
- Upload a resume (PDF or Word)
- Watch parsing progress
- Verify fields auto-populate
- Complete application form
- Answer knockout question incorrectly
- Submit application
- Verify success message
6. Review Candidate (Recruiter)
- Log in as Recruiter
- Navigate to
/ats/candidates - Find the candidate
- Verify “Incomplete Application” badge (if applicable)
- Click on candidate
- Verify:
- Parsed resume text is visible
- Tags are extracted
- Status is “rejected” (due to knockout question)
- Timeline shows rejection reason
- Select requisition from dropdown
- Change status to “Screen”
- Add a note
- Rate candidate (3 stars)
- Add a tag
7. Test Search
- On candidates page, use search:
- Search by name
- Search by email
- Search by tag (e.g., “JavaScript”)
- Search by parsed resume text
- Test boolean operators:
JavaScript AND React
8. Test Bulk Actions
- Select multiple candidates
- Update status for all
- Assign recruiter to all
9. Test Points System
- As recruiter, navigate to
/ats/points - Verify points are awarded for actions
- View points history
- Test spending points
10. Test Embed
- Go to Appearance > Ada Settings > Embed Settings
- Generate API key
- Add test domain to whitelist
- Copy embed code
- Create test HTML page with embed code
- Verify jobs load
- Test search and filters
- Test application submission
Troubleshooting
Common Issues
1. “You must be logged in to access this page”
Cause: Trying to access ATS pages without logging in
Solution: Log in to WordPress, then access ATS pages
2. “404 Not Found” on ATS pages
Cause: Permalinks not flushed after theme activation
Solution: Go to Settings > Permalinks and click Save Changes
3. Resume parsing fails
Causes:
- Unsupported file format
- File is image-based PDF (no text layer)
- PHP extensions missing
- File too large
Solutions:
- Ensure file is PDF or Word document
- Check PHP error logs
- Verify PHP extensions are installed
- Try smaller file (<10MB)
4. “Invalid security token” error
Causes:
- Nonce expired
- Cloudflare Turnstile misconfigured
- Caching issues
Solutions:
- Refresh page and try again
- Clear browser cache
- Check Turnstile keys in settings
- Disable Turnstile for testing (leave keys blank)
5. Tags showing as serialized data
Cause: Data corruption or migration issue
Solution: This should be automatically fixed. If not, contact support.
6. Candidates not appearing in search
Causes:
- Search term too specific
- Boolean operator syntax error
- Data not indexed
Solutions:
- Try simpler search terms
- Check boolean syntax:
term1 AND term2, notterm1&term2 - Verify candidate has tags or parsed resume text
7. Embed not loading
Causes:
- Domain not whitelisted
- API key incorrect
- CORS issues
Solutions:
- Verify domain is in whitelist (no
http://orhttps://) - Check API key matches settings
- Check browser console for CORS errors
8. Points not awarding
Causes:
- Points map not configured
- WP-Cron not running
- User role incorrect
Solutions:
- Check Gamification settings
- Verify WP-Cron is enabled
- Ensure user has
ada_recruiterrole
Getting Help
- Check Error Logs: Review PHP error logs and WordPress debug log
- Check Browser Console: Open browser developer tools (F12) and check for JavaScript errors
- Verify Permissions: Ensure user has correct role and capabilities
- Test in Incognito: Rule out browser cache/cookie issues
- Check WordPress Version: Ensure WordPress is up to date
- Check PHP Version: Ensure PHP 7.4+ is installed
Additional Notes
Security
- All ATS pages require login (except public job listings)
- Public application endpoints validate nonces and Turnstile (if configured)
- Embed system uses domain whitelisting and API keys
- All user input is sanitized and escaped
- File uploads are validated and stored securely
Performance
- Resume parsing is performed server-side
- Large files may take time to parse
- Search uses WordPress meta queries (optimized)
- Points system uses WP-Cron for hourly awards
Data Storage
- Candidates: Custom post type
ada_candidate - Requisitions: Custom post type
ada_requisition - Resume files: WordPress media library
- Parsed text: Post meta
ada_parsed_resume_text - Tags: Post meta
ada_tags - Status: Post meta
ada_status_requisition_{id}(per-requisition) - Timeline: Post meta
ada_timeline_requisition_{id}(per-requisition) - Points: User meta
ada_points
Cleanup
- Resumes are automatically deleted when candidate is deleted
- Orphaned resumes (not linked to any candidate) are cleaned up daily via WP-Cron
- Timeline events are stored indefinitely (no automatic cleanup)
Support
For issues, questions, or feature requests, please contact the theme developer or submit an issue through the appropriate channel.
Version: 1.0.0
Last Updated: December 5, 2025
Author: Billy Wilcosky
License: Proprietary