Sample Files
Download sample spreadsheets to see the structure for importing product data:
Products Sample - General product import template
Products with Country-Specific HS Codes - Shows how to set country-specific HS codes for customs
Sales Channel Publishing - Shows product and per-variant publishing across Online Store, Shop, and Buy Button
Combined Listing - Shows a parent listing connecting two child products by color (Shopify Plus)
Product and Variant Metafields - Shows metafield value formats for common types, including text, list, JSON, dimension, rating, and per-variant metafields
Multi-Location Inventory Update - Minimal file that updates stock at two locations by SKU without touching any other fields (replace the SKUs and location names with your own)
Images and Media - Shows multiple images per product using extra rows, image positions, alt text, and variant-specific images
Add Variants to Existing Products - Adds new variants without touching existing ones (replace the handles and SKUs with your own; see the step-by-step guide)
Multiple Barcodes - Shows several barcodes per variant in the Variant Barcodes column, with UPC, EAN, ISBN, and ASIN types
Price Update by SKU - Minimal file that updates price and compare-at price by SKU without touching any other fields (replace the SKUs with your own)
General
ID
Description | Example Value |
Shopify's unique product identifier |
|
The ID and Handle fields work together to group multiple rows into a single product object (for example, when importing multiple variants). If an ID is present, the app will first try to find an existing product using the ID. If no ID match is found, the app will attempt to locate the product using the Handle.
Using ID [ID]: Add [ID] to the column name (e.g., ID [ID]) to explicitly use the product ID column as the sole identifier. When importing with ID [ID] and a large number of products, the system automatically preloads all product and variant data into memory for faster lookups, unless the store is much larger than the file. This significantly speeds up bulk updates. During preloading, you'll see a progress message showing how many variants have been loaded.
Handle
Description | Example Value |
URL-friendly product identifier |
|
The handle creates the product's URL path and must be unique within your store. When no ID is provided or no product is found by ID, the Handle serves as the fallback identifier for locating existing products during import.
If you do not provide a handle Shopify will generate one for you based on the product title.
When an import changes an existing product's handle, Altera automatically creates a URL redirect from the old product URL to the new one. This keeps existing links and search engine rankings working after the change. The redirect is only created when the handle actually changes (different casing or spacing that resolves to the same handle is ignored). This is on by default and can be turned off with the Create redirects if handles change option on the import setup page.
Handles keep non-Latin characters, the same way Shopify does when it creates a handle from a title. Latin accents are transliterated (café becomes cafe), but Chinese, Japanese, Cyrillic, Arabic, and other scripts stay as they are, so a re-import matches the existing product. To convert handles to ASCII instead (男裝上衣 becomes nan-zhuang-shang-yi), turn on the Convert handles to English letters option on the import setup page (see Convert non-Latin handles to ASCII).
Command
Description | Example Value |
Import action: MERGE, UPDATE, NEW, REPLACE, DELETE, IGNORE |
|
MERGE: Update existing product or create if not found
UPDATE: Update existing product only (will skip if product isn't found)
NEW: Create product only (will skip if product exists)
REPLACE: Delete existing product and create new one. The row is checked first, and if it can't create a product (for example, a blank
Title), the row fails and the existing product is keptDELETE: Remove the product from your store (will skip if product doesn't exist)
IGNORE: Skip this product row during import
Use UPDATE instead of MERGE when you only want to change existing products. If an identifier in your file doesn't match a product on the store, MERGE creates a new product, while UPDATE skips the row and reports it (IMP002). This prevents accidental duplicates when a handle or SKU in your file is wrong.
Title
Description | Example Value |
Product name |
|
The main product title displayed to customers throughout your store.
Body HTML
Description | Example Value |
Product description |
|
Full product description supporting HTML formatting for rich content display.
Vendor
Description | Example Value |
Product manufacturer/brand |
|
The company or brand that manufactures or supplies the product.
Type
Description | Example Value |
Product category |
|
Free-form text field for categorizing products within your store.
Tags
Description | Example Value |
Comma-separated product tags |
|
Tags help organize products and enable customer filtering and search functionality.
Tags Command
Description | Example Value |
Tag operation: REPLACE, DELETE, MERGE |
|
MERGE: Append new tags to existing tags
REPLACE: Replace all existing tags with specified tags
DELETE: Remove specified tags from the product
Created At
Description | Example Value |
Product creation timestamp - Export only |
|
The date and time when the product was originally created in Shopify. This field is export-only and cannot be imported.
Updated At
Description | Example Value |
Last modification timestamp - Export only |
|
The most recent date and time the product was modified. This field changes any time a product or variant field is updated, including when inventory is adjusted. This field is export-only and cannot be imported.
Status
Description | Example Value |
Product status: ACTIVE, DRAFT, ARCHIVED, UNLISTED |
|
ACTIVE: Product is published and available for purchase
DRAFT: Product is saved but not published to customers
ARCHIVED: Product is hidden from all sales channels
UNLISTED: Product is not visible in search or collections but can be accessed directly by handle, ID, or metafield reference
Published
Description | Example Value |
Publication status: TRUE, FALSE |
|
TRUE: Product is published and visible to customers
FALSE: Product is unpublished and hidden from customers
This column controls the product's publication on the Online Store. Combine it with Published Scope to also control Point of Sale.
When creating a product, it is published to the Online Store by default. Set the value to FALSE to leave the new product unpublished.
When updating an existing product, TRUE publishes it, FALSE unpublishes it, and a blank cell leaves the publication status unchanged.
To also change Point of Sale, set Published Scope to
weborglobal.
Market columns like Included / [Market] control market availability separately and don't affect this field (see Pricing by Catalogs).
Published At
Description | Example Value |
Publication timestamp |
|
When the product was or will be published. Future dates schedule publication.
ISO-formatted timestamps (e.g., 2024-03-16T10:00:00Z) are also supported. When no timezone is specified, your store's timezone is used.
Published Scope
Description | Example Value |
Publication visibility scope |
|
Legacy field that extends the Published column to Point of Sale. Leave it out to control the Online Store only. Options are:
web: apply the Published value to the Online Store, and remove the product from Point of Sale.
global: apply the Published value to the Online Store, and publish the product to Point of Sale.
blank or column missing: apply the Published value to the Online Store only. Point of Sale is not changed either way.
The two columns work together as follows:
Published | Published Scope | Online Store | Point of Sale |
| blank | Published | Not changed |
| blank | Unpublished | Not changed |
|
| Published | Unpublished |
|
| Unpublished | Unpublished |
|
| Published | Published |
|
| Unpublished | Published |
(no column) |
| Not changed | Unpublished |
(no column) |
| Not changed | Published |
A new product with no Published column is published to the Online Store, and to Point of Sale as well when Published Scope is global. This keeps the two columns compatible with files written for other import tools.
On export, this column shows global when the product is published to Point of Sale and web otherwise.
Note: When updating an existing product, Published and Published Scope are applied only when the Published value changes the product's Online Store status. For example, TRUE with global on a product that is already published to the Online Store does not publish it to Point of Sale. To change Point of Sale on its own, use the Published: Point of Sale column instead. New products always apply both columns.
To publish to other sales channels, or to control each channel separately, use the Published: [Sales Channel] columns described in Publications / Sales Channels. Those columns take priority over Published and Published Scope.
Publications / Sales Channels
Control publication status across individual sales channels by creating separate columns for each channel. This works similarly to Pricing by Catalogs, where you create one column per sales channel.
Use column names in the format Published: [Sales Channel Name] for example:
Published: Online StorePublished: POSPublished: Shop(for the Shop app)Published: FacebookPublished: Buy Button
Published
Description | Example Value |
Publication status for specific channel |
|
Control whether the product is published on a specific sales channel.
TRUE: Product is published and visible on the specified sales channel
FALSE: Product is unpublished and hidden from the specified sales channel
Blank: No change to current publication status (skipped during import)
When importing, each sales channel can be controlled independently. If a column value is blank, that sales channel's publication status will remain unchanged during the import process.
This field has priority over the legacy "Published", "Published At" and "Published Scope" fields. If you include both sets of fields, the value in this field will be used.
Variant Published
Description | Example Value |
Publication status for a specific variant on a specific channel |
|
Control whether a specific variant is published on a specific sales channel, independently of the parent product.
Use column names in the format Variant Published: [Sales Channel Name], for example:
Variant Published: Online StoreVariant Published: Shop(for the Shop app)Variant Published: Buy ButtonVariant Published: Facebook
Values behave the same way as the product-level Published: columns:
TRUE: Variant is published and visible on the specified sales channel
FALSE: Variant is unpublished and hidden from the specified sales channel
Blank: No change to current publication status (skipped during import)
This is independent of the parent product's Published: columns. A variant inherits its parent product's publication state by default, so you only need to set Variant Published: columns for variants whose visibility differs from the product. To export these columns, select the "Variant Published on Sales Channel" field in the Sales Channels category.
Limitations:
Variant publishing is not supported for the Point of Sale channel. Shopify does not allow variants to be hidden from POS independently of their parent product. Setting
Variant Published: Point of SaletoFALSEis skipped with a warning (PRD062).A variant cannot be published to a channel where its parent product is not published. If you publish a variant to a new channel, make sure the parent product is also published there.
Template Suffix
Description | Example Value |
Custom template identifier |
|
Allows using alternative Liquid templates for displaying this specific product. In the Shopify admin, this field is labeled Theme template.
Gift Card
Description | Example Value |
Gift card designation: TRUE, FALSE |
|
TRUE: Product functions as a digital gift card
FALSE: Regular physical or digital product
URL
Description | Example Value |
Full product page URL - Export only |
|
The complete URL to the product page. This field is export-only and cannot be imported.
Total Inventory Qty
Description | Example Value |
Combined inventory across all variants - Export only |
|
Sum of inventory quantities for all product variants. This field is export-only and cannot be imported.
Row
Description | Example Value |
Row identifier for multi-row data |
|
Used when product data spans multiple spreadsheet rows (e.g., multiple variants or media files).
Top Row
Description | Example Value |
Primary product row indicator: TRUE, FALSE |
|
This field is used to identify the main product row in a multi-row import. If you have multiple variants, images, or other sub-data, you can quickly see unique products by filtering for TRUE in this column.
TRUE: Main row containing primary product information
FALSE: Additional row for variants, media, or other sub-data
Category
Product categories use Shopify's standardized product taxonomy to classify items consistently across your store and sales channels.
When importing categories the app will try and find a matching category in the following order:
Category ID (e.g., sg-4-17-2-17)
Category (full path, e.g., Apparel > Men > T-Shirts)
Category Name (e.g., T-Shirts)
Category: ID
Description | Example Value |
Category identifier |
|
The unique identifier for the product's assigned category from Shopify's Standard Product Taxonomy. Category IDs use the format sg-4-17-2-17 where each number represents a level in the category hierarchy.
Category: Name
Description | Example Value |
Category name |
|
The display name of the product's category. Matching is case-insensitive and supports both Shopify taxonomy categories with a fallback to Google Shopping category names. When importing categories we recommend using the Category field described below instead of this one as multiple categories can match the same name.
Category
Description | Example Value |
Full category path |
|
Complete hierarchical path showing the product's categorization. Matching is case-insensitive and supports both Shopify taxonomy categories with a fallback to Google Shopping category names.
Collections
Collections group products together to help customers browse and find related items. Manual collections require you to add products individually, while smart collections automatically include products based on rules you define.
Custom Collections
Description | Example Value |
Manual collections containing products |
|
Comma-separated list of manual collections where this product appears.
You can provide either collection handles (e.g., summer-favorites) or collection titles (e.g., Summer Favorites). When a title is provided, the app will convert it to a handle format (lowercase, spaces replaced with hyphens) and search for an existing collection with that handle.
If no matching collection is found, a new manual collection will be created with the provided value as both the handle (slugified) and title.
This column only adds. A blank cell changes nothing, and a products import never removes a product from a collection. To remove hand-picked products from a collection, import a Collections file with Condition: Field set to Manual Selection, the product handle in Condition: Value, and Condition: Command set to DELETE.
Smart Collections
Description | Example Value |
Automated collections - Export only |
|
Comma-separated list of smart collections that automatically include this product based on rules. Collections are identified by their handle.
Images / Media
Image Type
Description | Example Value |
Media file type |
|
Specifies the type of media file being uploaded or referenced.
IMAGE: Standard image files (JPEG, PNG, GIF, etc.)
VIDEO: Video files uploaded to Shopify
MODEL_3D: 3D model files for augmented reality
FILE: General file attachments
EXTERNAL_VIDEO: Videos hosted on Vimeo or YouTube
Image Src
Description | Example Value |
Media file URL or filename |
|
URL to media file or filename of existing file already uploaded to your store.
You can provide multiple URLs separated by semicolons or commas to upload multiple files at once. Alternatively, use multiple Image Src columns for different media files.
URLs are downloaded and uploaded to your store as new files, except Shopify CDN URLs from your own store, which are matched to your existing files by filename. To also match URLs from other sources (for example, when re-running a store copy) instead of re-uploading them, enable the Match URLs to existing files option on the import setup page (in the CLI, use the --match-urls-to-existing-files option with import create).
Google Drive share links are also supported. Use the public shareable URL format, for example: https://drive.google.com/file/d/1NvoqrhistNz3MVivgExVxm52qycb1agT/view
Dropbox share links are also supported. Both old-style and new-style link formats work:
https://www.dropbox.com/s/abc123/image.jpg?dl=0https://www.dropbox.com/scl/fi/abc123/image.jpg?rlkey=xyz&dl=0
FTP and SFTP links are also supported, in both Image Src and Variant Image. Shopify itself can only fetch media from public web URLs, so the app downloads the file from your FTP or SFTP server and uploads it to Shopify for you. Use the format:
ftp://username:password@server:port/path/file_name.jpgsftp://username:password@server:port/path/file_name.jpg
The port is optional (defaults to 21 for FTP and 22 for SFTP), and the username and password can be omitted for anonymous FTP. If the username or password contains special characters such as @, percent-encode them (for example, %40 for @). If the file can't be downloaded or uploaded, the image is skipped with a PRD073 warning (with the password hidden) and the rest of the row still imports (see PRD073).
When importing, if an Image Src URL can't be used, the image is left off the product rather than clogging it up. A Shopify product can hold at most 250 media files, and a broken image still counts toward that limit, so the app keeps these out of the way:
If the URL is a Shopify CDN link for this store that returns 404, the image is skipped before upload with a
PRD071warning (see PRD071).If Shopify accepts the URL but then fails to download it (for example, a link from another store that no longer exists), the failed media is removed from the product automatically, with a
PRD043warning (see PRD043).
Either way you get a warning naming the image that couldn't be added, so you know which URL to fix.
If an image failed to process in Shopify (for example, the original source URL no longer exists), the export shows the Shopify error message in this column instead of a URL, beginning with Error from Shopify API: and including the original image URL. These rows identify which media broke and why - they are diagnostic and are not meant to be re-imported as-is.
Image Command
Description | Example Value |
Media operation |
|
MERGE: Update existing media or add if not found
DELETE: Remove the media whose
Image Srcmatches the product's media. Images and hosted videos match by filename. YouTube and Vimeo videos match by video ID, so any of the usual URL forms work. If nothing matches, the import reports warning PRD095 and removes nothing.REPLACE: Remove all existing media and add new media
NEW: Only add media if product has no existing media (skips if product already has media)
IGNORE: Skip all media processing for this product
When using MERGE, the app checks whether the image already exists on the product before importing it. If the image URL belongs to the same Shopify store you are importing into (i.e., a cdn.shopify.com URL from your store), the app can look up the file via the API and determine that it is already attached to the product. In that case, the image is skipped to avoid duplicates. By default, images from other sources - such as other Shopify stores or external URLs - cannot be matched this way, so they will be imported even if a visually identical image already exists on the product. To match those by filename as well, enable the Match URLs to existing files option on the import setup page (in the CLI, use the --match-urls-to-existing-files option with import create).
Image Position
Description | Example Value |
Display order number |
|
Determines the order in which media files appear on the product page.
Image Width
Description | Example Value |
Media width in pixels - Export only |
|
The width dimension of the media file. This field is export-only and cannot be imported.
Image Height
Description | Example Value |
Media height in pixels - Export only |
|
The height dimension of the media file. This field is export-only and cannot be imported.
Image Alt Text
Description | Example Value |
Alternative text for accessibility and SEO |
|
Descriptive text for screen readers and SEO purposes when images cannot be displayed.
When updating an existing image, leaving this cell blank clears the alt text on Shopify. Remove the column from your file to leave alt text unchanged. The Image Src column must be in the same file, because that is how the app knows which image the alt text belongs to.
Inventory / Variants
Variant Inventory Item ID
Description | Example Value |
Inventory item identifier - Export only |
|
Internal Shopify identifier for the variant's inventory item. This field is export-only and cannot be imported.
Variant ID
Description | Example Value |
Unique variant identifier |
|
Shopify's unique identifier for the specific product variant. When no product-level identifiers (ID, Handle, Title) are provided, the system can use Variant ID to locate the parent product. When updating existing products, Variant ID takes priority over other variant matching methods.
Using Variant ID [ID]: Add [ID] to the column name (e.g., Variant ID [ID]) to explicitly use this column as a product identifier. This allows you to update product-level fields (like Title or Vendor) using only variant ID values, without needing a separate product ID, handle, or title column.
When importing with Variant ID [ID] and a large number of variants, the system automatically preloads all variant data into memory for faster lookups. This significantly speeds up bulk updates. During preloading, you'll see a progress message showing how many variants have been loaded. When the store is much larger than the file, the system looks up only the variants in the file, in groups of about 50.
Variant Command
Description | Example Value |
Variant operation |
|
MERGE: Update existing variant or create if not found
UPDATE: Update existing variant only. If no variant matches the row, the whole product fails with PRD036 and none of its variants change
NEW: Create variant only (will skip if variant exists)
DELETE: Remove the variant from the product. If no variant matches the row, the row is skipped with the warning PRD104
REPLACE: Update or create the listed variants, then remove every other variant from the product
Any other value is rejected during file analysis (PRD086), so a typo can't change a variant by accident. IGNORE is not a variant command. To leave a variant unchanged, remove its row from the file. To skip a whole product, set its Command to IGNORE.
REPLACE makes the file the complete variant list for the product. Variants that match a row are updated, rows that don't match create new variants, and existing variants that no row references are deleted. File analysis shows a warning when the column contains REPLACE (PRD087). To remove a single variant, use DELETE on that row instead.
Option1 Name
Description | Example Value |
First option category |
|
The name of the first product option (e.g., Size, Color, Material). This is only required on the first variant row for each product; subsequent variant rows can leave this blank.
Option1 Value
Description | Example Value |
First option choice |
|
The specific value for the first option that defines this variant.
Letter casing: When updating an existing product, a value that only differs from the store by letter casing (for example large blue in the file and Large Blue on the store) matches the existing variant, and the store value is renamed to the file's casing (PRD075). The same applies to option names. Values that differ in more than casing are treated as new option values and add new variants.
Multiple values: You can provide multiple values separated by semicolons (e.g., Red;Blue;Green) or commas (e.g., Red,Blue,Green) and the app will automatically expand them into separate variants. This requires the Variant Generate From Options column to be set to TRUE. Semicolons take priority when both are present in a value. If multiple option columns contain separated values, all combinations are generated. For example, Option1 Value Red;Blue with Option2 Value S;M;L creates 6 variants.
Linked options: When the option is linked to a metafield (see Option1 Linked To), provide metaobject handles instead of display names.
Option1 Linked To
Description | Example Value |
Metafield reference for the first option |
|
Links the first product option to a metafield, enabling variant option values to reference metaobjects instead of plain text. The value uses the format product.metafields.{namespace}.{key}.
In the Shopify admin this is the option's connected source: the category metafield (or product metafield) you pick with Connect to metafield when you edit a product's options. Fill this column to connect variant options to category metafields for many products in one import, instead of one product at a time. See How to connect variant options to category metafields in bulk for a step-by-step guide.
The referenced metafield definition must exist on the store as a product metafield definition of type list of metaobject references, pointing at the metaobject definition whose entries your option values should link to. Shopify standard definitions (namespace shopify, such as shopify.color-pattern) are enabled automatically. For custom definitions, create the definition first in Settings > Custom data > Products (content type Metaobject with List of values), or the import fails with PRD040.
When an option is linked to a metafield, the corresponding Option Value column should contain metaobject handles rather than display names. Altera resolves these handles to Shopify metaobject IDs during import.
This is useful for options backed by rich metaobject data such as color swatches, fabric types, or other structured product attributes managed through Shopify metaobjects.
Converting a plain option: If the option currently uses plain text values, providing this column converts it to a linked option in place, keeping all variant IDs. Every existing option value needs a metaobject entry with a matching handle in the linked type.
Changing an existing link: If the option is already linked to a different metafield (for example product.metafields.shopify.size set through the product category), providing a new value in this column re-links the option to the new metafield in place, also keeping all variant IDs. This works in any direction: from a Shopify standard metafield to a custom one, custom to Shopify standard, or between two custom or two Shopify standard metafields. Every option value must have a metaobject entry with a matching handle in the new type - custom entries must already exist (import them first if needed), while entries for Shopify standard types are created automatically from the taxonomy. If any entry is missing, the import reports the missing handles (PRD074) and the option keeps its current link. When re-linking to a Shopify standard metafield, the product's category must support that attribute - change the category in the same import if needed.
It is not possible to unlink an option (convert it back to plain text values) via import; leaving this column blank leaves the existing link unchanged.
Option2 Name
Description | Example Value |
Second option category |
|
The name of the second product option. This is only required on the first variant row for each product; subsequent variant rows can leave this blank.
Option2 Value
Description | Example Value |
Second option choice |
|
The specific value for the second option that defines this variant. Supports semicolon or comma expansion to create multiple variants when Variant Generate From Options is TRUE (see Option1 Value). Supports linked metaobject handles when Option2 Linked To is set (see Option1 Value).
Option2 Linked To
Description | Example Value |
Metafield reference for the second option |
|
Links the second product option to a metafield. See Option1 Linked To for details.
Option3 Name
Description | Example Value |
Third option category |
|
The name of the third product option. This is only required on the first variant row for each product; subsequent variant rows can leave this blank.
Option3 Value
Description | Example Value |
Third option choice |
|
The specific value for the third option that defines this variant. Supports semicolon or comma expansion to create multiple variants when Variant Generate From Options is TRUE (see Option1 Value). Supports linked metaobject handles when Option3 Linked To is set (see Option1 Value).
Option3 Linked To
Description | Example Value |
Metafield reference for the third option |
|
Links the third product option to a metafield. See Option1 Linked To for details.
Variant Generate From Options
Description | Example Value |
Enables variant generation from option values. Import only |
|
When set to TRUE, values in the Option1/2/3 Value columns separated by semicolons or commas are expanded into all possible variant combinations. Semicolons take priority when both are present in a value.
TRUE - Option values containing semicolons or commas are split and expanded into individual variants
FALSE - Option values are used as-is
For example, a single row with Variant Generate From Options set to TRUE, Option1 Name Color, Option1 Value Red;Blue, Option2 Name Size, and Option2 Value S;M;L will generate 6 variants: Red/S, Red/M, Red/L, Blue/S, Blue/M, and Blue/L.
Variant Position
Description | Example Value |
Display order of variant |
|
Determines the order in which variants appear when customers view options.
Variant SKU
Description | Example Value |
Stock keeping unit |
|
Unique identifier for inventory tracking and management purposes. When no product-level identifiers are provided, SKU can be used to locate the parent product. When updating existing products, SKU is used as a fallback method for matching variants when Variant ID is not available. Shopify allows for blank SKU values but this may make it harder to identify the products on your store.
When updating existing variants that are matched by another identifier (like Variant ID or option values), leaving this cell blank will clear the existing SKU on Shopify. Remove the column from your file if you want to leave SKUs unchanged.
Using Variant SKU [ID]: Add [ID] to the column name (e.g., Variant SKU [ID]) to explicitly use this column as a product identifier. This allows you to update product-level fields (like Title or Vendor) using only SKU values, without needing a separate product ID, handle, or title column.
When importing with Variant SKU [ID] and a large number of SKUs, the system automatically preloads all variant data into memory for faster lookups. This significantly speeds up bulk updates like inventory quantity changes. During preloading, you'll see a progress message showing how many variants have been loaded. When the store is much larger than the file, the system looks up only the SKUs in the file, in groups of about 50.
Variant Barcode
Description | Example Value |
Primary barcode of the variant (legacy) |
|
This is a legacy column. New exports can't select it, because Variant Barcodes holds every barcode of the variant. Saved export jobs that already have the column keep exporting it, the CLI and API can still name it in an export, and imports still read it. A file that imports it shows the warning PRD102; Variant Barcode [ID] doesn't.
UPC, EAN, or other barcode identifier for the variant. When no product-level identifiers, Variant ID, or SKU columns are provided, Barcode can be used as a final fallback to locate the parent product. Any barcode of a variant matches, not only the primary one, and the match doesn't change which barcode is the primary.
A Shopify variant can carry up to 20 barcodes. This column holds the primary one, the first barcode on the variant. Importing a value here replaces the primary barcode and leaves the other barcodes of the variant unchanged. To see or set all barcodes of a variant, use Variant Barcodes.
When updating existing variants that are matched by another identifier (like Variant ID, SKU, or option values), leaving this cell blank removes all barcodes from the variant. Remove the column from your file if you want to leave barcodes unchanged.
Using Variant Barcode [ID]: Add [ID] to the column name (e.g., Variant Barcode [ID]) to explicitly use this column as a product identifier. This allows you to update product-level fields using barcode values without needing a separate product ID, handle, or title column. Like the plain column, it finds a variant by any of its barcodes.
When importing with Variant Barcode [ID] and a large number of barcodes, the system automatically preloads all variant data into memory for faster lookups. This significantly speeds up bulk updates. During preloading, you'll see a progress message showing how many variants have been loaded. When the store is much larger than the file, the system looks up only the barcodes in the file, in groups of about 50.
Variant Barcodes
Description | Example Value |
All barcodes of the variant |
|
Every barcode of the variant, separated by semicolons, in the same format as the Variant Barcodes column of Shopify's own product CSV. A variant can have up to 20 barcodes, each up to 255 characters. The first barcode in the list is the primary barcode, the one shown in Variant Barcode.
To give a barcode a type, write the type and a colon in front of the value: upc, ean, isbn, gtin, or asin (upper or lower case). Shopify validates a typed barcode against that standard (length, characters, and check digit), so a typed value that doesn't pass fails the row. A barcode without a type is stored exactly as written.
4006381333931- one barcode without a typeean:4006381333931- one barcode with a typeean:4006381333931; upc:012345678905; SUP-4471- three barcodes, the last one without a type
To keep a backslash, a semicolon, or a colon as part of a barcode, write a backslash in front of it: \\, \;, or \:. For example, sdf\:2342323 is the barcode sdf:2342323 without a type. Any other word in front of a colon is read as a barcode type, so ean13:4006381333931 fails the row with PRD091. Commas, square brackets, spaces, and other characters need no backslash.
Importing: what the cell does to the variant's barcodes depends on Variant Barcodes Command. Without that column, or with a blank cell in it, the barcodes in the cell are added to the variant's barcodes (MERGE). A barcode written without a type keeps the type it already has on the variant, so files from systems that don't know about barcode types don't remove them. A blank cell leaves the variant's barcodes unchanged, unless the command is REPLACE.
Files exported by Altera before 2026-09-24 list the barcodes separated by commas, with the type in square brackets after the value (4006381333931 [EAN], 012345678905 [UPC]). Those files still import: a cell without a semicolon or a backslash that has a type in square brackets, or a comma, is read in that format. This ends around the end of 2026, so use the format above in new files. In a Shopify export or a file in the format above, a barcode that ends in a type in square brackets, or a barcode with a comma in it, is read correctly as soon as the cell also has a semicolon, a backslash, or a type in front of a value.
When a row fills both columns, Variant Barcode must be the first value of Variant Barcodes, which is how an export writes them. Any other value fails the row with PRD094.
Exporting: the column is part of the Inventory / Variants group, so product exports include it by default. The cell is written the way Shopify's product CSV export writes it: the type in lowercase in front of the value, ; between barcodes, and a backslash in front of a backslash, semicolon, or colon inside a barcode. A Shopify product export imports into Altera without changes to this column, and an Altera export imports into Shopify.
Variant Barcodes Command
Description | Example Value |
What to do with the barcodes in Variant Barcodes |
|
Tells the import what to do with the barcodes listed in Variant Barcodes on the same row.
MERGE: Adds the listed barcodes to the variant's barcodes. A barcode the variant already has stays where it is, so the primary barcode doesn't change. If the cell gives a type for a barcode the variant already has (
ean:4006381333931), that type is set on it. This is the default when the column is missing or the cell is blank.DELETE: Removes the listed barcodes from the variant. Barcodes are matched by value, so
ean:4006381333931also removes4006381333931stored without a type. A listed barcode that the variant doesn't have is skipped. Delete the primary barcode, and the next barcode becomes the primary one.REPLACE: The cell becomes the variant's complete set of barcodes, in that order, so the first barcode in the cell becomes the primary one. A blank cell removes every barcode of the variant.
With MERGE and DELETE, a blank Variant Barcodes cell changes nothing. A variant can have up to 20 barcodes; a MERGE that would go over 20 fails the row with PRD092. Any other value than the three above fails the row with PRD101.
Exporting: product exports write REPLACE on every variant row, because the exported Variant Barcodes cell holds the complete set. An exported file imports back without changes. To add barcodes without listing the ones the variant already has, change the command to MERGE.
Variant Image
Description | Example Value |
Variant-specific image URL |
|
URL of the image that represents this specific variant.
FTP and SFTP links (ftp://username:password@server:port/path/file_name.jpg) are supported the same way as in Image Src: the app downloads the file from your server and uploads it to Shopify for you.
Variant Price
Description | Example Value |
Regular selling price |
|
The standard price customers pay for this variant. Use decimal format only (no commas or currency symbols), with period as the decimal separator. Including the currency symbol in this field will cause the import to fail.
Variant Compare At Price
Description | Example Value |
Original or reference price |
|
The original or MSRP price shown crossed out to indicate savings. Use decimal format only (no commas or currency symbols), with period as the decimal separator.
When importing, leaving this cell blank will clear the existing compare-at price on Shopify. This is useful when ending a promotion and removing the crossed-out price from a product.
Variant Taxable
Description | Example Value |
Subject to taxes: TRUE, FALSE |
|
TRUE: Variant is subject to applicable taxes
FALSE: Variant is exempt from taxes
Note: Gift card products are automatically set to non-taxable regardless of this field value.
Variant Inventory Tracker
Description | Example Value |
Inventory tracking: shopify, blank |
|
shopify: Shopify tracks inventory quantities for this variant
Blank field: Inventory tracking is disabled for this variant
When you update an existing variant with this column present and the cell blank, inventory tracking is turned off for that variant. To leave tracking unchanged, remove the column from your file. If the same row also contains inventory quantities, the quantities are skipped with a warning because they can't be applied to an untracked variant.
When creating new variants without inventory quantity data, tracking is automatically disabled.
If you try to set inventory quantities when inventory tracking is disabled (and you're not enabling it in the same import), the import will fail with error PRD024. You must enable inventory tracking by setting this field to shopify before setting inventory quantities.
For variants with tracking disabled, exports leave this field blank and write Stocked in the Inventory Available: [Location Name] column for each location the variant is stocked at. Importing those values keeps tracking disabled and links the variant to the same locations (see Inventory Available).
Variant Inventory Policy
Description | Example Value |
Out-of-stock behavior: continue, deny |
|
continue: Allow purchases when out of stock
deny: Prevent purchases when inventory reaches zero
Variant Fulfillment Service
Description | Example Value |
Fulfillment service identifier |
|
Specifies which service handles fulfillment for this variant. During export, this is automatically set to manual for regular products and gift_card for gift card products.
Variant Inventory Qty
Description | Example Value |
Current stock level |
|
The available quantity for this variant in your default location.
This field is only used when no multi-location inventory columns (such as Inventory Available: [Location Name] or Inventory Available Adjust: [Location Name]) are present in your spreadsheet. If multi-location inventory columns exist, they take priority and this field will be ignored.
When your store has multiple locations, this column can only be used when creating new products (inventory will be set at the default location). It cannot be used to update existing products, as it could overwrite inventory at unintended locations. Use Inventory Available: [Location Name] instead to set inventory for a specific location.
Variant Inventory Adjust
Description | Example Value |
Quantity adjustment |
|
Relative change to current inventory (use - for decrease).
This field is only used when no multi-location inventory columns (such as Inventory Available: [Location Name] or Inventory Available Adjust: [Location Name]) are present in your spreadsheet. If multi-location inventory columns exist, they take priority and this field will be ignored.
This column also cannot be used when your store has multiple locations, as it could cause incorrect inventory counts. Use Inventory Available Adjust: [Location Name] instead to adjust inventory for a specific location.
Variant Cost
Description | Example Value |
Cost per unit |
|
The cost you pay for each unit of this variant, used for profit calculations. Use decimal format only (no commas or currency symbols), with period as the decimal separator.
When importing, leaving this cell blank will clear the existing cost value on Shopify.
Note that this field was initially in its own category named "Variant Cost" but is now in "Inventory / Variants" category along with the other variant fields.
Combined Listings
Combined listings join several separate products into a single listing, connected by a shared option such as color or model. A combined listing has a parent product (the listing itself, which can't be purchased and holds no inventory) and one or more child products (the individual products shown as options). On the storefront, customers see one product with all the child options available.
Combined listings are only available on Shopify Plus. On a non-Plus store the import still runs, but the combined listing columns are skipped and the products are imported normally (warning PRD064).
You express a combined listing in the same Products sheet using your normal product rows plus the columns below:
The parent product gets one row per combined-listing option value. Set
Combined Listing RoletoPARENT, use theOption1 Name/Option1 Valuecolumns to define the option (for exampleColor/Grey), and useCombined Listing Childto point each option value at the child product that fills it.The child products are ordinary product rows with their own variants, prices, and images. They need no special columns - a product automatically becomes a child when it's attached to a parent.
How the children are reconciled depends on the parent row commands:
MERGE(default) adds or updates the listed children without removing any that aren't in the file.REPLACEsyncs the listing to exactly the children in your file, detaching any that aren't listed. Note that aREPLACErecreates the parent product, so include all of its fields.A
Variant CommandofDELETEon an individual parent row detaches just that one child, leaving the rest of the listing untouched - noREPLACErequired.
A combined listing must keep at least one child. Removing the last one is blocked with error PRD068; to dissolve a listing, delete the parent product instead.
A minimal parent block for a "Modular Sofa" listing connecting a grey and a blue sofa:
Handle | Command | Combined Listing Role | Option1 Name | Option1 Value | Combined Listing Child |
|
|
|
|
|
|
|
|
|
|
|
|
For step-by-step examples of creating a listing and adding, removing, or dissolving children, see How to manage Shopify combined listings.
Combined Listing Role
Description | Example Value |
Combined listing role: PARENT, CHILD |
|
PARENT: This row's product is the combined listing parent. The role can only be set when the product is created; it cannot be added to an existing product.
CHILD: The product is a child of a combined listing. This value is set automatically when a child is attached and appears on export; you do not need to set it on import.
Blank: The product is a normal product that is not part of a combined listing.
Combined Listing Child
Description | Example Value |
Handle of the child product for this option value |
|
Set on each PARENT row to map that row's option value to a child product by its handle. Leave blank on child and non-combined product rows. Use either this column or Combined Listing Child ID to identify the child - you do not need both.
Combined Listing Child ID
Description | Example Value |
ID of the child product for this option value |
|
An alternative to Combined Listing Child that identifies the child product by its Shopify product ID instead of its handle. Useful when handles are not stable or not known. If both columns are provided, the ID is used.
Shipping and Customs
The shipping and customs fields of each variant: whether it needs shipping, its shipping profile, its packed dimensions, its weight, and the customs information for international shipments. These are the fields of the Shipping section of a variant in the Shopify admin. Product exports include this group by default.
Variant Requires Shipping
Description | Example Value |
Shipping requirement: TRUE, FALSE |
|
TRUE: Variant requires physical shipping
FALSE: Digital product that doesn't require shipping
Variant Shipping Profile
Description | Example Value |
Assigned shipping profile for this variant |
|
The shipping profile that controls shipping rates and delivery options for this variant. Each variant must be assigned to a shipping profile that determines how it can be shipped to customers.
When importing, you can specify the shipping profile by:
Name: The display name of the shipping profile (e.g.,
International,Domestic,General Profile)ID: The numeric profile identifier (e.g.,
101122334455)GID: The full Shopify GraphQL ID (e.g.,
gid://shopify/DeliveryProfile/101122334455)
During export, this field always displays the profile name. Variants not assigned to a custom shipping profile will show General Profile, which is Shopify's default shipping profile that all stores have. This field remains empty when Variant Requires Shipping is set to FALSE, since digital products don't use shipping profiles.
Profile names are matched without regard to case, so General Profile and General profile refer to the same profile. A variant that is already in the named profile is left unchanged. If Shopify rejects a profile change, the row still imports and a PRD097 warning explains why.
This column isn't available on stores that have moved to Shopify's market-driven shipping, because those stores no longer have shipping profiles. Shipping rates are set on each market and apply to products by collection. On those stores, exports leave the column blank, and imports ignore it: General Profile and blank cells are skipped silently, and any other value produces a PRD096 warning. Shopify moves all stores to market-driven shipping by July 2027.
Variant Packed Length
Description | Example Value |
Length of the variant when packed |
|
The outer length of the variant after it is packed for shipping, in the unit from Variant Packed Dimension Unit. In the Shopify admin, this is the length in the Packed product size fields of the variant.
Shopify uses packed dimensions to pick the smallest saved box that fits the items of an order. That box is used for carrier-calculated shipping rates at checkout and when you buy a shipping label. If an item has no packed dimensions, or no box fits, Shopify uses the store's default package.
Shopify saves packed dimensions only when the length, width, and height all have a value. When you import:
A value that is blank, or a column that is not in the file, keeps the saved value of the variant. For example, you can import only Variant Packed Length to change the length.
If the variant has no saved packed dimensions and a value is blank, the dimensions are not saved and the row shows a PRD107 error. The rest of the row is imported.
To remove the packed dimensions of a variant, leave all three cells blank or set them to
0.Values must be 0 or greater.
When you export, all four packed dimension cells are blank for a variant that has no packed dimensions.
Variant Packed Width
Description | Example Value |
Width of the variant when packed |
|
The outer width of the variant after it is packed for shipping. The import rules are the same as for Variant Packed Length.
Variant Packed Height
Description | Example Value |
Height of the variant when packed |
|
The outer height of the variant after it is packed for shipping. The import rules are the same as for Variant Packed Length.
Variant Packed Dimension Unit
Description | Example Value |
Unit of the packed dimensions: cm, in |
|
cm: Centimeters
in: Inches
Shopify accepts only these two units for packed dimensions. Any other unit fails the row with PRD108.
If the cell is blank or the column is not in the file, the variant keeps its saved unit. A variant without saved packed dimensions gets the unit of your store's unit system: cm for metric and in for imperial.
If you import only this column, the saved values get the new unit. The values are not converted, so 10 cm becomes 10 in.
Variant Weight
Description | Example Value |
Product weight value |
|
Numeric weight value for shipping calculations.
Variant Weight Unit
Description | Example Value |
Weight unit: kg, g, lb, oz |
|
kg: Metric weight measurement (kilograms)
g: Metric weight measurement (grams)
lb: Imperial weight measurement (pounds)
oz: Imperial weight measurement (ounces)
Variant Grams
Description | Example Value | |
Weight in grams - Import only |
|
Legacy weight field measured in grams. This field is import-only and provided for backwards compatibility with Matrixify and Shopify CSV format.
When importing, if Variant Grams is provided without Variant Weight, the grams value will be automatically converted to the appropriate weight unit (using Variant Weight Unit if specified, or your store's default weight unit).
Note: For new imports, use the Variant Weight and Variant Weight Unit fields instead, as they provide more flexibility in specifying weight measurements.
Variant HS Code
Description | Example Value |
Harmonized System trade code |
|
International trade classification code for customs and tariff purposes.
Note: Shopify no longer supports storing HS codes in the global.harmonized_system_code metafield. During import, if we detect this metafield on the product or variant, we will use its value as a fallback to set the Variant HS Code (stored on the InventoryItem).
Variant Country of Origin
Description | Example Value |
Manufacturing country |
|
The country where the product was manufactured. Accepts a two-letter ISO country code (CN) or a full country name (China); names are converted to the matching code on import. Unrecognized values are skipped with a DAT003 warning.
Variant Province of Origin
Description | Example Value |
Manufacturing province/state |
|
Province or state where the product was manufactured within the country of origin.
Variant Unit Price
Description | Example Value |
Unit pricing details |
|
Legacy JSON column for unit pricing measurement information. For new imports, use the separate unit price columns described in the Unit Pricing section instead.
{
"quantityUnit": "G",
"quantityValue": 12.0,
"referenceUnit": "KG",
"referenceValue": 1
}
If both this JSON column and the separate unit price columns are present, the JSON column takes priority for that row.
Unit Pricing
Unit pricing displays the price per standard unit of measurement (e.g., price per kilogram or per liter), helping customers compare products of different sizes. This is required in some regions like the European Union for certain product categories.
Unit Price Total Measure
Description | Example Value |
Total quantity of product in the package |
|
The numeric quantity value representing the total amount of product. Decimal values are supported (e.g., 12.5).
This is the "what's in the package" measurement. For example, if you're selling a 500g bag of coffee, this value would be 500.
Unit Price Total Measure Unit
Description | Example Value |
Unit for the total quantity |
|
The unit of measurement for the total product quantity. Must be one of the supported units listed below.
Supported Units:
Unit | Description | Category |
| Centiliters | Volume |
| Centimeters | Length |
| Fluid ounces | Volume |
| Feet | Length |
| Square feet | Area |
| Grams | Weight |
| Gallons | Volume |
| Inches | Length |
| Items (count) | Count |
| Kilograms | Weight |
| Liters | Volume |
| Pounds | Weight |
| Meters | Length |
| Square meters | Area |
| Cubic meters | Volume |
| Milligrams | Weight |
| Milliliters | Volume |
| Millimeters | Length |
| Ounces | Weight |
| Pints | Volume |
| Quarts | Volume |
| Yards | Length |
Unit Price Base Measure
Description | Example Value |
Reference quantity for price comparison |
|
The numeric reference value that defines the standard unit for price comparison. This is typically 1 (e.g., price per 1 kilogram).
This is the "price per X" measurement. For example, if you want to show price per kilogram, set this to 1 with a base measure unit of KG.
Unit Price Base Measure Unit
Description | Example Value |
Unit for the reference quantity |
|
The unit of measurement for the reference/base quantity. Must be one of the supported units listed above under Unit Price Total Measure Unit.
The base measure unit should typically match or be compatible with the total measure unit (e.g., G/KG for weight, ML/L for volume).
Unit Pricing Behaviors
Leave all columns blank - Skips updating unit pricing (preserves existing value)
Set either value to 0 - Clears/removes unit pricing from the product
Both formats present - If a row has a value in the Variant Unit Price (JSON) column, the separate columns are ignored for that row
Unit Pricing Example
To set up a 500g bag of coffee with a price-per-kilogram display:
Unit Price Total Measure | Unit Price Total Measure Unit | Unit Price Base Measure | Unit Price Base Measure Unit |
|
|
|
|
This tells Shopify: "This package contains 500 grams, show the price per 1 kilogram."
Multi-Location Inventory Levels
For each location, use column names like Inventory Available: My Custom Location and Inventory Available Adjust: My Custom Location where "My Custom Location" is replaced with your actual location name.
When setting or adjusting inventory for a location, the variant will automatically be linked to that location if it's not already linked. This applies to both Inventory Available: [Location Name] and Inventory Available Adjust: [Location Name] columns.
Inventory Available
Description | Example Value |
Available quantity in the location |
|
The available inventory quantity at the location.
Setting inventory using this column will automatically link the variant to the specified location if it's not already linked.
The column also accepts the special value Stocked. It links the variant to the location without setting a tracked quantity. Exports write Stocked for variants whose inventory is not tracked, so you can re-import an exported file without editing those cells and the variant stays untracked and stocked at the same locations. Stocked is not valid in the Inventory Available Adjust column.
Leaving the cell blank when updating an existing variant unstocks the variant from that location. The location stops counting toward the variant's available inventory and can no longer fulfill it. To leave inventory at a location untouched, remove that location's column from the file instead of leaving the cells blank. Shopify requires every variant to be stocked at at least one location, so a row whose blank cells would remove all of a variant's locations is skipped with an error (see PRD077).
Shopify deactivates the location's inventory record rather than deleting it, so the Shopify admin can still show the location's last on hand figure after unstocking. If you stock the variant at that location again, Shopify restores the previous quantities.
Inventory Available Adjust
Description | Example Value |
Adjustment to quantity |
|
Relative inventory change at the location (use - to decrease quantity).
Adjusting inventory using this column will automatically link the variant to the specified location if it's not already linked.
Pricing by Catalogs
Use column names in the format Included / Belgium, Variant Included / Belgium, Price / Belgium, Compare At Price / Belgium where "Belgium" is replaced with the title of a catalog or the name of a market.
On export there is one set of these columns for each catalog on the store, labeled with the catalog title: market catalogs first, then B2B company location catalogs. A catalog is what holds the price list and the product availability, so a catalog shared by several markets appears once. A market without a catalog has no columns. Archived catalogs are left out.
On import, a name is matched to a catalog title first, so an exported file imports back into the catalogs it came from. A name that matches no catalog title is matched to a market name and written to that market's catalog, so a file that uses market names works too. To price a market that has no catalog yet, add a Price / <Market> column by hand: the import creates the catalog and its price list.
In Shopify, one catalog can serve several markets. Columns that name those markets all write to the same catalog, so give them the same value or keep only one of them. If two such columns disagree on a row, the first column in the file wins and the import adds a PRD099 warning. A header that matches neither a market nor a catalog is skipped with a PRD098 warning. To manage a catalog directly, including its price list settings, use the Catalogs sheet.
Included
Description | Example Value |
Product market availability: TRUE, FALSE |
|
TRUE: Product is included in the specified market's catalog
FALSE: Product is excluded from the specified market's catalog
This is a product-level field: in Shopify the whole product is included in (or excluded from) a market's catalog. Set the value on the product's first row; values on other variant rows are ignored. Exports label the column with the catalog title, like Included / EUR Pricing. On import a market name works too.
Market inclusion is separate from sales channel publishing - these columns don't change whether the product is visible on the Online Store. Use the Published column or Published: [Sales Channel] columns to control sales channel visibility.
Variant Included
Description | Example Value |
Variant market availability: TRUE, FALSE |
|
TRUE: This variant is available in the specified market's catalog
FALSE: This variant is excluded from the specified market's catalog
Unlike Included, this controls availability for an individual variant within a market's catalog. Set the value on each variant's own row.
If any variant is included in a market, the product is automatically published to that catalog (a variant can only appear in a catalog its product belongs to). To remove a whole product from a market, use the product-level Included / [Market] column - the variant column never removes a product on its own, so excluding one variant won't affect the others. If you set Included / [Market] for the same market, that explicit value takes precedence.
A blank cell is a no-op - it leaves that variant's current catalog availability unchanged. Because including any variant publishes the whole product to the catalog (which makes every variant available by default), you must set FALSE on each variant you want excluded. A variant left blank, or not present in the file at all, stays included - a blank is not an exclusion. For example, to add a product to a market with only one variant available, set that variant to TRUE and set every other variant to FALSE in the same import.
Setting a variant to FALSE never publishes the product to a catalog. If the product isn't already in the market's catalog, a FALSE value is a safe no-op and won't pull the product (or its other variants) into the catalog.
Requires a market with an active catalog publication (a pricing-only market has no per-variant gate). This column has no Matrixify equivalent.
On export, Variant Included is only filled in for catalogs that have publishing controls (a catalog publication). For pricing-only catalogs the cell is left blank, because Shopify has no per-variant include switch for them - publishing controls are turned off, so every variant is implicitly available. In that case the product-level Included / [Market] column still shows TRUE, so seeing Included / [Market] as TRUE next to a blank Variant Included / [Market] is expected, not an error.
Price
Description | Example Value |
Market-specific price |
|
Price for the variant in the specified market's currency.
Values follow the same number rules as Variant Price: 21,53 is read as 21.53 (the file analysis adds a DAT019 warning so you can double-check) and 1,234.56 as 1234.56.
Exports label the column with the catalog title, like Price / EUR Pricing. On import a market name works too.
On export, this column shows only fixed catalog prices. If a catalog sets its prices with a percentage adjustment (for example "base price minus 20%"), the Price / [Market] cell is left blank, even though the product is included in the catalog. Shopify calculates those prices automatically from the catalog's adjustment instead of storing a fixed per-variant value, so there is no fixed price to export. A blank price here is not an error: the variant still has a price in that market, computed from your catalog's adjustment. To change it, update the base Variant Price (the adjustment follows automatically), or enter a fixed price in this column to override the adjustment for that variant. A catalog without a price list also exports blank, because there is nothing to price, and a market without a catalog has no columns at all.
Compare At Price
Description | Example Value |
Market-specific reference price |
|
Original or MSRP price for the variant in the specified market's currency.
Exports label the column with the catalog title, like Compare At Price / EUR Pricing. On import a market name works too.
When setting a compare-at price for a market, you must also provide the regular price for that same market. Markets without catalogs will have them created automatically during import.
Country-Specific HS Codes
Country-specific Harmonized System (HS) codes let you provide detailed customs classification codes that vary by destination country, ensuring accurate tariff calculations for international shipping. You can specify codes beyond the standard 6 digits for each country you ship to. To export country-specific HS codes, you will need to select the "Country-Specific HS Codes" field group in the export settings.
Country HS Code
Description | Example Value |
Country-specific Harmonized System trade code |
|
You can provide HS codes for specific countries by adding columns with the format Country HS Code: [Country Name] or Country HS Code: [Country Code]. For example:
Country HS Code: Ascension IslandCountry HS Code: CA
Importing: It is only possible to add or update Country-Specific HS codes. Due to a Shopify API limitation, it is not possible to remove them using the import.
Exporting: These columns are only included in the export file if Country-Specific HS codes are present for at least one product.
Metafields and SEO
Metafields can be imported and exported with products to store custom data, SEO information, and additional attributes. You can export:
Product metafields
Variant metafields
SEO fields are special metafields that can be referenced using either their metafield column name or a shorthand:
SEO Title:
SEO TitleorMetafield: title_tagorMetafield: global.title_tagSEO Description:
SEO DescriptionorMetafield: description_tagorMetafield: global.description_tag
If no SEO title or description is provided, Shopify automatically generates them from the product's title and description.
For rich text metafields (type rich_text_field), you can provide HTML content that will automatically convert to Shopify's JSON format during import.
To start from a spreadsheet pre-filled with your store's product and variant metafield columns (plus example values for each type), open Altera and go to Tools > Metafield import template and click Create template. See the metafield import template guide for details.
For detailed information about working with metafields, see our Metafields guide.
Google Shopping
Google Shopping columns let you import the product attributes used by Shopify's Google & YouTube sales channel. They use the column-name format Google Shopping / [Field] and are stored as product metafields in the mm-google-shopping namespace.
Each Google Shopping / [Field] column maps to the metafield mm-google-shopping.[key], where the key is the field name lowercased with spaces replaced by underscores. For example, Google Shopping / Age Group is stored as mm-google-shopping.age_group. Setting Google Shopping / [Field] is equivalent to setting the matching Metafield: mm-google-shopping.[key] column directly.
Commonly used columns:
Google Shopping / Google Product CategoryGoogle Shopping / GenderGoogle Shopping / Age GroupGoogle Shopping / MPNGoogle Shopping / ConditionGoogle Shopping / Custom ProductGoogle Shopping / Custom Label 0throughGoogle Shopping / Custom Label 4
Google Shopping / MPN
Description | Example Value |
Example Google Shopping field (Manufacturer Part No.) |
|
Values are stored as single line text in the mm-google-shopping namespace at the product level. To remove a value, clear the cell (an empty value deletes the metafield). To set these attributes per variant instead, use Variant Metafield: mm-google-shopping.[key] columns. Consult the Google Merchant Center specification for allowed values and capitalization for each field.
Export Filters
You can use these filters to limit which products are exported:
handle: Filter by product handletitle: Filter by product titlebarcode: Filter by product barcodecategory_id: Filter by category IDcollection_id: Filter by collection IDinventory_total: Filter by total inventory quantityprice: Filter by product priceproduct_type: Filter by product typesku: Filter by SKUvariant_id: Filter by variant IDvariant_title: Filter by variant titlevariant_inventory_quantity: Filter by the inventory quantity of each variant. See Variant inventory qtyvendor: Filter by vendor namecreated_at: Filter by creation dateupdated_at: Filter by last update datepublished_at: Filter by publish dategift_card: Filter by whether the product is a gift cardis_price_reduced: Filter by whether the product has a reduced pricetag: Filter by tag (include)tag_not: Filter by tag (exclude)status: Filter by product status (Active, Draft, Archived, Unlisted). Select multiple statuses withequals any ofpublishable_status: Filter by publication status (published, unpublished)combined_listing_role: Filter by combined listing role (Shopify Plus)metafield:<namespace>.<key>: Filter by the value of a product metafield, for examplemetafield:custom.wrapper. See Metafield value filters
The combined_listing_role filter accepts the values parent, child, and no_role, and lets you select more than one at once. Choosing both parent and child exports every product that is part of a combined listing - the parent and all of its children - in a single filter. See Combined Listings for how these products fit together.
Variant inventory qty
The Variant inventory qty filter exports the products that have at least one variant whose Variant Inventory Qty (the total of all locations) matches the condition. Use it to find the variants that are low or out of stock, for example Variant inventory qty less than 10. The inventory_total filter checks the total of the whole product instead, so it misses a product with one low variant and other variants in stock.
The filter accepts whole numbers with the conditions equals, does not equal, greater than, and less than.
To export only the matching variants of each product, select Limit export to selected variants below the filters. Without it, the export has all the variants of a matching product.
The export can't show a product count before it runs with this filter.
A variant that doesn't track inventory is checked with the quantity that Shopify keeps for it (usually
0), although itsVariant Inventory Qtycolumn is empty.With OR, you can combine this filter only with other Variant inventory qty filters.
The export checks every product that your other filters select. On a large store, add other filters (for example Status or Vendor) to make the export faster.
Product and Variant Grouping
When importing data with multiple rows per product (such as products with multiple variants or images), rows are grouped together to form complete product objects. The grouping and search hierarchy works as follows:
Product-Level Grouping
When your spreadsheet contains product-level fields (ID, Handle, or Title), the system groups rows using this priority order:
By ID: If a product ID is present, all rows with the same ID are grouped together. The system searches Shopify to find existing products by their unique identifier.
By Handle: If no ID is provided or no matching product is found, rows with matching handles are grouped together. The system searches for products using the handle.
By Title: If neither ID nor handle is provided, rows with identical titles are grouped together. The system searches for products with exact title matches. Note: If multiple products have the same title, the import will fail with an error.
Variant-Level Grouping
When your spreadsheet only contains variant-level identifiers (no product ID, handle, or title columns), the system uses variant fields to locate the parent product:
By Variant ID: Searches Shopify to find the product containing this specific variant
By SKU: Searches across all product variants to find products containing variants with matching SKUs
By Barcode: Searches by barcode across product variants (only when no SKU or Variant ID columns exist). Any barcode of a variant matches, not only the primary one
You can explicitly designate an identifier column by adding [ID] to the column name. For example, Variant SKU [ID] tells the system to use the SKU column to find and group products, allowing you to update product-level fields (like Title or Vendor) using only SKU values. This works for:
ID [ID](product-level ID)Variant ID [ID]Variant SKU [ID]Variant Barcode [ID]
When using the [ID] suffix, rows with the same value in that column will be grouped together as a single product, even if you're updating product-level fields. For large imports, the [ID] suffix also triggers an internal optimization that preloads store data for faster lookups.
Fallback Grouping
When your spreadsheet contains no identifying columns (no product ID, handle, title, variant ID, SKU, or barcode), the system uses these fallback methods:
By Top Row: If a "Top Row" column is present, rows are grouped using the Top Row markers. Each group of rows between TRUE values in the Top Row column becomes a single product.
All Rows Together: If no Top Row column exists, all rows in the spreadsheet are grouped together as a single product.
This fallback behavior ensures compatibility with Matrixify exports and custom data formats that don't include standard Shopify identifiers.
Variant Matching Within Products
When updating existing products, variants within the product are matched using this priority:
By Variant ID: Direct match using the variant's unique identifier
By Option Combination: Creates a hash from the variant's option values (Option1 Value, Option2 Value, Option3 Value) to match variants with identical option combinations
By SKU: Normalizes and compares SKU values to find matching variants
By Variant Barcode: Matches a variant that has this barcode among its barcodes, primary or not. The barcode is not written back, so the primary barcode stays the same
By Variant Barcodes: Matches the variant that has every barcode listed in the cell. The cell is then applied with its Variant Barcodes Command
The match doesn't depend on the Variant Barcodes Command. On a product with a single variant, a row without Variant ID, option values, SKU, or Variant Barcode matches that variant, so MERGE and UPDATE change it. A DELETE row only deletes the variant when it matches by an identifier, or when the variant is the default Default Title variant; otherwise the row is skipped with PRD104. On a product with several variants, a row identified only by a barcode that no variant has (or, for Variant Barcodes, a cell with a barcode that the variant doesn't have) fails with PRD103, unless the row has option values to create a new variant.
Multiple media files, inventory levels, and other sub-data are also grouped under their parent product using this same hierarchy.
When adding a new variant to a product, include at least one identifier column (such as Variant SKU, Option1 Value, or Variant Barcode) so that Altera can distinguish the new variant from existing ones. See How to add variants to existing products for a step-by-step guide.
