International shipping with EasyPost requires the correct combination of carrier services, customs documentation, and supported options. This article explains how customs forms and commercial invoices are created and transmitted, supported electronic submission methods, and best practices for ensuring compliance with international shipping regulations.
Prerequisites
- A carrier account with international shipping enabled
- A service level that supports international destinations
- Customs information provided in the
CustomsInfoobject - Knowledge of harmonized tariff codes for goods being shipped
Creating International Shipments
To create an international shipment with the EasyPost API:
- Create a
Shipmentobject using a carrier and service level that supports international delivery. - Include a valid
CustomsInfoobject with accurate details about the shipment contents. - Generate a label. A commercial invoice or other customs form will be included automatically if required by the carrier.
Commercial Invoices
- The
formsarray in theShipmentobject contains the commercial invoice. - EasyPost generates the invoice automatically when required.
- A physical invoice may need to be printed if electronic submission is not supported by the destination country or carrier.
See the Customs Guide for detailed information.
Customs Forms
- Customs forms are generated through the
CustomsInfoobject. - Most carriers integrate customs details directly on the shipping label.
- Separate customs forms are only required if the carrier specifically requests them.
Review the CustomsInfo documentation for more information.
Electronic Submission of Customs Forms (EDI and ETD)
- Customs information is transmitted electronically to carriers when supported.
- If electronic submission is not possible, EasyPost generates a form in the
formsarray that must be printed and attached. - The field
submitted_electronicallyindicates whether the form was transmitted electronically (true) or requires printing (false).
Suppressing Electronic Transmission
The shipment options suppress_etd is a boolean value that disables the electronic submission of the commercial invoice. When enabled:
- A generic EasyPost commercial invoice is generated in the
formsarray. - The field
submitted_electronicallyis set tofalse. - Physical copies of the invoice must be printed and attached to the parcel.
This option should only be used when shipping to countries that do not accept electronic commercial invoices.
Supported Methods
- Paperless Trade (PLT): Supported for DHL Express.
- EDI: Supported for FedEx and UPS.
-
AES/ITN: ITNs generated through AESDirect can be included in the
eel_pfcfield of theCustomsInfoobject.
Incoterm Rules
The standards for duties and taxes are established by the International Chamber of Commerce (ICC) through incoterms. EasyPost supports passing incoterm values via the options object in the API.
- DDP (Delivered Duty Paid): Seller pays duties and taxes.
- DAP/DDU (Delivered at Place / Duties Unpaid): Recipient pays duties and taxes.
- DDU has been deprecated in favor of DAP.
Example
"options": {
"incoterm": "DDP"
}Best Practices
- Always provide accurate values in the
CustomsInfoobject to avoid delays at customs. - Use correct harmonized tariff codes (
hs_tariff_number) for each unique item. - Use
customs_certifyandcustoms_signervalues to electronically certify customs forms. - Ensure package values are never set to zero; carriers require a declared value. If you don't want to keep track of the pricing, simply enter a $0.01 value to complete the form.
- Create separate
CustomsItemobjects for items with different tariff codes.
FAQs
Q: Why is customs information required for shipments to Puerto Rico?
UPS treats Puerto Rico as an international destination and requires customs data. USPS treats Puerto Rico as domestic and does not require customs data.
Q: Can multiple tariff numbers be added to a single CustomsItem?
No. Create a new CustomsItem object for each harmonized code. To look up the correct harmonized code for a shipment's hs_tariff_number, review the Harmonized Tariff Schedule and enter the name of the CustomsItem.
Q: Can EasyPost automatically sign customs forms?
Yes. Use the customs_certify and customs_signer fields in the CustomsInfo object.
-
customs_certify: A boolean value (true,false) that takes the place of the signature on the physical customs form. This is how you indicate that the information you have provided in your customs declaration is accurate.
-
customs_signer: The name of the person who is certifying that the information provided on the customs form is accurate.
Read more about customs declarations, customs forms, and signature options in the EasyPost API documentation:
Example
Q: Is it acceptable to estimate tariff numbers?
It is not recommended. Incorrect or incomplete tariff codes can cause delays. Always provide the most accurate harmonized code available.
Q: What is the difference between COD amount and CustomsItem value amount?
-
cod_amount: The cash on delivery amount expected from the recipient. -
customs_item.value: The decleared value of the contents for customs processing.
When a shipping label is generated for an international package with customs fees, enter the customs_items value into the details of the package via the customs_items value string.
Please make sure to add the currency: "currency": "USD”.