EU product identifiers on Shopify: barcodes, SKUs and NS-PIDs in bulk
From 1 November 2026 the EU asks for product identifiers for every item in a parcel worth up to €150 that's sent to a customer in the EU from outside it. A parcel without them can be held or sent back, and in the Shopify admin a label to the EU can't be bought until each item has a standard identifier or a declaration that it has none. Here's where Shopify reads each identifier and how to fill them in for a whole catalog.
The three identifiers, and where Shopify reads them
- Your own identifier (M-PID): Shopify sends the variant's ID, so there's nothing to add.
- The standardized identifier (S-PID): a barcode with the type GTIN, EAN, UPC or ISBN. A barcode left as Custom counts too when it's a valid GTIN (8, 12, 13 or 14 digits) or ISBN.
- The maker's own code (NS-PID), such as a model or part number: a barcode with the type NS-PID. Without one, Shopify uses the standard barcode, then any other barcode, then the SKU, then the variant's ID, so a variant with a GTIN or a SKU already has it covered.
Some goods need no identifiers, such as unprocessed food in HS chapters 01 to 15, certain handmade goods, antiques and works of art. Shopify decides that from the variant's HS code, and a product can't be marked exempt by hand, so the HS codes are worth checking too.
A product with no barcode at all
Handmade and one-of-a-kind items often have no GTIN. For those, Shopify asks for a declaration instead: on the product, or on each variant, open Shipping, then More details, and under EU customs declaration turn on Has no standardized identifier. The version of Shopify's Admin API that apps use today (2026-10) doesn't offer that setting, so it's a click per variant in the admin. Turn it on only where the product truly has no GTIN, EAN, UPC or ISBN: with it on, no barcode is sent to customs for that item.
Barcodes changed in September
A variant can now hold up to 20 barcodes, each with a type, and the same value can't be on one variant twice. Sales channels such as Google read the first barcode, and the admin adds a new one at the end and can't reorder them. Shopify's product CSV has a Barcodes column for all of them, a type and a colon before each value and a semicolon between them, like gtin:4006381333931; ns-pid:AB-12. A barcode written back without its type is stored as Custom, so a file or an app that drops the types drops them from the store too.
How AK: Bulk Product Editor does it in bulk
- The common search No standard barcode (EU customs) finds every variant a label would stop on, in Bulk edit, in Spreadsheet and in Export.
- In Spreadsheet, the Barcode column takes a scanner: a code and Enter keep it and move down a row, so one scan per variant runs down the column.
- Set the barcode type gives a type to each Custom barcode that passes that type's check (its characters, its length and its check digit, checked the way Shopify does), and the preview lists each variant where no barcode passed, with the reason, before anything is written.
- Add a barcode adds the maker's code from a template, such as each SKU or a metafield like
{metafield:custom.mpn}, after the variant's other barcodes, so the first one stays first. - Put a barcode first moves each variant's standard barcode to the front, the one sales channels read.
- A ready-made edit gives a SKU to every variant that has none, and HS codes and countries of origin edit in bulk too.
- Import and export read and write the Barcodes column in Shopify's own syntax, a barcode named without a type keeps the type it has, and a code Excel has turned into a number like 4.00638E+12 is refused with the way to get its digits back.
- Every run shows each value before and after, and has a receipt and an undo.
The Free plan changes up to 25 products in one run, and every plan has every feature. The other ways back from a bulk edit are in how to undo a bulk edit in Shopify, and the app is on the Shopify App Store.
Questions
Write to me at support@aislekit.app.