Published
ShipStation creates a customs declaration automatically for every order with an international shipping address, and fills it from data you can set once and stop thinking about. Configured properly, an international order imports with its form already complete.
The work is in deciding which of three layers each piece of data belongs in, because putting it in the wrong one is what produces a form that looks complete and is not.
ShipStation creates a declaration automatically for any order with an international shipping address. What it puts in the fields depends on three settings, in increasing order of specificity.
International Settings hold the account-wide default. The Customs Declarations option there has three values: create the declaration from the order’s items, use predefined values for everything, or leave it blank so you fill it in by hand. The default is to build from order items, which is right for almost everyone. ShipStation notes this setting affects orders that import after you change it and does not touch orders already in the account.
Product records override that. Each product has a Customs tab holding a description, a harmonization code, a declared value and a country of origin. Whatever is there wins for orders containing that product. This is the layer that does the work, and it is the one most accounts leave empty.
Preset Groups sit between the two. A Preset Group can carry a customs description, declared value, harmonization code and country of origin for every product assigned to it, which is how you set customs data for a category rather than a SKU. It behaves like a shared product default and an individual product default overrides it. What Preset Groups and Shipping Presets actually do is a separate subject; for customs, the useful property is that assigning fifty products to one group is faster than editing fifty records.
If you have a large catalogue, the Product CSV import updates all of this in bulk. That is the whole job for most operations: one spreadsheet, once.
More than people expect. ShipStation’s criteria and actions reference lists six actions that touch international shipments:
| Action | What it sets |
|---|---|
| Set Customs Content Type | Merchandise, Gift, Documents, Returned Goods or Sample |
| Set International Non-Delivery | Return to sender, or treat as abandoned |
| Set Tax Identifiers | Adds a tax ID from your International Settings to the declaration |
| Set Declaration Statement | Declaration statement on FedEx international customs documents |
| Bill Int’l Duties to Payor of Shipping Charges | Bills duties to you rather than the recipient |
| Prepay Duties and Taxes | Recipient pays on delivery, or you prepay |
Those pair with an International Order criterion that ShipStation auto-sets, plus Country, State and Postal Code, so per-destination rules are straightforward: gift declarations for one market, prepaid duties for another, a different tax identifier for a third.
Two are worth calling out. Bill Int’l Duties to Payor of Shipping Charges is the difference between a customer receiving a parcel and a customer receiving a bill at the door, which is the most common complaint on international consumer orders — ShipStation’s note is to check with your carrier how they bill those charges. And Prepay Duties and Taxes is narrow: as of August 2026 ShipStation documents it for US to Canada shipments on USPS First Class International only, at $6.95 on top of the label.
What rules do not do is carry item-level data. A harmonization code, a customs description and a country of origin are properties of a product, not of an order, and there is no rule action that sets them. That is the right split — the code for a given SKU is the same on every order containing it, so storing it per-order would mean writing it thousands of times. It goes on the product once.
Country of origin defaults to your account’s home country. ShipStation states the default value is based on your ShipStation account home country. That is the only sensible guess a platform can make — where a product was manufactured is not in any order feed — and it is correct if you manufacture domestically. If you import goods and resell them, it is wrong on every product you have not edited.
This is not a cosmetic field. ShipStation’s own guidance is blunt about it:
Never confuse the “shipped from” address with the “origin.” Providing incorrect COO data can lead to shipping delays, heavy fines, or seizure of goods.
Country of origin is where the item was manufactured or last substantially transformed, and it determines the duty rate and whether a trade agreement applies. Repackaging or relabelling does not change it. Setting it correctly is a per-product exercise you do once and then stop thinking about.
Discounted orders declare the discounted price. ShipStation is explicit that it does not adjust this for you:
When orders with discount-priced items import, ShipStation does not automatically change the declared customs value of those items. This is because discounts are unique to each merchant’s policies. You must manually change the price of each item listed on the customs forms to reflect the discounted price.
Read that carefully, because it cuts both ways depending on how your channel reports the order. What arrives is whatever the marketplace sent, and on a heavily promoted catalogue the declared value can drift a long way from the value you would want to defend to a customs officer or claim against an insurer. It is the same field the insurance amount derives from, which is worth knowing if you sell on promotion often.
The requirement has hardened over the last three years and the sequence matters.
The EU has required HS codes on all shipments entering member countries since March 2023, as part of its Import Control System 2 reform. The requirement applies regardless of which carrier you use. ShipStation notes it will not stop you creating a label without a code, so nothing in the interface prevents you from shipping non-compliant.
USPS followed. From the DMM advisory:
Effective September 1, 2025, mailers worldwide must provide, at minimum, the applicable 6-digit HS code for each item in an international shipment.
There is a provision in that advisory worth knowing, because it is not in most summaries of the rule:
USPS customers do not need to look up these numerical codes if they provide a detailed description of each item on their customs form.
So for USPS specifically, a genuinely detailed description satisfies the requirement. That is a smaller job than classifying a catalogue, and it is a reasonable interim position while you work through the codes properly. It does not help you with the EU, where the code itself is required.
“Detailed” has a meaning here. USPS wants a description that explains what the goods are, what they are made of and what purpose they serve. “Clothes” fails. “Men’s cotton shirt” passes. The EU maintains its own guidance on unacceptable goods descriptions listing generic terms that will not be accepted along with alternatives that will, and ShipStation publishes the list of stop words it has been given, which includes Consumption, Ensemble, Item, Promotional, Miscellaneous and N/A. Those terms are not banned outright — they are unusable on their own, and fine inside a description that identifies the product.
Codes are looked up at the Harmonized Tariff Schedule for US exporters, and USPS runs a lookup tool that takes a description and returns a code.
This one is not in the interface and it is the reason international forms fail to print.
Every carrier caps the number of line items on a customs form, and the caps are far apart. As of August 2026, ShipStation publishes them as follows. These are carrier API limits and they move, so re-check before designing around one:
| Carrier | Maximum customs line items |
|---|---|
| USPS | 30 |
| UPS | 50 |
| FedEx | 99 |
| DHL eCommerce (US and EU) | 99 |
| GlobalPost | 255 |
| DHL Express | 999 |
ShipStation creates one declaration per distinct product in the shipment. A 60-line B2B order is fine on FedEx, fails on UPS, and is twice the USPS limit.
The fix is consolidation, and it is legitimate when the items genuinely are the same thing: ShipStation lets you merge declarations for identical products and set the quantity, so twelve of one shirt is one line rather than twelve. What you cannot do is merge things that are actually different, because the description and the code have to be right per line.
If you routinely ship high-line-count international orders, the carrier choice is partly a customs-form choice. That is not a consideration Rate Shopper knows anything about, and it is a reason to keep high-line-count orders out of a comparison that could hand them to the carrier with the tightest cap.
Three that catch people, all documented by ShipStation.
Mexico requires a Package Description in addition to the item descriptions — a 35-character summary of what is in the parcel, required since 1 March 2023. On a multi-package shipment it is required per parcel, and the field appears for each one in the Package Set popup.
A Manufacturer Identification (MID) code field appears only when the ship-from address is outside the US and the ship-to address is in the US. If you ship into the States from elsewhere, this is increasingly asked for, particularly on textiles.
Tax identifiers are conditional. ShipStation’s field reference says they are required for EU shipments over €150 or where you charge VAT or GST at checkout. Store them in International Settings once.
Which document appears depends on the carrier. USPS prints the declaration on the label, so nothing separate is generated. UPS and FedEx submit electronically. Others return a PDF that arrives with the label, and the Customs Forms column on the Shipments grid tells you which of the three happened for a given shipment.
Two rules about the paper forms worth remembering: a CN23 can be substituted for a CN22, but a CN22 cannot be substituted for a CN23. And a commercial invoice records the agreement between shipper and receiver — who is responsible, who pays the duties, whether they are already paid — which the CN22 and CN23 do not.
Most international shipments also need a phone number or email for the recipient. If your channel does not pass one, that is a data problem to solve at the store connection rather than at the customs form.
Pull a product export and look at three columns: customs description, harmonization code, country of origin. If they are empty, that is the entire project, and it is a spreadsheet rather than a configuration exercise.
Then check one thing in the interface. Take a recent international order with more than a handful of distinct items, open the Customs Declarations section, and count the lines against the cap for the carrier you sent it with. That is the failure that arrives without warning, and it is easier to find deliberately than at four in the afternoon on a Friday.
Customs data being correct does not make duties predictable. Whether the recipient is billed on delivery, whether you prepaid, and what the destination charges are all decisions made outside ShipStation, and a customer who gets an unexpected bill at the door experiences it as your fault regardless of who was right about the paperwork.
That is a checkout question rather than a fulfillment one, and it belongs next to the rest of what you tell the customer before they pay.
An international order carries decisions a domestic one does not: who pays the duty, which tax identifiers the declaration needs, which service is worth the transit, and how the contents have to be described. Each of those is correct per order and per destination rather than set once.
String builds and maintains that logic inside existing ShipStation accounts, for operations shipping roughly 6,000 orders a month or more. Below that, product-level customs data and ShipStation's International Settings will cover most of it.