Table of Contents
Your applicant tracking system holds thousands of candidate records inside Salesforce. How many of them have heard from your team in the last 90 days?
For most staffing agencies, that number is closer to zero. Candidates go stale. Recruiters source new ones instead of re-engaging the old, and the database that should be your biggest recruiting asset sits untouched. The bottleneck is that native sending tools weren't built to pull from ATS custom objects.
This guide breaks down where ATS data lives in Salesforce, why staffing email stalls at scale, and how to build a re-engagement workflow from live candidate records.
Where ATS Data Lives in Salesforce (and Why That Matters for Email)
Salesforce-based applicant tracking systems store candidate data in three custom objects: Candidate__c, Job_Order__c, and Placement__c. These objects hold every field you need to segment and personalize staffing email campaigns. The problem: native Salesforce email tools can't query them.
| Object | What It Stores | Key Fields for Email |
| Candidate__c | Candidate profiles | Email, skills, availability status, last activity date |
| Job_Order__c | Open roles | Job title, location, required skills, hiring client |
| Placement__c | Completed assignments | Start date, end date, bill rate, candidate-to-job link |
These three objects connect through lookup relationships. A single candidate record can link to multiple placements and multiple job orders. That history is your filter. Instead of blasting 20,000 candidates, you build a 200-person campaign targeting IT contractors whose last assignment ended 60 days ago.
Two fields control whether you can email a candidate at all. HasOptedOutOfEmail on the Contact or Lead record is the opt-out flag Salesforce checks beforesending mass emails. EmailBouncedDate stamps when a previous send bounced. Skip either one and your campaign violates CAN-SPAM or burns sends on dead addresses.
So the richest staffing data in your CRM sits one table away from your email tool. Visible in reports, unreachable at send time. That's the gap at the center of every Salesforce ATS integration.
Why Staffing Agencies Hit a Wall with Candidate Email in Salesforce
Staffing agencies hit two walls when they try to email candidates at scale from Salesforce: a hard daily sending cap that stops campaigns mid-run, and a candidate database that loses value every week it goes unworked.
The 5,000-Email Ceiling
Salesforce caps mass email at 5,000 sends per org per day on a rolling 24-hour window. For a staffing agency with 15,000 active candidates, a single campaign takes three full days to finish. No error, no warning when you hit the cap. The remaining emails just queue.
The real damage is timing. A client calls with 40 open warehouse positions starting Monday. Your recruiter needs to reach every candidate with forklift certification and open availability this week. At 5,000 per day, that outreach takes two days to land. By the time batch two goes out, competitors have already placed the fastest responders from batch one.
Here is where the limits stack up:
- The 5,000 daily cap is shared across the entire org. Three recruiters sending on the same day compete for the same ceiling, and one large campaign can lock out every other recruiter's outreach for 24 hours.
- Each list email sent in Lightning maxes out at 200 recipients. A 2,000-candidate campaign means ten separate sends, each manually configured.
Most recruiters stop after the second manual send and go back to calling.
What a Stale Candidate Database Actually Costs
Most staffing agencies add thousands of candidates to their applicant tracking system every month. Most never hear from the agency again after the initial placement or interview.
SHRM puts the average cost per hire at $4,700 across industries, and even high-volume staffing roles run roughly $1,070 per placement when you count job board spend, screening, and recruiter time (SHRM, 2026). Re-engaging an existing candidate who has already passed screening costs one email.
The Salesforce field that flags a cold candidate is LastActivityDate on the Contact record: the most recent call, email, or task logged against them. When LastActivityDate sits 60 or 90 days in the past and there is no open Placement__c record, that candidate is stale. Most agencies have thousands of records in that state and no automated way to reach them.
What a Re-engagement Email Needs to Work
Timing comes first. A candidate two months out of a placement still remembers your agency and has a current resume on file. Wait six months, and that candidate has moved, changed numbers, or signed with a competitor.
Then personalization. A re-engagement email that gets opened pulls specific data from the candidate's record:
- Last placement role and end date from Placement__c
- Skills and availability status from Candidate__c
- Recruiter name and branch location from the owner record
- The specific open Job_Order__c that matches their profile
A generic "we have new opportunities" blast to 10,000 candidates gets ignored. An email naming the candidate's last role and a matching open position gets read.
Re-engagement at scale requires an email tool that reads ATS data, personalizes based on placement history, and sends beyond the daily limit. Native Salesforce tools can't do any of those three. MassMailer sends directly from live records inside Salesforce, bypasses the daily cap with its own sending infrastructure, and pulls merge fields from custom objects like Candidate__c and Placement__c.
How ATS Data Powers Targeted Candidate Email Campaigns
Targeted candidate email starts with a filtered audience from ATS fields and merge fields that personalize each message from the candidate's own record.
Segmenting Candidates from ATS Fields
Salesforce reports and list views turn your applicant tracking system data into a send-ready audience. The segmentation power sits in filter combinations across ATS objects.
A staffing agency filling IT contractor roles in Dallas would build a report filtering for:
- Status__c = "Available" on Candidate__c
- Skills__c contains "Java" or "Python" on Candidate__c
- LastActivityDate older than 60 days on the Contact record
- City = "Dallas" or "DFW" on the mailing address fields
That report returns 200 qualified candidates instead of 20,000 untargeted ones. The catch: getting that audience into your email tool. Candidate__c is a custom object, and native Salesforce mass email only queries Contact and Lead. To send bulk email to recruiters working from ATS reports, you need a tool that reads custom objects directly and skips the manual mapping back to Contact.
Personalizing Campaigns with ATS Merge Fields
Merge fields pull live data from a candidate's Salesforce record into the email at send time. Standard fields like {!Contact.FirstName} works in anySalesforce email template. The challenge starts one object away.
To include a candidate's last placement role, your template needs to traverse the lookup from Candidate__c to Placement__c and pull Job_Title__c. Native Salesforce templates cannot cross that relationship. The workaround is formula fields on the Contact record to surface ATS data, but every schema change in your applicant tracking system means another formula to maintain.
The difference shows up in the subject line:
| Subject Line | What It Pulls |
| "New opportunities available in your area" | Nothing from the record |
| "Sarah, your Java skills match 3 open roles in Dallas" | FirstName, Skills__c, City, count from Job_Order__c |
Send the first version, and candidates treat it like spam. Send the second, and they see a recruiter who knows their skills and market. For staffing agency email marketing, the subject line decides whether the email gets opened or buried.
MassMailer traverses lookup relationships natively, so your template references Placement__c.Job_Title__c or Job_Order__c.Location__c directly. No formula fields to build, and no maintenance when the ATS schema changes.
A Candidate Re-engagement Workflow: From Stale Record to Placed
A re-engagement workflow turns dormant candidate records into an active pipeline by sending targeted emails triggered by ATS data already sitting in Salesforce. Here is a three-touch sequence built on fields your applicant tracking system already tracks.
Filtering the Right Candidates
Start with a Salesforce list view or report that isolates candidates worth re-engaging:
- LastActivityDate on the Contact record: older than 60 days, younger than 12 months. Beyond a year, the candidate's certifications or availability have likely changed enough to need a fresh intake, not an email.
- Candidate_Status__c on Candidate__c: set to "Open to Opportunities" or "Between Assignments." This separates candidates in the pipeline from those already placed or flagged as inactive.
- HasOptedOutOfEmail = false and EmailBouncedDate = null on the Contact record. Both fields must pass before any bulk email for recruiters goes out.
For a staffing agency with 15,000 candidate records, expect this filter to return roughly 1,500 to 3,000 contactable candidates.
The Three-Touch Sequence
Each email has a different job and pulls different merge fields from your ATS custom objects.
Touch 1 (Day 1): The role-specific check-in. Subject line pulls {!Contact.FirstName} and the candidate's primary skill from Skills__c. Body references their last placement role from Placement__c.Job_Title__c and asks whether they are looking. No links to apply, no job board. One question.
Touch 2 (Day 5): The market update. Subject line references their metro area from MailingCity. Body shares how many open Job_Order__c records match their skill set and location. This gives the candidate real demand data from your Salesforce ATS integration, not a templated "we have opportunities."
Touch 3 (Day 12): The direct match. Only sent to candidates who opened Touch 1 or Touch 2. Subject line names a specific job title and client industry from Job_Order__c. The body includes a compensation range if the field is populated. One candidate, one role.
Tracking Responses Back to the Record
Here is what most staffing guides skip: the value of a re-engagement sequence is not just opens and replies. It is what writes back to Salesforce. A reply to Touch 1 updates LastActivityDate and moves the record out of future re-engagement filters automatically. A click in Touch 3 tells the recruiter exactly which role caught their attention. Every response updates the candidate's Activity History, so the recruiter who picks up the phone already knows what the candidate engaged with.
A staffing agency CRM email tool that runs inside Salesforce writes these interactions to the record natively.MassMailer schedules each touch in the sequence and spaces them across days, so a 3,000-candidate re-engagement campaign runs hands-free once the list view and templates are set.
What to Look for in a Salesforce-Native Email Tool for Staffing
The re-engagement workflow above depends on an email tool that can do three things native Salesforce email cannot: query ATS custom objects, traverse lookup relationships for merge fields, and send past the daily cap. Not every third-party tool does all three.
Checklist before you commit
- Custom object access. Your applicant tracking system stores candidates on Candidate__c, not on Contact or Lead. The tool must build and send lists directly from custom object reports and list views. If it only queries standard objects, you are back to mapping records manually before every campaign.
- Cross-object merge fields. Personalization from ATS data means pulling Job_Title__c from Placement__c or Location__c from Job_Order__c into the email template. The tool should traverse lookup relationships natively. A tool that requires formula fields on the Contact record to surface this data adds maintenance every time your ATS schema changes.
- Sending capacity. Staffing re-engagement campaigns regularly exceed 1,000 recipients. A staffing agency CRM email tool needs to send past the daily cap without splitting the campaign across multiple days. Check whether the tool counts against the org limit or uses its own sending infrastructure.
- Activity write-back. Every send, open, and click should be logged to the candidate's Activity History inside Salesforce. If the tool stores engagement data in its own dashboard but does not write it back to the record, your recruiters lose visibility, and LastActivityDate stops updating.
- Compliance handling. The tool must respect HasOptedOutOfEmail and EmailBouncedDate at send time, not just at list-build time. A candidate who opts out between list creation and sending should be excluded automatically, with no manual re-filtering.
- Scheduling and sequencing. A multi-touch re-engagement workflow needs timed sends: Touch 1 on Day 1, Touch 2 on Day 5, Touch 3 on Day 12. The tool should handle this natively rather than requiring a separate automation platform or manual sends on a calendar.
MassMailer meets all six criteria as a Salesforce-native app. See how it works with your data. Book a walkthrough and run the re-engagement workflow from this guide on your own ATS records.
Frequently Asked Questions
1. Can Salesforce work as an applicant tracking system?
2. What is the difference between an ATS and a CRM for staffing?
3. How often should a staffing agency email candidates in its database?
4. What applicant tracking system apps integrate with Salesforce?
5. Do candidates need to opt in before a staffing agency can email them?
6. How do you measure staffing email campaign performance in Salesforce?
Start Your Free Trial Today
Experience MassMailer the easiest way to send personalized emails from Salesforce.
Related Blogs
MassMailer Resources