Disclosure: I build Citebeam, the Shopify app mentioned in this post. The numbers use public data only and the method is open, so you can check them yourself.
From 1 November 2026, EU customs declarations for online sales of imported goods to consumers have to carry product identifiers for each item, and customs can hold parcels that lack required data. Citebeam, the Shopify app I build, has a free checker that shows how your catalog looks on the identifier basics in about ten seconds: run it on your store, no sign-up.
I am not giving legal advice. Which of your parcels are in scope, and in what format the data goes, is for your carrier or customs broker to confirm, and carriers have started publishing what they want from merchants. What I can give you is data: what the identifier basics look like across 1,071 live Shopify stores, what Shopify itself says about its fields, and a 20-minute pass that gets a catalog ready.
The three identifiers, in Shopify terms
- Your own product code (M-PID). In Shopify that is the variant SKU. Every variant needs its own.
- The manufacturer's or supplier's code (NS-PID). A model or part number. Shopify now lets you enter it as a variant barcode of type NS-PID (Admin API 2026-10 and the admin).
- A standardised identifier (S-PID). A GTIN, EAN, UPC or ISBN, where the product has one.
What 1,071 stores look like
In October 2026 I read the public data of 1,071 live Shopify stores (42,560 products): the public product feed (first 50 products) and one product page each. No store is named. Two numbers matter here, and both are public-data proxies, not customs data:
- 50.3% of products have at least one variant with no SKU. 79.6% of the stores have at least one such product, and in 50.2% of the stores most products have one. The SKU is the usual M-PID, and a SKU that is blank or shared by several variants cannot identify one variant.
- 8.4% of the stores print a GTIN in the Product JSON-LD of the product page I read (10.6% of the pages that carry Product JSON-LD at all). Read that as a lower bound, not as the share of stores that have barcodes: the public feed does not show barcodes, and a theme prints one into its structured data only if it is set up to.
The manufacturer's code cannot be seen from outside at all. That one only exists in your admin.
What Shopify says about its own fields (as of 23 October)
Shopify staff have answered several of the open questions on the developer forum. The short version, with the sources at the end of this section:
- A barcode with no declared type ("Custom") that holds a valid GTIN already counts as the S-PID. You should not tick "Has no standardized identifier" for those variants. Staff added that the safer move is still to set the barcode's type to GTIN, EAN, UPC or ISBN rather than rely on Shopify recognising it. The declaration is for variants whose barcodes are SKUs, internal codes or other values that are not valid GTINs. (Staff, 20 October.)
- If a variant has no NS-PID, Shopify fills one in from its other barcodes, the SKU or the variant ID. Your supplier's real code is better, and you should keep one NS-PID barcode per variant: which one is used when there are several is not documented. (Staff, 20 October.)
- "Has no standardized identifier" cannot be set in bulk from the admin today. There is no CSV column and no bulk-editor column. Through the API it is in the unstable version and in the 2027-01 release candidate, which becomes the stable version on 1 January. A placeholder such as "None" in the barcode field does not record it. (Staff, 19 to 22 October.)
- Passing the declaration on to carriers was "not live just yet" on 20 October, so ask your carrier how they take it.
Sources: Shopify's BarcodeType documentation and the developer-forum threads About EU new barcode requirements and barcode types and How to bulk edit the new "Has no standardized identifier" checkbox. This is Shopify's description of its own fields, so check it against the current docs.
A 20-minute pass before 1 November
-
SKUs first. Export Products as CSV. In the Variant SKU column, filter the blanks, then flag duplicates (in Google Sheets,
=COUNTIF(A:A, A2)>1on that column). Replace placeholders such as N/A or 0. Fix products with many variants first: that is where a parent SKU gets copied to every size and colour. - Barcodes second. For each variant decide: a real GTIN goes in the barcode field, as digits only; if the product has none, declare it on the variant instead of typing a placeholder. A mistyped barcode is worse than none, so check the last digit. This is the check digit test Citebeam uses:
// GTIN-8/12/13/14 check digit (GS1 mod 10)
function validGtin(code) {
if (!/^\d{8}$|^\d{12,14}$/.test(code)) return false;
const digits = code.split("").map(Number);
const check = digits.pop();
const sum = digits.reverse().reduce((s, d, i) => s + d * (i % 2 === 0 ? 3 : 1), 0);
return (10 - (sum % 10)) % 10 === check;
}
- Manufacturer codes third. If you make the product, the code is yours to assign. If you resell it, ask the supplier for the maker's model or part number, and enter it as an NS-PID barcode. Never invent one.
- HS code and country of origin. They sit on the variant (Shipping section) and carriers ask for them too. The origin is where the item was made, not where you ship from.
- Hand your carrier a file, one line per variant: handle, variant title, SKU, barcode, vendor, manufacturer code, HS code, country of origin.
Skip the spreadsheet
Doing this across hundreds of variants by hand is the job Citebeam is built for. The free checker reports your SKU coverage, missing and duplicated SKUs, and whether a product page publishes a GTIN, from public data only. The Citebeam app goes further from inside your Shopify admin: it reads every variant (it only reads, it stores nothing from this check and needs no new permission), lists the variants with a missing or duplicated SKU, a barcode that fails the check digit or is not a GTIN, no vendor, no manufacturer code, and gives you that carrier file as a CSV with the manufacturer-code column ready for you to fill from your suppliers.
The data behind the study, the method and its limits are public: the research page, including the EU customs identifiers section.
How I measured (short version)
Stores came from Common Crawl's October 2026 index of myshopify.com addresses; I probed 1,461 and 1,071 qualified (public feed, at least 10 products). Per store: robots.txt, up to 50 products from the public feed and one product page, with at most 3 requests, an honest user agent and robots.txt respected. For the 58.6% of stores with more than 50 products, only the first 50 are represented, and structured data comes from one product page per store without running JavaScript. The sample leans toward smaller and newer merchants.
1 November is close. Start with the SKUs: run the free check and you will know in ten seconds how big that job is for your store.
Written with AI assistance.

Top comments (0)