User Guide

What RecruitFlow Does

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:

  • • Find Sarah Jones in Zoho Recruit
  • • Find John at Company A and Bob at Company B (with their emails)
  • • Create a Zoho submission for each target
  • • Create separate Gmail drafts with Sarah's resume attached
  • • Log everything back to Zoho
  • • Send you a summary in Telegram

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.

How It Works (The Flow)

Every command goes through these steps in order:

1

Command Received

You type or voice-note a command in Telegram (or use the Test page).

2

AI Parses Intent

GPT-4o-mini extracts the candidate name, target companies/contacts, job context, and send mode from your message. Tolerates typos.

3

Clarification Check

If the AI can't understand something, it sends you clarification questions in Telegram and stops. Nothing is sent.

4

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.

5

Target Resolution

For each target, finds the company in Zoho, then the contact (by name or default submission contact), then optionally the job opening.

6

Zoho Submission

Associates the candidate with the job opening in Zoho (creating the submission record). If no job is specified, logs a general submission.

7

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.

8

Zoho Logging

Adds notes to the candidate record and the job opening with submission details, email status, and run ID.

9

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.

Command Format

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

Voice Notes

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.

Draft vs Send

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.

Targets & Contacts

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"?

  • • Company not found in Zoho
  • • Contact not found at that company
  • • Multiple contacts match the name
  • • Contact has no email address
  • • No default submission contact set (when no person specified)

Unresolved targets are skipped — the system continues with resolved targets and reports the unresolved ones in the summary.

Zoho Submissions

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).

Email Delivery

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").

Dashboard & Tracking

The Dashboard shows every automation run with full details.

Run Statuses

✓ Success⚠ Partial✗ Failed○ Running

What's Tracked Per Run

  • • Original Telegram message
  • • Parsed intent (candidate, targets, job, mode)
  • • Targets attempted / succeeded / unresolved
  • • Error details (which step failed and why)

What's Tracked Per Submission

  • • Target company and contact
  • • Zoho submission status and ID
  • • Email status (drafted / sent / failed)
  • • Gmail draft or message ID
  • • Any error messages

Click any run to expand it and see the per-submission details. Use the filter buttons to show only failed or partial runs.

Settings Reference

All credentials are stored in the database — not in environment variables. Configure them in Settings.

Zoho Recruit

Client IDFrom Zoho API Console (Self Client)
Client SecretFrom Zoho API Console
Refresh TokenGenerated via Zoho OAuth flow with ZohoRecruit.modules.ALL + ZohoRecruit.settings.ALL scopes
API Domainhttps://recruit.zoho.com (default) — change for EU/IN/AU data centers
Accounts Domainhttps://accounts.zoho.com (default)

Gmail

Client IDFrom Google Cloud Console → OAuth 2.0 Client
Client SecretFrom Google Cloud Console
Refresh TokenGenerated via OAuth playground with Gmail send scope
Sender EmailThe Gmail address emails are sent from
Sender NameDisplay name on outgoing emails (default: Eli Rubin)

Telegram Bot

Bot TokenFrom @BotFather in Telegram
Chat IDYour chat or group ID (for test page and error alerts)
Allowed User IDSecurity filter — only this Telegram user ID can trigger automations

OpenAI (Command Interpreter)

API KeyYour OpenAI API key
ModelDefault: gpt-4o-mini — the AI that parses your commands into structured intent

Whisper STT (Voice Notes)

API KeyOptional — leave blank to reuse the OpenAI key above
EndpointDefault: https://api.openai.com/v1 — change for custom Whisper deployments
ModelDefault: whisper-1

Email Template

Default Send Modedraft (recommended) or send — controls what happens when you don't specify a mode
Email SignatureAppended to every email (default: Thanks, Eli Rubin)

Error Handling

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.

FAQ

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