Wedding vendor shortlist sheet: each photographer's, caterer's and decorator's published inbox, WhatsApp and Instagram, with quote, advance and the date they hold
What you get: one Google Sheet for hiring wedding vendors with one row per vendor you are considering (photographer, caterer, decorator, makeup artist, DJ or band, mehendi artist, venue): the inbox, phone, ready wa.me link and Instagram page each vendor publishes on its own website, the date you asked, the quote, the advance they want and the date they hold your wedding date until. A Next step column (ask now / message on Instagram / chase today / decide by ... / booked / no), a compare tab that ranks quotes inside the budget for each category, and a budget tab with booked totals and advances paid per category. Formulas are below. The example rows are made up.
The finished sheet
vendors tab (example rows are made up)
| Category | Vendor | Domain | Inbox | Phone | Asked on | Quote | Advance | Hold until | Next step | |
|---|---|---|---|---|---|---|---|---|---|---|
| Photography | Example Studio | example-studio.in | bookings@example-studio.in | +910000000001 | instagram.com/examplestudio | 2026-10-19 | 180000 | 50000 | 2026-10-31 | decide by 2026-10-31 |
| Photography | Sample Frames | sample-frames.com | hello@sample-frames.com | +910000000002 | 2026-10-16 | chase today | ||||
| Catering | Demo Caterers | demo-caterers.in | instagram.com/democaterers | message on Instagram | ||||||
| Decor | Test Decor Co | test-decor.co | events@test-decor.co | +910000000004 | 2026-10-21 | 240000 | 80000 | 2026-10-25 | decide by 2026-10-25 |
Who this is for
- Couples and families planning a wedding who want two or three real quotes in each category before paying an advance.
- Freelance wedding planners and coordinators building a vendor shortlist for each new client.
- Siblings, cousins and friends splitting the calls, where nobody knows who has already asked which photographer.
Good vendors get booked early for popular dates. The slow part is finding each vendor's actual booking inbox, phone and WhatsApp, then comparing quotes that arrive in different shapes (package price, per plate, advance, hold period). This sheet does both, and keeps every category in one place.
Step 1: list the vendors (tab list)
Columns: A category, B vendor, C website, E instagram (optional). Add every vendor you are considering from recommendations, wedding fairs and search results. In D2, turn the websites into domains:
=ARRAYFORMULA(IF(C2:C="",,LOWER(REGEXREPLACE(REGEXREPLACE(TRIM(C2:C),"^(https?://)?(www\.)?",""),"[/?#].*$",""))))
That turns https://www.Example-Studio.in/weddings into example-studio.in, the same form the scraper writes in its domain field, so it is the key the formulas join on. Many wedding vendors only have an Instagram page and no website: leave C empty for them and paste the Instagram link into E.
Step 2: get each vendor's public inbox, phone, WhatsApp and Instagram (tab scrape)
With the contact scraper
Open the Website Contact Scraper: Emails, Phones & WhatsApp on the Apify Store, paste column D into Websites or domains (plain list) and use this input (JSON tab):
{
"urls": ["example-studio.in", "sample-frames.com", "demo-caterers.in"],
"maxPagesPerSite": 4,
"defaultCountry": "IN",
"checkEmailMx": true,
"includePersonalEmails": false,
"includePersonProfiles": false
}
- Set
defaultCountryto your own country (IN, GB, US, AE...) so local phone numbers without a country code are read correctly. - Keep
includePersonalEmailsandincludePersonProfilesoff. You want the vendor's booking inbox, not a named person's address. - Only give it the vendors' own websites. Instagram, Facebook and similar platform pages are on its blocklist and are skipped (status
blocked-by-tos-list), so message those vendors on the platform yourself. Instagram links that a vendor shows on its own website are collected. - Four pages per site (homepage plus the most contact-like pages) is the default. 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/1/email, phones/0/phone, socials/whatsapp/0/url and socials/instagram/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/1/email, phones/0/phone, socials/whatsapp/0/url and socials/instagram/0/url, open each vendor's contact page and type what you see, with ok in status. Slower, but the same formulas work.
Step 3: the vendors tab
Category =list!A2, Vendor =list!B2, Domain =list!D2. Every contact column uses one lookup pattern; change only the header in quotes. Put the first two emails found in hidden helper columns N and O:
=IFERROR(INDEX(scrape!$A:$ZZ,
MATCH($C2, 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 O. Then the Inbox in D2 prefers an address that looks like a booking inbox:
=IF(REGEXMATCH(O2, "(?i)^(bookings?|enquir(y|ies)|inquir(y|ies)|weddings?|events?|hello)@"), O2, N2)
Phone in E2 uses the same lookup with phones/0/phone, WhatsApp in a column P with socials/whatsapp/0/url, and Instagram in F2 with socials/instagram/0/url, wrapped so a link you typed yourself is kept:
=IF(list!E2<>"", list!E2, IFERROR(INDEX(scrape!$A:$ZZ,
MATCH($C2, INDEX(scrape!$A:$ZZ, 0, MATCH("domain", scrape!$1:$1, 0)), 0),
MATCH("socials/instagram/0/url", scrape!$1:$1, 0)), ""))
If Inbox, Phone and WhatsApp are all empty, check status in the table below.
Step 4: the quote columns and Next step
Type what each vendor sends you: Asked on (G), Quote (H, the full package price for what you asked for), Advance (I) and Hold until (J, the date the vendor keeps your wedding date free without an advance). Add column L Answer: booked, no or blank, and column M Advance paid (the amount, once you pay it).
Next step in K2:
=IF(B2="", "", IF(L2="booked", "booked", IF(L2="no", "no", IF(G2="", IF(AND(D2="", E2="", P2=""), IF(F2="", "find contact", "message on Instagram"), "ask now"), IF(H2="", IF(TODAY()-G2>=3, "chase today", "wait"), IF(J2="", "ask how long they hold the date", IF(J2<TODAY(), "hold expired: ask again", "decide by " & TEXT(J2, "yyyy-mm-dd"))))))))
Three days is the chase point; change it to suit. Sort or filter by Next step each evening and whoever is helping takes the "ask now" and "chase today" rows.
Step 5: the budget and compare tabs
On a budget tab, put each category in A and its budget in B. Then:
C2 (booked): =SUMIFS(vendors!H:H, vendors!A:A, A2, vendors!L:L, "booked") D2 (left): =B2-C2 E2 (advance paid): =SUMIFS(vendors!M:M, vendors!A:A, A2) F2 (quotes in): =COUNTIFS(vendors!A:A, A2, vendors!H:H, "<>")
Add a total row with =SUM(B2:B), =SUM(C2:C) and =SUM(E2:E), and format D red when it is below zero. On a compare tab, type a category in A1 and list every quote for it inside its budget, cheapest first:
=SORT(FILTER({vendors!B2:B, vendors!H2:H, vendors!I2:I, vendors!J2:J},
vendors!A2:A=A1, vendors!H2:H<>"",
vendors!H2:H<=VLOOKUP(A1, budget!A:B, 2, FALSE), vendors!L2:L<>"no"), 2, TRUE)
Quotes are only comparable when they cover the same things. Note in a spare column what each one includes (hours, number of photographers, album, plates, travel, taxes) before you rank them.
What the status values mean
| status | Meaning | What to do |
|---|---|---|
ok | Site read | Use the inbox, phone, WhatsApp or Instagram found |
blocked-by-robots | The site asks bots not to crawl | Open its 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 platform page such as Instagram or Facebook | Message the vendor on that platform |
blocked-by-site, rate-limited, failed | HTTP 401/403/429, too many requests, or unreachable | Retry later, or call |
The enquiry that gets a full quote back
Ask for everything you need to compare in one message, so the vendor answers once. Example for a photographer:
Subject: Wedding photography enquiry: 12-13 Dec, about 300 guests Hello, We are planning our wedding on 12 and 13 December in [city], with about 300 guests: [list the events, e.g. haldi, sangeet, wedding, reception]. Could you send: 1. Whether you are free on those dates 2. Your package price for this, and what it includes (hours, number of photographers, video, album, travel) 3. The advance, and when the balance is due 4. Your cancellation and date-change terms 5. How long you can hold the dates for us Thank you, [Name], [phone]
- Use the same list of events, dates and guest count in every enquiry, so quotes cover the same work.
- Ask how long they will hold the date. That is the date in Hold until, and it stops you losing a good vendor while you wait for others.
- Read the cancellation and date-change terms before paying an advance, and get the package in writing.
- When you book, tell the vendors you did not choose, so they can free the date.
This is a customer asking for a quote, not marketing, so it is fine to email or message a vendor's published booking contact. Keep the sheet to what the booking needs and share it only with the people planning.
Check before you pay an advance
- You have at least two or three quotes in this category, written down with what each includes.
- The chosen vendor's hold date has not passed, and they confirmed they are free on all your dates.
- Advance, balance due date, what is included and cancellation terms are written in the row.
- The budget tab shows the category within budget, or the family has agreed the extra.
- Vendors you did not choose have been told.
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,emails,phones,socialsincl.whatsappandinstagram; platform blocklist): Apify Store page (input schema and README)
Related
- Office Christmas party venue sheet
- Get a business website's WhatsApp and social links
- Add emails and phones to a Google Maps scrape
Unadhi Guides are free, independent explainers. We correct errors as soon as we find them: write to mininglife7@gmail.com.