Corporate gift order prospect sheet for small gift makers: each company's purchase, HR or admin inbox, an order-by date and a follow-up tracker for Christmas and New Year
What you get: one Google Sheet for a small corporate gift business (gift boxes, sweets, cakes, hampers, printed merchandise) with one row per company you want to offer Christmas or New Year gifts to. Each row shows the best shared inbox the company publishes on its own website (purchase or procurement first, then HR, admin or office, then a general inbox), the company phone and WhatsApp link if listed, a Next step column, an Order by date worked back from your own delivery date and lead time, a follow-up date and a Send? column that stops you writing to anyone who said no. Formulas are below. The example rows are made up.
The finished sheet
gifts tab (example rows are made up)
| Domain | Status | Best inbox | Inbox type | Next step | Deliver by | Order by | Pitched on | Follow up on | Send? |
|---|---|---|---|---|---|---|---|---|---|
| acmetech.example | ok | procurement@acmetech.example | Purchase | Send offer to purchase inbox | 18 Dec 2026 | 4 Dec 2026 | 2 Nov 2026 | 9 Nov 2026 | Wait |
| brightclinic.example | ok | hr@brightclinic.example | HR | Send offer to HR inbox (staff gifts) | 18 Dec 2026 | 4 Dec 2026 | Ready | ||
| riverlogistics.example | ok | info@riverlogistics.example | General | General inbox: ask who buys staff or client gifts | 18 Dec 2026 | 4 Dec 2026 | Ready | ||
| bigbank.example | blocked-by-terms | Skipped: open the site's contact page yourself | 18 Dec 2026 | 4 Dec 2026 | Ready | ||||
| studiojane.example | ok | hello@studiojane.example | General | General inbox: ask who buys staff or client gifts | 18 Dec 2026 | 4 Dec 2026 | NO: UK sole trader, consent first |
Lead time in the example is 10 working days; use your own. Christmas Day 2026 and New Year's Day 2027 are both Fridays, so many offices hand out gifts in the week before.
Who this is for
- Home bakers, sweet shops, hamper and gift-box makers, florists and print shops who want 20 to 200 local companies to hear about a staff-gift or client-gift offer before Christmas and New Year.
- Anyone who already has a list of company websites (from a business park, a chamber of commerce member page, a trade fair, a Google Maps export) and wants the right inbox filled in one run.
It is not for buying a mass email list. A short list of companies near you that you can actually deliver to gets more replies, and it keeps each message relevant.
Step 1: list the companies in a tab named sites
| Column | What to put |
|---|---|
| A Company | Name, for example "Acme Tech" |
| B Website | The homepage, for example https://www.acmetech.example |
| C Type | Corporate (a company, LLP or other body with its own legal identity) or Sole trader (a one-person business or an ordinary partnership). This matters for UK companies in Step 5. |
| D Staff (approx.) | Optional. A rough headcount helps you size the offer (for example a box per employee). |
Put two settings at the top of a tab named settings: in B1 your deliver-by date (for example 18/12/2026) and in B2 your lead time in working days (how long you need from a confirmed order to delivery, for example 10).
Step 2: run the contact scraper on the websites
Open the website contact scraper on the Apify Store and paste column B into urls (one per line). What it does with the default settings, as written in the Actor's input schema and code on 26 October 2026:
- Reads the homepage plus the most contact-like pages (contact, about, support):
maxPagesPerSiteis 4 by default. Try 6 if many rows come back with onlyinfo@. - Returns only shared role inboxes.
purchase@,procurement@,hr@,admin@,office@,corporate@,events@,info@,contact@andhello@are all on its role list. Addresses that identify one person (for examplehr.priya@) are dropped and only counted inpersonalEmailsDropped, becauseincludePersonalEmailsis off. - Checks each inbox's domain can receive mail (
mxValid), returns phone numbers in international format and links such as WhatsApp. - Follows robots.txt and reads each site's terms. A site whose terms forbid scraping comes back as
blocked-by-terms(orblocked-by-tos-listorblocked-by-robots) and is not charged. You look those up by hand.
When the run finishes, export the dataset as CSV, then in your sheet use File → Import → Upload, "Insert new sheet", and rename it scrape. Nested fields become headers like emails/0/email, emails/1/email, phones/0/phone and socials/whatsapp/0/url, so the formulas below find columns by header name, not by position.
Free route
For 10 or 20 companies, open each website's contact page and copy the inboxes into a scrape tab with the headers domain, status (type ok) and emails/0/email, emails/1/email and so on. The formulas work the same.
Step 3: build the gifts tab
Create a tab named gifts, put these headers in row 1 and these formulas in row 2, and fill down as many rows as scrape has.
| Col | Header | Formula (row 2) |
|---|---|---|
| A | Domain | =IFERROR(INDEX(scrape!$A2:$ZZ2, MATCH("domain", scrape!$A$1:$ZZ$1, 0)), "") |
| B | Status | =IFERROR(INDEX(scrape!$A2:$ZZ2, MATCH("status", scrape!$A$1:$ZZ$1, 0)), "") |
| C | All inboxes | =IFERROR(TEXTJOIN(", ", TRUE, FILTER(scrape!$A2:$ZZ2, REGEXMATCH(scrape!$A$1:$ZZ$1, "^emails/\d+/email$"))), "") |
| D | Purchase inbox | =IFERROR(REGEXEXTRACT(", "&C2, ", ((?:purchase|procurement|tenders)(?:[.\-_][a-z0-9]+)?@[^,]+)"), "") |
| E | HR / admin inbox | =IFERROR(REGEXEXTRACT(", "&C2, ", ((?:hr|admin|office|corporate|events|reception)(?:[.\-_][a-z0-9]+)?@[^,]+)"), "") |
| F | General inbox | =IFERROR(REGEXEXTRACT(", "&C2, ", ((?:info|contact|hello|enquiry|enquiries|mail|general)(?:[.\-_][a-z0-9]+)?@[^,]+)"), "") |
| G | Best inbox | =IF(D2<>"", D2, IF(E2<>"", E2, F2)) |
| H | Inbox type | =IF(D2<>"", "Purchase", IF(REGEXMATCH(E2, "^hr"), "HR", IF(E2<>"", "Admin", IF(F2<>"", "General", "")))) |
| I | Phone | =IFERROR(INDEX(scrape!$A2:$ZZ2, MATCH("phones/0/phone", scrape!$A$1:$ZZ$1, 0)), "") |
| J | =IFERROR(INDEX(scrape!$A2:$ZZ2, MATCH("socials/whatsapp/0/url", scrape!$A$1:$ZZ$1, 0)), "") | |
| K | Named inboxes dropped | =IFERROR(INDEX(scrape!$A2:$ZZ2, MATCH("personalEmailsDropped", scrape!$A$1:$ZZ$1, 0)), 0) |
| L | Next step | =IFS(B2<>"ok", "Skipped ("&B2&"): open the site's contact page yourself", H2="Purchase", "Send offer to purchase inbox", H2="HR", "Send offer to HR inbox (staff gifts)", H2="Admin", "Send offer to admin inbox", H2="General", "General inbox: ask who buys staff or client gifts", I2<>"", "No inbox found: call the office number", TRUE, "No inbox found: use the site's contact form") |
| M | Type | =IFERROR(INDEX(sites!$C:$C, MATCH("*"&A2&"*", sites!$B:$B, 0)), "") |
| N | Deliver by | =settings!$B$1 (overwrite on any row where the company asks for a different date) |
| O | Order by | =IF(N2="", "", WORKDAY(N2, -settings!$B$2)) |
| P | Pitched on | Type the date you sent the offer |
| Q | Follow up on | =IF(P2="", "", MIN(WORKDAY(P2, 5), WORKDAY(O2, -3))) |
| R | Reply | Type: Ordered / Sample asked / Not this year / No |
| S | Do not contact | Type Y the moment anyone asks you to stop or replies "No" |
| T | Send? | =IFS(S2="Y", "NO: do not contact", M2="Sole trader", "NO: UK sole trader, consent first", R2<>"", "Done: "&R2, AND(O2<>"", TODAY()>O2), "Too late for this date", P2="", "Ready", TODAY()>=Q2, "Send one follow-up", TRUE, "Wait") |
Notes on the formulas:
- The follow-up date in Q is five working days after the offer, but never later than three working days before the order-by date, so a late follow-up does not land after the company could still order. The three days is our working rule, not a law; change it if you like.
- WORKDAY skips Saturdays and Sundays only. If your workshop is closed on public holidays, add a holiday range as a third argument, for example
WORKDAY(N2, -settings!$B$2, settings!$D$2:$D$20). - A general inbox such as
info@may be read by whoever answers enquiries, not by the person who buys gifts. That is why the general row asks "who buys staff or client gifts" instead of pitching the full offer straight away.
Step 4: the plan tab
Add a tab named plan. In A1: =QUERY(gifts!A2:T, "select T, count(A) where A is not null group by T order by count(A) desc label T 'Send?', count(A) 'Companies'", 0). Filter gifts on column T to Ready and work those rows first, sorted by Order by.
A short offer that works: what the gift is (with one photo or a link to it), price per box at two or three quantities, the last order date from column O, delivery area, and one line saying they can reply "no" and you will not write again.
Step 5: check before you send
- Bad MX: if the CSV has
emails/0/mxValid=FALSEfor the inbox you picked, that domain has no mail server. Use the phone number or contact form instead. - Named inboxes dropped above 0 (column K) means the site lists people's own addresses. Do not guess them; use the shared inbox or the contact form.
- UK companies: the ICO says the PECR rule on marketing by email does not apply to corporate subscribers (companies, LLPs, Scottish partnerships, some government bodies), but sole traders and other partnerships are treated like individuals, so you need their consent or a soft opt-in. Either way, say who you are and give a working opt-out address. That is what the "NO: UK sole trader" row does.
- India and elsewhere: an email to a shared company inbox is still marketing. Keep it relevant to that company, send one follow-up at most, and mark column S as soon as anyone says no. Data protection law (for example India's DPDP Act 2023 or the GDPR) may apply to any personal data you keep. This is not legal advice.
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 inputs and outputs (
urls,maxPagesPerSitedefault 4,includePersonalEmailsoff by default, role inbox list incl. purchase, procurement, hr, admin, office, corporate, events;personalEmailsDropped,mxValid, statusesblocked-by-terms,blocked-by-tos-list,blocked-by-robots): Apify Store listing and the Actor's input schema and code. - Corporate and individual subscribers, email marketing to companies versus sole traders, identifying yourself and giving an opt-out: ICO, Business-to-business marketing.
- Google Sheets INDEX/MATCH, FILTER, REGEXEXTRACT, WORKDAY and QUERY functions: Google Docs Editors Help.
Related
- Press list sheet for a product launch or Black Friday pitch
- Office Christmas party venue quote sheet
- 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.