GoatLabels GoatLabels
Outbound from the US, not inbound to it.

Customs forms for a small parcel going abroad


Written for the person filling it in.

A US seller shipping a small parcel abroad files USPS PS Form 2976 — the CN22 short declaration — or 2976-A/CP72 above the value threshold, or the carrier's own commercial invoice on UPS, FedEx, and DHL. Most guides explain these forms to importers, not to the person filling one in.

Customs items, not a paper form

Description, declared value, country of origin, quantity, and the HS code you supply — entered once as item rows, printed onto whichever declaration the service requires.

UPSFedExDHLUSPS all quoted
Declaration built From the item rows you enter.
Saved templates Repeat SKUs entered once.
Duties prepaid Where the service supports DDP.

Duties inside the same all-in price

On services that support prepaid duties, the tax is quoted with the freight as one number that leaves your prepaid wallet — so no stranger phones your buyer for money.

VisaMastercardAmerican ExpressApple PayGoogle PayBitcoinEthereumTether (USDT)
DDP quoted Duty inside the price you compare.
Prepaid wallet Card, Apple Pay, ACH, or crypto.
Billy drafts copy Descriptions, not classifications.

Which form you actually file as a US seller

Almost everything written about customs forms is written for the person receiving a parcel, not the person sending one. If you are a US seller putting a small box on a plane, here is the short version. Shipping by post, you file USPS PS Form 2976 — which is the CN22 short declaration, the green sticker people recognise — for a low-value parcel, and PS Form 2976-A, the CP72 set, once the value goes above the threshold. CN22 is a Universal Postal Union form rather than a foreign one, and PS Form 2976 is the US implementation of it, so the two names describe the same document rather than competing options.

In practice you will not hand-write either. Buying an international label online generates the combined customs-declaration-and-label form from the data you entered, which means the real task is not filling in a form at all: it is entering customs items. A customs item is a row with a description, a quantity, a declared value, a country of origin, and an HS code. The form is a rendering of those rows. Once you see it that way the whole thing gets easier, because you stop trying to write a good sentence in a box and start describing goods.

Shipping with UPS, FedEx, or DHL instead, there is no CN form in the picture. Those carriers use a commercial invoice, historically three printed copies in a pouch and now usually uploaded electronically with the shipment. The information is the same information — the same description, the same quantity and unit value, the same country of origin, the same code — in a different container. Which is why the work of getting international shipping right is not learning four form layouts. It is learning to describe your own products the way a customs system needs them described, once, and then reusing it.

Writing a description that does not get the parcel held

A customs officer needs to answer one question from your description: what tariff line does this belong to? If your text does not let them, the options are to open the box or to hold it until someone explains. Both are slow, and both are avoidable with about eight extra words.

The four descriptions that reliably stall a parcel are gift, sample, merchandise, and the bare category name. Clothing is a bare category name; so is jewellery, so are parts and accessories. The fix is a formula: material, then item, then use where it is not obvious. Instead of clothing, write a women's knitted cotton sweater. Instead of jewellery, write a sterling silver pendant necklace, not set with precious stones. Instead of parts, write a stainless steel replacement hinge for a wooden jewellery box. None of that is longer than a tweet and all of it is the difference between automated clearance and a physical inspection.

Three rules go with it. Use one row per distinct item rather than bundling a mixed order into a single line, because a mixed line cannot be classified. Declare what the buyer paid, not your cost, not the wholesale price, and never zero — an undervalued parcel is a misdeclaration with your name on it, and it also destroys your own insurance claim if the parcel is lost, since the declared value is the ceiling on what you can recover. And do not mark a sold item as a gift to help the buyer avoid duty. It is a false declaration, the person signing it is you, and the destination's systems are considerably better at spotting it than they were.

On GoatLabels, Billy drafts the customs description from the order text you paste or screenshot, so the first version of the row is written for you and you edit rather than compose. What Billy does not do is choose your HS code — that is the next section, and it is deliberately your decision.

Finding an HS code without hiring a broker

The Harmonized System is an international product taxonomy. The first six digits are common across almost every country that uses it, and national systems extend them: the US export code, Schedule B, is ten digits built on those first six. For a small parcel the six-digit code is usually enough to satisfy the destination's electronic advance data, and the ten-digit Schedule B is what US export reporting expects at higher values.

