Unadhi Guides

Clean an Apify contact scrape into a call sheet: one row per business, best email and phone first

Updated 14 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 a list you build by hand. Current Apify pricing is only on the Store page.

What you get: one Google Sheet (or Excel workbook) called a call sheet: one row per company, with the best email, the best phone, a WhatsApp link if the business publishes one, the website, the page where the contact was found, and a simple score so the most reachable businesses sit at the top. You paste a raw contact CSV into one tab; formulas do the rest. Setup is about 30 minutes, and every later CSV takes two minutes.

The finished call sheet

ScoreBusinessBest emailBest phoneWhatsAppWebsiteFound on
3example-clinic.inappointments@example-clinic.in+914000000001wa.me/914000000001https://example-clinic.in…/contact-us
2example-studio.comhello@example-studio.comhttps://example-studio.com…/about
1example-traders.co.in+914000000002https://example-traders.co.in…/

Example rows only, to show the layout. Not real business data.

Score: 3 = email and phone, 2 = email only, 1 = phone only, 0 = nothing usable (kept on a separate "check by hand" list).

Why a raw scrape is not a call sheet yet

Step 1: get one contact CSV

Free, a few businesses

Open each company's contact or about page and type what it publishes into a sheet with the same column names used below (domain, status, emails/0/email, phones/0/phone, startUrl). For ten or twenty businesses that is quicker than any tool. If you already have a CSV from another contact tool, rename its columns to these names and skip to Step 2.

No code, hundreds of websites (Apify)

  1. Create a free Apify account (no card needed for the free plan; see apify.com/pricing for current free monthly usage).
  2. Open Website Contact Scraper: Emails, Phones & WhatsApp and click Try for free.
  3. Paste your websites. In JSON view:
{
  "urls": ["example-clinic.in", "example-studio.com", "example-traders.co.in"],
  "maxPagesPerSite": 4,
  "includePersonalEmails": false,
  "respectRobotsTxt": true,
  "respectTermsOfService": true,
  "checkEmailMx": true,
  "defaultCountry": "IN"
}

Set defaultCountry to the country most of the businesses are in, so local numbers without a country code are read correctly. Leave includePersonalEmails off: the call sheet is built on shared role inboxes such as info@, sales@ and appointments@. Already have a Google Maps dataset? Pass its dataset ID instead; see enrich a Google Maps Apify dataset with emails and phones, and the business name then comes through as sourceItems/0/title.

When the run finishes, open the dataset, choose Export → CSV and download it.

Step 2: import it as text into a tab called raw

Step 3: add a COL helper (one-time)

The column order of a CSV can change between runs, so pick columns by their header name, not their letter.

=IFERROR(XLOOKUP(h, raw!$1:$1, raw!$2:$5000), "")
=LAMBDA(h, IFERROR(XLOOKUP(h, raw!$1:$1, raw!$2:$5000), ""))

COL("domain") now returns the whole domain column. If a header is missing (for example no site in the run had a second email, so there is no emails/1/email), it returns blank instead of an error.

Step 4: build the rows tab

Add a tab called rows. Type these headers in row 1 and each formula in row 2 of its column. In Google Sheets the formulas already spill down; in Excel 365 they spill without ARRAYFORMULA (you can leave it out).

ColHeaderFormula in row 2
Abusiness=COL("domain")
Bstatus=COL("status")
Cname=COL("sourceItems/0/title") (blank unless you started from a Maps dataset)
Dbest email=COL("emails/0/email")
Ebackup email=COL("emails/1/email")
Fbest phonesee below
GWhatsApp=COL("socials/whatsapp/0/url")
Hwebsite=COL("startUrl")
Ifound onsee below
Jscoresee below

F: best phone (a tel: link first, otherwise the first number)

=ARRAYFORMULA(IF(COL("phones/0/source")="tel-link", COL("phones/0/phone"),
  IF(COL("phones/1/source")="tel-link", COL("phones/1/phone"), COL("phones/0/phone"))))

I: found on (the page where the email, or else the phone, was published)

=ARRAYFORMULA(IF(COL("emails/0/foundOn")<>"", COL("emails/0/foundOn"), COL("phones/0/foundOn")))

J: score (3 email + phone, 2 email only, 1 phone only, 0 none)

=ARRAYFORMULA(IF(A2:A="", "", IF((D2:D<>"")*(F2:F<>""), 3, IF(D2:D<>"", 2, IF(F2:F<>"", 1, 0)))))

The scraper lists same-domain emails first, so emails/0/email is normally the company's own inbox. Want WhatsApp to break ties? Change the 3 to 3+(G2:G<>"")*0.5.

Step 5: one row per business (the call_sheet tab)

Add a tab called sorted. In A2, sort the usable rows best score first, then by business name:

=SORT(FILTER(rows!A2:J, rows!A2:A<>"", rows!B2:B="ok", rows!J2:J>0), 10, FALSE, 1, TRUE)

In K2 of the same tab, number each repeat of a business (1 = its best row):

=ARRAYFORMULA(IF(A2:A="", "", COUNTIFS(A2:A, A2:A, ROW(A2:A), "<="&ROW(A2:A))))

Finally add the call_sheet tab, copy the headers from rows into row 1, and in A2:

=FILTER(sorted!A2:J, sorted!K2:K=1)

That is your call sheet: one row per company, most reachable first. For the "check by hand" list (blocked, failed or empty sites), add one more tab with =FILTER(rows!A2:J, rows!A2:A<>"", (rows!B2:B<>"ok")+(rows!J2:J=0)).

Excel 365: SORT and FILTER work the same. For the de-duplication, put =UNIQUE(sorted!A2:A1000) in call_sheet!A2 and fill each other column with =XLOOKUP($A2#, sorted!$A$2:$A$1000, sorted!D$2:D$1000) (change the last range per column). XLOOKUP returns the first match, which is the best-scored row.

Step 6: check before you call

What not to do

This guide is general information, not legal advice. You are responsible for how you use the data and for following each site's terms and your local law. The Apify Actor mentioned reads only public pages, uses an honest bot User-Agent, follows robots.txt, never logs in and never gets around blocks.

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.

Related

← All guides

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