Unadhi Guides

Wholesale line sheet from your own Shopify or WooCommerce store: photo, SKU, RRP, wholesale price and an order column for each product, in one Google Sheet

Updated 21 Oct 2026 · Disclosure: the product data scraper linked below is an Unadhi product on the Apify Store. This guide is free, and the sheet also works with the free product export from your own Shopify or WooCommerce admin. Current Apify pricing is only on the Store page. This page has no affiliate links and nobody paid to be mentioned.

What you get: a wholesale line sheet in one Google Sheet, built from your own web shop. It has one row per product: photo, product name, SKU, category, sizes or colours, in stock, RRP (your normal shop price, even if a sale is running), a wholesale price worked out from one setting, the retailer's margin, a case pack and an order quantity column the shop buyer fills in, with a line total. Hide the rows you don't offer wholesale, download it as a PDF, and send it to the gift shops, boutiques and stockists you pitch for Christmas. Formulas are below. The example rows are made up.

The finished sheet

linesheet tab (example rows are made up; settings: wholesale = 50% of RRP ex VAT, shop prices include 20% VAT)

PhotoProductSKUCategoryOptionsIn stockRRPWholesale ex VATRetailer marginCase packOrder qtyLine total
(image)Hand-poured soy candle, figCAN-FIG-200Candles200 g, 400 gYes24.0010.0050%612120.00
(image)Linen tea towel, sageTT-SAGEKitchenYes18.007.5050%68Order in multiples of 6
(image)Ceramic mug, speckledMUG-SPKKitchenBlue, SandNo21.609.0050%4

The mug row shows why RRP is not simply "price": if the mug is on sale at 16.00 in your shop with a compare-at price of 21.60, the sheet uses 21.60, so a pre-Black-Friday sale does not cut your wholesale prices.

Who this is for

Small brands that already sell online (candles, ceramics, prints, cards, skincare, clothing, food gifts) and want to sell to independent shops too. Shop buyers usually ask for a line sheet or wholesale price list before they order. Building it by hand means copying every product, photo and price from your shop; this sheet reads them from one product file and updates when you re-import.

Step 1: get your products into a tab named scrape

With the product data scraper

Open the E-commerce Product Data Scraper (Shopify, WooCommerce, any shop) on the Apify Store and use this input with your own shop address:

{
  "startUrls": [{ "url": "https://your-shop.example" }],
  "maxProductsPerShop": 2000,
  "includeDescription": false
}

In the run, export the dataset as CSV. In your Google Sheet use File → Import → Upload, "Insert new sheet", and name the tab scrape. Do not rename headers. You get one row per product with columns such as title, sku, category, price, compareAtPrice, inStock, currency and images/0, and for Shopify shops variants/0/title, variants/1/title and so on. For Shopify shops, price, compareAtPrice and sku come from the cheapest variant, and category is the product type. For WooCommerce shops, category is the product's categories joined by commas, compareAtPrice is the regular price, and there are no variant columns.

Free, from your own shop admin

The formulas below look columns up by header name, so with an admin export you change only the header names in quotes.

Step 2: the settings tab

Add a tab named settings:

CellWhat to typeExample
B1Wholesale price as a share of RRP before VAT50%
B2VAT or sales tax included in your shop prices (type 0% if your shop prices exclude tax)20% (UK standard rate)
B3Default case pack (minimum per product)6
B4Minimum first order value150

50% is only an example. Many shops price at about double their cost, but the right figure depends on your sector, your costs and what your stockists expect, so check your own numbers before you send the sheet. Wholesale prices to businesses are normally quoted before VAT; that is why the sheet takes VAT out of your shop price first.

Step 3: build the linesheet tab

Add a tab named linesheet. Row 1 holds the headers below; row 2 holds the formulas, which you copy down one row per row of scrape. Set the row height to about 100 pixels so the photos show.

ColHeaderFormula (row 2)
BProduct=IFERROR(INDEX(scrape!$A2:$ZZ2, MATCH("title", scrape!$A$1:$ZZ$1, 0)), "")
CSKUsame pattern with "sku"
DCategorysame pattern with "category"
NImage link (hide this column)same pattern with "images/0"
APhoto=IF(N2="", "", IMAGE(N2))
EOptions=IFERROR(REGEXREPLACE(TEXTJOIN(", ", TRUE, FILTER(scrape!$A2:$ZZ2, REGEXMATCH(scrape!$A$1:$ZZ$1, "^variants/\d+/title$"))), "^Default Title$", ""), "")
FIn stock=IFERROR(IF(INDEX(scrape!$A2:$ZZ2, MATCH("inStock", scrape!$A$1:$ZZ$1, 0))&""="", "Check", IF(UPPER(INDEX(scrape!$A2:$ZZ2, MATCH("inStock", scrape!$A$1:$ZZ$1, 0))&"")="TRUE", "Yes", "No")), "Check")
GRRP=IF(B2="", "", LET(p, N(IFERROR(INDEX(scrape!$A2:$ZZ2, MATCH("price", scrape!$A$1:$ZZ$1, 0)))), c, N(IFERROR(INDEX(scrape!$A2:$ZZ2, MATCH("compareAtPrice", scrape!$A$1:$ZZ$1, 0)))), MAX(p, c)))
HWholesale ex VAT=IF(N(G2)=0, "", ROUND(G2 / (1 + settings!$B$2) * settings!$B$1, 2))
IRetailer margin=IF(H2="", "", 1 - H2 / (G2 / (1 + settings!$B$2))) (format as %)
JCase pack=settings!$B$3, then type over it for products sold in other packs
KOrder qtyleft empty for the shop buyer
LLine total=IF(N(K2)=0, "", IF(MOD(K2, J2)<>0, "Order in multiples of "&J2, K2 * H2))
MOffer wholesale?you type Y or N

Notes on the formulas:

Under the table, add the order summary:

Order total ex VAT:  =SUM(L2:L)
Minimum first order: =IF(SUM(L2:L) >= settings!B4, "Met", "Add "&TEXT(settings!B4 - SUM(L2:L), "0.00")&" more")

SUM skips the "Order in multiples of" text, so a line with a wrong quantity is not counted until it is fixed.

Step 4: send it

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.