Two free tools do the whole job. The Census Bureau publishes a Schedule B search, and the US International Trade Commission publishes an HTS search. The trick to using either is to search by what the thing is made of and how it was made, not by what you call it in your shop. The system is organised around material and process, so a search for cotton knitted pullover lands where you need to be and a search for hoodie does not. Work down from the chapter rather than trusting the first result: the chapters are grouped by material, the headings by product family, and reading the neighbouring lines tells you whether you have the right one far better than the search ranking does.

Then stop doing it. Almost every small seller ships a short list of repeating SKUs, so classify each one once and save it. GoatLabels stores saved customs templates for exactly this: the description, the declared value, the country of origin, and the code you supplied, reused on the next parcel of the same thing. Twelve minutes of classification up front removes the field from the next two hundred labels.

The boundary is worth stating plainly, because it is where a lot of shipping software is vague. GoatLabels carries an HS code field and stores the code you enter. It does not classify goods for you. A misclassification is the shipper's legal liability, not the platform's, and any tool that offers to pick the code for you is offering an opinion that you are the one signing. If your product is genuinely ambiguous — a composite material, a kit, anything with electronics inside something else — that is the case where a customs broker earns their fee once and you reuse the answer forever.

DDP versus DDU: who gets the bill at the door

Every international parcel resolves one question: who pays the destination's duty and tax. Under DDU, sometimes labelled DAP, the buyer pays. Concretely that means the carrier or the destination post contacts your customer, asks for money and often a handling fee on top, and holds the parcel until they pay. From the buyer's side this is a stranger demanding money for something they already paid for, and it is the single largest source of international refund requests, negative feedback, and refused deliveries for small sellers. The parcel then comes back, and you have paid twice to sell nothing.

Under DDP the duties and taxes are calculated and prepaid at label time. Your buyer receives the parcel exactly like a domestic one. It costs more at purchase and it costs dramatically less in support time and refunds, which is why the right default for a small seller is DDP where the service supports it, with the duty priced into the item or into your shipping charge rather than absorbed silently.

On GoatLabels the international services that support prepaid duties quote them inside the same all-in number as the freight, so a DDP quote and a DDU quote are directly comparable rather than one of them hiding a cost that lands on your customer later. That exact number leaves your prepaid wallet when you buy. The general case for quoting all four carriers rather than defaulting to one is made on cheap shipping labels, and the fees that attach to a destination rather than to a parcel are on shipping surcharges explained.

One more destination type belongs here in a sentence: military APO, FPO, and DPO parcels need a customs declaration even though you are paying domestic postage, and the address formatting that makes them deliverable at all is on can UPS or FedEx deliver to a PO Box.

Thresholds and policy, checked 2026-08-03

This is the only block on the page containing a threshold, a date, or a policy specific, and it is the fastest-moving material here. De minimis rules have been changing in several major markets, so treat everything below as a pointer to a primary source rather than as a settled fact.

Verify against USPS Publication 699, the International Mail Manual, and the destination's own customs guidance before relying on any threshold above. Review cadence: quarterly while de minimis policy is moving.

Items in, declaration out

Describe the goods once. Reuse it forever.

An international label is a domestic label plus a set of item rows. Enter what is in the box, what it is made of, what the buyer paid, where it was made, and the code you supply — and the declaration the service needs is generated from that. Save it against the SKU and the next parcel of the same thing is a two-tap job.

1
The order and the destination
Pasted, screenshotted, or synced
buyer_dm

Can you send the cotton sweater to Lisbon? Happy to pay the shipping — just don't want a bill at the door.

Store order
Ships to Portugal
Saved template
Cotton sweater, HS 6110.20
Customs item entered
Description
Women's knitted cotton sweater
Quantity
1
Declared value
What the buyer paid
Country of origin
United States
Paste the order or pick a saved customs template

One row per distinct item, described by material and product rather than by category. A mixed line cannot be classified, and a bare category name is what gets a box opened.

2 Billy AI

Drafts the description. You supply the code.

Billy AI
  • Turns a pasted order or a screenshot into item rows with a usable description
  • Validates the destination address before anything is paid for
  • Never picks your HS code — you enter it, because a misclassification is the shipper's liability
  • Included on every plan, so international orders cost nothing extra to draft
