Unadhi Guides

Supplier quote request (RFQ) sheet: the sales or export inbox each supplier publishes, a chase tracker and a landed-cost comparison in one Google Sheet

Updated 21 Oct 2026 · Disclosure: the website contact scraper linked below is an Unadhi product on the Apify Store. This guide is free, and the sheet also works if you copy inboxes from supplier websites 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 with two working tabs. The rfq tab has one row per supplier you want a quote from (manufacturers, wholesalers, packaging or print suppliers). It shows the sales, export or orders inbox the supplier publishes on its own website, a general inbox as a fallback, a next step when none is found, the date you asked, a chase date and a do-not-contact column. The quotes tab turns every reply into a landed cost per unit in your own currency, checks the minimum order quantity (MOQ), ranks the suppliers that qualify and gives an order-by date. Formulas are below. The example rows use made-up .example suppliers and made-up numbers.

The finished sheet

rfq tab (example rows are made up)

DomainStatusQuote inboxFallbackNamed inboxes droppedNext stepAsked onChase onQuote in?Send?
alpha-moulds.exampleokexport@alpha-moulds.example0Send RFQ to quote inbox26 Oct 202629 Oct 2026YesDone
beta-plastics.exampleoksales@beta-plastics.example1Send RFQ to quote inbox26 Oct 202629 Oct 2026YesDone
gamma-pack.exampleokinfo@gamma-pack.example0Use general inbox and ask who handles quotes26 Oct 202629 Oct 2026YesDone
delta-print.exampleok2Site lists named inboxes: read its contact pageReady
epsilon-tex.exampleblocked-by-termsSkipped: use the site's contact or quote formReady

quotes tab (example rows are made up; your order is 500 units, your currency INR)

SupplierCur.Unit priceMOQOrder qtyShipping for the orderDuty % (your figure)FX to INRLead time (days)Landed per unit (INR)MOQ ok?RankOrder by
alpha-moulds.exampleUSD2.1050050018010%8435227.30Yes216 Oct 2026 (too late)
beta-plastics.exampleUSD1.95100050015010%8430207.90No: order 1000+21 Oct 2026
gamma-pack.exampleINR20530050025000%112210.00Yes18 Nov 2026

Read it like this: the lowest unit price (beta-plastics) does not qualify at your quantity, and once shipping and duty are added the local supplier (gamma-pack) beats the import quote and is the only qualifying supplier that can still deliver by 20 November. That is the decision the sheet is built to show in one glance.

Who this is for

Step 1: list the suppliers in a tab named sites

ColumnWhat to put
A SupplierName, for example "Alpha Moulds"
B WebsiteThe homepage, for example https://www.alpha-moulds.example
C CountryWhere it ships from. You need this for shipping, duty and currency in Step 5.
D ItemWhat you want quoted, in the same words for every supplier, so the quotes compare like for like.

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) or startUrls. Set defaultCountry to the country most suppliers are in, so local phone numbers are read correctly. What it does with the default settings, as written in the Actor's input schema and source:

Honest limit: in the current version, wholesale@, trade@ and b2b@ are not on the role list, so with the default setting they are dropped and counted, not shown. The sheet turns that count into a "read its contact page" step instead of hiding it.

When the run finishes, export the dataset as CSV, then in your sheet use File, Import, Insert new sheet, and rename it scrape. Nested fields become headers like emails/0/email and emails/0/mxValid, so the formulas below find columns by header name, not by position.

Step 3: build the rfq tab

Create a tab named rfq, put these formulas in row 2 and fill down as many rows as scrape has.

