Shopify customs errors: every message, cause and fix
Shopify's customs error messages are terse and they all sound like the same problem. They aren't. Some are format validation, some are missing data, one is a geography surprise, and one only bites developers. This is the index: find your exact message, get the cause and the fix, and follow the link if you need the long version.
Quick index
| Error message | Real cause | Fix |
|---|---|---|
| Harmonized code is invalid | Wrong shape, not wrong classification — odd digit count, letters, or stray characters | Jump to fix |
| HS codes and country of origin are required | One or more items in the order have empty customs fields | Jump to fix |
| Customs information is required for this order (domestic) | The order crosses a customs boundary that doesn't look like a border | Jump to fix |
| You can't purchase a shipping label / label blocked | Carrier rejects incomplete customs data at intake | Jump to fix |
| Country of origin is required | Origin empty, or set to the shipping country by mistake | Jump to fix |
| Weight can't be blank / weight required | Variant weight is 0 or unset | Jump to fix |
| GraphQL: harmonizedSystemCode rejected on productCreate | Field is on the inventory item, not the product or variant | Jump to fix |
"Harmonized code is invalid"
What Shopify is actually checking: the shape of the string, not whether the code is correct for your product. The rule is digits only, and an even number of them — 6, 8, or 10.
The five things that trigger it:
| Input | Why it fails |
|---|---|
6109100 | 7 digits — odd. Codes come in even lengths. |
6109.10.00 12 | Trailing space or embedded whitespace |
HS6109.10 | Letters. Prefixes like "HS" or "HTS" aren't part of the code. |
61091 | Fewer than 6 digits — below the international minimum |
6109.10.0012.00 | More than 10 digits |
Fix: strip dots, spaces and letters, then count. If you land on 7 or 9 digits you've probably truncated a 8- or 10-digit national code — go back to the source rather than padding with a zero, because a padded code is a different classification. Dots are fine to type; Shopify strips them. Full breakdown of this error →
"HS codes and country of origin are required"
Cause: at least one item in the order has an empty HS code or country of origin. Shopify names the requirement but not the offending line item, which is why this one wastes so much time.
Fix for one order: open each product in the order → Shipping section → Customs information → fill both fields. Remember they're set per variant, so a product with five sizes has five separate places this data lives, and filling the first one doesn't fill the rest.
Fix for the pattern: if this keeps happening, the catalog has systematic gaps and fixing them order by order is a treadmill. Three ways to find every product missing a code → · Full breakdown of this error →
Customs information demanded on a "domestic" order
Cause: the order crosses a customs boundary that doesn't look like an international border. The usual suspects:
- US mainland → Puerto Rico, Guam, US Virgin Islands, American Samoa
- EU mainland → Canary Islands, Ceuta, Melilla (in the EU customs union for some purposes, outside for others)
- France → overseas departments such as Martinique or Réunion
- Your fulfilment location is in a different country than you assume — a 3PL or dropship supplier abroad makes every order international
Fix: check the actual origin and destination on the order rather than the customer's apparent country. If it's a territory case, the customs data is genuinely required and there's no way around it. Full breakdown →
Shipping label blocked at purchase
Cause: this is usually downstream of one of the errors above. Since the de minimis suspension, carriers require complete customs data before accepting an international parcel, so they've pushed validation to label purchase rather than risking a hold at the border. Shopify surfaces the rejection.
Fix: complete the customs fields on every variant in the order, then retry. Two things worth knowing:
- A description that reads as a real product matters too. "Item #4492-B" invites inspection; "women's cotton t-shirt" clears.
- A zero weight will block some carriers even when HS code and origin are present.
Don't route around this by switching carrier or service. The parcel still has to clear customs at the other end, and a label bought without complete data becomes a hold instead of a rejection — which is worse, because it happens after the customer is expecting delivery. Why carriers tightened this →
"Country of origin is required"
Cause: the field is empty. But there's a second, quieter failure here that produces no error at all and costs more: setting origin to where you ship from rather than where the product was made.
Country of origin means the country of manufacture or substantial transformation. A shirt made in Portugal and shipped from a New Jersey warehouse is Portugal. Declaring it as the US is a misdeclaration — it applies the wrong duty rate and forfeits any trade-agreement treatment the real origin might qualify for.
Fix: get origin from your supplier or the product label, not from your logistics setup. If you genuinely don't know for a product, that's a supplier question, not a guess. Where the field lives and how to set it in bulk →
Weight missing or zero
Cause: variant weight unset or left at 0, which is easy to miss because Shopify only enforces it at the point of buying a label.
Fix: set a real shipped weight per variant — packaging included, since that's what the carrier bills. Beyond the error itself, weight feeds duty-by-weight lanes in some destinations, so a placeholder value can produce a wrong duty assessment rather than a clean failure. Digital products and gift cards should be marked as not requiring shipping, which removes them from this check entirely.
GraphQL: harmonizedSystemCode rejected
Cause: the field isn't where most people look for it. HS code and country of origin live on the inventory item behind a variant, not on the product and not on the variant itself. Passing harmonizedSystemCode at product level in productCreate gets rejected or ignored.
Fix: set it through the inventory item — either nested as inventoryItem input on the variant mutation, or with a separate inventoryItemUpdate call carrying harmonizedSystemCode and countryCodeOfOrigin. Two things that catch people out:
countryCodeOfOrigintakes a two-letter ISO code (PT), not a country name.- The same even-digit validation from the admin applies at the API layer, and the error message is less helpful there.
Check the current field placement against Shopify's API reference for the version you're targeting — this has moved between versions. Origova's docs →
When the errors are a symptom, not the problem
One or two of these is a bad afternoon. Hitting them repeatedly means the catalog has systematic gaps, and every new product or supplier import reopens them. Shopify offers no report of which products are missing customs fields — the bulk editor will let you type codes but won't tell you where they're absent, and the product CSV has no column for two of the four fields.
That's the gap Origova fills: it scans the whole catalog, lists every variant missing an HS code, country of origin, or weight, flags malformed codes before Shopify or a carrier rejects them, and applies fixes in bulk — reversibly, written straight back to Shopify, with gift cards and digital products excluded automatically.
Frequently asked questions
Why does Shopify say harmonized code is invalid?
Shopify validates the shape of an HS code, not its accuracy. The code must be digits only and an even number of them — 6, 8, or 10. An odd digit count, a stray letter, a trailing space, or a code padded with zeros to 7 or 9 digits will all be rejected. Strip dots and spaces, count the digits, and make sure the total is even.
Why can't I buy a shipping label without HS codes?
Since the de minimis suspension, carriers require complete customs data before they'll accept an international parcel, so Shopify blocks label purchase when the HS code or country of origin is missing from any item in the order. The fix is to add the missing data to the variants in that order, not to work around the label screen.
Why is Shopify asking for customs information on a domestic order?
Usually because the order crosses a customs boundary even though it looks domestic — US shipments to Puerto Rico, Guam, or other territories, EU shipments to the Canary Islands, or shipments from a fulfilment location in a different country than the customer. Check where the order is actually shipping from and to.
Why does the productCreate GraphQL mutation reject harmonizedSystemCode?
The field lives on the inventory item, not the product or the variant. In current API versions you set it via inventoryItem input with harmonizedSystemCode and countryCodeOfOrigin, or with a separate inventoryItemUpdate call. Passing it at product or variant level will be rejected or silently ignored.
How do I find every product missing an HS code in Shopify?
Shopify has no native report for this. The three realistic methods are walking the admin product by product, exporting the inventory CSV and filtering it, or using an app that scans the catalog. There's no filter in the admin product list for missing customs fields.
Does country of origin mean where I ship from?
No, and this is the most expensive misunderstanding in customs data. Country of origin is where the product was manufactured or substantially transformed, not where your warehouse is. A shirt made in Portugal and shipped from a New Jersey warehouse has Portugal as its country of origin.
Primary sources: the official Harmonized Tariff Schedule (hts.usitc.gov) and Shopify Help Center.
Related: Harmonized code is invalid: the fix · HS codes and country of origin are required · Customs info on a domestic order · Find products missing HS codes · Origova support