Shopify 商品 CSV 校验器
Shopify 是在导入之后才告诉你哪里错了 —— 而最贵的那个错,也就是覆盖线上商品,它压根不会告诉你。先把文件查一遍。
🔒 你的商品数据不会离开浏览器。
把你店里现有的 handle 加进来,以便检查是否会覆盖(可选,推荐)
在 Shopify 后台:商品 → 导出 → 全部商品,然后把 Handle 那一列粘到这里(每行一个)。什么都不会上传 —— 比对在你的浏览器里完成。
没人会警告你的那个导入错误
Shopify 按 Handle 匹配商品。如果你 CSV 里的某个 handle 在店里已经存在,导入就是更新那个商品 —— 用你文件里的内容替换掉它的标题、描述、定价和变体。而导入会报告成功。界面上没有任何东西告诉你,线上商品已经被重写了。
这就是校验器要你提供现有 handle 的原因:在你点下导入之前,这是唯一能知道「哪些商品即将被替换」的办法。
同一个 handle 的各行必须挨在一起
一个商品的所有行必须相邻。如果同一个 handle 在文件更靠后的地方 —— 在别的商品之后 —— 又出现一次,Shopify 会把后面那一段当成同一商品的另一次导入,于是前一段里的变体消失了。按 handle 排序就能避免。
为什么要在这里查条码?
Shopify 对条码字段里的任何文字照单全收,不做校验。那个坏掉的条码随后流进你连接的每一个销售渠道 —— Google、Meta、Amazon —— 并在那些地方把你的商品拒掉,离造成它的那个文件已经很远。本校验器对这一列跑完整的 GS1 检查。
本工具执行的全部检查(24 条规则)
表头与文件结构
SHP-H01 缺 Handle 列
Handle 是 Shopify 用来指认每个商品、并把商品与它的变体归到一起的那一列。没有它,导入直接失败。
修复: 加一列 Handle。用小写单词加连字符,例如 "stainless-water-bottle"。
SHP-H02 缺 Title 列
每个新商品都必须有 Title。「Invalid CSV header: missing headers: Title」是被报告最多的导入错误之一 —— 它通常意味着表头行被改过名,或者这个文件是从别的平台导出来的。
修复: 加一列 Title,一字不差地写作 "Title"。
SHP-H03 这个列名不是 Shopify 的标准字段
这一列与 Shopify 的模板对不上。不认识的列在导入时会被忽略,所以像 "Vairant Price" 这样的拼写错误不会大声失败,而是悄悄把那一列数据丢掉。
修复: 对照 Shopify 商品 CSV 模板核一下拼写;确实是有意加的列就删掉(metafield 列要写成完整的 "Metafield: namespace.key [type]" 形式)。
SHP-H04 重复的列
SHP-H05 这一行的字段数与表头不一致
某一行的字段比表头多或少,通常意味着有一个逗号没被引号包住,或者某个取值里夹了换行。取值会整体左移或右移,落进错误的列。
修复: 含逗号或换行的取值用双引号包起来,取值内部的引号写成两个。
handle 与商品分组
SHP-D01 Handle 是空的
SHP-D02 Handle 里有非法字符
handle 只能包含小写字母、数字和连字符 —— 它会成为商品 URL 的一部分。大写字母、空格、下划线、斜杠和带重音的字符都不合法。
修复: 转成小写,其余字符一律换成连字符:"Water Bottle 1L" → "water-bottle-1l"。
SHP-D03 同一个 handle 的行被拆散在文件各处
共用一个 handle 的所有行必须相邻。当一个 handle 在别的商品之后再次出现时,Shopify 会把后面那一段当成同一商品的另一次导入 —— 后一段覆盖前一段,前一段里的变体随之消失。
修复: 按 Handle 排序,让每个商品的各行挨在一起。
SHP-D04 Handle 撞上了店里已有的商品(有静默覆盖风险)
导入按 Handle 对照。如果这个文件里的某个 handle 在你店里已经存在,导入会直接改掉那个线上商品,而不是新建一个 —— 而且没有任何提示。这是 Shopify 导入里最贵的一次事故:界面报告「成功」,线上商品却已被悄悄替换。
修复: 导入之前先把当前商品导出一份,对一遍 handle。真正是新商品的,给它一个店里还不存在的 handle。
SHP-D05 商品级字段在变体行上重复出现
只有一个 handle 的第一行承载商品级字段(Title、Body、Vendor、Type、Tags)。在变体行上重复它们对 Shopify 来说不算错误,但同一 handle 的各行之间取值一旦冲突,其中一个就被悄悄丢掉了。
修复: 每个 handle 的第二行及以后,把商品级的列留空。
变体与选项
SHP-V01 有选项取值,却没有选项名
某一行给了 "Option1 Value",但这个商品没有 "Option1 Name"。Shopify 会以「You need to add option values for …」拒绝导入。
修复: 在该 handle 的第一行设好 Option1 Name(例如 "Size"),并给每个变体行一个 Option1 Value。
SHP-V02 变体行上有选项名却没有取值
商品声明了一个选项(例如 Size),但这个变体行把对应的取值留空了。每个变体都必须为每个已声明的选项给出取值。
修复: 把这一行的选项取值填上;如果这个商品本来就没有变体,就把该选项去掉。
SHP-V03 重复的选项组合
同一商品的两个变体行有完全相同的选项取值(例如两行都是 Size=M、Color=Blue)。Shopify 保留一个,丢掉另一个。
修复: 一个商品的每个变体都需要一组独一无二的选项取值组合。
SHP-V04 一个商品的变体太多
SHP-V05 跨商品重复的 SKU
字段取值
SHP-F01 价格无效
价格必须是用句点作小数点的纯十进制数 —— 不能有货币符号,不能有千分位,也不能用逗号当小数点。"1,299.00" 和 "$19.99" 都过不了。
修复: 写 1299.00 和 19.99。导出之前把该列设为文本,或者设为不带分隔符的数字格式。
SHP-F02 图片 URL 无效
Image Src 必须是一个完整、公网可达、以 http:// 或 https:// 开头的 URL。相对路径和本地文件路径通不过校验(报出来的错误是「Validation failed: Invalid URL provided」)。
修复: 用公网托管图片的完整 URL。
SHP-F03 布尔取值无效
Published、Variant Requires Shipping、Variant Taxable 和 Gift Card 只接受 TRUE 或 FALSE。像 "yes"、"1"、"Y" 这样的写法会被拒绝。
修复: 用 TRUE 或 FALSE。
SHP-F04 库存策略取值无效
Variant Inventory Policy 只接受 "deny"(缺货即停售)或 "continue"(缺货继续卖)。
修复: 用小写的 deny 或 continue。
SHP-F05 重量或库存数量无效
Variant Grams 与 Variant Inventory Qty 必须是数字。取值里夹着文字或单位("500g"、"12 pcs")会被丢掉,或者让这一行失败。
修复: 字段里只放一个光秃秃的数字;单位属于 Variant Weight Unit。
SHP-F06 条码无效
Variant Barcode 这一列通不过 GS1 校验。Shopify 把你给的东西原样存下,但一个坏掉的条码会传播到你连接的每一个销售渠道 —— Google、Meta、Amazon —— 并在那些地方把你的商品拒掉。
修复: 拿商品上印的号码核对一遍条码,并把该列设为文本格式,免得表格软件继续把它弄坏。
编码与脏数据
SHP-E01 弯引号或非 UTF-8 标点
没被引号包住的字段里出现弯引号(“ ”)或其他 Word 风格的标点,会把 CSV 解析弄坏 —— Shopify 报的是「illegal quoting」错误。它们来自在 Word 或 Google Docs 里写的文案。
修复: 把文件存成 UTF-8 CSV,并把数据字段里的弯引号换成直引号。
SHP-E02 被表格软件弄坏的取值
这个取值带着表格软件做数字转换的指纹:科学计数法(8.71E+12)、末尾多出的 ".0",或者一个丢了前导零的条码。光靠这个文件本身,原始数据往往已经找不回来了。
修复: 从源头重新导出,并把受影响的列设为文本格式。
SHP-E03 字段里有不可见字符
取值里有零宽空格、不换行空格,或者一个 BOM。它们在表格里看不见,却会成为商品标题、handle 或 SKU 的一部分 —— 这就是为什么两个「一模一样」的 SKU 后来会对不上。
修复: 把受影响的取值重新敲一遍,或者在导入前先清洗文件。
关于这些规则。 每一条都有编号、严重级别和通俗解释。每个来源链接都已登记在案,并对线上页面实际复验过,而不是凭印象写上去的. 规则如何编写、测试与保持更新 →