Full enterprise ATS — AI screening, VMS inbound sourcing, Google Drive, email/text templates, and multi-portal access.
VMS — inbound login (sign in with your credentials)
Custom email & text templates you create and save
Google Drive resume upload integration
AI screening results saved directly to candidate profile
Vendor & client portals with real email invites
HRRS Pro
Enterprise Recruiting Platform
Sign in as
🛡Admin
🔎Recruiter
👔Manager
🏢Vendor Portal
🤝Client
🧑Candidate
Forgot password?
Register for the Candidate Portal
Fill this out once, and we'll review your registration — you'll get portal access once approved.
🔄 We've made an important update — please do a hard refresh to get the latest version (Windows/Chrome: Ctrl+Shift+R · Mac: Cmd+Shift+R · Mac Safari: Cmd+Option+R).
⚠ Your browser's saved data for this app is nearly full, which can cause things to silently stop saving (like staying signed in).
Notifications
Messages
Vendor Messages
Select a vendor to view and reply
Dashboard
Good morning!
0
Active jobs
0
Candidates
0
Interviews scheduled
0
Offers pending
Candidate Breakdown
New: not yet associated to a job or contacted. In Review: contacted, or actively in a job's pipeline. Available: their job filled, but they weren't hired or rejected. Rejected: moved to a rejected status. Hired candidates aren't counted in any of these four.
0
New
0
In Review
0
Available
0
Rejected
0
Placed
0
Offers out
0
Interviews
0
Screening
0
Submitted
📧 Prescreen Reminder Emails Sent0
Every friendly and final reminder sent so far to candidates who haven't answered their prescreen questions — checked automatically every 30 minutes while the app is open.
No reminders sent yet
⚠ No Response After Final Reminder0
These candidates never answered their screening questions after two reminders. Nothing further happens automatically — review each and decide.
No one currently in this state
✅ Recently Completed Screenings0
Screening questions completed in the last 7 days. Click anyone to review — Next/Back lets you step through the whole list without coming back here each time.
No completed screenings in the last 7 days
0
Pending Approval — Candidates
0
Pending Approval — Vendors
0
Pending Approval — Clients
Pipeline snapshot
Recent activity
📝 Unfinished Emails0
✅ My Tasks
🆕 New Candidates
🤝 Vendor Submissions
✍ RTR Signed
⏳ Pending Submittals0
📤 Submittals
Job Requisitions
Create, manage, and share open roles
Posting Title
Type
Location
Pay
Skills
Cands
Status
Posted
Actions
Candidates
AI-ranked talent pool
🤖 AI Search — describe who you're looking for, in your own words
Candidate Name
Applied Job
AI Match %
City
State/Province
Zip Code
Country
Stage
Modified Time
Email
Mobile
Current Job Title
Skill Set
Highest Qualification
Industry
Source
Vendor Name
Split Company
Associated Tags
Text Opt
Email Opt
Actions
Contacts
General contacts — not yet formal candidates
Name
Email
Phone
Notes
Added
Actions
No contacts yet
Vendor
Vendor profile info and notes, kept separate from portal management
Agency
Contact
Email
Phone
Submissions
Shared Jobs
Placements
Agreement
Added
First Signed In
Notes
No vendors yet
Clients
Client relationship info — company details, notes, and job history, kept separate from portal management
📊 Client Job Requests
0
Pending Approval
0
Approved
0
Declined
0
Total Requests
Client
Job Title
Status
Submitted
Decided
No client job requests yet
Company
Contact
Email
Phone
Stage
Company Info
Jobs
Tasks
Documents
Email History
Notes
No clients yet
🔍 Email Connection Diagnostics
🔔 All Notifications
Showing the last 60 notifications — the most this app keeps a record of.
🔍 Check Pending Applications/Registrations Queue
Checks directly with the shared database for anything submitted but not yet processed into a candidate record — this is what "haven't received a notification" would actually look like if something is stuck here.
📬 Check Job Mailbox Queue
This is a separate queue from Pending Applications — this is specifically what Job Mailbox (resumes forwarded or emailed in via Zapier) feeds into. Checks directly with the shared database for anything received but not yet turned into a candidate record.
📧 Recreate Candidate From Notification Email
Paste the full "New Candidate Portal application" or "New application" email you received — this reads their name, email, phone, location, skills, and other details straight from it, instead of you retyping everything by hand.
🔎 Data Recovery Search
Searches emails by recipient name (not email match, in case the profile's email changed), and checks for assessment/document records that may be orphaned from a candidate whose profile changed or was affected.
Checks every email you've ever sent against current candidate records, all at once — this is the right tool when several people may be affected, not just one.
Searches every record in every data type for this exact text, regardless of which field it's in — the right tool when something specific (like a wrong email) keeps showing up and the actual source isn't obvious.
🗑 Recently Deleted Candidates
Full records are kept here after deletion so they can genuinely be restored — not just an id number. Keeps the most recent 200. Search by name or by an orphaned candidate ID to find out who a record used to belong to.
🗑 Recently Deleted Assessments
Full prescreening/assessment results are kept here after deletion, including every answer, so they can genuinely be restored. Keeps the most recent 200.
🔍 Quick Note
📝 Notes —
📨 New Message to Vendor
💬 Private Messages —
📧
📧 Emails Sent —
📢 Notify Vendors —
🔒 Internal Notes —
🔒 Admin/Recruiter only — this is never visible to the vendor or client themselves, unlike the "📝 Notes" thread.
✉ Email
✉ Email
Contact
Contact Info
🤝 Meetings
💬 Internal Messages (Admin, Senior Recruiter, and Recruiter)
✉ Emails
📥 Replies Received
Add Contact
Hiring Pipeline
Kanban — click any card to view or advance the candidate. Only candidates associated with a job appear here.
VMS Connections
Forward real job requisition emails in from any connected platform
⬇ INBOUND ONLY — These integrations download job requisitions into HRRS Pro. Your jobs are never posted outward to any VMS platform.
Also accepts CSV / Excel / Google Sheets exports for bulk import
🔗 Live Application Intake
No job board gives a small tool like this direct API access — that requires a formal ATS partnership only large platforms have. But you can still get candidates flowing in automatically: create a free Google Form as your "Apply Now" page, share that link anywhere (including as the external Apply URL when you post on Indeed/ZipRecruiter/etc, or on your Wix site), and this ATS will pull in every new submission automatically.
☁ Google Drive
There's no direct connection between Google Drive and this ATS — Google doesn't allow a plain website to reach into your Drive without a formal, verified integration. The real, working path is two clicks instead of one:
1. Click "Open Google Drive" below (or the 📁 Drive button in the top bar) — find your resume file and click Drive's own Download button to save it to your computer 2. Come back here and use the upload box above ⬆ — drag that downloaded file in like any other resume
Upload history
Uploading only extracts the resume text. Pick a job and click "Add to ATS" on each row below to actually create the candidate profile.
AI Screening
Generate questions · run sessions · results auto-saved to candidate profile
Screening questions
Select a job to generate questions
AI-ranked candidates
AI Interview Bot Results auto-saved to profile
⚠ This runs live, right here in your browser — it does not email anything to the candidate, and the candidate cannot access this chat remotely. Use it yourself during a call, or for internal note-taking. To send questions to a candidate to complete on their own time, use Assessments instead — that's the one that emails a link and lets the candidate answer remotely.
👋 Hi! I'm the HRRS AI screener. Select a candidate above and type start to begin. Results save automatically to their profile.
Question Library
173 interview questions across 25 competency categories
Text Interviews
SMS-style threaded interviews — use your saved templates
Conversations
No threads yet
Select a thread
Video Interviews
Schedule interviews and link a video call you've already created on Google Meet or Zoom
Scheduled video interviews
Email
Send to candidates using your saved templates
Compose
Sent emails
SMS / RingCentral
Two-way messaging with templates
🔗 RingCentral — not connected
SMS threads
No SMS threads yet
Select a thread
Internal Messages
Private messages between team members — use @username to mention
Conversations
No conversations yet
Select a conversation
Use @username to mention team members privately. Message is private unless you @mention others.
My Templates
Create email and text templates — reusable everywhere in HRRS
Templates0
No templates yet. Click + New template
✏️
Select a template or create one
Calendar & Schedule
Interviews, calls, and video meetings you schedule and track here
🗓
Scheduling Links Saved
June 2026
Events
No events — click + New event
To-do's
Personal reminders — anything you add here shows up in your daily "Open Items" email until you mark it done
Notes
Genuinely private, personal reference notes — write freely, saves automatically as you type
👁 Viewing someone else's notes — read-only, these belong to them
💼 Jobs
🧑 Candidates
🤝 Vendors
🏢 Clients
🎥 Interview
My Interviews
Candidates assigned to you — resume, screening answers, job description, and your interview notes
Welcome — Have A Nice Day!!!
Vendor Portal
Manage agencies — send real email invites
Pending Vendor Approval0
Submitted through the public "Join Our Recruiter Network" form. Approving sends the real portal invite email automatically.
No pending applications right now
Declined Vendor Requests0
Vendor applications you've denied — kept here for reference rather than deleted outright.
No declined requests yet
⏰ Vendor After-Hours Issues0
Vendors who couldn't sign in after your business hours ended — review each morning and send a new password with one click.
No after-hours issues right now
📧 "Send invite" opens your email client with a pre-filled invitation email. Your email program sends it.
Vendors
📧 To send the portal link separately: find the vendor below and click "Send portal link". Click "Assign jobs" to choose which requisitions they can see and submit candidates for.
Agency
Contact
Email
Signed In
Placements
Assigned Jobs
Status
Actions
No vendors yet
Vendor access controls
What vendors can see in their portal
Welcome — Have A Nice Day!!!
RECRUITING PARTNER
Q&A
We're here to help!
Questions about Jobs, Candidates or Submissions?
Send us a Private Message and our team will be happy to assist.
Vendor Portal
Submit candidates and track their progress.
⚠ Confidentiality Reminders
Salary:
DO NOT post on Job Boards or Social Media
DO NOT mention Salary over Email, LinkedIn, WhatsApp, or any written communication
Client Name:
DO NOT post on Job Boards or Social Media
DO NOT mention Client Name over Email, LinkedIn, WhatsApp in the First Communication
Activity
❓ Vendor Q&A
How do I submit a candidate?
Find the job on your Assigned Jobs list and click "+ Submit Candidate" on the job card. Enter the Candidate's Name, Email, Phone Number, Skills, Resume, and Candidate Summary, then click Submit. You can follow your candidate's progress through the various stages directly in the Vendor Portal. Every candidate submission is automatically date- and time-stamped when received.
How do I contact HRRS?
Please use Private Messages below in the Vendor Portal for any questions regarding jobs, candidates, submissions, or other recruiting matters.
What happens if the candidate has already been submitted by another Vendor?
As you enter the candidate's name or email address in the submission form, the system automatically checks for a potential match with a candidate already in the system. If a match is found, you will immediately see a warning: ⚠ Possible duplicate of [Name] (already in system) This helps prevent duplicate submissions and allows Vendors to verify the candidate before completing the submission.
Submission Date & Time Are Recorded
The system automatically records the date and time of every candidate submission. If the same candidate is submitted by multiple Vendors, the Vendor who first submits the candidate will receive placement credit if that candidate is ultimately hired, subject to the terms of the Vendor Agreement. This tracking process helps ensure that candidate ownership and placement credit are handled fairly and transparently.
Please check the duplicate warning carefully before submitting a candidate.
Placements – Payment Requirements
To receive your placement payment, all of the following requirements must be met:
Candidate Starts: The candidate must officially begin employment with the Hiring Company.
Client Payment Received: The Hiring Company must complete its payment to HR Recruiting Services (HRRS) for the placement.
Guarantee Period Completed: The candidate must successfully complete the applicable guarantee period set by Client, and the Hiring Company must confirm that the guarantee requirements have been met.
Payment to Vendor: Once all of the above requirements have been satisfied, your placement payment will be issued within 10 days after HRRS receives payment from the client.
W-9 Required: As an independent 1099 Freelance Recruiter, you will be required to provide a completed W-9 to HRRS before payment can be issued.
Please note: Placement payments are contingent upon receipt of payment from the Hiring Company and successful completion of the applicable guarantee period.
Fill out the information below so we can match you to the most relevant jobs
What you recruit
Company industries
Candidate roles you recruit
Countries
States
Client Portal
Invite-only — clients need your approval before they get access
Pending Client Applications0
Submitted through the public client application form. "Add as Client" creates the record — approve it below to send their portal invite.
No pending applications right now
Pending Client Approval0
No pending clients
Pending Job Requests0
No pending job requests
Approved / Declined Client Job Requests
Once approved, publish from here or head to Jobs to assign it to vendors.
✅ Candidates can ONLY get portal access via an Admin email invitation. There is no public sign-up link.
Portal settings
Control what candidates can see and do once approved
✅ You are notified immediately when an invited candidate accepts and registers
Pending Approval0
No pending registrations
⏰ After-Hours Password Issues0
Candidates who couldn't sign in after your business hours ended — review each morning and send a new password with one click.
No after-hours issues right now
Invited Candidates
Name
Email
Status
Invited
Self-Service
Actions
No invites sent yet
Your Candidate Portal
Track your application and keep your profile up to date
Wix Integration
Post all your jobs to Wix — share link or embed code
Your Wix website URL
Enter your Wix URL to generate share links and embed codes for each job
Reports
Live recruiting analytics and exportable reports
✅ Your agenda now also sends automatically, once per day, the first time you open the ATS that day — you don't need to click the button unless you want an extra copy right now. This only fires while the app is actually open in a browser at least once that day; it can't send at a fixed time if nobody opens it (see Settings → Notifications for details on this limitation).
0
Placements
—
Avg days to fill
—
Offer acceptance
—
Cost per hire
Candidates by source
Pipeline funnel
🕐 Activity Log
Sign-in and sign-out history for your team — for what everyone actually worked on, see "📋 Daily Recruiter Activity" below.
Date
Name
Sign In
Sign Out
📋 Daily Recruiter Activity
What each person actually worked on for the selected day — candidates added, emails sent, jobs posted, and more.
📅 Interviews
Interview Name
From
To
Candidate Name
Posting Title
Interview Status
📞 Phone Screens
Date/Time
Candidate Name
🎥 Video Interview Stage
Candidate Name
Stage
🤝 Submittal to Client
Date/Time
Candidate Name
Posting Title
⭐ Top Rated Candidates (80-100% AI Match)
AI Score
Candidate Name
Posting Title
📆 Age of Open Jobs
Job Opening
# Positions
Age (Days)
✅ Tasks
Task
Assigned To
Due Date
Status
Users & Settings
Edit your profile, manage team, API keys
Help
Quick directions for common tasks, and what's changed recently
📬 Your Job Mailbox Address(es)
Personal forwarding (forward any resume email here to add it to Candidates): hrrsresumes.oa0hoz@zapiermail.com
🆕 What's New — Recent Updates
▸ Show
🆕 What's New — Recent Updates
Showing recent changes only — the practical "how do I..." info now lives in the topic sections below, organized by area (Jobs, Candidates, Vendor Portal, etc.) instead of buried in this list.
URGENT FIX: Re-extract Missing Resume Text was checking the wrong field, so it found nobody to fix — found via a real, live example: Kevin Lin genuinely needed this, but the button reported "already extracted" for everyone. The actual resume file data deliberately isn't part of the lightweight candidate sync (by design, to keep it fast) — it lives in its own dedicated location per candidate, fetched on demand. This checked the wrong field for that data and found it empty for virtually everyone, even though the real file was always there. Now correctly finds candidates by their resume filename (always present) and fetches the actual file on demand before attempting extraction, using the exact same proven mechanism already used elsewhere for viewing/downloading a resume. Tested directly against a simulation of her exact scenario to confirm it now genuinely works.
Long numeric ID prefixes are now automatically stripped from resume filenames — found via her real example: Zoho exports resumes with a filename like "4562100000001420054_Justin_Spencer.pdf". Now cleaned to just "Justin_Spencer.pdf" automatically, wherever a resume gets attached (Bulk Match Resume Files, manual upload, replacing a resume on a candidate's profile). Tested directly against her exact filename and confirmed genuinely short numeric prefixes, like a real year, are correctly left alone.
URGENT: found and restored a genuine regression — the Date Added column on Upload Resumes had been lost — this was built and shipped earlier today, but was missing from the deployed file, likely lost when copying from an outdated base during a later change. Re-applied and re-verified, along with the horizontal scroll fix from the same earlier work.
New: red duplicate warning on Upload Resumes, before adding anyone to the ATS — checks each staged file against existing candidates by email extracted from the resume text, falling back to name matching. Tested directly against a real duplicate, a name-only match, and a genuinely new person, all correctly handled.
Vendor submissions: duplicates are now actually blocked, not just possible — submitting a candidate whose email already exists now shows "Not able to upload candidate — Candidate has already been uploaded" and stops the submission entirely, exactly as requested. Also fixed: submission timestamps now include the actual time, not just the date.
URGENT FIX: two toolbar icons had zero permission checks at all, ever — the "Messages" (internal staff-to-staff chat) and "Vendor Messages" icons lived outside the normal sidebar system that everything else relies on, so they were always visible to every role, including Vendor, regardless of what their actual saved permissions said. Found via direct, real feedback that Vendor Messages was reachable from a real test vendor account. Fixed both properly — hidden entirely when the role lacks access, plus a defense-in-depth check inside each function itself so a stray click can't bypass it either. Tested directly against confirmed real vendor permission data.
Same delete button added to Internal Notes too — found via direct feedback that it was only on the vendor-facing Messages, not this genuinely private, staff-only system. Same proven, tombstone-protected pattern. Tested directly.
New: delete button on individual Vendor/Client messages, admin-side only — built in direct response to a real need: a way to remove a specific message without console commands. Caught and fixed a real bug in my own first version before shipping it — the deletion wasn't properly tombstoned, so a stale copy of the conversation could have silently brought a deleted message right back. Tested the actual delete-and-merge scenario directly to confirm it now stays permanently gone.
Client's Offered Salary warning updated to also cover posting — now reads "(DON'T POST SALARY OR SHARE WITH CANDIDATES)".
# of Positions, Experience Level, and Visa Sponsorship can now be shown to vendors — same internal-by-default pattern as the other fields, with their own checkboxes on both Add and Edit Job. Tested every combination directly, including singular vs plural for "1 position" vs "3 positions".
New "DO NOT POST JOB ANYWHERE — SOURCING ONLY" warning — an independent checkbox on any job, separate from the existing Vendor Only visibility badge, so this can be flagged regardless of how the job is otherwise set up. Shows as a clear red banner on the vendor-facing job card.
URGENT FIX: my own gap - a vendor's reply to a staff-initiated message never surfaced anywhere — found via a real, live example: replied back and neither she nor Lee could see it. The badge and inbox treated "has a reply" as "done, nothing more needed" for every ticket, but for a staff-started conversation, the vendor's reply is the first time staff would ever see it at all. Now correctly surfaces again the moment a vendor replies, and clears once staff actually opens that vendor's thread. Tested the full lifecycle directly, and confirmed the original, vendor-initiated direction is completely unaffected.
URGENT: same duplicate-session bug found and fixed in three more places — the "open items" daily email, both pre-screening reminder emails to candidates, and both automation-triggered emails (including "A few quick questions," confirmed directly against her real duplicate report). Every one of these had the identical vulnerability: a local-only check with no real, shared lock, so multiple simultaneous sessions could each independently decide it was safe to send. All four now claim the same atomic lock already proven for vendor reminders before ever sending. Tested each one directly, simulating multiple simultaneous sessions racing for the same email.
New: proactive warning when browser storage is nearly full — built in direct response to a real, confirmed incident today where this silently caused both a stuck update banner and getting logged out unexpectedly, with no visible error anywhere until dug up through the console. A red banner with a one-click "Clear it now" button now appears automatically, well before storage actually fills up and starts silently failing saves. Also added a matching Help page section as a manual backup reference. Tested the detection threshold directly against the exact numbers from today's real incident.
URGENT, serious: found and fixed why a vendor could stop seeing newly assigned jobs the longer they stayed signed in — confirmed directly on her own test account: 22 jobs assigned, only 6 showing, even after forcing a refresh. Root cause: her own account record was only ever captured once, at the moment she signed in, and never refreshed again — every time the shared job/vendor data synced afterward, it created a brand-new copy behind the scenes, silently disconnecting from that original, frozen snapshot. The longer someone stayed signed in, the more likely their view was to fall behind reality. Fixed by re-checking against the live, current data every time this information updates. Tested the exact real scenario end-to-end — confirmed the fix correctly recovers all 22, not just the original 6. Affects vendors, clients, and staff alike, since all four share the identical pattern.
New vendor applicants: admin notification email now includes a direct resume download link — same proven, no-cost pattern already used for candidates (signs her in if needed, downloads immediately), rather than a true attachment, which EmailJS confirmed requires a paid plan upgrade starting at $9/month. Built directly in response to the resume data-loss incident, giving her an independent backup path straight from her own email going forward.
URGENT, serious: found and fixed a real data-loss bug caused by an earlier fix today, which permanently deleted the original resume from all 7 real vendor applicants' records — confirmed directly against the live database. The earlier vendor storage fix only removed the resume from the local backup copy, but the resume was still part of the main vendor record pushed to the shared database as a whole — so the next time this device loaded its own already-stripped local copy, that incomplete version got pushed right back up, overwriting the real data. Rebuilt using the exact same safe, isolated-node pattern already proven for candidate resumes: the resume now lives in its own dedicated database entry that can only ever be added to, never cleared by an incomplete save. Tested directly to confirm both properties hold. The original resume files for these 7 vendors are very likely unrecoverable going forward — flagged directly to her.
URGENT: found and fixed the single largest contributor to local storage filling up — confirmed directly on a real device today: vendors had zero stripping at all before hitting local storage, unlike candidates and uploads which already had this protection. A vendor's original application resume file was quietly accounting for 1.5MB across just 26 vendors, roughly a third of all local storage used. Fixed at all four places vendors get saved, using the same proven approach already used for candidates. Tested directly — confirmed a 98.5% reduction on a real-sized record, with every other application detail staying fully intact.
Found and fixed the actual root cause of today's stuck banner and lost saved login — confirmed directly: a real device's local backup storage was completely full, and the app only ever checked whether the largest single save (candidates) failed, silently missing the other ~30 smaller saves — including the banner's own "seen" marker — that could just as easily fail the same way. All saves are now tracked together, so any failure triggers a clear, honest warning instead of confusing, indirect symptoms. Tested directly to confirm even a single failure among many is caught.
Refresh banner version bumped for today's fix — so it reappears for everyone, including anyone who already saw and dismissed the earlier one from earlier this week. Tested directly to confirm.
URGENT: found and fixed why some vendors received the same reminder email more than once — confirmed directly via real email timestamps spread 34 minutes apart, not clustered together. The actual cause: multiple separate browser sessions, each running its own independent 30-minute check, could each believe they were the first to send a given reminder, since the "already sent" check only ever looked at that session's own local data, never anything shared or authoritative. Now claims a genuine, atomic lock directly against the shared database before ever sending — only one session can ever win the right to send a specific reminder, no matter how many are open at once. Tested the actual race condition directly with multiple simultaneous claims.
Vendor Q&A expanded with two new sections — "Submission Date & Time Are Recorded" (first-submitter placement credit) and, in bold, "Placements – Payment Requirements" with the full 5-point list. Flagged for her own review: worth confirming this wording matches the actual signed Vendor Agreement exactly, since it makes specific, binding-sounding payment claims.
Added the same country autocomplete already proven on candidate forms to both Add Job and Edit Job — confirmed directly this had genuinely never been built for jobs at all, only candidates, which is why a hard refresh didn't fix it. The ZIP-from-city/state lookup was already working correctly on both job forms.
Submitted switched to a brighter, more vivid orange in the Hiring Pipeline.
Vendor Portal title simplified to just the vendor's name, subtitle shortened to "Submit candidates and track their progress."
Fixed: Hiring Pipeline numbers and labels never actually varied by stage — confirmed directly: every stage was hardcoded to the same blue, which is exactly why Rejected showed blue instead of red. Each of the 5 stages now gets its own distinct, correct color for both its label and its count.
Vendor Q&A: key terms highlighted in burgundy to match the banner — Assigned Jobs, Submit Candidate, and each submission field called out in the first answer; Private Messages called out the same way in the second, which now also says "below" to point more clearly at where it actually sits on the page.
Banner finalized: centered as a block under "Welcome," spacing stretched back out between elements, everything kept on one line — refined together through several rounds of live preview until the balance was right: not full-bleed to the page edges, not tightly packed either, and the supporting text sitting right after the second divider instead of wrapping underneath.
Vendor Portal's Hiring Pipeline made compact, per her exact requested layout — replaced the wide, horizontally-scrolling board of candidate cards with a small, stacked grid showing just a count per stage: Submissions, Submitted, and Hired on top; Review and Rejected below. Shortlisted folds into Review, Offer folds into Submitted, consolidating from 7 stages down to the 5 she wanted. Tested the full mapping directly to confirm every candidate is still counted exactly once, nothing lost in the consolidation.
Recruiting Partner Q&A banner redesigned, based on her own detailed spec, refined together through several rounds of live preview — dusty rose and burgundy palette, a message-bubble icon with a typing-dots detail, italic-weight "Q&A" heading, a script-style "We're here to help!" accent, and a hand-drawn botanical sprig with berries, tilted to look like it's caught mid-breeze. Still built specifically in response to only ever receiving one vendor contact message despite having several active vendors.
Every vendor email now BCCs her own address automatically — built in direct response to needing her own record when a recruiter claims they never received something. Works regardless of which connection actually sends it (the dedicated vendor mailbox, or the fallback to her main connection). Extended the underlying BCC system to support a specific address, not just an on/off toggle, while confirming every existing caller keeps working exactly as before. Tested all scenarios directly.
Welcome email bullet reworded to “Questions: Send our team private messages about any job requisition, right from inside the portal,” per her exact wording.
Shortlist confirmation email updated to her exact new wording — removed the Google Meet/self-scheduling detail and the "interview availability may be limited" paragraph, and softened the closing line.
Button relabeled to "🤝 Convert to Vendor – Sends Agrmnt," and a new "Conversion of Candidates to Vendors" Help section added under Candidates — both so this workflow is clear at a glance and easy to refer back to later.
New "📥 Vendor Submissions" section added to the Help page — covers the admin email notification, where the setting lives, and every place a vendor-submitted candidate actually shows up, all confirmed directly against the real code today.
Reverted the above, per her explicit follow-up — automatic screening questions should only go out when a candidate genuinely applies themselves through the portal. Uploading a resume herself now deliberately stays fully manual again, as before, with no automation firing from that specific flow.
URGENT: found and fixed why automations never fired from the actual "Upload Resumes" flow — confirmed directly: this specific path never called the automation trigger at all, anywhere in the function, unlike the separate CSV import flow which did. A carefully set up "when stage becomes Applied" automation would have silently never fired for anyone added this way. Fixed using the candidate's real, resulting stage. Tested both real scenarios directly — uploading without a job (Applied) correctly fires, uploading with a job assigned (Matched) correctly does not, since that's a different stage.
Clarified confusing wording on the "Send Screening Questions" automation — "the same built-in screening questions email" was reasonably read as every job sharing the same questions, when it actually just meant the email's wording is consistent while the questions inside are pulled per-candidate's own job, correctly, confirmed directly in the code. Reworded to say this explicitly.
Fixed: the duplicate resume warning was correct but permanently stuck showing forever — confirmed directly against her real upload history: an already-imported candidate was never actually removed from the list, just relabeled, so every candidate she'd ever successfully added kept showing here indefinitely, correctly but confusingly flagged as "a duplicate of themselves." An already-imported entry is now skipped from this list entirely. Tested directly with her exact real scenario — 4 already-imported entries correctly disappeared, the 1 genuinely pending one remained.
"📋 Send Screening Questions" made bright yellow, per request, to stand out.
Stage labels on the candidate profile now show in black, not the harder-to-read gray they used before — the currently selected stage still stands out clearly by its own solid border and distinct background color.
New: "📋 Send Screening Questions" now sends immediately, right from the candidate profile — built in response to a real workflow complaint. The old version closed the profile and navigated to the Email tab, which also destroyed the profile's own Next/Back navigation between candidates on the same job. Now sends directly, stays on the profile, and the existing Next/Back navigation keeps working exactly as before — send, click Next, repeat.
Fixed: zip code no longer auto-filling from city/state on the actual candidate edit form — confirmed directly: the lookup was wired up correctly everywhere else (jobs, sourcing), but was simply never added to this specific form. Tested directly.
Also noted, not yet acted on: found a separate, unrelated ID collision between the Client "Company Info" modal and the Candidate Portal's own "Edit Your Profile" modal — both reuse the same field IDs. Flagging this for awareness since it wasn't the cause of either issue reported today, but could cause a subtle bug later.
URGENT: found and fixed why @-mentioning the Administrator could never work at all — confirmed directly: she's genuinely never stored as a record in the same list every other mention gets matched against, so no tag for her name could ever notify her. Now checked separately and correctly. Tested her exact real name directly, and confirmed mentioning anyone else, like a Recruiter, is completely unaffected.
Fixed: choosing "Vendor" as a contact's category didn't actually group them anywhere — confirmed directly: only Prospective and Secured Client had their own section, so Vendor (and General) both fell into a generic catch-all. Vendor now gets its own clearly labeled section, matching how the other categories already worked. Tested the full grouping directly.
New: photos on Contacts — paste an image directly (Ctrl/Cmd+V after copying one) or upload a file, shown as a thumbnail in the contact list and on their full profile. Caught and fixed a mistake of my own mid-build (an edit that briefly orphaned an existing function) before shipping.
URGENT: found and fixed why a vendor's signed agreement can be permanently lost, from a real, live example — the automatic recovery step deleted the queued signature the moment it ran, even on the rare occasion it failed to find a matching vendor, with no way to get it back. Now only removed once actually, successfully attached. Also added a real way to recover from this for a vendor already caught by it: "↻ Reset & Resend" appears right on the Expired badge, clears the expired state, and sends them a genuine fresh 5-day window rather than making them reapply from scratch for a mistake that wasn't theirs. Caught and fixed a mistake of my own mid-build (wrong quote type broke the interpolation) before shipping. Tested the full reset directly against her exact, real data.
Refresh banner now auto-disappears once each device has actually loaded the update, no manual dismiss needed — the banner's own code only exists inside the updated file, so simply seeing it already proves that device is on the current version. It marks itself handled automatically the moment it shows, then stays quiet for that device from then on. If a future update needs another refresh, it reappears for everyone until they load that version too, same as before. Tested the full lifecycle directly: first visit, repeat visit, a brand-new device, and a future update reintroducing it.
URGENT, second real gap found in the same fix, from her direct report that it was still happening — two genuine issues: the vendor assignment count reverting was never actually covered by the first fix at all, since it only touched job records, never vendor records. And even for jobs, a device still running the old code never sets a timestamp, so it kept winning against a genuinely newer, timestamped change, defeating the entire fix during the transition period. Both fixed: vendor records now get the same timestamp tracking, and a timestamped record is now trusted over one without, rather than requiring both sides to have one. Tested the exact real scenario directly, including the specific case that was still failing.
URGENT, systemic fix: found and fixed why a recent job change could silently revert itself — confirmed via a real, repeated live example. The core sync logic always let whichever device happened to be saving win, completely regardless of which version was actually newer — meaning any device with a stale local copy could silently overwrite a genuinely more recent change made elsewhere, just by triggering any save at all. Jobs now carry a real timestamp, and the sync correctly keeps whichever version is actually newer. Existing records without this timestamp yet fall back to the exact same behavior as before, so nothing else breaks. Tested the exact real scenario directly, plus confirmed backward compatibility.
Assign Jobs list now shows Open jobs only — Draft, Closed, and On-Hold no longer clutter the list. Also fixed a real risk this change introduced before shipping it: since only Open jobs are shown, saving used to be able to silently wipe out an existing assignment to a job that had since moved to Closed or On-Hold, just because it was no longer on screen to be re-checked. Now explicitly preserved. Tested the exact scenario directly.
Found the real cause of the "only 16 of 20 jobs assigned" gap, and fixed the actual tool that caused it — confirmed directly: the Assign Jobs list was completely unsorted (raw creation order) in a 360px scrollable box, making it easy to miss newer jobs sitting near the bottom while quickly assigning many vendors in a row. Now sorted alphabetically, with a new "Select all" / "Select none" option so this can't happen again. Job cards on the Vendor Portal also widened.
Job cards on the Vendor Portal made genuinely compact — description, must-haves, prescreen questions, and the submissions table now collapse behind a "View full details" toggle by default, so the Submit button on the next job stays reachable without scrolling past a full job's worth of content first. Cards also capped at a max width so they don't stretch too wide on a large screen. Activity and Vendor Q&A shortened to a fixed height with their own scroll, matching Confidentiality Reminders. Hiring Pipeline moved back above the job list.
Vendor Portal layout restructured — Private Messages moved into the narrower left column (naturally more compact, wraps sooner) with a genuine height limit and scroll so it can never push anything else down again. Job Requisitions now sits first, at the top of the main column, completely unaffected by how many messages accumulate over time.
Vendor Q&A expanded to her full, exact wording — now three questions, including the new duplicate-warning explanation. Verified the date/time-stamp claim directly in the code before publishing it — confirmed accurate.
Vendors now see a live duplicate warning while submitting a candidate — same red "⚠ Possible duplicate of [Name] (already in system)" warning already proven on the internal Upload Resumes page, checking both name and email as they type. Submit is genuinely disabled while a match is showing, and the same check runs again as a backup at actual submission time too. Tested directly, exact wording matches her example.
New Q&A card added to the Vendor Portal, right under Activity — "How do I submit a candidate?" and "How do I contact you?" (pointing to Private Messages, not email). Written directly from the confirmed, current submission steps in the actual code.
Deactivating a vendor now asks for an optional reason, saved permanently — the "⏸ Deactivate" button previously changed status with no way to record why. Now prompts for a reason (skippable), and the status badge itself becomes clickable to view it again later, along with who deactivated them and when. Reactivating a vendor clears the old reason automatically. Tested directly with her exact real scenario.
URGENT FIX: a job marked Admin Only or Admin + Recruiters Only could still be assigned to a vendor — confirmed via a real, live example: "Assign Jobs to Vendor" had zero visibility filtering at all, and even the vendor's own portal view was only checking for one of the two restricted types, not both. Fixed at both points, plus a one-time retroactive cleanup that strips any such job already sitting in an existing vendor's assignments. Tested all three fixes together directly.
URGENT: found and fixed the actual reason a message from a Recruiter never reached her side — traced directly to his device running an outdated version of the file from before the ticket system existed, so his message went into an old, disconnected data structure her current screen no longer even reads. No app-side bug — the fix is making sure everyone redeploys the same current file.
New: staff can now start a private message to a chosen vendor directly, not just reply to one they sent — "+ New Message" in the Vendor Messages panel shows only approved vendors, per her explicit request. Sends a real email too, since a vendor has no way to know otherwise. The vendor sees it clearly labeled as coming from staff, with their own reply box; the existing "awaiting reply" badge and list correctly leave these out while waiting on the vendor, since that's not something staff needs to act on. Tested the full flow directly, including confirming pending/declined vendors are never offered.
New: a genuinely public client application form, built on direct request — Client Portal previously only supported her manually adding a client first; there was no way for a company to apply on their own. New "📋 Copy Client Application Link" button on the Help page generates a real, working link (same proven pattern as the vendor one). Submissions land in a new "Pending Client Applications" section on the Client Portal page — approving creates the real client record, feeding into the existing Pending Approval flow exactly as if she'd added them by hand. Also added a proper button for the existing Candidate Register link, previously only reachable from Jobs → Quick Links. Caught and immediately fixed a mistake of my own mid-build — an edit that briefly orphaned an existing function's body — restored and re-verified before shipping. Tested the full application-to-client-record flow directly.
URGENT FIX, my own mistake: the vendor application link on the Help page was genuinely broken — confirmed via a real vendor's "unable to connect" error. It was hardcoded as plain text, missing the embedded config every other public link on this page correctly includes automatically — without it, someone opening the link from a brand-new device has no way to reach any real data at all. Replaced with a real "Copy Vendor Application Link" button, same proven pattern already used for every other working link on this page.
New auto-calculating fee formula under Private Financials, Administrator only — enter Community, Processing, and Matchmaking Fees, and Total Fees adds them automatically. Actual Revenue then calculates itself from Revenue per Position minus Total Fees, live as she types, on both Add and Edit Job. Flags in red if fees ever exceed revenue. Tested the actual math directly, including realistic dollar-formatted input and the no-fees-yet case.
New "📢 Notify Vendors" button on the job detail page — genuinely different from the older, generic Message Vendors feature, which isn't tied to any one job at all. This one only notifies vendors actually assigned to that specific job, sends both a real notification (shows in their bell icon, exactly as she asked) and an email so it reaches them either way. Tested the assignment filtering directly to confirm vendors on other jobs are correctly excluded.
Hot jobs now show a "🔥 HOT" badge on the vendor-facing card too — previously only visible internally, never to vendors at all.
New "📧 Emails" button on each vendor's profile — shows every email actually sent to that specific vendor, click any one to read its full content. Also fixed the main Email page the same way, since it turned out to only ever show subject/date/status, never the actual body — clicking now opens the full email there too. Caught and immediately fixed a mistake of my own along the way: an edit that accidentally deleted an existing function, restored before shipping. Tested the filtering and lookup directly.
New full vendor agreement reminder sequence — 24 hours (existing), then a second, stronger reminder at 48 hours, then on day 5 the agreement automatically expires with her exact email text, status changes to "Agreement Expired," and their registration closes. Tested every checkpoint directly against realistic timing, including confirming it never fires early, never re-fires, and stops the moment they actually sign.
Application link added to the Help page under Vendor Portal, in blue to stand out — also refreshed a few other lines in that section that had gone stale (the old Notes system, outdated reminder timing).
Fixed: Vendor Portal "Mark all read" didn't actually clear anything — it only toggled the unread flag, so old notifications kept sitting in the list. Now genuinely clears a vendor's own view for a clean slate, while her own admin-side visibility into that same activity is fully preserved. Tested directly, including confirming other vendors are unaffected.
Vendor Messages rebuilt as a genuine ticket system, per explicit request — Subject, Job, and Message on every message, each one its own discrete item rather than a running chat thread. Admin side shows both received date/time and replied date/time on every ticket, exactly as requested. Any Recruiter, Senior Recruiter, or Admin can reply. New "⬇ Download" button exports every vendor message to a CSV file for her records — tested the export directly, including values with commas and quotes to confirm it opens correctly in Excel.
Removed "no email needed" wording, replaced with the same "portal only, email not supported" framing used elsewhere, and added a 300-character limit with a live counter on the vendor's own message input specifically — matching the short-message style she referenced. Confirmed directly that any Recruiter, Senior Recruiter, or Admin already has full access to reply to these messages, no change was needed there.
URGENT correction: built a genuinely separate email connection for vendor emails, not just a display-name overlay — caught directly that the earlier fix could still show her real Gmail address in some mail clients, since it was sending through her main connection underneath. New Settings section (same proven pattern as the existing no-reply connection) lets her connect custsrvc@hrrecruitingservices.com as its own real EmailJS service. Falls back to the display-name approach automatically until she connects it, so nothing breaks in the meantime.
Portal access email now mentions the private messaging feature — a new bullet point plus a short explanation, telling new vendors they can message the team about any job right from the portal, no email needed.
Vendor portal label updated to "Private Messages" and made to stand out — both the header and the "no email" nudge line are now bold, dark blue, and more prominent, per her exact wording.
All vendor emails now sent as "HRRS", replies go to custsrvc@hrrecruitingservices.com instead of her own inbox — application, agreement, portal access, and reminder emails all updated, including removing her personal name and email address that had been exposed inside a couple of the email bodies themselves, not just the headers. One message-notification email intentionally kept its "from [staff name]" wording, since that's genuinely useful context for the vendor, not personal exposure. Every other email type (candidates, clients) is completely unaffected — confirmed directly.
URGENT FIX: my own earlier fix to Recently Completed Screenings had a real bug — found via a live example (Adonis Madera): it required stage to be exactly "Screening" to show up, but a candidate can genuinely complete their assessment while still sitting at "New," "Applied," or "Matched," since finishing the questions doesn't automatically change their stage. Now correctly only excludes someone who's genuinely moved past initial review (In Review, Shortlisted, Rejected, Placed, etc.), not anyone still at an earlier, pre-review stage. Tested all scenarios directly, including her exact real case.
URGENT FIX: vendors could see the internal Upload Resumes page, including every job in the system — confirmed via a real, live example on her own test vendor account. Her saved permissions had page:upload stuck at true from before the code's own default was corrected to false; the current code was already right, but the existing migration only adds a genuinely missing key, never corrects one that already exists with a stale value. Added a targeted, one-time correction, same proven pattern as an earlier fix this week. Tested directly against her exact confirmed data.
Vendor Messages now labeled "Private Portal" in bold, with updated wording — "Send all questions about job requisitions here, emails are not supported."
Vendor "Notes" renamed to "Messages (Job Q&A)" — with a short line explaining they can send the team a question about the job here instead of emailing. Applies everywhere the vendor sees this (the modal title and the widget itself); Client notes are unchanged.
Fixed: Recently Completed Screenings kept showing people for the full 7 days even after already being reviewed and acted on — the list only checked when the assessment was completed, never their current stage. Now correctly drops someone once she's moved them forward, converted them to a Vendor (which never touches stage at all), or manually flagged them as Vendor type. Tested all three cases directly.
New "(Vendor)" flag for candidates who are actually Recruiting Partners — clickable on the candidate profile and shown persistently in blue next to their name, on both the profile and the main list, once flagged. Also addable during bulk "Change Stage," as a genuinely separate checkbox that never touches the stage itself — confirmed and tested directly that flagging someone Vendor never overwrites real pipeline progress like Offer or Placed.
Sticky horizontal scrollbar added to the Candidates table — the table could already scroll left/right, but the scrollbar sat at the bottom of the table itself, which could be far down the page with many rows. Now a second scrollbar stays pinned to the bottom of the screen at all times, in sync with the table.
Found two more real bugs specifically in the Upload Resumes page (a third, separate path from what was fixed before) — (1) the numeric prefix cleanup was missing here too, confirmed and fixed. (2) During bulk "Add ALL pending to ATS," each candidate's AI parsing was unconditionally popping their profile open on screen — disruptive during a bulk run, and likely made it hard to tell whether Education/Experience were actually filling in. Now only happens for the single, manual "AI-fill profile" action it was originally built for.
URGENT: found the numeric-prefix cleanup was genuinely missing from most new-resume paths — online applications, vendor submissions, vendor sign-ups, email intake, and the Contacts vendor upload all stored the raw filename, numbers included. Only bulk-matching and a couple of manual upload spots were actually covered. Fixed all of it at the source, tested directly, and confirmed short legitimate numbers in a filename are correctly left alone — only genuine long ID-style prefixes get stripped.
Fixed: resume file matching didn't account for the Zoho export's numeric ID prefix — filenames like a 19-digit-and-underscore export are already stripped before being stored on a candidate, but the matching comparison itself was checking the raw, un-stripped name, so a fresh upload with the prefix still on it could fail to match its already-clean counterpart. Tested directly with her exact real filename to confirm this now matches correctly.
Close button added to Vendor Messages — top-right of the panel, so you can dismiss it to go investigate something and come back to reply later, without losing your place. Also confirmed directly: a vendor logged into their own portal can only ever see their own messages — traced the actual code path and there's no way for one vendor to see another's.
New "Vendor Messages" inbox in the top nav bar — dark blue, shows on every page right next to the existing Messages icon, with a live badge count of vendors awaiting a reply. Click it to see the list and reply directly, without visiting each vendor's profile. A vendor drops off the list the moment you reply, until they message again — but the conversation itself stays permanently in their regular Notes, since this is the exact same underlying data, just a filtered view on top of it. Tested this directly, including confirming the full thread survives even after someone drops off the awaiting list.
Vendor Portal Notes: staff replies now show initials only, not full names — e.g. "SH" instead of "Sammie Hill" — when you or a recruiter answers a vendor's note. The vendor's own name still shows normally; only internal staff replies are shortened. Scoped to vendor notes specifically, since Client notes weren't part of this request. Also added a "(Messages Job Q & A)" subtitle under Notes in the Vendor Portal.
Red warning labels added to Client's Offered Salary and Prescreen Questions — "(DON'T SHARE WITH CANDIDATES)" and "(ASK STANDARD QUESTIONS +)" respectively, on both Add Job and Edit Job.
Payment Terms, Work Arrangement, Department, and Type are now internal by default, with a checkbox to show each to vendors — same proven pattern as the existing salary visibility toggle. Type was previously always visible to vendors unconditionally; it now correctly follows the same internal-by-default rule as the other three. Also added the missing Department field to Edit Job, since there was previously no way to change it after a job was created.
New "Internal R2R Notes" field — write notes specifically for vendors, never shown to candidates. Always visible on the vendor-facing job card once filled in, regardless of any other visibility settings. Tested every field combination directly, including the important case of a fresh job with nothing checked showing nothing at all to vendors.
New "Match Entire Folder" option added next to Bulk Match Resume Files — the original button needed individual files selected (Ctrl/Shift-click); this new one lets you pick a whole folder or external drive directly, matching every resume file inside it automatically, no need to select files one at a time.
New "Bulk Match Resume Files" button on Candidates — for the hundreds of candidates whose resume file was never successfully saved to the cloud in the first place, likely from before syncing was fully reliable. Select many resume files at once from wherever they're saved, and each one is automatically matched to the right candidate by filename — tested directly, including filenames that differ only in spacing, case, or underscores vs. spaces, which still correctly match. Already-fixed candidates are automatically protected and never touched. Each matched file is properly saved to its dedicated cloud location this time, genuinely fixing the original gap rather than working around it.
New "Re-extract Missing Resume Text" button on Candidates — found through a real, live example: Kevin Lin, Sarah Chen, and others had a fully intact, uploaded resume file, but the text was never successfully extracted from it, which is exactly why AI scoring showed "no resume to score" for them despite a resume clearly being on their profile. This recovers it by re-running the same, proven extraction already used at upload time on the file data already stored — no re-upload needed. Genuinely skips legacy .doc/.dot files, since that's a real format limitation, not something a retry can fix, and says so clearly. Tested the actual file reconstruction directly to confirm no data is lost or corrupted in the process.
Sourcing results now sort by AI match score, highest first — rebuilt to score everyone before showing the list, so the closest matches genuinely land at the top, not filled in after the fact in whatever order the search happened to return. Candidates with no resume to score (shown clearly as such) sort to the very bottom, kept separate from a real low score rather than mixed in and misread as one.
Sourcing results now show the score right beside each name and sort best-match-first — rebuilt to score everyone before showing the list at all, rather than filling scores in one at a time after the order was already set, since sorting by score only makes sense once every score is known. Candidates with no resume to score against are pushed to the bottom, kept clearly separate from an actual low score. Tested the sort directly with a mixed set to confirm the ordering is exactly right.
Internal Sourcing (job tab) now shows a real AI match score next to each result — reused the same proven scoring system already used elsewhere in the app, which genuinely weighs that job's must-haves and description, not just typed search terms. Scores fill in progressively after results appear, since each one is a real AI call. Candidates already attached to a different job are now clearly flagged, tested to correctly NOT flag someone already on the same job being searched.
Country picker rebuilt as a compact, short list instead of one long dropdown — defaults to United States, click to open a genuinely short, scrollable list rather than showing all 198 at once, which a native dropdown can't reliably control the height of across browsers.
Country is now a real, scrollable dropdown in both sourcing locations — no more typing to filter, just scroll and pick from all 198, each with its flag.
Added State back to sourcing search, with automatic zip lookup — fill in city and state and the zip auto-fills using the same lookup already proven elsewhere in the app, so radius search works even without knowing the exact zip. State also filters results directly, and correctly disambiguates same-named cities in different states.
Jobs list now scrolls instead of growing indefinitely — sticky header stays visible while scrolling, matching the same pattern already used for the Vendor table.
New "Internal Sourcing" tab on every job, plus the same power added to Source Candidates on the Candidates page — search your own database by boolean, three keyword modes (include all, include any, exclude), and location including real radius search (5–100 miles) from a zip code, with results ranked by actual distance. Country list expanded to 198 countries with flags, reused everywhere a country field already existed. From a job's own Internal Sourcing tab, "Add to job" associates directly to that job. From the Candidates page, a job picker (open jobs only) lets you choose which one. Tab styled blue and bold as requested. Tested the full search logic and the add-to-job flow directly, including the real distance math against known real-world distances.
Jobs list: Date and Status are now sortable, highlighted blue, plus a new Skills column — reused the existing sort system already proven on Job Title. Skills wraps properly for longer lists instead of stretching the column.
Candidate profile: wider, with real zoom controls — for anyone finding the default print too small. Resets to 100% each time a new profile opens, capped between 70% and 200%.
URGENT FIX: rejected candidates were still getting screening reminder emails, repeatedly — found via a real, live example: a candidate already marked Rejected had no screening reminder ever recorded as sent, so the system kept trying to remind them to complete screening on every single app load. The check never looked at stage at all before. Now skips anyone already Rejected, Withdrew, Client Reject, Do Not Contact, or Placed. Tested directly against the real candidate's actual data to confirm this specific case is genuinely blocked now.
URGENT, real root fix: permissions had zero Firebase sync at all — every device kept its own, completely independent local copy forever. A permission change made on one device, or even a one-time code correction, could never reach a recruiter's own separate laptop — this is why fixes kept appearing to "not work" even after being confirmed correct. Now genuinely syncs: any device with correct data pushes it, and every device pulls and merges in corrections automatically, without needing anyone's own browser console. Tested the actual merge logic directly against a simulated stale device to confirm it self-corrects.
Found the actual reason the Internal Messages fix didn't take effect — the earlier fix only changed the code's default value, but her account already had this permission saved from before, so the new default never reached her actual data. Added a targeted, one-time correction that fixes her real saved permissions directly, not just the default for new accounts. Confirmed this actually corrects the stale saved value, tested directly.
Fixed: Recruiter and Senior Recruiter could not see Internal Messages on a Contact's profile at all — same kind of gap as vendor notes earlier this week: the role-level permission was set to false for both, meaning no recruiter could see or send these messages regardless of intent. Both roles now have access, and the label updated to match since it's no longer selective.
New "Candidate Breakdown" on the Dashboard — New, In Review, Available, and Rejected counts, right below the total. Tested every scenario directly: candidates actively in an open job's pipeline count as In Review per her clarification, candidates whose job filled but weren't hired count as Available, and Hired candidates are deliberately excluded from all four rather than miscounted into any of them.
"What's New" is now collapsible, and collapsed by default — the page was getting long, and this list alone was 22 items sitting right at the top before you could get to anything else. Click to expand it any time you want to see it, otherwise the topic sections are right there instead.
New "Contacts" section on the Help page — explains the Vendor category, resume upload, and Date Applied field for tracking website applicants, which was never documented anywhere before.
New "Clients" section on the Help page — genuine gap found while reviewing the page: Vendor Portal already had its own section, Clients did not.
New "Vendor" category on Contacts, with resume upload and a Date Applied field — for vendors who apply through the website. Select Vendor as the category and both a resume upload and Date Applied field appear right there on their profile, with a real download link once uploaded.
Fixed: a blocked candidate could still silently progress through the entire reminder chain — a genuinely new bug, found while investigating a real incident: several places marked a screening email or reminder as "sent" unconditionally, even when the actual send was blocked and never went out at all. This let a blocked candidate's reminder timeline keep advancing on schedule as if real emails were being delivered, eventually firing a "reminder" for an email that never existed. Fixed at the source (four separate places) so a blocked or failed send is never mistaken for a real one again.
Fixed: merging duplicate candidates could silently orphan their real prescreening answers — found while investigating a real merge: their assessment answers and any documents sent to them were never reassigned to the surviving record before the duplicate was deleted, leaving that data attached to an id that no longer existed. Now correctly carried over as part of every merge going forward.
Fixed: a major, systemic gap — the core candidate sync had zero protection against a stale copy silently reverting a fresh edit — found while investigating a corrected email that kept reappearing wrong. Every candidate update from any device was blindly trusted wholesale, with no regard for which version was actually more recent, meaning a stale tab or device syncing for any unrelated reason could quietly undo someone else's fresh edit — a corrected email, a stage change, anything. Now compares timestamps per-candidate and keeps whichever edit genuinely happened last, matching the same protection already proven when saving. Tested directly both directions to confirm a fresh edit now correctly wins over stale data, while a genuinely newer edit from another device still correctly wins too.
Fixed: deleting a prescreening/assessment result (or a document) could silently pop right back — found while investigating a real report: removing one never actually tombstoned it, and the live sync listener for both had no tombstone-awareness at all, so any stale copy still holding it would bring it right back on the next sync. Fixed both the delete action and both listeners — tested directly end-to-end to confirm a deleted record now genuinely stays gone even when a stale copy syncs in afterward.
Deleted prescreening/assessment results are now recoverable — built directly in response to a real, permanent loss: removing one now archives the full record first (every answer included), the same way deleted candidates already are. A new "🗑 Recently Deleted Assessments" button on the Candidates page shows everything removed, with a one-click Restore.
Deleting records is now restricted to Administrators only, by default — built directly in response to a real incident: removing a prescreening result, an email log entry, or using the deep-search delete tools all previously had zero permission checks at all, meaning any signed-in recruiter could delete this data regardless of role or access level. Now blocked for every non-Administrator role by default — no setup needed on your end, this applies automatically.
Fixed: a completed screening could get processed twice, sending a duplicate notification email — found while investigating a real duplicate report: multiple open tabs or devices had no way to know another one was already handling the same submission, so more than one could process it independently. Now uses the same proven atomic claim already protecting job applications.
Agreement link locks permanently after signing — instantly, not delayed — the lockout now writes directly at the moment of signing, rather than waiting for the admin's own browser to separately process it. Once signed, the full agreement text is no longer accessible through that email link at all.
Real PDF download of every signed agreement — full legal text plus everything the vendor filled in, their signature, and timestamp, available directly from the Vendor page for your own records.
Industries and candidate roles updated to her real, complete lists — replaced the generic 13-item industries list with her actual 27 industries everywhere it's used (jobs and the vendor recruiting profile), and combined her candidate role additions with the original list, removing the one exact duplicate (Healthcare) while keeping every other option distinct, per her explicit instruction. Verified both final lists directly.
Applied the new no-reply address across every automatic email she named — traced each one directly rather than assume: four of the five (agreement request, both reminders, welcome email) already shared the same underlying function updated earlier and needed no further change. Only "New job matches for you" (sent to candidates, not vendors) used a separate, more generic sending function and needed its own explicit update. Also swapped that email's sign-off from her personal signature to simply "HRRS," as requested.
Found and fixed two more places sending the exact same prescreening email that the earlier fix had missed — the fully automatic version (triggered by a candidate reaching a configured stage) and its delayed-send counterpart both still used her own address. Confirmed this by tracing the actual automatic-sending system directly, separate from the three manual ways to send this same email. The delayed-send fix is scoped narrowly to screening emails specifically, since that same generic function also handles other, different automated email types she hasn't asked to change.
Full, honest rebuild of Video Interviews, after finding it was almost entirely fake, including a real, live bug found along the way — the mic, camera, screen-share, and "live session" mockup, the fake hardcoded "AI summary" (same score every time, regardless of who was interviewed), "Save notes" that never actually saved anything, and even the "Google Meet" link generation itself (a random code, not a real meeting Google ever created) have all been removed entirely. Critically, this same fake link generator was also used by the main Calendar/scheduling feature, which really did email candidates a broken, non-working link — flagged to her directly, since this may need real follow-up with anyone who received one. Replaced everything with what is genuinely real: scheduling now takes an actual link she creates herself on Google Meet or Zoom, notes that actually persist, and a real AI summary generated from her own actual notes, refusing to generate anything if there is nothing real to summarize yet. Tested the core logic directly.
Found and fixed the real cause of the storage-warning cycle: notifications were never actually capped at all — confirmed directly: 5,919 real notifications against a supposed limit of 300, nearly 20x over. The trim never actually stuck, since every sync pulled already-trimmed history right back in from other devices' copies, forever. Now tombstones the excess permanently (the same proven mechanism already used for real deletions) rather than just trimming locally, and the listener that receives updates now respects that tombstone list too, closing the exact gap that let old entries keep resurrecting. Tested the full cycle end-to-end, including a stale remote copy correctly staying filtered out. This should stop the clear-warning-clear-warning cycle for good, not just once.
New AI Search on Candidates lets her type a plain-English description and get genuine matches from her own database — e.g. "Find me a Senior React developer with fintech and team leadership experience in NYC." Sends a compact summary of each candidate (not full resumes) to stay fast, capped at her 300 most recently updated candidates on very large databases, returning ranked matches with a short reason each. Tested the summary generation and result matching directly end-to-end.
Extended the existing Job Mailbox so a dedicated forwarding email can reliably tie resumes to one specific job — previously only matched loosely against the email subject line; now checks the mailboxLabel field against each job's exact Opening ID first, a reliable match rather than hoping Indeed's subject line happens to mention the job title correctly. Added a one-click hint on every job's detail page with copy-ready setup instructions. Falls back to the original, existing behavior for her general, not-job-specific forwarding address. Tested all four realistic scenarios directly, including case and whitespace tolerance and correct fallback behavior.
Vendor Portal now groups approved vendors together, and the separate Vendor page has clickable, sortable columns — the Vendor Portal list is now grouped by status (approved together first, alphabetically by agency within each group), rather than showing whatever order vendors happened to be added in. Separately, the Vendor page's Agency, Email, Submissions, and Agreement columns are now clickable, toggling ascending/descending with a visible arrow indicator. Agreement sorts by actual progression (expired, sent-and-unsigned, not-yet-sent, then signed), since it isn't a simple field. Tested both directly with realistic data.
"Assign this batch to" (when uploading resumes) now only shows Open jobs — previously showed every job regardless of status, including closed, on-hold, and draft ones that shouldn't be a valid destination for new candidates. The dropdown itself already scrolls naturally when there are many options, since that's standard browser behavior.
Confirmed bulk email to a group of candidates already fully exists, and added the two placeholders she specifically wanted — search, select candidates via checkboxes, and "Email Selected" already sends a genuinely personalized email to each one individually; [Name], [Job], and the apply link already worked. Added [Must-Have] and [Nice-to-Have] as their own separate inserts (previously only the general job description existed), plus matching quick-insert buttons in the bulk email modal for description, must-have, nice-to-have, and the apply link. Tested her exact template end-to-end, confirming every insert resolves correctly.
Added a way to remove a test candidate from Vendor Submissions without deleting them entirely — built after she clarified that the existing Delete button (which fully removes a candidate from the ATS) wasn't what she wanted for test submissions. A small button on each entry now just clears the vendor tag, keeping them as a completely normal candidate everywhere else. Tested directly, confirming the full record stays intact.
Found and fixed a second, related systemic risk in the same function — the whole vendor-reminder check only ever saved once, at the very end, after processing every single vendor. If any one vendor caused an error partway through, the entire check would halt immediately, silently losing every change already made to everyone processed earlier in that same run — not just the one that failed. Each vendor's own processing is now isolated, so one person's issue can never affect anyone else's already-completed changes.
Found and fixed a genuine, confirmed bug: bulk stage change silently skipped every email trigger — traced directly from her real test moving a candidate to R2R Sent and never receiving it. The bulk-change path set the stage but never fired the Shortlisted, R2R Coming, or R2R Sent emails, and never ran automations either — all completely separate from the working, individual stage-change path. Now fires the exact same triggers either way, tested directly against her exact scenario.
Found and fixed a genuine bug behind the literal word "SIGNATURE" showing up at the bottom of some emails — confirmed directly from her real report. Four compose paths (bulk email preview/send and the general compose box) were inserting the internal signature placeholder through the same function used to safely display plain text, which strips out the invisible markers that tell the system where to actually insert her real signature - leaving just the visible word "SIGNATURE" behind with nothing where her real signature should be. Fixed all four to insert her real, rendered signature directly instead.
URGENT: found and fixed the actual root cause behind the RTR data disappearing repeatedly, confirmed live with her — traced through direct, live testing together: the candidate sync (both directions) picks one side's entire record wholesale based on which was more recently modified, rather than merging field by field. The RTR signing page never touches a candidate's modifiedAt timestamp, so a signature written directly by it looked "older" to this comparison than any regular edit happening in the ATS around the same time — and got silently, completely discarded the next time that sync ran, however it was written. Fixed in both directions to merge field by field instead: the more recent side still wins for any field both sides share, but a field unique to either side, like a signature, now survives regardless of which side wins the timestamp comparison. Verified directly against the exact real scenario that caused this.
URGENT: found and fixed the real reason the RTR data-loss fix itself didn't actually work — diagnosed live, directly with her: the transaction-based approach from the previous fix silently reports success on this large candidate list (600+ entries) via this page's temporary connection, without actually writing anything - confirmed by testing a plain, direct write side by side, which worked reliably. Rebuilt using that same proven direct-write approach, with a reliable fallback to the index already found successfully when the page first loaded, and now genuinely reads the write back to confirm it landed before ever reporting success to anyone. Also manually recovered and restored the three real signatures (Allison Cardona, Paul E. Young, MaeCh Hill) that were lost to this same underlying issue, using their exact signed data recovered from the notification backup record.
Made the RTR signing link a real, styled blue bold link, and added a note that replying directly won't work — directly addressing what happened with Patti J Anderson, who replied to the email instead of using the link, which this app has no way to ever see. The link now renders as genuine HTML (bold, blue) rather than plain text, using the same real link system already proven elsewhere in the app - a broadly good improvement applied to every email that uses it, not just this one.
URGENT: fixed real data loss on RTR signing, confirmed directly from her report about Patti J Anderson — the save previously looked up the candidate by scanning a snapshot for a matching id, then silently skipped the actual write if that lookup ever failed for any reason - while the notification email fired regardless, exactly explaining why she received the email with nothing to show for it in the ATS. Rebuilt using a transaction directly on the candidates list (the same reliable pattern already proven for tombstoning), which finds and updates the right record atomically, and now genuinely fails with a visible error if the candidate truly can't be found, rather than silently reporting success with nothing actually saved. Tested both the normal case and the not-found case directly.
Built a real, working mobile version of vendor approval, per her direct follow-up — traced the actual problem directly: this list was an 8-column table, with "Approve" in the very last column, requiring side-scrolling through 7 other columns to reach on a phone — not practically usable. Below 640px, the same vendors and the exact same actions now show as stacked cards instead, with Approve directly tappable with no scrolling required. Desktop table stays completely untouched.
Built a real, working mobile menu, per her direct report that things didn't fit on her phone — traced the actual cause directly: the sidebar previously only ever shrank on smaller screens, it never actually hid, meaning it permanently occupied roughly half of a typical phone screen. Below 640px, it now hides by default and opens as a slide-out menu with a tap on a new menu icon, closing automatically after picking a page (or tapping outside it), same as any standard mobile app. Sign out moved from a crowded, overflowing row of buttons into the top of this same menu, always reachable now regardless of screen width. Desktop above 640px is completely untouched.
Found and fixed a genuine gap behind her missing RTR notification, and the same issue in three other places — confirmed directly: EmailJS itself works perfectly, but the admin notification email was never actually waited for before showing the candidate's "signed" success page. If that tab closed right after signing (a completely natural thing to do), the in-flight notification could get cut off before it ever completed. Found and fixed the exact same gap in three other places using this same notification: the vendor agreement, recruiter application, and client application flows.
Added a real "Signed Forms" section to the candidate profile, right under Education Details — the RTR PDF download button moved here from the top header, styled in a light purple to stand out, per her explicit request. Shows a clear "No signed forms on file yet" message when nothing's been signed.
Re-applied the Admin default sign-in fix, which had reverted back to Recruiter — confirmed directly, this was a genuine regression from an earlier fix today, not new JavaScript logic; the static default simply reverted at some point during a later edit. Fixed directly, and confirmed no dynamic code is involved that could cause this again.
URGENT: found and fixed the real cause of repeated, duplicate prescreening emails going to the same candidates — confirmed directly from her real report of complaints. Root cause: the delayed-send system marks a pending item as done through a background Firebase write that was never actually waited on; if the page closes or refreshes before that completes, the item can resurrect from a stale remote copy and genuinely send again — exactly matching "every time I hard refresh." Added a real, independent safeguard that can't be defeated by that same timing gap: checks the actual, already-sent email log directly before ever sending again, regardless of whether that specific item's own tombstone made it through in time. Also fixed a related gap where a delayed send had no protection at all against being scheduled twice in the first place. Tested both directly against her exact reported scenario.
Added a real PDF download for signed RTR forms, and rewrote the R2R Sent email per her detailed direction — a "Download Signed RTR (PDF)" button appears on a candidate's profile once they've actually signed (never sent to the candidate themselves — for her own records or a client who asks for a copy), using the same proven PDF generation already used for vendor agreements, plus a quick-download icon right on the new Dashboard widget. The email itself was rewritten in several passes per her exact wording: removed the now-redundant full authorization text (since the real signing link already leads there), moved the signing link to the bottom, and bolded two specific phrases using styled Unicode characters, the same approach already proven for "Congratulations" in this same email, since this send is plain text rather than HTML.
Built a real, digitally-trackable RTR signing form, replacing what was previously just plain text inside an email — built in direct response to her asking whether this could actually be tracked. Works for any candidate, whether or not they're a Candidate Portal user, using the exact same proven, no-login-required pattern already working for vendor agreements. The R2R Sent email now includes a real signing link; signing it writes directly to the candidate's own record, sends her a real email notification, and shows up on a new Dashboard widget, sorted most recent first. Tested the full flow directly, including the dashboard sorting logic.
Found and fixed a genuine, confirmed bug: prescreening emails were missing the signature entirely, across every way they can send — confirmed directly from her real test email. The new signature system only ever got wired into the newer emails (R2R Coming, R2R Sent, Shortlisted); the prescreening email itself was never updated at all, across all six paths it can go out through (automatic send on application, bulk, direct-from-profile, and the compose-and-review path). Fixed consistently everywhere, including the automatic send her real ZipRecruiter candidates would actually trigger.
Added a fifth Interview category to Personal Notes, and a Help note about Google's own self-scheduling option — the new Interview notes box works exactly like the existing four (Jobs, Candidates, Vendors, Clients), saving automatically as she types. Also documented that Google Calendar's own Appointment Schedule feature can go in the same Calendly URL field, per her factual note.
Fixed an outdated button name in the Help page and added new scheduling directions, per her request — the Calendly-link help line still said "Google Calendar," the old name before today's honest-connections fix renamed it to "Scheduling Links." Added a new line directly explaining how to schedule an interview and send the real invite for Google Meet, Zoom, or Calendly, right in the same Calendar & Scheduling help card.
Found and fixed a genuine, widespread bug behind "this position position" and similar awkward text across six different candidate emails — confirmed directly from her real report. Each email had its own, inconsistent fallback for when no job is attached to a candidate, and every one of them collided with the word "position" already hardcoded right after it in the template, producing duplicated or broken phrasing. Replaced with two new, shared, consistent helpers used everywhere this pattern appears (Shortlisted, R2R Coming, R2R Sent, phone screen availability, and both no-response withdrawal/reminder emails), each returning a genuinely complete, grammatically correct phrase either way. Tested her exact reported scenario directly, along with the normal case and a candidate with a role but no job.
Removed the logo entirely per her follow-up, and gave her name its own fancy, italic script styling — updated to her full name, "Sammie Hill," standing out from the rest of the signature in a cursive font. Both changes applied directly to her actual, saved signature, matching what she confirmed in the preview.
Added her resume-notice, confidentiality, and environmental footer text to the signature, and fixed the logo's position — the two disclaimer sections render very small in gray, the environmental line small and green, all below the colored motivational line. Logo now sits on its own line above her name, per her explicit correction. Also directly updated her actual signature text to the exact content and order she confirmed after reviewing the preview, since her own attempt to make this edit hadn't taken effect yet — a one-time update that will never overwrite anything she edits herself going forward.
Overhauled her email signature: much smaller, her real logo added, and the same colored motivational line restored — the old signature appended as plain text, which meant no real colors or logo image were ever actually possible, regardless of what was typed in. Rebuilt as genuine, small HTML (11px), with her real logo (confirmed directly against her own site) placed right before her name, and the exact same blue/orange styling already proven on her vendor email footer. Also fixed the plain-text fallback path (used if EmailJS ever fails) to show something sensible instead of a raw internal marker. Separately fixed "Position: Unassigned" showing up in R2R emails, traced to a candidate genuinely unassigned from any job — now falls back to "this position" instead of that specific placeholder value.
Removed the closing line from the phone screen availability email, per her request — now ends cleanly at "Enter Dates & Times Below:".
Added her real R2R Sent email, and updated her R2R Coming email to her latest wording — R2R Coming now includes the job title right in the subject line, with her clearer wording throughout. R2R Sent is a brand new, separate email firing on its own distinct stage change, with the full authorization language and her styled heading preserved exactly as written. Both were shown to her as a full preview before shipping, confirming the real candidate name and job title fill in correctly (not the sample data shown in the preview) and the small paragraph spacing renders as expected.
Renamed VMS Sourcing to VMS Connections, and swapped the generic phone screen availability email for her actual, real template — exact wording preserved, with [Name] and [Job] correctly substituted for the real candidate and role.
Replaced the entire fake VMS Sourcing system (7 platforms) with a real, working version, using the same proven Job Mailbox already handling resumes — the old system never validated any credential (said "Connected" no matter what was typed in) and always inserted the same 2-3 hardcoded, made-up jobs regardless of which service was picked; one version even used randomness to fake looking like a real, changing result each time. Confirmed directly that no fake jobs currently exist in her real database. The real replacement: forward (or auto-forward via a free Zap) actual job requisition emails from any of these platforms to the same webhook already used for resumes, and AI reads the real email to create the job — nothing invented, nothing hardcoded. Tested the parsing and fallback logic directly.
Removed the fake "Google Calendar connected" system entirely, per her explicit request that only real things stay in the ATS — it never actually connected to any real Google account; it just stored a name and email as text and said "connected" regardless. Also found and removed two related, genuine bugs from the same system: a dead button pointing at an already-removed modal, and a false "Synced to Google Calendar" label showing on every event. Replaced with an honest "Scheduling Links" tool that only stores what's real: her Calendly link and personal Meet link.
Added a place to save a reusable, personal Google Meet link, treated the same way as Calendly — set once under Google Calendar settings, then auto-fills into Schedule Video Interview whenever Google Meet is picked, without overwriting anything she's already typed for that specific interview. Also fixed a related gap: this form never cleared its own fields after scheduling, which could carry a previous interview's link into the next one.
Added Calendly as a fourth scheduling option, and Schedule Video Interview now actually emails the candidate for real — previously created a record but never notified anyone. Now reuses the same, proven email logic already built for the New Calendar Event flow: Google Meet/Zoom send the real date, time, and link; Calendly sends her saved self-scheduling link instead, with date/time fields correctly hidden since the candidate picks their own. Also added a new "Ask Phone Screen Availability" button on every candidate's profile, sending a real email asking what times work, matching the first step of her described workflow. Tested both scheduling paths directly end-to-end.
Found and fixed a genuine, confirmed bug that permanently stranded a vendor's automatic reminders forever — traced a real case directly: a lock meant to prevent duplicate sends got claimed successfully, but the email itself never actually completed, and nothing ever released that lock afterward. Every future check saw the lock already claimed and silently skipped that vendor, forever, with no visible sign anything was wrong. All four reminder types (sign-in, both agreement reminders, and the 5-day expiration) now release their lock if the send doesn't actually succeed, so a genuine retry can happen on the next cycle instead of permanent silence.
Vendor list now shows exactly how many days an agreement has been pending, right on the page — no more needing the console to check. Turns red and says "overdue" once it passes 5 days, since that's the point the automatic expiration should have already fired. Tested directly against a real, confirmed 5.1-day-overdue case.
Fixed a real, confirmed bug where the "Set New Password" page only ever checked staff accounts — any vendor, client, or candidate trying to set a new password always got "No account found," even with a completely valid account, since the two branches of the check were doing the exact same, staff-only lookup regardless. Now checks all four account types. Tested directly against her exact reported scenario, confirming it now succeeds correctly while a genuinely non-existent email still correctly fails.
Vendor emails switched from custsrvc@ to support@hrrecruitingservices.com, per her existing, already-forwarding mailbox — updated everywhere this appeared: the Settings help text, the connection status messages, the fallback sender, and the actual reply-to address used once the dedicated connection is set up. She confirmed this matches how she used to run vendor communication through Freshdesk — a real, monitored inbox rather than a no-reply address.
Prescreening question emails to candidates now route replies to no-reply too — all three paths that send this exact email (the bulk-select modal, sending straight from a candidate's profile, and selecting candidates from a job) updated consistently, since they're all the same underlying email just triggered from different places. As with vendor emails, this only changes where a reply actually goes if someone hits reply; the visible "From" address is a separate setting controlled by whichever account is connected to send mail, not by this.
Fixed four vendor emails still telling people to click "Vendor," after that button was relabeled to "Vendor Portal" — caught directly from a real approval, where the sign-in instructions no longer matched the actual button. All four updated to match, including the Welcome email specifically.
New, confirmed footer added to every single vendor email — sign-off, website, tagline, and a colored, italic motivational line, built once as a shared function so every vendor email uses the exact identical footer rather than 13 separate copies. Every existing vendor email's old, individual sign-off was removed to avoid duplication. Tested the actual function directly, confirming any special characters in the main message stay safely escaped while the footer's real color styling comes through correctly.
Private Messages moved to its own dedicated sidebar tab, with a colored icon — previously embedded near the bottom of the Vendor Portal page, which she confirmed was easy to miss. Now sits alongside Vendor Portal and Requisition Matching as its own tab, with a purple speech-bubble icon that stands out (the name itself stays plain, matching every other tab, per her explicit preference). Requisition Matching's icon changed to 🎯 at her request. Also updated the reply-to address on vendor message notifications to the new no-reply alias she set up in Google Workspace.
Fixed a real gap in the vendor message notification: it had no clickable link at all, and never explained where to actually find the reply box once signed in — confirmed directly this was just plain text saying "sign in," with no way to get there. Now includes a real, working link that signs a vendor in with the correct role already selected and their email pre-filled, plus clear, numbered steps pointing straight at Private Messages. Also relabeled "Vendor" to "Vendor Portal" on the sign-in screen with a distinct orange color, since her vendors are recruiters themselves and would naturally see "Recruiter" and assume that's them — confirmed this is the likely cause after finding "Recruiter" is the default, pre-selected role on that screen.
New-candidate AI scoring now writes to visible Notes and actually alerts her team, matching what screening completion already did — confirmed directly this previously only saved the summary to an internal field nobody sees day-to-day, and never notified anyone no matter how well someone scored. Now appends the AI summary into the same Notes a person would normally read, and sends the same in-app + email alert already used for completed screenings when a candidate scores above 85%, the same "strong match" threshold already used for the green color everywhere else in the app. Tested directly, including confirming existing notes are preserved and appended to, never overwritten.
Added a fifth shortcut: ZipRecruiter, alongside LinkedIn, Indeed, Facebook, and Handshake — on the job detail page, these now sit right below the existing "Check this posting" row, with a clear space between them, per her explicit placement request. Create Job keeps them at the top, since that form has no equivalent section to anchor near for a job that hasn't been created yet. Verified each site's actual current employer login URL directly rather than guess (including confirming Facebook Jobs was retired in 2022 and only reintroduced in October 2025, working through your own business page rather than a separate portal). Same as LinkedIn — pure convenience links, no integration or credentials involved.
Added a simple 🔗 LinkedIn shortcut button — on the job detail page and on Create Job, opens LinkedIn in a new tab so she can sign in and post there herself with one less step. Not an integration or automatic posting of any kind — confirmed directly that LinkedIn's actual posting API requires a formal business partnership (and isn't currently accepting new ones at all), so this is intentionally just a convenience link, the same as a bookmark.
Additional Job Info section made compact, per her confirmed preview — renamed from "Additional Job Terms" to "Additional Job Info" in blue to stand out, all four short fields (Replacement Terms, Guarantee Period, Citizenship Status, Travel Required) now sit in one compact row instead of stacked, and a new, larger "Sourcing Tips" field was added below for longer notes. Applied to both Create Job and Edit Job.
Four new job fields added, each independently shareable with Vendors — Replacement Terms, Guarantee Period, Travel Required, and Citizenship Status, each with its own separate checkbox, so she can share exactly the ones she wants per job, not all-or-nothing. Tested all four independently to confirm each only shows when its own checkbox is checked and it actually has a value.
Industries list is now editable by her, directly in the app — no more asking for a code change every time. A new "+ Add a new industry option" link on job creation lets her add one on the spot, with duplicate protection (including case-insensitive). Added Science/Engineering as requested. Tested the add/duplicate-prevention logic directly. Per her explicit instruction, the public vendor application form was deliberately left untouched — it keeps using its own, existing snapshot rather than fetching live settings, to avoid exposing the full admin settings object to an unauthenticated, public page.
New "Requisition Matching" page added to the Vendor Portal — a compact form under a new sidebar tab, right below Vendor Portal, where a vendor can specify what they recruit: company industries (checkboxes), plus candidate roles, countries, and states as small, removable tags picked from a fixed list, keeping matching reliable. Includes a clear way back to the job list from the same page. Tested the tag add/remove/duplicate-prevention logic directly.
Fixed: a vendor's resume and application details were being saved but never actually shown anywhere — new "📄 Application" button on the Vendor page shows everything they submitted (role, experience, specialization, industries, why they applied) plus a working resume download, same as candidates.
Standard prescreening questions updated, and visa sponsorship now behaves correctly per job — removed the schedule question, replaced two others per request, and the sponsorship question now only disqualifies someone when the specific job genuinely can't sponsor, instead of applying the same rule to every job regardless of its actual sponsorship policy.
New "⏳ Pending Submittals" on the Dashboard, right above Submittals — candidates in In Review or R2R Sent, ready but not yet actually sent to the client. Click a name to open their profile.
Fixed: the "Save draft" button on the email composer was completely fake — it showed a "Draft saved" confirmation but never actually saved anything. Now it genuinely does, plus the composer auto-saves silently whenever you navigate away with something unfinished. New "📝 Unfinished Emails" on the Dashboard shows every one — click a name to pick up right where you left off. Clears automatically once you actually send.
New "To-do's" page — simple, personal reminders that stay open until you mark them done.
New "Open Items" email, separate from the calendar Agenda email — gathers your open notes, candidates whose prescreen hasn't been sent, candidates waiting for review, new Vendor and Client Portal registrations, and new candidates from the last 24 hours, all in one daily email. Honestly, unsent draft emails are not included — the app doesn't save drafts at all right now, so there was nothing there to gather.
AI scoring for paragraph screening answers now weighs Must-Have and Nice-to-Have separately — previously only used the general job description, so structured requirements not repeated in that text were invisible to the scoring. New "Nice-to-Have Qualifications" field added alongside Must-Have, with Must-Haves weighted most heavily and Nice-to-Haves as a smaller bonus.
Visa sponsorship is now set per-job, correctly on your own Add/Edit Job forms too — this field already existed for jobs submitted through the Client Portal, but there was no way to set it when you create or edit a job directly yourself. Fixed to match, so the sponsorship question correctly knocks out candidates only for jobs that genuinely don't sponsor.
Yellow "HOLD" indicator on the vendor's own portal view — when a job is On-Hold on your side, vendors now see a clear yellow badge and their Submit button is disabled, so it's obvious not to submit candidates. Protected at three layers, not just visually.
New "📋 Shared Jobs" on each vendor — a clean, read-only list of what's currently assigned to them: job title, status, and how many candidates they've submitted for each one specifically. Distinct from "Assign jobs," which stays the editing tool.
Client email replies now show up right in the app, per client — extends the same proven inbound-reply system already catching candidate/contact replies from your real inbox, now also matching against clients (including any additional contacts on file, not just the primary one). New "📧 Email History" per client shows both sent and received, with date/time.
📋 Jobs
Create a job: Jobs → + New Job. Add a description (rich text — bold, italic, bullet lists), mandatory skills, and prescreening questions. Link a real assessment: open the job → "+ Link assessment" → pick an existing one, or create the standard 10-question set. Generate a job board XML feed: Jobs → Quick Links → "📡 Free job board XML feed." Get a share link for a specific job: job's "🔗 Copy Job Link" button — automatically shortened.
👤 Candidates
Add a candidate with a resume: + Add Candidate now has a real file upload — attach a resume and AI fills in skills, experience, and address automatically. Anything you type by hand always wins over AI's guess. Send just the prescreening questions (not a full re-application): candidate's profile → "📋 Send Screening Questions." Ask for an updated resume: candidate's profile → "📄 Request Updated Resume." See who's registered for the portal: their profile shows "📨 Delivered Invite" (when the email sent) and "🔑 Sign In" (when they actually logged in, with which email). Give someone portal access manually (added by hand, imported, or recovered): their profile → "🔑 Grant Portal Access." If they already have access but haven't signed in, this becomes "Resend Portal Access" with a fresh password. See which open jobs a candidate is a strong match for: their profile's "🎯 Matched Jobs" card, with a direct link to each one. Find something that looks lost or disconnected: Candidates → "🔎 Data Recovery Search" — search by name or job title. Rebuild a candidate from one of this app's own notification emails: Candidates → "📧 Recreate From Email" — paste the email, review, create. Get a short link to your full Careers page: Job Requisitions → "🔗 Short Careers Link" — copies a shortened version straight to your clipboard. This depends on a free, third-party shortening service, so if it's ever unavailable, it automatically falls back to copying the regular (full-length) careers link instead, along with a message letting you know that happened — nothing is lost either way, and it's worth trying again shortly after. Check for stuck portal registrations: Candidates → "🔍 Check Pending Queue." Group candidates by job, best matches first: click directly on "Applied Job" in the Candidates table header. Search instead of scrolling when emailing or selecting candidates: the To: field and bulk-email recipient picker are both real search boxes now, not long dropdowns.
🤝 Conversion of Candidates to Vendors
A candidate applied for a job but wants to be a vendor instead — what do I do? Open their candidate profile and click “🤝 Convert to Vendor – Sends Agrmnt.” That’s the whole first step. Does this send them the vendor application form first? No — since you already have their info from their candidate profile, this skips the application entirely and goes straight to sending them the Recruiting Partner Agreement to sign. What happens after they sign? Same next stages as any vendor — you click “✓ Approve now” on their new Vendor page entry, which is what actually creates their portal access and sends the invite. How is this different from someone who applies to become a vendor directly? Someone using the public vendor application link never touches the Candidates list at all — they land in Pending Vendor Approval on the Vendor Portal page, where you’d click “Send Agreement” there instead. Both paths lead to the same agreement and the same approval process — just a different starting point depending on how they actually came in.
📬 Job Mailbox — get resumes emailed to you routed in automatically
There's no single fixed forwarding address — it's set up once, through a free Zapier automation (about 10 minutes), and after that resumes emailed to a dedicated address land in Candidates on their own, no manual upload.
Full setup instructions and your personal webhook URL: Settings → Organization → "📬 Job Mailbox" card. Quick version: in Zapier, create a Zap with trigger "Email by Zapier → New Inbound Email" (this gives you the actual dedicated address, like yourcompany@robot.zapier.com) → add a "Webhooks by Zapier → POST" action → paste in the webhook URL from Settings. Best reliability: ask candidates to paste their resume text into the email body, not just attach a file. Want a second mailbox for a different source (e.g. personal forwarding vs. job boards)? Set up a second Zap the same way, pointed at the same webhook URL, with a mailboxLabel field added to distinguish it — see the full field list in Settings → Organization.
📝 Assessments
Create the standard set: Assessments → open a job's assessment → "✚ Add 10 standard questions." Auto-generate job-specific questions from the JD: open the assessment → Edit → "✨ Generate from job description." Send to a specific candidate: Assessments → View → search for their name → Send.
🧑 Candidate Portal
Approve a pending registration: Candidate Portal → find them under Pending → Approve. Give someone your "Sign In" link: Jobs → Quick Links → "📋 Copy Candidate Sign-In Link" — separate from the "Register" link, for people who already have an account. Give someone a link to register for the first time: click "📋 Copy Candidate Register Link" below.
Turn off self-service withdrawal (candidates must email you instead): Candidate Portal → Portal Settings → "Allow application withdrawal." Control what else candidates can do in their portal: Candidate Portal → Candidate Portal Settings — these genuinely save and apply.
🤝 Vendor Portal
Send someone the actual application: click "📋 Copy Vendor Application Link" below to copy a real, working link — no need to add them as a Vendor first, they fill it out themselves and it lands in your review queue.
Two ways a vendor gets into the system: they apply through that link (lands in Pending Vendor Approval), or someone applies to a regular job posting instead — open their candidate profile and click "🤝 Convert to Vendor" to send them the same agreement and start the same process. The full approval flow: Send Agreement → they sign it → you click "✓ Approve now" on their Vendor page entry — this last step is what actually creates their real portal access and sends the invite email. Nothing happens automatically before that. See who applied and got turned down: Vendor Portal → "Declined Vendor Requests" — kept for reference instead of deleted. Assign jobs to a vendor: Vendor Portal → their row → "📋 Assign jobs." See if they've actually signed in: Vendor Portal or Vendor page → "Signed In" column — turns bold and blue with a real date once they have, so you know at a glance without checking manually. Automatic reminders: if approved but not yet signed in, a one-time email after 24 hours. If the agreement was sent but not signed: a reminder at 24 hours, a second, stronger reminder at 48 hours, then on day 5 if it's still unsigned, the agreement expires automatically — their status changes to "Agreement Expired" and they'd need to reapply from scratch. Toggle the whole sequence in Candidate Portal → Portal settings. Communicate directly with a vendor: Vendor page → their row → "💬 Messages" — a real ticket system (Subject, Job, Message), not email. Recruiter and Senior Recruiter can see and reply to these too, not just Admin. Download every message as a CSV from the Vendor Messages panel in the top toolbar. Hide pay rates from vendors: Vendor Portal → "Vendor access controls" → "View pay rates" — on by default, toggle off to hide. Show a specific job's real salary to vendors: Edit that job → "Client's Offered Salary" → check "Show this salary to vendors." Off by default for every job — this is separate from the salary vendors normally see. A job you can't post publicly, but want a vendor working: set that job's Visibility to "Vendor Only" — hidden from the careers page, job boards, and candidates, but still visible to you, recruiters, and any vendor you assign it to. Shows a red "⚠ DO NOT POST" badge automatically. A job only your own team should see (not vendors, not candidates, not public): set Visibility to "Admin + Recruiters Only" instead — genuinely blocked from vendors even if one were accidentally assigned.
📥 Vendor Submissions
Do I get notified when a vendor submits a candidate? Yes — a real email goes to your own address immediately, with the candidate's name, ID, the job, when it happened, which vendor referred them, and links straight to their profile and resume. Where does this notification setting live? It's tied to the same "new candidate" notification setting used for every new candidate, not something vendor-specific — if it's ever been turned off, this email goes quiet too. Where does the candidate actually show up? Everywhere a regular candidate would — the main Candidates page, that specific job's candidate list, and their own profile (source shows as "Vendor: [Name]"). It's not a separate, hidden queue. Where do I see it from the vendor's own side? Vendor Portal → that job's card → "Your submissions" — visible to the vendor who submitted them, not just to you. Anything else? A real in-app notification (bell icon) is created too, separate from the email — so you have both a record in your inbox and a live alert in the app itself.
⚠ Browser Storage Full (staying signed in, banners stuck)
What is this? Every browser limits how much this app can save locally on your computer (typically around 5MB). Once that fills up completely, any new save silently fails — no error message, nothing visible — which can look like several unrelated problems at once. What it can look like: getting signed out and needing to re-enter your password even though "remember me" should keep you signed in, or an update banner that won't go away even after a hard refresh. The app now watches for this automatically — if it's found, a red banner appears at the top with a "Clear it now (safe)" button, right in the app. No console needed. Is clearing it safe? Yes — this app treats your browser's local storage as a cache, not the real copy. Your actual data lives in the shared database and syncs back automatically. You will need to sign in again afterward. If the automatic warning isn't there yet (like on a browser that hasn't picked up this update): open DevTools (right-click → Inspect) → Application tab → Local Storage → find this site → right-click → Clear → refresh the page.
🏢 Clients
Send someone a real application to become a client: click "📋 Copy Client Application Link" below — they fill it out themselves and it lands in your review queue on the Client Portal page.
Track a client relationship: Contacts → Category → "Prospective Client" while you're pursuing them, or "Secured Client" once signed. Record when a contract actually started: only shows once you select "Secured Client" as the category — a real "Date Started" field appears right there on their profile. See client job requests and email replies: Clients page — job requests they've submitted and any email replies show up per client, right in the app.
👥 Contacts
Track a vendor who applied through your website (not the ATS's own "Join Our Recruiter Network" form): Contacts → Add Contact, then open their profile and set Category to "Vendor." Upload their resume: only shows once "Vendor" is selected as the category — a real Resume field appears right there on their profile, with a working download link once uploaded. Record the date they applied: same as above — a "Date Applied" field appears alongside the resume upload once Category is set to "Vendor," for you to fill in manually. Note: this is a separate, manual way to keep track of website applicants in one place — it doesn't create a real vendor record or portal access the way the built-in vendor system does. For that, see Vendor Portal above.
📅 Calendar & Scheduling
Let a candidate pick their own interview time via Calendly: candidate's profile → Schedule → New Calendar Event → Type: "Calendly Self-Scheduling-Google Meet" — leave Date & time blank, since they'll be the one choosing it. "Create event" vs. "Create + Google Meet" for this type: it genuinely doesn't matter which one you click — this event type always generates a Google Meet link either way. What the candidate receives: when the date/time is left blank, they get an accurate "please pick a time" email with your Calendly link — not a premature "scheduled" confirmation with a placeholder time. Search for a candidate instead of scrolling: the Candidate field on New Calendar Event, New Text Thread, New SMS Thread, and Schedule Video Interview are all real search boxes now — type a few letters of their name. Your Calendly link itself: Calendar & Schedule → "🗓 Scheduling Links" → Calendly URL field — this is what gets included in the "please pick a time" email. Google also offers its own self-scheduling option: Google Calendar's "Appointment Schedule" feature lets a candidate pick their own time too, the same way Calendly does — that link can go in the same Calendly URL field above if you'd rather use it instead. Schedule an interview and send the real invite (Google Meet, Zoom, or Calendly): Video Interviews → "+ Schedule video" → search for the candidate → pick a platform. Google Meet/Zoom: pick a date/time and paste in a real link you've already created (your personal Meet link auto-fills if you've saved one). Calendly: no date, time, or link needed — it sends your saved Calendly link so they pick their own time. Clicking "Schedule" is the actual moment the real email goes out.
✉ Email
Format text (bold/italic/bullets): use the toolbar above the message box — works in both single Email and Bulk Email. Send to many candidates at once: Candidates → select the ones you want (or Select All) → "✉ Email selected." Preview before sending: "👁 Preview" button shows exactly what the recipient will see. See what was actually sent to someone: their profile's "✉ Emails" section — click any Subject to open the real email.
⚙ Settings
Connect your email: Settings → Email — connects the Gmail account that actually sends everything. Send automated messages from a no-reply address: Settings → Email → the separate "No-Reply Connection" card — only affects automated confirmations, not anything you send yourself. Control who can see this Help page (or any page): Settings → Users & Settings → Permissions, per role.
Assessments
Create customized prescreening assessments for each job — AI scores and ranks candidates automatically
📋 An assessment must be linked to a job before candidates can complete it — nothing applies automatically. Use "Apply to ALL jobs" to instantly create the standard 10-question assessment for every job that doesn't have one yet, or link job-specific client questions one job at a time.
Assessments0 assessments
No assessments yet — create one and link it to a job
How Assessments Work
1. Create an assessment with custom questions
2. Link it to a job (visible in the job header)
3. Candidates apply and answer all questions
4. AI scores responses 0–100% and ranks candidates
5. Knockout questions auto-reject candidates with wrong answers
6. Rejected candidates receive an automatic rejection email
✅ Knockout questions immediately disqualify and send rejection
📊 AI ranks passing candidates from highest to lowest %
Candidate Assessment Scores
Candidate
Job
Assessment
Score
Status
Completed
Actions
No assessment results yet
Documents
Create, send for e-signature, and track signed documents
All Documents
No documents yet — create one to send for e-signature
How Documents Work
1. Create a document using the editor — add filler fields like [Candidate Name], [Date], [Signature] 2. Choose a candidate and set a signing deadline 3. Send for e-signature via email 4. Candidate signs and submits 5. Signed document appears under their profile 6. Candidate does not receive a copy
✅ Signed documents are stored only in HRRS Pro under the candidate's profile
Automation
Automate emails and actions triggered by candidate stage changes
Active Automations
No automations yet
Automation Examples
✉ When stage → Applied: send "Thank you for applying" email
✉ When stage → Interview: send "Interview invitation" email
✉ When stage → Offer: send "Congratulations" email
✉ When stage → Rejected: send "Rejection" email
✉ When stage → Placed: send "Welcome aboard" email
📅 Schedule follow-up reminder 3 days after no response
📊 Auto-run AI screening when candidate applies
📧 Prescreen Reminder Sequence
1. Prescreen questions sent to the candidate
2. No response after 24 hours → automatic "Friendly Reminder" email
3. Still no response 24 hours later (48 hours total) → automatic "Final Reminder" email
4. After that, nothing further happens automatically
There is no automatic rejection. Candidates who still haven't answered after the final reminder show up on the Dashboard under "⚠ No Response After Final Reminder", where you decide by hand: 🔄 Try Again resends the questions and restarts the whole cycle fresh, or ❌ Reject sends a real "Final Notice" email and marks them Rejected — only when you click it.
📨 Pending Scheduled Sends
Automations with a delay (not "Immediately") land here until they actually go out — cancel any of them right up until they send.
Pay & Positions — toggle below controls what actually shows on the public job page and postings
🔒 Private Financials — Administrator only, never shown to anyone else
Fee Breakdown — adds up to Total Fees above
Additional Job Info
🔍 Source Candidates
Search your entire candidate base — boolean, keyword modes, or location including a radius search.
Add Candidate
Uploading a resume here will auto-fill skills, experience, education, and the address fields below once you click "Add candidate" — review everything after, since automated extraction isn't always perfect.
Candidate
100%
Job
📋 Send Screening Questions to All
Edit User
⚠ Email is this person's sign-in identity — changing it means they'll need to sign in with the new address from then on. Passwords are still changed by the person themselves, or via "Forgot password?"
Add Team Member
📧 Clicking "Add & invite" opens your email client with a pre-filled invite email including their temporary password and a link to reset it.
Add Vendor / Agency
📧 "Add & invite" opens your email client with a pre-filled portal invite.
Placements
A running record of every placement this vendor has made, and the fee for each — since fees vary by placement rather than a fixed rate. Visible only to you, never to the vendor.
+ Add Placement
Submissions
Every candidate this vendor has submitted, automatically tracked — candidate name, job, and exactly when it happened.
Shared Jobs
Jobs currently shared with this vendor — a clean, read-only view. To add or remove access, use "📋 Assign jobs" instead.
Application Details
Signed Agreement
Jobs
Tasks
+ Add Task
Documents
Contracts, proposals, and other files attached to this client's record.
Email History
Sent
Received
Company Info
Company Details
Additional Contacts
✉ Message Vendors
Edit Portal Access
Assign Jobs to Client
Choose which job(s) this client can view and review candidates for.
Assign Jobs to Vendor
Check every job requisition this vendor should see and be able to submit candidates for. They will only see jobs checked here — nothing else.
Submit a Candidate — Job
Add Client
Ctrl/Cmd-click to select multiple. Leave empty if this client will only submit new job requests.
📧 New clients start as Pending Approval — no portal invite goes out until you approve them below in the Client Portal page.
Create Template
New Calendar Event
Schedule Video Interview
Your saved Calendly link will be sent to the candidate so they can pick their own time. Set/update your Calendly link →
⚙ Default Video Platform
This just pre-selects your usual platform when scheduling — you'll still create the actual meeting link yourself on Google Meet or Zoom and paste it in.
🗓 Scheduling Links
This just stores links you use for scheduling — it doesn't connect to your real Google Calendar in any way. Save the links below, and use "Open Calendar" to work in your actual calendar directly.
New Text Thread
New SMS Thread
RingCentral Credentials
📋 Log a Job Board Posting
This is a manual record for your own tracking — there's no automated, real-time status check with these boards (that requires a formal API partnership with each one). Log it here after you post, so you have one place to see where a job is live.
📡 Free Job Board XML Feed
Indeed, WhatJobs, and several other free job boards accept a standard XML feed of your open jobs and post them automatically, at no cost — this generates that exact file, in the industry-standard format they expect.
One honest limitation: this app has no backend server, so this button generates a snapshot of your currently open jobs, not a permanently "live" web address that updates itself. Job boards typically re-check a feed every few hours to a day — so re-generate and re-share this file periodically (whenever your jobs change) for the board to pick up updates. Most boards let you re-submit the same file/link to refresh it.
To use it: download the file, then check the job board's "Add employer feed" or "XML feed" option under their employer/postings settings — most let you upload the file directly, or host it somewhere and paste the link.
✅ New Task
If set, whoever this is assigned to gets a reminder email once the due date arrives — checked whenever the app is opened, so it won't fire at an exact time of day.
Candidates for this job
AI Score
Posting Title
Candidate Name
Stage
Modified Time
Skill Set
City
State
📋 Link Assessment
Don't have one yet? Create the standard 10-question assessment for this job instead:
📥 Reply Received
From
Subject
Received
Message
✉ Sent Email
From
To
Subject
Sent
Message
👁 Email Preview
This shows exactly what the recipient will see — all placeholders resolved to real values, signature included, same as what actually sends.
To
Subject
Message
🔍 Quick Links
Fast access to outside tools you'll use alongside this ATS.
The job board checks open a search for your company name — there's no direct API access to confirm a specific listing went live, since that requires a paid partnership with each board. This is the fastest way to manually verify.
✨ AI Job Description Rewriter
Start AI Interview Session
✅ AI results (score, summary, responses) are saved automatically to the candidate's profile. No manual entry needed.
New Conversation
Messages are private between you and this person. Use @username in messages to include others.
Invite Candidate to Portal
📧 This opens your email client with the Candidate Portal welcome email pre-filled. When the candidate accepts, they will appear in "Pending Approval" for you to Approve or Decline before they can sign in.
EEO Self-Identification Survey
Completion is voluntary and will not affect this application. Information is kept confidential and used only for compliance reporting (EEOC, OFCCP).
Reset Password
Enter your email address and we'll send you a link to set a new password.
Set a New Password
Choose a new password for your account.
Change Your Password
You're signing in with a temporary password — set a real password before continuing.
📧 Action needed to send this email
✏ My Email Signature
This signature is yours alone — write it exactly the way you want, full control. It's tied to your account and appears automatically at the bottom of every email you personally send (not on system emails like invites or password resets).
⚠ For the logo to actually display as an image in emails you receive replies to, your EmailJS template needs to be set up for HTML (not the default plain-text setup). Without that, the logo is saved and ready, but won't visually render — the text portion of your signature always works either way.
✉ Bulk Email
🔗 Set up Live Application Intake
1. Go to forms.google.com and create a new form called "Apply Now" 2. Add these questions: Full Name, Email, Phone, Which position are you applying for? (short answer), How did you hear about us? (multiple choice: Indeed, ZipRecruiter, LinkedIn, Google, Referral, Other), Resume link or paste your resume text (paragraph) 3. Click the Responses tab → click the green Sheets icon → "Create a new spreadsheet" — this links every submission to a Google Sheet automatically 4. In that Sheet, go to File → Share → Publish to web → choose the Form Responses sheet → format CSV → click Publish 5. Copy the URL it gives you and paste it into the "Published Google Sheet CSV URL" field on this page, then click Save 6. Click "🔄 Sync new applications now" anytime — or just reopen this page, since it checks automatically 7. Copy your Form's own link (top-right "Send" button in Google Forms) — that's your real, working "Apply Now" link. Use it as the external Apply URL when posting on any job board that allows one, share it on your Wix site, or post it directly on social media
✅ Every new response in the Sheet becomes a real candidate here automatically, with the job matched by title and the source pulled from "How did you hear about us?" — no manual data entry.
Create Assessment
Job-Specific Questions (add up to 10 unique questions for this job)
0 / 10
🔀 Duplicate Candidates
📋 Import Resume or Profile
Works for LinkedIn, GitHub, a resume found through Google search, or anywhere else — no site allows automated scraping or pulling profiles directly, so this is the honest, working path: copy the visible text from wherever you found them and paste it below. Parsed the same way an uploaded resume is.
Right-click their profile photo and save it, then attach it here — same as pasting the text, this only works with what's already visible on your screen.
🔖 Faster: one-click import from any page
Drag this button to your bookmarks bar. While viewing any resume or profile page (LinkedIn, GitHub, anywhere), click it — this page opens with that page's text already filled in above, ready to review and add.
🔍 Source Candidates
Being upfront: this app can't crawl LinkedIn or the wider web itself to find candidates — real sourcing AI needs its own dedicated engine and access LinkedIn and most job sites explicitly don't allow for automated tools. But you already have exactly that kind of tool connected: Metaview's Sourcing feature does real AI-powered candidate search, and results can flow straight into this job automatically.
Paste the copied brief into Metaview's Sourcing search. Anything it finds will come into this job automatically once your Zap is set up — see Metaview Integration in Settings → Organization for the exact steps.
📱 Job QR Code
Scanning this opens the job posting directly on a candidate's phone. Print it, put it on a flyer, add it to a booth banner — anywhere a phone camera can reach it.
✉ Share Job
📅 Interviews Scheduled
📊 Import Candidates from Spreadsheet
Match each column from your file to the right field below. Columns that don't apply can be left as "— skip —".
If your export includes resume files, put them all in a single .zip (no folders inside) and upload it here. Map the "Attachment filename" field above to whichever column lists each file's name (e.g. "john_smith_resume.pdf") — same pattern as Zoho's import.
Preview (first 5 rows)
🔄 Change Stage
📋
⚠ Possible Duplicate
This looks like it might already be in your system.
Already in HRRS Pro
You're uploading
Add Question
Assessment
Send Screening Questions to Candidate
This sends a direct link so the candidate can answer these questions themselves — their real answers come back and attach to their profile automatically.
Create Document
🎭 Masked Resume
This creates a separate copy of the resume text with the candidate's name, email, phone, home address, and gender/education clues removed — useful when submitting to a client who shouldn't see this directly. This never changes their real profile. Name/email/phone/address are removed reliably; university names, graduation years, and any birth-date-like text are lower-confidence, so please review below and edit directly if anything needs fixing before downloading.
Document
Assessment Result
New Automation
Automatically pulls each candidate's own job-specific screening questions — no template needed here, and no mixing between jobs.
Active
RingCentral Sign In
Sign in with your RingCentral account email and password to connect SMS messaging.
Insert Link
Assessment
Please answer all questions carefully. Knockout questions (marked Required) must be answered correctly to proceed. Results are scored by AI and visible to the recruiter.
📤 Post Job to Boards
Select which boards to post this job to. An email notification will be sent to you listing every board the job was posted on, separated by Free and Paid.