RecruitFlow replaces manual candidate submission workflows. Instead of logging into Zoho, finding contacts, creating submissions, composing emails, and attaching resumes one by one — you send one command from Telegram and the system does everything automatically.
You say:
"Send Sarah Jones to John at Company A, Bob at Company B for Medical Assistant"
RecruitFlow will:
Each client gets their own email (no CC/BCC). You can track who you sent the candidate to, per job and per client, inside Zoho.
Every command goes through these steps in order:
Command Received
You type or voice-note a command in Telegram (or use the Test page).
AI Parses Intent
GPT-4o-mini extracts the candidate name, target companies/contacts, job context, and send mode from your message. Tolerates typos.
Clarification Check
If the AI can't understand something, it sends you clarification questions in Telegram and stops. Nothing is sent.
Candidate Lookup
Searches Zoho Recruit by email (if you used an @) or by name. If zero or multiple matches, it asks you to be more specific.
Target Resolution
For each target, finds the company in Zoho, then the contact (by name or default submission contact), then optionally the job opening.
Zoho Submission
Associates the candidate with the job opening in Zoho (creating the submission record). If no job is specified, logs a general submission.
Gmail Email
Composes a personalized email per target with the candidate's highlights, availability, comp, and attached resume. Creates a draft or sends immediately based on your mode.
Zoho Logging
Adds notes to the candidate record and the job opening with submission details, email status, and run ID.
Telegram Summary
Sends you a final summary showing which targets succeeded, which failed, and which were unresolved.
If any step fails for a specific target, the system continues with the remaining targets (partial success). You always get a summary.
Commands start with send or submit (they're interchangeable). Type help to see examples in Telegram.
send Sarah Jones to John at Company A, Bob at Company B for Medical Assistant (draft)
Send to specific people at specific companies, for a specific job, in draft mode.
send Sarah Jones to Company A, Company B for Front Desk (send now)
Send to companies without specifying a person — uses the default submission contact. Send immediately.
submit John Doe to Company X, Company Y
No job specified, no mode specified — defaults to draft, creates a general submission.
send sarah.jones@email.com to John at Company A
Use an email to identify the candidate (more precise than name).
Command Structure
send [candidate name or email] to [Person at Company, Person at Company, ...] for [job title] (draft|send|send now)
• Candidate — name or email address
• Targets — comma-separated, "Person at Company" or just "Company"
• Job — optional, comes after "for"
• Mode — optional, defaults to draft
You can send a voice note in Telegram instead of typing. RecruitFlow will automatically transcribe it using Whisper (speech-to-text) and process the transcribed text as a command.
Just hold the microphone button in Telegram and say your command naturally, e.g. "Send Sarah Jones to John at Company A for Medical Assistant, draft".
Tip: Speak clearly and include the key parts — candidate name, target companies/people, and optionally the job title. The AI is tolerant of natural speech patterns.
Whisper settings (API key, endpoint, model) can be configured in Settings. If no Whisper API key is set, it falls back to your OpenAI API key.
RecruitFlow supports two email modes:
Draft (default)
Creates Gmail drafts in your inbox. You can review and edit before sending manually. This is the safest option.
(draft) or just omit the mode
Send
Sends the email immediately. Use only when you're confident in the content. Cannot be undone.
(send) or (send now)
The default mode can be changed in Settings under "Email Template → Default Send Mode". We recommend keeping it on draft.
Each target in your command is resolved against Zoho Recruit:
Person + Company
e.g. John at Company A — searches for a contact named "John" at Company A. If multiple Johns are found, the target is marked unresolved.
Company Only
e.g. Company A — looks for the "Default Submission Contact" at that company. Set this flag on the contact in Zoho you want to receive submissions by default.
What makes a target "unresolved"?
Unresolved targets are skipped — the system continues with resolved targets and reports the unresolved ones in the summary.
For each resolved target, RecruitFlow creates a submission in Zoho Recruit by associating the candidate with the job opening.
With a Job Opening
If you specify a job (e.g. "for Medical Assistant"), the system searches for a matching job opening at that company and creates the candidate ↔ job association. This appears in Zoho under Job Openings → Related Candidates.
Without a Job Opening
If no job is specified or no matching job is found, a general submission is logged. The email is still sent and a note is added to the candidate record for tracking.
After each run, the system also updates custom fields on the candidate record: Last Automation Run Status, Last Automation Run Time, Last Automation Run ID, and Last Automation Error Summary (if these fields exist in your Zoho setup).
Each target receives a separate, personalized email. No CC or BCC — every email is 1:1.
Email template:
Hi {FirstName},
Wanted to share a candidate I think could be a strong fit for {job title or "your team"}.
{CandidateName} — highlights:
• (bullets from Zoho Candidate Summary)
Availability: {from Zoho or "Available upon request"}
Comp: {from Zoho or "Open"}
Resume attached. If you'd like, I can coordinate an intro quickly.
{Your signature from Settings}
Resume: Automatically attached from the candidate's Zoho attachments (looks for files named "resume" or with .pdf/.docx extension). If no resume is found, the email is sent without it and you're notified in the summary.
Sender: Emails come from the Gmail account configured in Settings, with the sender name you set (default: "Eli Rubin").
The Dashboard shows every automation run with full details.
Run Statuses
What's Tracked Per Run
What's Tracked Per Submission
Click any run to expand it and see the per-submission details. Use the filter buttons to show only failed or partial runs.
All credentials are stored in the database — not in environment variables. Configure them in Settings.
Zoho Recruit
Gmail
Telegram Bot
OpenAI (Command Interpreter)
Whisper STT (Voice Notes)
Email Template
RecruitFlow tracks errors at three levels:
1. Telegram (Instant)
You get an immediate Telegram message if something goes wrong — candidate not found, API error, voice transcription failure, etc.
2. Zoho (Permanent Audit Trail)
Notes are added to the candidate record and job openings with full details: what was submitted, to whom, email status, and run ID. Custom candidate fields are updated with the last run status.
3. Dashboard (Searchable History)
Every run is logged with status, error details, and per-submission tracking. Filter by status to quickly find failed or partial runs.
Common errors and what to do
"Candidate not found" — Try using the candidate's email address instead of their name.
"Multiple candidates found" — The name matched more than one record. Reply with the specific email.
"Company not found" — Check the company name spelling in Zoho. The search uses fuzzy matching but the company must exist.
"Multiple contacts" — Two people with similar names at the same company. Be more specific (e.g. full name).
"Zoho token refresh failed" — Your Zoho refresh token may have expired. Generate a new one and update Settings.
"Gmail error" — Check that your Gmail OAuth credentials are valid and the refresh token hasn't expired.
Can I send to more than 3 clients at once?
Yes — there's no limit on the number of targets. Each one is processed independently.
What happens if the resume is missing?
The email is still sent/drafted, but without an attachment. You'll see a warning in the Telegram summary and the dashboard.
Can I customize the email template?
The email signature can be changed in Settings. The body template includes the candidate's highlights from their Zoho Candidate Summary field, plus availability and comp info.
What if I make a typo in the command?
The AI interpreter is tolerant of typos. It will do its best to match names and companies. If it can't figure something out, it will ask you for clarification instead of guessing.
Is it safe? Can it accidentally send emails?
The default mode is draft — emails are created as Gmail drafts, not sent. You must explicitly say "send" or "send now" to send immediately. The Telegram webhook also only accepts messages from your configured user ID.
Can I test without Telegram?
Yes — use the Test page to type commands directly. Results appear in the Dashboard just like Telegram-triggered runs.
What Zoho scopes do I need?
ZohoRecruit.modules.ALL and ZohoRecruit.settings.ALL. These cover candidate search, contact search, job openings, associations, and notes.
Can I use a custom Whisper endpoint?
Yes — in Settings under "Whisper STT", you can set a custom endpoint URL and model name. This works with any OpenAI-compatible speech-to-text API.
RecruitFlow — Telegram → Zoho Recruit → Gmail Automation