Unadhi Guides

Speculative job application sheet: each company's careers@, jobs@ or hr@ inbox from its own website, with date sent, follow-up date and reply

Updated 23 Oct 2026 · Disclosure: the contact scraper linked below is an Unadhi product on the Apify Store. This guide is free, and the sheet works with a CSV from any tool or by copying inboxes by hand. Current Apify pricing is only on the Store page. This page has no affiliate links and nobody paid to be mentioned.

What you get: one Google Sheet for speculative job applications with one row per company you would like to work for: the careers@, jobs@ or hr@ inbox the company publishes on its own website, the page it was found on, the company's main phone and LinkedIn company page, the role you are asking about, the date you sent, an automatic follow-up date, the reply, and a Next step column (find inbox / send now / follow up today / wait / interview / closed). A summary tab counts sent, replied and interviews per week. Formulas are below. The example rows are made up.

The finished sheet

companies tab (example rows are made up)

CompanyDomainInboxFound onRole asked aboutSent onFollow up onReplyNext step
Example Logisticsexample-logistics.incareers@example-logistics.inexample-logistics.in/careersOperations analyst2026-10-122026-10-22follow up today
Sample Foodssample-foods.comhr@sample-foods.comsample-foods.com/contactSupply chain trainee2026-10-202026-10-30wait
Demo Softwaredemo-software.iojobs@demo-software.iodemo-software.io/aboutJunior data analyst2026-10-082026-10-18interviewinterview
Test Pharmatest-pharma.coQA associatefind inbox

Who this is for

The slow part of a speculative application is not the letter. It is finding the right inbox for each company, then remembering who you wrote to, when, and who to follow up with. This sheet does both, and keeps every company in one place.

Step 1: list the companies (tab list)

Columns: A company, B website, D role (the role or team you are asking about). Put the company's careers or jobs page in B if it has one, otherwise its homepage. In C2, turn the websites into domains:

=ARRAYFORMULA(IF(B2:B="",,LOWER(REGEXREPLACE(REGEXREPLACE(TRIM(B2:B),"^(https?://)?(www\.)?",""),"[/?#].*$",""))))

That turns https://www.Example-Logistics.in/careers into example-logistics.in, the same form the scraper writes in its domain field, so it is the key the formulas join on.

Step 2: get each company's published inbox (tab scrape)

With the contact scraper

Open the Website Contact Scraper: Emails, Phones & WhatsApp on the Apify Store, paste column B into Websites or domains (plain list) and use this input (JSON tab):

{
  "urls": ["example-logistics.in/careers", "sample-foods.com", "demo-software.io"],
  "maxPagesPerSite": 4,
  "defaultCountry": "IN",
  "checkEmailMx": true,
  "includePersonalEmails": false,
  "includePersonProfiles": false
}

When the run finishes, export the dataset as CSV, then in your sheet use File → Import → Upload, "Insert new sheet", and name the tab scrape. Keep the headers. Apify flattens lists into numbered columns such as emails/0/email, emails/0/foundOn, emails/1/email, phones/0/phone and socials/linkedin/0/url; the formulas find them by header name, so column order does not matter.

Free, without the scraper

Make a scrape tab with the headers domain, status, emails/0/email, emails/0/foundOn, emails/1/email, emails/1/foundOn, emails/2/email, phones/0/phone and socials/linkedin/0/url. Open each company's careers and contact pages, type what you see, and put ok in status. Slower, but the same formulas work.

Step 3: the companies tab

Company =list!A2, Domain =list!C2, Role =list!D2. Every contact column uses one lookup pattern; change only the header in quotes. Put the first three emails found in hidden helper columns M, N and O:

=IFERROR(INDEX(scrape!$A:$ZZ,
  MATCH($B2, INDEX(scrape!$A:$ZZ, 0, MATCH("domain", scrape!$1:$1, 0)), 0),
  MATCH("emails/0/email", scrape!$1:$1, 0)), "")