ColHeaderFormula (row 2)
ADomain=IFERROR(INDEX(scrape!$A2:$ZZ2, MATCH("domain", scrape!$A$1:$ZZ$1, 0)), "")
BStatus=IFERROR(INDEX(scrape!$A2:$ZZ2, MATCH("status", scrape!$A$1:$ZZ$1, 0)), "")
CAll inboxes=IFERROR(TEXTJOIN(", ", TRUE, FILTER(scrape!$A2:$ZZ2, REGEXMATCH(scrape!$A$1:$ZZ$1, "^emails/\d+/email$"))), "")
DQuote inbox=IFERROR(REGEXEXTRACT(", "&C2, ", ((?:export|exports|sales|orders|enquiry|enquiries)(?:[.\-_][a-z0-9]+)?@[^,]+)"), "")
EFallback=IF(D2<>"", "", IFERROR(REGEXEXTRACT(", "&C2, ", ((?:info|contact|hello|office)(?:[.\-_][a-z0-9]+)?@[^,]+)"), ""))
FNamed inboxes dropped=IFERROR(INDEX(scrape!$A2:$ZZ2, MATCH("personalEmailsDropped", scrape!$A$1:$ZZ$1, 0)), 0)
GNext step=IFS(B2<>"ok", "Skipped ("&B2&"): use the site's contact or quote form", D2<>"", "Send RFQ to quote inbox", N(F2)>0, "Site lists named inboxes: read its contact page", E2<>"", "Use general inbox and ask who handles quotes", TRUE, "No inbox found: use the contact or quote form")
HBad MX=IFERROR(SUMPRODUCT(--(UPPER(TO_TEXT(FILTER(scrape!$A2:$ZZ2, REGEXMATCH(scrape!$A$1:$ZZ$1, "^emails/\d+/mxValid$"))))="FALSE")), 0) (above 0: one inbox has no mail server; do not use it)
IAsked onType the date you sent the RFQ
JChase on=IF(I2="", "", WORKDAY(I2, 3))
KQuote in?Type Yes when the quote arrives, then copy it to the quotes tab
LDo not contactType Y if the supplier declines or asks you not to write again
MSend?=IFS(L2="Y", "NO: do not contact", K2="Yes", "Done", I2="", "Ready", TODAY()>=J2, "Chase once", TRUE, "Wait")

Filter column M and work only the rows that say Ready or Chase once. Write to each supplier one at a time from your normal inbox; one chase is enough.

Step 4: the RFQ email (same questions for everyone)

Asking every supplier the same questions is what makes the quotes comparable. Change only the first line.

Subject: Quote request: [item], [quantity] units, delivery to [city, country]

Hello [Supplier] sales team,

I am [your name] from [your company], [website]. We are comparing
suppliers for [item: material, size, finish, packing].

Please quote:
1. Unit price at [quantity] units, and your price breaks
2. Minimum order quantity (MOQ)
3. Currency, and whether the price includes tax
4. Delivery terms and shipping cost to [city, country]
5. Lead time from order and sample to dispatch
6. Payment terms

We plan to decide by [date]. If quotes are handled by someone else,
please let me know who.

[Your name], [company], [phone]
If you would rather not receive requests from us, reply "no".

Step 5: build the quotes tab

Create a tab named quotes with one row per quote received. Type columns A to I from the supplier's reply. Duty and shipping are your own figures: take the duty rate from your country's customs authority for your product code, and the shipping cost from the quote or your forwarder. Put the date you need stock by in cell P1 (for example 20/11/2026, a week before Black Friday on Friday 27 November 2026).

ColHeaderFormula or entry (row 2)
A to ISupplier, Currency, Unit price, MOQ, Order qty, Shipping for the order (in the quote currency), Duty % (as 10%), FX to your currency, Lead time (days)Typed from the quote
JLanded per unit=IF(OR(C2="", E2=""), "", ROUND((C2*E2 + F2) * (1 + G2) * H2 / E2, 2))
KMOQ ok?=IF(C2="", "", IF(E2>=D2, "Yes", "No: order "&D2&"+"))
LRank=IF(K2="Yes", COUNTIFS($K$2:$K, "Yes", $J$2:$J, "<"&J2) + 1, "")
MOrder by=IF(I2="", "", IF($P$1 - I2 < TODAY(), TEXT($P$1 - I2, "d mmm yyyy")&" (too late)", TEXT($P$1 - I2, "d mmm yyyy")))

The duty formula above is a simple estimate that applies the rate to goods plus shipping. Your customs authority's rules on the value duty is charged on, and any other import taxes, decide the real figure, so treat column J as a comparison number, not a final cost.

A two-day plan

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.