Every 15 minutes, finds a work email for each new lead in your Airtable table, trying Apollo then Hunter, and writes it on the row.
Uses
Airtable
Apollo
Hunter
Find a work email for every new lead in Airtable
Every 15 minutes, the rows in your Airtable leads table that have not been processed yet are picked up and each person's work email is looked for. Apollo is tried first for a verified email and company details; if that finds nothing, Hunter is asked, and its answer is kept only when it scores highly and the company's mail server does not accept every address.
Each row is updated in place with the email, its status and source, plus title, seniority, LinkedIn, industry and headcount where found. Anything the search did not find leaves the row's own value alone, so a LinkedIn link or email you typed in is never wiped. The row is marked 'enriched', or as needing review when no confident email turned up. Only rows without a result are ever touched, so a row is never looked up twice, and a run cut short by a rate limit leaves the rest for the next run. Rows missing a first name, last name or domain are marked for review and skipped rather than stopping the run.
You need Apollo, Hunter and Airtable connected, a 'Leads' table with First Name, Last Name, Company and Domain columns plus columns for the results, and your Airtable base ID and table name filled in.
baseId to blank.Set baseId to blank.tableName to Leads.Set tableName to Leads.minScore to 90.Set minScore to 90.tableName. Save it as leadsResult.List records in tableName. Save it as leadsResult.records to leadsResult.records.Set records to leadsResult.records.record in records:For each record in records:recStatus to record.fields["Enrichment Status"].Set recStatus to record.fields["Enrichment Status"].recStatus is not enriched and recStatus is not needs_reviewIf recStatus is not enriched and recStatus is not needs_reviewrecId to record.id.Set recId to record.id.firstName to record.fields["First Name"].Set firstName to record.fields["First Name"].lastName to record.fields["Last Name"].Set lastName to record.fields["Last Name"].companyName to record.fields.Company.Set companyName to record.fields.Company.companyDomain to record.fields.Domain.Set companyDomain to record.fields.Domain.resolvedEmail to blank.Set resolvedEmail to blank.emailStatus to not_found.Set emailStatus to not_found.emailSource to none.Set emailSource to none.apollo to an empty record.Set apollo to an empty record.firstName is yes and lastName is yes and companyDomain is yesIf firstName is yes and lastName is yes and companyDomain is yesfirstName lastName. Save it as apollo.Enrich person firstName lastName. Save it as apollo.apolloEmail to apollo.person.email.Set apolloEmail to apollo.person.email.apolloStatus to apollo.person.email_status.Set apolloStatus to apollo.person.email_status.apolloEmail isn't blank and apolloEmail is not email_not_unlocked@domain.com…If apolloEmail isn't blank and apolloEmail is not email_not_unlocked@domain.com…resolvedEmail to apolloEmail.Change resolvedEmail to apolloEmail.emailStatus to apolloStatus.Change emailStatus to apolloStatus.emailSource to apollo.Change emailSource to apollo.resolvedEmail is blankIf resolvedEmail is blankcompanyDomain lastNames email at firstName. Save it as hunter.Find companyDomain lastNames email at firstName. Save it as hunter.hunterEmail to hunter.email.Set hunterEmail to hunter.email.hunterScore to hunter.score.Set hunterScore to hunter.score.hunterAcceptAll to hunter.accept_all.Set hunterAcceptAll to hunter.accept_all.hunterEmail isn't blank and hunterScore is greater than or equal to minScore…If hunterEmail isn't blank and hunterScore is greater than or equal to minScore…resolvedEmail to hunterEmail.Change resolvedEmail to hunterEmail.emailStatus to valid.Change emailStatus to valid.emailSource to hunter.Change emailSource to hunter.emailStatus to missing_input.Change emailStatus to missing_input.finalStatus to needs_review.Set finalStatus to needs_review.resolvedEmail isn't blankIf resolvedEmail isn't blankfinalStatus to enriched.Change finalStatus to enriched.resolvedEmail, or record.fields.Email if it is empty and save it as email.Use resolvedEmail, or record.fields.Email if it is empty and save it as email.apollo.person.title, or record.fields.Title if it is empty and save it as title.Use apollo.person.title, or record.fields.Title if it is empty and save it as title.apollo.person.seniority, or record.fields.Seniority if it is empty and save it as seniority.Use apollo.person.seniority, or record.fields.Seniority if it is empty and save it as seniority.apollo.person.linkedin_url, or record.fields.LinkedIn if it is empty and save it as linkedin.Use apollo.person.linkedin_url, or record.fields.LinkedIn if it is empty and save it as linkedin.apollo.person.organization.industry, or record.fields.Industry if it is empty and save it as industry.Use apollo.person.organization.industry, or record.fields.Industry if it is empty and save it as industry.apollo.person.organization.estimated_num_employees, or record.fields.Employees if it is empty and save it as employees.Use apollo.person.organization.estimated_num_employees, or record.fields.Employees if it is empty and save it as employees.recId in tableName.Update recId in tableName.