USPS
Ground Advantage
2–5 days$7.40
$1.20 of that figure is the insurance premium, recorded on the same shipment
all-in · one debit, one credit
Shipping shows up in your books three ways: postage you paid, shipping income you charged the buyer, and after-the-fact corrections — refunds on voided labels and carrier adjustments. Clean books track all three per order, so margin reflects what delivery actually cost, not what the label cost at purchase.
USPS, UPS, FedEx, and DHL each quoted as one number that includes surcharges, insurance, and signature fees — so one label is one ledger line, not five.
Top-ups by card, Apple Pay, Google Pay, ACH, or crypto are asset transfers — the expense posts per label as the balance draws down.
Sellers argue about this because the word shipping covers three different money flows wearing one name. Postage you pay to send customer orders is a cost of selling. Freight you pay to receive inventory is part of what that inventory cost you. And the shipping line buyers pay at checkout is not a cost at all — it is revenue. Most of the confusion in a small seller's books comes from letting those three share an account, at which point no report can say what delivery actually earns or costs.
The defensible positions are narrower than the arguments suggest. Outbound postage on customer orders is most commonly booked as a selling or operating expense; inbound freight belongs with the inventory it carried. Some sellers fold outbound postage into cost of goods sold so that gross margin reflects delivered cost — also workable, provided it is deliberate. The real rule is the boring one: split the flows, choose a treatment with whoever prepares your taxes, write it down, and never change it silently. A margin figure is only useful if this month was computed the same way as last month.
One account deserves special mention because almost everyone gets it wrong at first: the prepaid wallet. Funding a shipping balance is not an expense — it is cash becoming a different asset, and the expense happens later, label by label, as the balance draws down. Booked this way, your postage expense lands in the period the parcels actually shipped, not the day you happened to top up.
| Account | Type | What posts here |
|---|---|---|
| Prepaid shipping wallet | Other current asset | Wallet top-ups in; label purchases, insurance premiums, and signature fees out; void credits back in; adjustments out. |
| Postage expense (or COGS — shipping) | Expense | The all-in cost of each label as it is bought, plus adjustments; reduced by void credits. Pick expense or COGS with your accountant and stay put. |
| Shipping income | Income | What buyers paid you for delivery, booked with the sale — never netted against postage. |
| Inbound freight | Inventory / COGS | Carriage on inventory you purchased. Kept separate from outbound postage so the two flows never blur. |
Whatever the buyer paid you for delivery is income, and it deserves its own income account rather than being quietly subtracted from postage expense. Netting the two feels tidy and destroys the one comparison a small seller most needs: shipping income against postage expense, side by side on the profit and loss, telling you whether your checkout shipping prices are funding your actual delivery costs. Sellers who net them discover they have been subsidising delivery only when the year-end totals refuse to add up.
The edge cases are worth naming. Free shipping means zero shipping income and full postage expense — the subsidy is real, so let the books show it rather than bury it. Flat-rate checkout shipping against live-rated postage means the two accounts will never match per order, and that gap is your pricing decision made visible, not an error. And marketplaces that collect shipping from the buyer and pass it through a payout need reading carefully: book what the payout report says you received for shipping, which is not always what the buyer saw at checkout.
Corrections are where shipping bookkeeping earns its keep, because both kinds arrive after the sale they belong to. A voided label comes back as a wallet credit, spendable immediately — the mechanics and deadlines live on the void a shipping label page. A carrier that reweighs or remeasures a parcel bills the difference after delivery; how each carrier detects, bills, and lets you dispute that is the carrier billing adjustments page's territory. Here is what both look like as entries, using deliberately invented round numbers — copy the shape, not the figures.
| Event | Debit | Credit | Note |
|---|---|---|---|
| Fund the wallet with $200 | Prepaid shipping wallet $200 | Cash $200 | No expense yet — money moved between assets. |
| Buy a label for $9 | Postage expense $9 | Prepaid shipping wallet $9 | The expense happens here, at purchase, per order. |
| Void that label; credit granted | Prepaid shipping wallet $9 | Postage expense $9 | The mirror of the purchase, dated when the credit posted. |
| Carrier adjustment of $3 posts | Postage expense $3 | Prepaid shipping wallet $3 | Referenced to the original shipment so its margin updates too. |
Three habits keep the corrections honest. Date every entry on the day the money actually moved — the day the credit posted or the adjustment hit — not the day of the original label, so each period carries its own truth. Reference each correction to its original shipment, so the order's margin updates instead of the correction floating loose in a miscellaneous account. And record one nuance exactly as it happens: when an adjustment exceeds the wallet balance, the remainder is charged to the card on file, so that entry credits the card liability, not the wallet, because books should say where money really came from.
A chart of accounts is only as good as the records feeding it, and this is where the platform does the bookkeeper a favour: every event above is its own record. A label purchase, a void credit, and an adjustment each exist as separate entries with their own dates and amounts, visible in the dashboard ledger — never a silently edited balance you have to reverse-engineer at quarter end.
For getting that history into your accounting workflow, the bridge is the REST API: shipments and their adjustments are readable as records for any period, calls are unlimited on every plan, and the current endpoints are documented in the API docs. To be plain about the boundary — there is no ready-made connector for any specific accounting package, and this page will not pretend otherwise. A short script, or the tooling your bookkeeper already runs against APIs, pulls the period's rows; teams that want entries posted the moment a correction lands wire up the signed webhooks instead, and the webhook recipes page walks through that consumer end to end. Either way the goal is the same as this whole page's: a ledger where every parcel's true delivered cost is one lookup away.
Shipping bookkeeping is only hard when the source records are vaguer than the accounts they feed. This flow produces exactly what a ledger wants and nothing it has to unpick: a top-up that moved cash from one asset into another, a purchase that posted a dated expense at a single all-in amount, and — when a correction lands weeks later — its own entry carrying its own date and a reference back to the shipment it belongs to. Nothing is netted, nothing is a silently edited balance, and no figure has to be reverse-engineered at quarter end.
one parcel to Austin, TX — invoice attached
Funding the wallet is not the expense. A top-up debits an asset and credits cash; the expense posts later, label by label, in the period the parcels actually shipped.
Corrections come later and get their own dated entries — a void credit as the mirror of this purchase, a carrier adjustment as a separate line referenced to the same shipment. The entries are in the table above; what those two events actually are belongs to the void a shipping label and carrier billing adjustments pages.
Shopify, Etsy, WooCommerce, and TikTok Shop sync into the same To Ship queue, and a pasted DM or a typed address lands in it too. That matters to your books more than it looks: however the order arrived, the label posts the same way — one dated debit to postage expense, one credit to the prepaid wallet — so channel mix never turns into an account-mapping exercise at month end.
Via AItiles: pasted orders and screenshots post exactly like synced ones — same account, same date rule, same reference.
Nothing below is an accounting feature. They are ordinary shipping mechanics that happen to determine whether a bookkeeper gets one dated record per event or a balance to reverse-engineer.
Top-ups by card, Apple Pay, Google Pay, ACH, or crypto move cash into a prepaid balance — an asset-to-asset transfer with no expense in it. The expense posts per label as the balance draws down, which is what puts your postage in the period the parcels shipped rather than the period you happened to top up.
Billy drafts the label from a pasted order or a screenshot and validates the address before money moves. Every avoided mistake is an entry you never have to write: a bad address means a purchase, a void credit, and a second purchase where one line should have been.
Surcharges, insurance, and signature fees are inside the quoted number, so a label is a single amount to book instead of a bundle to split across accounts. If a carrier reweighs the parcel afterwards, that difference arrives as its own dated entry rather than as an unexplained movement in a balance.
USPS, UPS, FedEx, and DHL are quoted on the same parcel and paid from the same prepaid balance, so switching carrier order by order never splinters your chart of accounts. The account structure is decided by the flow — outbound postage, inbound freight, shipping income — not by which carrier happened to win the box.
Shipments and their adjustments are readable over REST for any period, with unlimited calls on every plan, so getting a quarter of history out is a script rather than an afternoon of copy-paste. There is no ready-made connector for any specific accounting package, and this page will not imply one — the API and the in-app ledger are the bridge.


