Apollo + JEV / Lead qualification
Jev makes lead qualification
feel like cheating.
Turn your Apollo list into qualified leads and personal message drafts. Jev picks the relevant service, checks the pitch and flags anything that needs another look. You review the messages before sending.
By Artem Novitckii · Free code + setup guide · Mac or Windows
Want this built for your business? Book a call with Moshn →
- 01Apollo supplies the contacts
Use your saved contacts or a CSV export.
- 02JEV applies your criteria
Customer fit, service relevance and message checks.
- 03Personal drafts, ready to review
Company-specific messages with a call invitation and optional booking link.
Your starter kit
The code, ready for your offer.
Download the project and open it in your coding assistant. It includes the Apollo connection, JEV classifier, editable message templates and instructions for your AI.
Starter release. Local setup and simulated API tests pass. A real Apollo-to-JEV run still needs validation with your accounts; speed, cost and classification accuracy are not yet measured for this project.
01 / Start here
You bring the offer.
Your AI helps with the setup.
You don't need to write the code yourself. You need an AI that can open a project folder and run commands on your computer. Give it the project above, then paste this:
Set up this Apollo + JEV lead classifier for me:
https://github.com/artemnovitckii/apollo-jev-lead-classifier
Read AGENTS.md and docs/setup-with-ai.md. Ask what I sell, who buys it, what makes someone a poor fit and what evidence supports each service I offer. Use my answers to update config/offer.json. Keep an unknown option when the evidence is missing. Configure config/messages.json with truthful templates for each service, my call invitation, optional booking link and sender name.
Help me connect my saved Apollo contacts or use an Apollo CSV. Show me how to enter my own API keys privately with configure.py. Never ask me to paste keys into this chat.
Run the local checks, then import a preview of 10 contacts once Apollo is configured. Tell me which fields are missing and whether company enrichment would help. I want the setup ready to qualify my list and create personalized message drafts using --draft-messages. Explain which drafts need revision or research and which are ready for my review before sending. Do not send messages. Clearly distinguish offline checks from a successful live run.Your AI should ask about your business before it changes the criteria. The included example is for selling enquiry follow-up, client onboarding and reporting automations to service businesses.
- On your computer
- Python 3.10 or newer. The project uses Python's built-in tools, so there are no extra packages to install.
- For live classification
- Your own TypeSafe / JEV API access.
- For direct Apollo import
- An Apollo account with saved contacts and an API key allowed to read them. A CSV export works too.
Prefer cloning the project yourself?
git clone https://github.com/artemnovitckii/apollo-jev-lead-classifier.git
cd apollo-jev-lead-classifierOr download the ZIP above and unzip it. Open a terminal in the folder containing lead_classifier.py. On Windows, replace python3 with py in this guide.
02 / Connect your data
Use the contacts you already have.
Direct connection
Saved Apollo contacts
The tool reads contacts from your Apollo account. Your AI can configure a keyword, list or stage filter using actual IDs from your workspace.
Alternative
An exported CSV
Export a list from Apollo and put it in the project's data folder. Include company, title and the business information needed for your criteria.
For the direct connection, create an Apollo API key with access to Contacts Search. This version reads saved contacts; it does not search the full Apollo database.
Run this yourself in a terminal to enter your Apollo and TypeSafe keys privately. It hides what you type and saves the keys in the project's local .env file.
python3 configure.py
python3 lead_classifier.py --doctorThe setup check confirms that configuration and keys are present. It does not prove that your provider accounts can make requests. Never paste a key into an AI chat or share your .env file.
What if the company information is missing?
Saved-contact search can return a title and company name without industry or headcount. Optional company enrichment can fill some of those gaps. It needs Apollo's Organization Enrichment permission and can consume credits, even during a preview.
python3 lead_classifier.py --source apollo --enrich-organizations --preview --limit 10 --output output-enriched-previewUse the imported CSV for later classification so you do not repeat the enrichment. A company's industry or tools still do not prove that it has a particular problem.
03 / Make the decisions useful
Tell JEV what a good fit means.
Your offer lives in config/offer.json. Have your AI replace the example with your actual buyer, exclusions and services. Start with facts you can check:
Example offer / AI automation services
“We help service businesses with 5 to 100 employees reduce manual admin. We work with founders and operations leads.”
- Customer fit
- A service business in that size range, with someone responsible for buying or managing operational services.
- Service relevance
- A sourced note describes staff copying numbers into weekly client reports. Reporting automation is worth reviewing.
- Message mismatch
- The pitch claims the prospect has a warehouse problem, but the supplied evidence describes a marketing agency.
Illustrative criteria, not results from a live JEV run.
If you have research, add the actual evidence, source and date. A source link alone won't do: this tool does not visit websites. Supply an existing message to check it, or use the included messaging step to create a draft after qualification. The setup guide explains CSV columns and Apollo custom-field mapping.
04 / Run a small batch
Start with ten. Read what comes back.
- Preview the import. Read ten saved Apollo contacts and prepare the questions JEV would receive. This calls Apollo, but does not call JEV.
python3 lead_classifier.py --source apollo --preview --limit 10 --output output-apollo-previewOpen imported-leads.csv in the output folder. Check the role, company and any missing facts. Your AI can help inspect requests.jsonl to confirm the criteria and evidence.
- Qualify the leads and prepare messages. This uses JEV credits and avoids fetching Apollo again. Each generated draft adds a separate JEV message check.
python3 lead_classifier.py --input output-apollo-preview/imported-leads.csv --live --draft-messages --limit 10 --output output-first-results- Open
classified.csvandmessage_drafts.csv. Compare the decisions and drafts with the source facts. Adjust your criteria if the questions are unclear, then test on fresh contacts before scaling up.
Use an Apollo CSV instead
Save your export as data/apollo.csv, then preview the first ten rows:
python3 lead_classifier.py --input data/apollo.csv --preview --limit 10 --output output-csv-previewWhen it looks right, replace --preview with --live and choose a new output folder. CSV preview needs no API keys; live classification needs your TypeSafe key.
05 / Use the output
A list with a next step.
You get separate labels and confidence values for fit, service relevance and the supplied message. The tool then suggests what to review:
| Result | What to do |
|---|---|
| Research or review | Fill a gap or check an uncertain decision. |
| Deprioritize | Check the exclusion before removing the prospect from this campaign. |
| Revise message | Fix the wrong angle or unsupported personalization. |
| Review for outreach | Check the pitch before using your usual outreach process. |
Filter by service to review one group together. The original classifications stay in classified.csv; generated subjects, messages and their separate checks are in message_drafts.csv.
Confidence is about the classification. It is not the chance of a reply or sale. Campaign predictions need actual campaign outcomes to test against. See the validation worksheet to measure your own results.
06 / Turn the shortlist into outreach
A personal message.
A clear invitation to talk.
Jev selects the service supported by your research. The code fills an editable template with the company name, then Jev checks the exact subject and message for relevance and unsupported claims.
Open config/messages.json with your AI. Write a template for each service you actually offer, choose your call invitation and optionally add your own booking link and signature. This personalizes by company and selected service; it does not generate free-form prose or invent a personal observation.
Illustrative draft / Fictional company
Client onboarding at Example North Studio
Hi, I wanted to ask about client onboarding at Example North Studio. We build workflows that collect intake forms, track missing files and show your team what is still needed. Would that be relevant to how you onboard clients?
Would you be open to a quick call to see whether this would be useful?
Example from the included template, assuming a confident fit and onboarding angle. This is not a live model result. Your booking link and signature appear below the invitation if configured.
Add --draft-messages to the live command, as shown above. No extra writing-provider key is needed. Only confident good fits with a known service angle and company name get drafts. An existing mismatched message can receive a replacement while the original stays available.
| Status | Next step |
|---|---|
| Review before sending | Jev returned a confident match. Read it yourself, then use your usual sending process. |
| Revise message | The generated pitch was flagged for a mismatch. |
| Research or review | The message check was uncertain or lacked enough evidence. |
| Skipped or error | The lead did not qualify for a draft, or a provider check failed. Inspect the row before proceeding. |
Draft checks run after classification and add JEV usage. Preview mode produces no drafts because it has no qualification results. See the messaging guide for settings, outputs and how to check a message after editing it.
07 / If you get stuck
A few things worth checking.
My AI cannot open the project.
Use an assistant that can work with local files and run commands, such as a coding assistant in a project folder. Download and unzip the project first, then open that folder. A regular chat without file or terminal access can explain the steps, but cannot run the tool for you.
Apollo says 401 or 403.
Check that your key is active and has access to Contacts Search. If you enabled company enrichment, it also needs Organization Enrichment. Account access can vary. Keep the key in your local setup; do not paste it into chat.
Apollo returns no contacts.
The connection reads contacts already saved in your Apollo account. Check the account and filters, or use an exported CSV. It does not search Apollo's entire prospect database.
Most results say unknown.
Check the imported fields. A title and company name may not establish your criteria. Add missing company facts or sourced research. Lowering the confidence threshold will not supply missing evidence.
A folder already exists, or some records failed.
Give each run a new output folder. If a JEV request fails, its row is marked error_review. Fix the problem, then create a CSV with only the failed rows before retrying. The tool does not automatically resume a run.
What does it cost, and where does my data go?
The code and guide are free. Apollo and TypeSafe control API access and billing. Direct import reads from Apollo; optional company enrichment may use Apollo credits. Live classification sends the selected business fields, research and message text to TypeSafe. Each draft adds a JEV check, including its subject, body and any booking link. The summary records classification and draft-check usage separately. Files stay in your project folder, but live processing uses those external services. Check provider billing before increasing the batch.
Try it on your own offer.
Get the project, give your AI the setup prompt and review your first ten contacts.
Get the Apollo + JEV setup
Unlock the full guide, project download and setup prompt, plus every resource in the library. Free, with my weekly email. Unsubscribe anytime.
Moshn / AI automation agency
Want AI automation built for your business?
Moshn builds AI systems around the tools your team already uses, from lead qualification and follow-ups to onboarding and reporting.
Book a call. Tell us what your team is doing manually, and we'll show you what can be automated.