Legal Metrology check sheet for Shopify and WooCommerce stores in India: which product pages are missing MRP, net quantity, maker's address or country of origin
What you get: one Google Sheet for an Indian brand selling pre-packaged goods from its own Shopify or WooCommerce store, with one row per product and a column for each declaration that rule 6(10) of the Legal Metrology (Packaged Commodities) Rules, 2011 asks an e-commerce entity to show online: maker, packer or importer name and address, country of origin (imported goods), net quantity, MRP inclusive of all taxes, best before or use by (where the goods can go bad) and dimensions (where size matters), plus consumer care contact. A Missing column lists, in words, what each product page does not say yet, and a Next step column tells you whether to fix the page, check it by hand or leave it. Formulas are below. The example rows are made up.
The finished sheet
check tab (example rows are made up)
| Product | Price (₹) | MRP on page (₹) | Net qty | Maker / packer / importer | Imported? | Country of origin | Can go bad? | Best before | Consumer care | Missing | Next step |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Example Turmeric Powder 200 g | 149 | 180 | yes | yes | N | Y | yes | yes | all found | ||
| Sample Cold-Pressed Coconut Oil 1 L | 420 | yes | N | Y | yes | MRP, maker/packer/importer, best before / use by | fix page | ||||
| Demo Bamboo Toothbrush (pack of 4) | 299 | 249 | yes | yes | Y | N | country of origin, consumer care | price above MRP shown: check first | |||
| Test Gift Hamper | 1,499 | N | Y | no description text | check page by hand |
Who this is for
- Indian D2C brands selling packaged food, personal care, home and kitchen goods or gifts from their own Shopify or WooCommerce store.
- Store agencies and freelancers who build and run those stores and want one check per client before a sale or a catalogue upload.
- Importers and resellers who put imported packaged goods on their own site.
The slow part is not knowing the list. It is opening a few hundred product pages to see which ones forgot the MRP line, the net quantity or the importer's address. This sheet reads every product description at once and shows only the pages that need work.
What the rules ask for (the short version)
- On the package. Rule 6(1) lists the declarations every package must carry: (a) the name and address of the manufacturer (and of the packer if different; for an imported package, the importer), and for imported products the country of origin, manufacture or assembly; (b) the common or generic name of the product; (c) the net quantity in a standard unit (or the number, if sold by number); (d) the month and year of manufacture, and a "best before" or "use by" date, month and year if the product may become unfit for human consumption after a time; (e) the retail sale price, shown as the maximum retail price inclusive of all taxes in Indian currency; (f) dimensions, where the size of the product is relevant.
- Online. Rule 6(10) says an e-commerce entity must ensure that the declarations in rule 6(1), except the month and year of manufacture or packing, are displayed on the digital and electronic network used for e-commerce transactions. So the product page needs the same facts as the label, apart from the manufacturing date.
- Marketplaces. On a marketplace, a proviso to rule 6(10) puts responsibility for the correctness of the declarations on the manufacturer, seller, dealer or importer if the marketplace only hosts what the seller provides and meets its intermediary due diligence. On your own store, you are the one showing the page.
- Consumer care and unit price. Rule 6(2) asks every package to carry the name, address, telephone number and email of the person or office to contact for consumer complaints, and rule 6(11) asks for a unit sale price (per gram, per ml, per unit and so on) on pre-packaged goods. These are separate sub-rules from 6(1), so 6(10) does not name them. The sheet has a consumer care column anyway, because shoppers ask for it; drop it if you do not want it.
- Food and cosmetics. For packages of food, rule 6(1)(a) and the date rule point to the Food Safety and Standards Act, 2006 and its rules instead, and for cosmetics the date rule points to the Drugs and Cosmetics Rules, 1945. Check those labelling rules for those products.
Step 1: get every product's description (tab products)
With the product scraper
Open the E-commerce Product Data Scraper (Shopify, WooCommerce, any shop) on the Apify Store and use this input (JSON tab), with your store's homepage:
{
"startUrls": [{ "url": "https://www.example-store.in" }],
"maxProductsPerShop": 500,
"maxListingPages": 10,
"includeDescription": true
}
- Keep
includeDescriptionon. The checks read thedescriptionfield: on Shopify that is the product's main description, on WooCommerce the description (or the short description if the long one is empty), elsewhere the description in the page's product data. It is plain text, cut at 5,000 characters. - Your own terms come first. Before fetching anything, the scraper reads the shop's robots.txt and terms of service and skips the shop if they forbid scraping. Shopify's default store terms do, so your own store may come back as
blocked-by-termsin theSHOPS_SUMMARYrecord. That costs nothing; use the free route below. - You pay only per product delivered; listing pages are free. Marketplaces such as Amazon and Flipkart are never fetched, so this check is for your own store.
Export the dataset as CSV, then in your sheet use File → Import → Upload, "Insert new sheet", and name the tab products. Keep the headers.
Free, without the scraper
Export your products from your store admin (Shopify: Products → Export; WooCommerce: Products → Export), import the file as the products tab and rename the headers you need to title, price and description (in Shopify's export these are Title, Variant Price and Body (HTML); the HTML tags do not stop the formulas). The url column is optional. Keep one row per product, not per variant: Shopify puts extra variants and images on rows with an empty title, so filter those out first.
Step 2: the check tab
Each row of check reads the same row of products by header name, so column order does not matter. In hidden helper column Q2 put the description:
=INDEX(products!$A:$ZZ, ROW(), MATCH("description", products!$1:$1, 0))
Product in A2 uses the same formula with "title", URL in R2 with "url" and Price in B2 with "price". Copy row 2 down as far as the products go.
MRP on page in C2 picks up the first number written after "MRP":
=IFERROR(VALUE(REGEXREPLACE(REGEXEXTRACT(Q2,
"(?i)M\.?R\.?P\.?[^0-9]{0,30}([0-9][0-9,]*(?:\.[0-9]+)?)"), ",", "")), "")
The yes/blank columns all use one pattern; change only the words in quotes:
D2 Net qty: =IF(REGEXMATCH(Q2, "(?i)net\s*(qty|quantity|wt|weight|content|vol)"), "yes", "") E2 Maker: =IF(REGEXMATCH(Q2, "(?i)(manufactured|marketed|packed|imported)\s*by|manufacturer|packer|importer"), "yes", "") G2 Origin: =IF(REGEXMATCH(Q2, "(?i)country\s*of\s*origin|made\s*in\s"), "yes", "") I2 Best before: =IF(REGEXMATCH(Q2, "(?i)best\s*before|use\s*by|expiry"), "yes", "") J2 Care: =IF(REGEXMATCH(Q2, "(?i)(customer|consumer)\s*care|complaint"), "yes", "") S2 Size: =IF(REGEXMATCH(Q2, "(?i)dimension|size|[0-9]\s*(cm|mm)\b"), "yes", "") T2 Incl. taxes: =IF(REGEXMATCH(Q2, "(?i)incl[a-z.]*\s*(of\s*)?all\s*tax"), "yes", "")
Type Y or N yourself in Imported? (F), Can go bad? (H) and, in hidden column U, Size matters?. The sheet cannot know these. Words that also appear in your own text (for example "size" in a care line) can give a false "yes", so spot-check a few rows.
Step 3: Missing and Next step
Missing in K2 lists, in words, what the page does not say:
=IF(A2="", "", IF(Q2="", "no description text",
TEXTJOIN(", ", TRUE,
IF(C2="", "MRP", IF(T2="", "MRP: add 'inclusive of all taxes'", "")),
IF(D2="", "net quantity", ""),
IF(E2="", "maker/packer/importer", ""),
IF(AND(F2="Y", G2=""), "country of origin", ""),
IF(AND(H2="Y", I2=""), "best before / use by", ""),
IF(AND(U2="Y", S2=""), "dimensions", ""),
IF(J2="", "consumer care", ""))))
Next step in L2:
=IF(A2="", "", IF(Q2="", "check page by hand", IF(AND(C2<>"", B2>C2), "price above MRP shown: check first", IF(K2="", "all found", "fix page"))))
Sort by Next step. "check page by hand" means the description is empty: many themes show the label details in a separate tab, a metafield or a photo of the pack, which the description does not contain. Open those pages and look. "fix page" rows need the missing items added. "price above MRP shown" means the selling price in the store is higher than the MRP written in the description, so one of them is out of date.
Step 4: a summary tab
Products checked: =COUNTA(check!A2:A) All found: =COUNTIF(check!L:L, "all found") Fix page: =COUNTIF(check!L:L, "fix page") Check by hand: =COUNTIF(check!L:L, "check page by hand") Price above MRP: =COUNTIF(check!L:L, "price above MRP*") No MRP line: =COUNTIF(check!K:K, "MRP*") No net quantity: =COUNTIF(check!K:K, "*net quantity*") No maker/packer: =COUNTIF(check!K:K, "*maker/packer/importer*")
Re-run the scrape (or re-export) after you fix pages and paste the new CSV over the products tab: the counts update by themselves.
A block you can paste into each product description
MRP: ₹[amount] (inclusive of all taxes) Net quantity: [200 g / 1 L / 4 pieces] Manufactured by: [name], [full address with PIN code] Packed by: [name and address, if different] Imported by: [name and address in India, for imported goods] Country of origin: [country, for imported goods] Best before: [period or date, if the product can go bad] Dimensions: [size, if size matters] Consumer care: [name or office], [address], [phone], [email]
Keep the wording the same as on the label, and update the page whenever the label or the MRP changes. If the details live in a theme tab or metafield rather than the description, the checks above will not see them; that is fine, as long as the page shows them.
Check before you call it done
- Every "fix page" row has been fixed, and the new export shows it as "all found".
- Every "check page by hand" product page was opened and shows the declarations somewhere on the page.
- No product sells above the MRP its own page shows.
- Imported?, Can go bad? and Size matters? are filled in for every row.
- Food and cosmetics pages were also checked against their own labelling rules.
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
- Legal Metrology (Packaged Commodities) Rules, 2011, rules 6(1), 6(2), 6(10) and 6(11), as reproduced by the Legal Metrology Department, Government of Kerala: Relevant Rules
- Product scraper input and output fields (
startUrls,maxProductsPerShop,maxListingPages,includeDescription;title,url,price,compareAtPrice,description; robots.txt and terms check,SHOPS_SUMMARYstatuses, marketplaces never fetched): Apify Store page (input schema and README)
Related
- Export a Shopify store's products to CSV
- Export a WooCommerce store's products to CSV
- Google Shopping product listing check sheet
- Real-discount check sheet
Unadhi Guides are free, independent explainers. We correct errors as soon as we find them: write to mininglife7@gmail.com.