Described. Valued. Ready to declare.
3
Declaration generated, duties chosen
DDP where the service supports it
Paid from the prepaid wallet
Card, Apple Pay, Google Pay, ACH, or crypto
$12.47
USPS
Label and customs form printed together
Duties inside the same all-in number
$12.47

Save the finished item as a customs template and the next parcel of the same SKU reuses the description, the declared value, the country of origin, and the code you entered.

Every storefront. One set of item rows.

International orders from every channel you sell on.

Shopify, Etsy, WooCommerce, and TikTok Shop sync into the To Ship queue, so an order heading to Lisbon arrives with the destination already attached and only the customs items left to enter. Paste an Instagram or Facebook DM and Billy drafts the description row straight from the message.

Shopify logo Shopify
Etsy logo Etsy
WooCommerce logo WooCommerce
TikTok Shop logo TikTok Shop
Amazon logo Amazon
eBay logo eBay
Squarespace logo Squarespace
Wix logo Wix
Walmart logo Walmart
Shopify Plus logo Shopify Plus Soon
Square logo Square
BigCommerce logo BigCommerce
Magento logo Magento
Zapier logo Zapier Soon
NetSuite logo NetSuite Soon
Ecwid logo Ecwid Soon
Temu logo Temu
Shein logo Shein Soon
ChannelAdvisor logo ChannelAdvisor Soon
SkuVault logo SkuVault Soon
Zoho Inventory logo Zoho Inventory Soon
What an international parcel actually needs.

The form is the easy part.
The item rows are the work.

Everything below exists to make the customs data you enter accurate the first time and reusable every time after — and to keep the duty out of your buyer's inbox.

Prepaid wallet,
duties drawn from it too

Fund it with card, Apple Pay, Google Pay, ACH, or crypto. On services that support prepaid duties the tax is bought from the same balance as the freight, in the same transaction, with no monthly minimum to print and nothing billed in a month you did not ship in.

Wallet balance
$1,247.36 USD
AI

Billy drafts the description,
you supply the HS code

Paste the order or drop a screenshot and Billy writes the customs description into an item row for you to review. It does not classify goods and it will not choose your code, because a misclassification is the shipper's liability and nobody should sign an opinion they did not make.

Billy LIVE
Where's the package to Maya?
It's in transit via UPS. Expected Friday, Aug 7.
UPS
1Z8923A6B05G4123456
In transit
Austin, TX → Dallas, TX
Ask Billy anything...

Duties inside
the number you compare

Where the service supports prepaid duties, tax is quoted with the freight as one all-in figure, so a DDP quote can be compared honestly against a DDU one instead of hiding a cost that lands on your customer a week later. That exact amount leaves your balance.

Shipment summary
UPS Ground $12.49
Insurance $0.75
Fuel surcharge $0.32
Total $13.56

Postal and carrier routes,
quoted side by side

USPS uses the CN22 and CP72 declarations; UPS, FedEx, and DHL use a commercial invoice. Same data, different container — which is why quoting all four against the same parcel is worth doing rather than picking a route because you already know its paperwork.

Compare rates
UPS UPS $12.48
FedEx FedEx $13.22
DHL DHL $14.10
USPS USPS $11.79
Duties & taxes paid

Customs items
over the REST API

Send customs item rows with the shipment call — description, quantity, declared value, country of origin, and your HS code — on unlimited calls on every plan. Saved templates keep repeat SKUs consistent whether the label is bought by a human or a script.

POST /v1/shipments
{
"to": { "name": "Maya" },
"from": { "name": "Alex" },
"service": "ups_ground",
"label_format": "pdf"
}
Webhook delivered
GoatLabels mobile shipments queue with an international order ready to declare
Billy drafting a customs item row from a pasted order on mobile

Declaration ready

CL-1038 · Lisbon, PT

Declare it from the packing table

The item rows, one thumb.

Nothing about a customs declaration needs a desktop. The order, the item rows, the saved template, the DDP choice, and the buy button all fit on the phone next to the tape gun — which matters, because the version of this job that gets done badly is the one done later on a laptop from memory.