Purchase recorded
Postage expense · dated today
The reason small-seller shipping books go bad is not ignorance of debits and credits — it is a gap between where the label gets bought and where anything gets written down. Closing that gap is the whole trick: buy the label from the phone at the packing table and the dated record exists before the box is taped.
The question a shipping ledger exists to answer is per-order, and it is usually asked with your hands full. Ask out loud and Billy finds the shipment, reads back what was paid and what has landed against it since, and tells you whether an adjustment has posted — so the delivered cost of one parcel is a sentence rather than a reconciliation. Included on every plan. This is the real product, not a render.

Listening
"What did we pay to ship order 1024?"
Delivered · adjustment posted
Order #1024 · reweigh billed to the same shipment
Speaks plain English · finds a shipment by order or buyer · says what posted and when · included on every plan, so nothing about your records sits behind a tier.
This is what makes a label a single journal entry instead of a bundle to split: each carrier comes back as one all-in number with its delivery window, and that exact amount is what leaves the prepaid balance. Figures below are invented illustration, exactly like the worked entries above — copy the shape, not the numbers.
Ground Advantage
2–5 days$7.40
$1.20 of that figure is the insurance premium, recorded on the same shipment
all-in · one debit, one credit
Ground
3–4 days$10.80
$1.20 of that figure is the insurance premium, recorded on the same shipment
all-in · one debit, one credit
Home Delivery
2–4 days$11.40
$1.20 of that figure is the insurance premium, recorded on the same shipment
all-in · one debit, one credit
Every label purchase, void credit, and adjustment is its own record with its own date — readable over REST with unlimited calls on every plan, so pulling a quarter of shipping history for your accountant is a script, not an afternoon of copy-paste.
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"
}
Software fees are the other half of what shipping costs you, and they book differently from postage: a subscription is a period expense whether or not a parcel moved. On Free there is no such line — the only shipping charge in your books is the postage you bought. Pro is a flat monthly plan, and if you take it, it lands as one predictable recurring expense you can budget rather than a variable you have to explain.
Volume pricing
illustrativemore volume → lower per-label rates
$0 / forever
No software line on the profit and loss at all — just postage, dated per label.
The assistant that drafts a label from a pasted order and validates the address before anything posts runs unlimited on Free. It never becomes its own vendor line in your books; Pro simply adds Billy on Telegram.
GET /api/v1/shipments
200 OK · plan: free
Unlimited calls on Free — the bridge to your accounting workflow costs nothing.
Bring your invoice — on Pro we work with you to beat the rates you're getting from
ShippoPirateShipShipStationLabel prices are quoted live from USPS, UPS, FedEx, and DHL as one all-in number, and that exact amount is what debits your prepaid balance — which is why the ledger entry and the receipt always agree. Full pricing details
The chart of accounts above is the same for all of them. What differs is which entry goes wrong first when shipping and its corrections share one line.
Shipping income vs postage expense
Netting what buyers paid against what postage cost feels tidy and destroys the one comparison that matters. Kept apart, the two accounts face each other on the profit and loss and say plainly whether delivery is funding itself.

Inbound freight vs outbound postage
Carriage on stock you purchased belongs with that stock; postage on customer orders is a cost of selling. Letting the two share an account is the fastest way to a gross margin nobody can reconcile.
Two flows, two accounts
Inbound freight into inventory · outbound postage as expense
Orders with no feed still need a record
Voids and adjustments land after the sale
3
kinds of entry — purchase, void credit, adjustment — each with its own date and reference
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.
Early customer · TikTok
TikTok Shop seller
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.
Early customer · Etsy
Etsy maker
The API is what every shipping API pretends to be. Idempotency that actually works.
Sasha R.
Staff engineer, marketplace
All-in prices make one-line entries, voids and adjustments post as their own dated records, and the API hands your bookkeeper the period's history on request.
Sign up in seconds. No card required. No monthly minimum to print.