with emails/1/email in N and emails/2/email in O. Then the Inbox in C2 prefers a careers inbox, then jobs, then hr, then the first address found:

=IFERROR(INDEX(FILTER({M2,N2,O2}, REGEXMATCH({M2,N2,O2}, "(?i)^careers?[.@-]")), 1),
 IFERROR(INDEX(FILTER({M2,N2,O2}, REGEXMATCH({M2,N2,O2}, "(?i)^jobs?[.@-]")), 1),
 IFERROR(INDEX(FILTER({M2,N2,O2}, REGEXMATCH({M2,N2,O2}, "(?i)^hr[.@-]")), 1), M2)))

Found on in D2 uses the same lookup with emails/0/foundOn (use emails/1/foundOn or emails/2/foundOn when the Inbox came from N or O), so you can open the page and check the inbox is meant for applications. Add a Phone column with phones/0/phone and a LinkedIn company page column with socials/linkedin/0/url (company pages are always kept; staff profiles are dropped). If the inbox is only info@, say in the subject line that it is a job enquiry, so it is passed on.

Step 4: dates, reply and Next step

Type Sent on (F) when you send. Follow up on in G2 is ten days later; change the number to suit:

=IF(F2="", "", F2+10)

Column H Reply: blank, replied, interview, no or no opening. Column L Followed up: the date you sent the follow-up. Next step in I2:

=IF(A2="", "",
 IF(H2="interview", "interview",
 IF(OR(H2="no", H2="no opening"), "closed",
 IF(H2="replied", "answer them",
 IF(C2="", "find inbox",
 IF(F2="", "send now",
 IF(L2<>"", IF(TODAY()-L2>=14, "closed: no reply", "wait"),
 IF(TODAY()>=G2, "follow up today", "wait"))))))))

One follow-up is enough. After that the row closes by itself, so the list shows only the companies worth your time this week. Sort or filter by Next step each morning.

Step 5: the summary tab

Sent:            =COUNTIF(companies!F:F, "<>")-1
Sent this week:  =COUNTIFS(companies!F:F, ">="&TODAY()-WEEKDAY(TODAY(),2)+1)
Replied:         =COUNTIF(companies!H:H, "replied")+COUNTIF(companies!H:H, "interview")
Interviews:      =COUNTIF(companies!H:H, "interview")
Follow up today: =COUNTIF(companies!I:I, "follow up today")

If many letters get no reply, look at the role line and the first two sentences before writing more. A short, specific letter to fewer companies usually does better than the same letter sent everywhere.

What the status values mean

statusMeaningWhat to do
okSite readUse the inbox found, or check Found on if it looks wrong
blocked-by-robotsThe site asks bots not to crawlOpen its careers or contact page yourself
blocked-by-termsThe site's terms forbid scraping (clause quoted in error)Same
blocked-by-tos-listThe "website" is a page on a site such as LinkedIn or FacebookApply through that site or find the company's own site
blocked-by-site, rate-limited, failedHTTP 401/403/429, too many requests, or unreachableRetry later

The letter and the follow-up

Subject: [Role or team] enquiry: [your name], [one-line strength]

Hello,

I would like to work in [team] at [company] because [one specific
reason: a product, a project, a recent opening of an office].
I have [one or two facts that match the role: degree, project,
tool, result you can show].

Is there an opening now or in the coming months that would suit me?
My CV is attached, and [link to portfolio / GitHub / LinkedIn].

Thank you,
[Name], [city], [phone]
Follow-up, same thread, about ten days later:

Hello, a short follow-up on my note below about [role/team].
I am still very interested, and happy to send anything else that helps.
Thank you, [Name]

Check before you send

Partner programme opening soon

Partner programme opening soon: join the free waitlist. Planned terms are 50% of each referred sale (75% once you have 5+ paying customers), single level, paid through Gumroad only from revenue received.

Sources

Related

← All guides

Unadhi Guides are free, independent explainers. We correct errors as soon as we find them: write to mininglife7@gmail.com.