Paste or snap the order and Billy drafts the customs description into an item row for you to check.
Pick a saved customs template and the description, declared value, country of origin, and your HS code come back filled in.
The destination address is validated before you spend anything — a returned international parcel costs more than the label did.
Choose prepaid duties where the service supports it and the tax is quoted inside the same all-in number.
One-tap print sends the label and its declaration to your phone's share sheet or a thermal printer over Wi-Fi.
Billy is included, not a paid tier

Ask about the parcel instead of hunting for it.

An international parcel spends most of its life somewhere you cannot see, and the question you actually have is never a form question — it is where is it and has it cleared. Hold the mic and ask. Billy pulls the tracking history for that shipment and reads it back, remembers the buyer and the saved box, and drafts the customs description on the next order to the same destination. This is the real product, not a render.

goatlabels.io/dashboard/shipments — Billy
Billy reading back an international parcel's tracking history over the purchased labels list

Listening

"Where's Maya's package?"

Out for delivery

CL-1039 · Austin, TX · by 6 PM

Speaks plain English · drafts the customs description, never your HS code · remembers customers and saved boxes · included on every plan, never a pricier tier.

All-in quotes

Duties inside the same number.

An international quote that excludes the destination's tax is not a price, it is an estimate with your buyer's doorstep attached. Every column here is one all-in figure with the duties and taxes already counted, so a prepaid-duty service can be compared honestly against one that bills your customer later.

US → DE 2.6 lbs 12×8×4 in
USPS

USPS

Priority Mail Intl

10–15 days

$7.40

$1.90 of duties & taxes prepaid, not billed to your buyer

all-in · no surprises

FedEx

FedEx

Intl Connect Plus

3–5 days

$8.90

$2.20 of duties & taxes prepaid, not billed to your buyer

all-in · no surprises

Duties prepaid
DHL

DHL

Express Worldwide

1–2 days

$9.80

$2.50 of duties & taxes prepaid, not billed to your buyer

all-in · no surprises

No door bill for your customer Void → credit straight back to your wallet Multi-currency display
Public API v1

Customs items in code, for nothing extra.

Send the item rows with the shipment call — description, quantity, declared value, country of origin, and the HS code you supply — and the declaration is generated from them. REST, JSON, one Bearer header, signed webhooks instead of polling, and unlimited calls on every plan.

Customs items on the shipment call — one row per distinct item, exactly as the form needs them
Signed webhooks instead of polling for clearance and tracking events
Real idempotency keys — a retried international order never buys two labels
OpenAPI 3.1 spec, no SDK lock-in, unlimited calls on every plan
Read the API docs Get a free API key $0 on every plan
curl https://api.goatlabels.io/api/v1/shipments
POST /api/v1/shipments
Authorization: Bearer sk_live_…
Idempotency-Key: ord_8421

{
  "to": { "name": "Joyce", "city": "Berlin", "country": "DE" },
  "parcel": { "weight": 2.6, "weight_unit": "lb" },
  "service": "fedex_intl_priority"
}
Pricing for someone shipping abroad

Two plans. No international surcharge from us.

Customs items, saved customs templates, and prepaid duties are not a paid tier here. Free covers 50 shipments a month with everything else unlimited, and Pro is a flat monthly plan with unlimited shipments and cheaper label pricing. Nothing about an international parcel moves you up a plan.

Pro

Most popular
$40 / month
Unlimited shipments — no monthly cap
Cheaper label pricing that scales down as your volume grows
Billy AI on Telegram — draft an international label without opening the dashboard
API access still free and unlimited

Volume pricing

illustrative
less volume more volume

more volume → lower per-label rates

Free

$0 / forever

Fund a wallet, pay per label, and pay nothing at all in a month you did not ship in.

50 shipments a month, no monthly minimum to print
Customs items and saved customs templates included
USPS, UPS, FedEx, and DHL rate-shopped on every parcel, duties inside the quote
Billy AI in the web app, unlimited — drafts the description, never the code
REST API with unlimited calls; fund by card, Apple Pay, Google Pay, ACH, or crypto

Billy is not an upsell

The assistant that turns a pasted order into customs item rows — and validates the destination before you spend anything — runs unlimited in the web app on Free. Pro adds Billy on Telegram.

Web, every plan Telegram, Pro

API free on every plan

GET /api/v1/shipments

200 OK · plan: free

Customs items over unlimited calls on Free — still unlimited on Pro.

Bring what you pay today

On Pro we will work with you to beat the label rates you are already getting from

