Send Automated Recruitment Rejection Email at End-of-Day (Google Sheets | Gmail)
Go to WorkflowDescription
Send Automated Recruitment Rejection Emails with Google Sheets and Gmail at End-of-Day.
Automatically reads a “Candidate Status” tab in Google Sheets every day at 18:00 Asia/Kolkata, filters rows with exact (case-sensitive) rejection statuses and sends one personalized rejection email per candidate via SMTP (Gmail). It rate-limits sends, supports DRY\_RUN previews and writes a timestamp back to rejection_sent_at to avoid duplicates.
Who’s it for
Recruiters needing consistent, respectful closure at day end.
Teams tracking hiring outcomes in Google Sheets.
Coordinators who prefer a scheduled, hands-off workflow with safeguards.
How it works
Cron (18:00 IST) triggers daily
Google Sheets Read → loads Candidate Status tab
Filter → keep rows where status REJECT_STATUS_CSV (exact match), with valid candidate_email and empty rejection_sent_at
DRY\RUN? If true → output preview only; if false → proceed
Rate limit → wait RATE_LIMIT_SECONDS (default 10s) between emails
SMTP (Gmail) → send personalized email per row using templates
Mark as sent → write current timestamp to rejection_sent_at
How to set up
Sheet & Columns**: Create “Candidate Status” tab with:
candidate_name, candidate_email, role, status, recruiter_name, recruiter_email, company_name, interview_feedback (optional), template_variant (optional), language (optional), rejection_sent_at
Credentials: Connect **Google Sheets (OAuth) and SMTP (Gmail) in n8n (use App Password if 2FA)
Config (Set node)**:
SPREADSHEET_ID
SOURCE_SHEET = Candidate Status
TIMEZONE = Asia/Kolkata
REJECT_STATUS_CSV = e.g., Rejected
SMTP_FROM = e.g., [email protected]
SUBJECT_TEMPLATE = Regarding your application for {{role}} at {{company_name}}
HTML_TEMPLATE / TEXT_TEMPLATE
RATE_LIMIT_SECONDS = 10
INCLUDE_WEEKENDS = true
DRY_RUN = false
Activate**: Enable the workflow
Requirements
Google Sheet with the “Candidate Status” tab and columns above.
SMTP (Gmail) account for sending.
n8n (cloud or self-hosted) with Google Sheets + SMTP credentials.
How to customize
Statuses**: REJECT_STATUS_CSV supports comma-separated exact values (e.g., Rejected,Not Selected)
Templates**: Edit SUBJECT_TEMPLATE, HTML_TEMPLATE, TEXT_TEMPLATE
Variables:** {{candidate_name}}, {{role}}, {{company_name}}, {{recruiter_name}}, and optional {{feedback_text}}/{{feedback_html}} from interview_feedback
Schedule**: Change Cron time from 18:00 to your preferred hour
Rate limit**: Tune RATE_LIMIT_SECONDS for SMTP policy
Preview**: Set DRY_RUN=true for a safe, no-send preview
Add-ons
Dynamic Reply-To** per recruiter_email
Localization/Variants** via language or template_variant columns
Daily summary** email: sent/skip/error counts
Validation & logging**: log invalid emails to another tab
Gmail API**: swap SMTP with Gmail nodes if preferred
Use Case Examples
Daily round-up**: 18:00 IST closure emails for all candidates marked Rejected today
Multi-brand hiring**: Switch company_name per row and personalize subject lines
Compliance/logging**: DRY\RUN each afternoon, review, then flip to live sends
Common troubleshooting
No emails sent**: Ensure status exactly matches REJECT_STATUS_CSV (case-sensitive) and candidate_email is present
Duplicates**: Verify rejection_sent_at is blank before run; workflow sets it after sending
Blank variables**: Fill candidate_name, role, company_name, recruiter_name in the sheet
SMTP errors**: Check credentials, sender permissions, and daily limits
Timing**: Confirm workflow timezone Asia/Kolkata and Cron = 18:00
Need Help?
Want us to tailor the template, add a summary report or wire up company-based variants? Contact our n8n automation engineers at WeblineIndia and we’ll plug it in.