Speculative job application sheet: each company's careers@, jobs@ or hr@ inbox from its own website, with date sent, follow-up date and reply
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)
| Company | Domain | Inbox | Found on | Role asked about | Sent on | Follow up on | Reply | Next step |
|---|---|---|---|---|---|---|---|---|
| Example Logistics | example-logistics.in | careers@example-logistics.in | example-logistics.in/careers | Operations analyst | 2026-10-12 | 2026-10-22 | follow up today | |
| Sample Foods | sample-foods.com | hr@sample-foods.com | sample-foods.com/contact | Supply chain trainee | 2026-10-20 | 2026-10-30 | wait | |
| Demo Software | demo-software.io | jobs@demo-software.io | demo-software.io/about | Junior data analyst | 2026-10-08 | 2026-10-18 | interview | interview |
| Test Pharma | test-pharma.co | QA associate | find inbox |
Who this is for
- Graduates and career changers writing to companies they want to join, whether or not a job is advertised.
- Students looking for internships, where many smaller companies never post a listing.
- Placement cells, career coaches and mentors who keep one shortlist of employers per batch or per client.
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
}
- Start on the careers page when there is one. The scraper fetches the address you give it first, then the most contact-like links on the same site (contact, about, team, imprint and similar). It does not look for careers pages by itself, so a careers inbox that appears only on a jobs page is found only if you start there.
- Give one address per company. Rows are de-duplicated by domain, so a second URL on the same site is not visited again.
- Keep
includePersonalEmailsandincludePersonProfilesoff. With them off, only shared inboxes are returned:careers@,jobs@andhr@are kept (also with a place, such ascareers.india@), while an address with a person's name in it, such ashr.priya@, is dropped and only counted. Inboxes such asrecruitment@,talent@orhiring@are not on the scraper's shared-inbox list, so they are dropped too: if a company's careers page shows one, copy it by hand. - Set
defaultCountryto your own country (IN, GB, US, AE...) so local phone numbers are read correctly. You pay only for pages actually fetched; sites skipped because of robots.txt or their terms are not charged.
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
| status | Meaning | What to do |
|---|---|---|
ok | Site read | Use the inbox found, or check Found on if it looks wrong |
blocked-by-robots | The site asks bots not to crawl | Open its careers or contact page yourself |
blocked-by-terms | The site's terms forbid scraping (clause quoted in error) | Same |
blocked-by-tos-list | The "website" is a page on a site such as LinkedIn or Facebook | Apply through that site or find the company's own site |
blocked-by-site, rate-limited, failed | HTTP 401/403/429, too many requests, or unreachable | Retry 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]
- Write to the company's careers, jobs or hr inbox, not to staff whose addresses you guessed. If the careers page says "apply only through our portal", use the portal and mark the row closed.
- Mention one specific thing about the company in every letter. That is the line that shows it is not a mass mailing.
- Send from your own personal address, attach one CV as a PDF, and keep the file name to your name and the role.
- Keep the sheet to company details and your own notes; share it only with a mentor or placement officer helping you.
Check before you send
- The inbox is one the company publishes for applications or general enquiries, and Found on confirms the page.
- The company's careers page does not ask you to apply only through a portal.
- The role line and the one specific reason are filled in for this company.
- Your CV file name, phone and links are correct.
- Sent on is filled in, so the follow-up date appears.
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
- Contact scraper input and output fields (
urls,maxPagesPerSite,defaultCountry,checkEmailMx,includePersonalEmails,includePersonProfiles;domain,status,emailswithtypeandfoundOn,phones,socials; shared-inbox list incl. careers, jobs and hr; de-duplication by domain; blocklist of sites such as LinkedIn and Facebook): Apify Store page (input schema and README)
Related
- Open jobs from Greenhouse, Lever and Ashby boards
- Open jobs from Zoho Recruit, Keka and Freshteam boards
- Clean a contact CSV into a call sheet
Unadhi Guides are free, independent explainers. We correct errors as soon as we find them: write to mininglife7@gmail.com.