ShippoPirate ShipShipStation
No contracts No fee for a customs form Start in seconds
USPS UPS FedEx DHL

Label prices are quoted live from USPS, UPS, FedEx, and DHL as one all-in number, with duties inside it on the services that support prepaid duties — and that exact amount leaves your prepaid balance. Full pricing details

Who fills in the most item rows

From one parcel abroad to a saved template library.

Same item rows, same saved templates, same DDP decision, whether you ship overseas twice a month or twice an hour. These are the four shapes of seller who meet a customs declaration most often.

Live sellers shipping overseas

TikTok Shop & live commerce

Item rows

A sale made in a live stream still needs a description, a declared value, a country of origin, and a code. Draft the row once against the SKU and every later parcel of the same thing reuses it instead of being retyped at midnight.

1 row per distinct item saved templates bulk print
goatlabels.io/dashboard/shipments
GoatLabels shipments queue with purchased labels

Etsy and Depop makers

Etsy & independent creators

Handmade goods are the hardest things to describe well, and a bare category name is what gets a box opened. Write material, item, and use once per SKU and the vague-description hold stops happening.

Described, not categorised

Women's knitted cotton sweater · origin US

Sellers quoting from DMs

The orders with no connector

can you post it to Lisbon?
Declaration drafted · CL-1024

Anyone selling into the EU or UK

Where the threshold is theirs, not yours

DDP

duties prepaid at label time, so nobody phones your buyer

Real sellers, real words

Sellers who ship past the border.

A video took off and I had 80 TikTok Shop orders by morning. I printed every label from my phone on the bus to the post office.
E

Early customer · TikTok

TikTok Shop seller

TikTok Shop
I run my Etsy shop from the kitchen. The AI reads the order, picks the carrier, the label prints. That's the whole workflow now.
E

Early customer · Etsy

Etsy maker

Etsy
The API is what every shipping API pretends to be. Idempotency that actually works.
S

Sasha R.

Staff engineer, marketplace

API user

Customs forms, answered

Which customs form do I need to ship from the US?
If you are shipping by post, you file USPS PS Form 2976, which is the CN22 short declaration, for a low-value parcel, and PS Form 2976-A, the CP72 set, above the value threshold. In practice buying an international label online generates the combined declaration-and-label form from the item data you enter, so you are filling in customs items rather than a paper form. If you are shipping with UPS, FedEx, or DHL there is no CN form at all — you provide a commercial invoice with the same information.
What should I write in the item description?
What it is, what it is made of, and what it is for, in that order. Write a women's knitted cotton sweater rather than clothing, and a sterling silver pendant necklace rather than jewellery. The words that reliably stall parcels are the vague ones — gift, sample, merchandise, parts, accessories — because an officer who cannot classify the contents from your description has to open the box to do it.
Do I need an HS code for a $40 parcel?
Increasingly yes, and it costs you nothing to include one. Many destinations now expect a code on low-value parcels for their electronic advance data, and a parcel with a code moves through automated clearance while one without it waits for a human. The first six digits of the Harmonized System are internationally common, and that is usually enough for a small parcel.
Do military APO, FPO, and DPO parcels need a customs form?
Yes. You pay domestic postage and the address is a domestic USPS address, but the parcel leaves the country, so a customs declaration is required and the same description rules apply. The address formatting for those destinations, and which carriers can serve them at all, are covered on our PO Box and military address page.
What changed when the de minimis exemption ended?
Less than most sellers assume, because the widely reported US de minimis change governs parcels arriving into the United States. It is an import rule. For a parcel you are sending out of the US, the threshold that decides whether your buyer is charged belongs to the destination country, and several major destinations lowered or removed theirs years earlier. The specifics, with dates, are in the dated block on this page.
Should I ship DDP or DDU?
DDP where the service supports it, and price the duty into the item. Under DDU the carrier contacts your buyer for money before releasing the parcel, which is the largest single source of international refunds and disputes for small sellers. Under DDP the duties and taxes are calculated and prepaid at label time and the buyer receives the parcel like a domestic one.
Free plan. Saved customs templates included.

One set of item rows.
Every destination you sell to.

Enter the item rows, let the declaration generate itself, choose prepaid duties where the service supports it, and buy from a prepaid wallet.

Sign up in seconds. No card required. No monthly minimum to print.