USPS
Priority Mail Intl
10–15 days$7.40
$1.90 of taxes & duties included
all-in · the figure the ledger records
A subscription box is the same parcel hundreds of times, so the work inverts: rate-shop the box spec once, then spend each cycle on the two things that change — the subscriber list and the rates. Addresses churn between cycles, and a rate you settled on in spring drifts by peak season.
USPS, UPS, FedEx, and DHL price the same packed box — pick the winner once and reuse the decision until the spec or the season invalidates it.
Card, Apple Pay, Google Pay, ACH, or crypto top up one prepaid balance — fund it once a cycle and buy the whole batch against it.
A one-off seller rate-shops parcels; a box business rate-shops a specification. Every shipment in a cycle is the same carton at the same packed weight going a domestic zone away, which means the carrier question — which of four services wins on this parcel — has one answer that holds for hundreds of labels at a time. Quote the packed spec across USPS, UPS, FedEx, and DHL, read the all-in numbers side by side, and lock the winner. That decision is now infrastructure, not a per-order chore, and the monthly work shrinks to the two inputs that actually move: who is on the list, and whether the locked rate is still true.
A lock is only safe if you know what breaks it. Four things do. The contents change enough to move the packed weight — the month the box carries ceramics instead of tea is a different parcel wearing the same branding. The packaging changes dimensions, and a box that grew an inch can cross into dimensional-weight billing; the divisors and thresholds live on the size and weight limits page. The carriers reprice, either at their annual rate events or inside a seasonal surcharge window. And the list itself can shift geographically — a subscriber base that skews further from your origin over a year quietly changes which service wins. None of these announce themselves, which is why the cycle below ends with a drift check rather than blind reuse.
The cycle is a run-book, not a mood. Six steps, in order, each one there to catch a specific failure before it becomes a stack of returned boxes. The file mechanics underneath it — column mapping with saved presets, per-row validation, batch quoting, row-by-row purchase — are the bulk CSV page's subject; this table is the operating cadence a box business wraps around them. The second cycle takes minutes, because the column mapping was saved the first time and every step after the export is a repeat.
| Step | What you do | What it catches |
|---|---|---|
| Export the list | Pull the active-subscriber export from your billing platform on the same day each cycle, after renewals settle. | Shipping to churned subscribers, or missing the ones who joined since the last pull. |
| Diff against last cycle | Compare the new file to the previous cycle's file, row by row. Flag changed addresses and new rows for a second look. | The subscriber who updated their address mid-cycle, and typos introduced by a profile edit. |
| Validate every row | Import the file and let per-row address validation run before anything is bought. | The subscriber who moved and never told anyone — the address that reads fine but stopped being deliverable. |
| Batch quote, then buy | Quote the locked spec across the file, confirm per-label cost matches last cycle, and purchase row by row from the wallet. | Rate drift — a step change in per-label cost is your signal to re-rate-shop before committing the batch. |
| Work the exceptions | Failed rows are reported individually and retryable. Fix, revalidate, and rebuy just those rows. | One bad row silently sinking the batch, or getting rebought twice in the scramble. |
| Close the loop | Note this cycle's per-label cost and returned-box count next to the file before archiving it for next month's diff. | Slow drift that no single cycle reveals — the ledger trend only exists if each cycle records its number. |
Two details make the run-book durable. First, export on the same day every cycle, after renewals settle — a list pulled mid-renewal ships boxes to cards that were about to decline. Second, archive each cycle's file. The diff step only exists if last month's file still does, and the drift check only exists if last month's per-label cost was written down somewhere a human will look. When the volume outgrows the dashboard, the same lifecycle runs from a script against the REST API — unlimited calls on every plan, with signed webhooks reporting label and tracking events back so the script never polls.
Subscription lists rot in a way one-off orders never do. A checkout address is typed minutes before the label is bought; a subscriber address was typed once, months or years ago, and has been silently aging ever since. People move on roughly annual timescales, which means every cycle some slice of a mature list is pointing at a previous residence — and the subscriber has no idea, because from their side nothing went wrong yet. The box business finds out one of two ways: cheaply, before the batch is bought, or expensively, when the carrier brings the box back and reshipping doubles the postage on that subscriber for the month. What a carrier does with an undeliverable parcel, and who pays for the round trip, is the returned-to-sender page's territory.
The cheap path has two layers, and they catch different halves of the problem. The diff catches deliberate change: a subscriber updated their profile, the row differs from last cycle's file, and the run-book flags it for a second look so a fat-fingered edit does not ship. Validation catches silent change: the row is byte-identical to last month, but the address behind it stopped resolving — the apartment building renumbered, the unit line was always missing, the subscriber moved without updating anything. Per-row validation runs against every address before money moves, so the rows worth a human look are surfaced while the fix is an email to the subscriber rather than a parcel in the wrong city. The diff is free and catches what changed; the validator is automatic and catches what should have.
The locked rate has a shelf life, and the operator who set it in spring is rarely watching when it expires in November. Drift arrives on three schedules. Carriers reprice annually, and the service that won your spec by a small margin can lose it in the same announcement. Seasonal surcharge windows open and close on the carriers' calendars, and a per-parcel fee lands very differently on a business shipping one parcel profile hundreds of times in a week — the triggers and mechanics are the surcharges page's subject, and one sentence here is all they need. And your own spec creeps: this month's insert, that month's heavier jar, until the weight on the label no longer matches the weight in the box.
Detection is a ledger habit, not a research project. Because every label in a cycle is the same spec, per-label cost should trace a flat line from month to month, and a flat line is the easiest chart in the world to read: any step is a signal. Filter the shipment ledger to a cycle, read the per-label cost, and compare it to the number you archived with last cycle's file. If it moved and the box did not, the carriers moved — re-quote the spec across all four and re-lock. If it moved because the box changed, the spec sheet is stale — fix it and re-quote. Either way the response is the same afternoon of work you did at launch, repeated only when the evidence demands it. What an all-in quote includes, and why comparing them beats comparing rate cards, is covered on the cheap shipping labels page; the box business's edge is that it only has to make that comparison when the flat line bends.
A cycle is not hundreds of decisions, it is one decision made at launch and a monthly loop that protects it: the subscriber export comes in as a file, the diff and the validator work the list, the locked spec prices every row, and the batch is bought from one balance with the exceptions reported by row.
Hey — moving next week, can you send this month's box to the new place? Updated my address in the portal.
The diff catches addresses that changed on purpose. Validation catches the ones that changed underneath a subscriber who never updated anything.
Close the loop before you archive: this cycle's per-label cost and returned-box count are the only early-warning system rate drift and address churn ever get.
Subscriber lists live in billing platforms, and those are not store connectors — the cycle's intake is an export, every month, on purpose. What does sync is the storefront most box businesses run alongside the subscription: Shopify, Etsy, WooCommerce, TikTok Shop, Amazon, eBay, Squarespace, Wix and the rest drop gift boxes, replacements, and one-off shop orders into the same To Ship queue the cycle runs through, drawing on the same prepaid balance.
Via AItiles: the mid-cycle order that arrived as a message — paste it and Billy drafts the label without opening a spreadsheet.
The spec, the mapping, and the funding rail are decided once. The list, the validation, and the drift check run every cycle — and each has one place to live.
Card, Apple Pay, Google Pay, ACH, and crypto top up one prepaid balance, and the batch buys against it row by row. A voided label credits straight back to the same balance, so a fixed row rebuys from the returned money.
A replacement box, a gift order, a subscriber DM with a new address — Billy drafts a label from a pasted message or a screenshot, validated before payment, so the one-off between cycles never needs its own file.
Each label is one number with the fees already inside, and that exact amount leaves the balance. Identical parcels should cost identical amounts — which is what makes per-label cost on the ledger a drift alarm instead of a mystery.
USPS, UPS, FedEx, and DHL price the same packed box whenever you re-quote, so a re-lock after a rate event is an afternoon of reading four numbers, not a renegotiation.
The REST API runs the same parse, validate, quote, and purchase lifecycle as the dashboard, with unlimited calls on every plan, signed webhooks for label and tracking events, and idempotency keys so a retried job never buys twice.


Row rebought
Exception fixed · same spec, same balance
The batch is a desk job for about four minutes. Everything after it happens standing up, surrounded by identical cartons — and that is exactly when a failed row, a wrong label, or a subscriber's question turns up. All of it fits on the phone beside the tape gun.
Somewhere in every cycle a subscriber asks where theirs has got to, and the answer is buried in a batch of hundreds that all look alike. Say the question out loud and Billy finds that shipment and reads its status back, so a message gets answered between two cartons instead of after the run. Included on every plan. This is the real product, not a render.

Listening
"Where's subscriber 288's box?"
Out for delivery
This cycle · address validated at import
Speaks plain English · finds one shipment inside a cycle of hundreds · included on every plan, on Telegram with Pro.
Identical parcels should cost identical amounts, and that is what makes a box business's ledger readable: per-label cost traces a flat line, and any step in it is the signal to re-quote the spec across all four carriers. Each column is one all-in figure with the fees already inside — the exact number the ledger will record. The sample parcel below is an illustration.
Priority Mail Intl
10–15 days$7.40
$1.90 of taxes & duties included
all-in · the figure the ledger records
Intl Connect Plus
3–5 days$8.90
$2.20 of taxes & duties included
all-in · the figure the ledger records
Express Worldwide
1–2 days$9.80
$2.50 of taxes & duties included
all-in · the figure the ledger records
Every risk in a scripted cycle is a multiplied risk: the same mistake, made identically, several hundred times inside one loop. That is why the interesting API features here are the boring ones — keys that make a retry safe, and events that surface a failed row without anybody watching a terminal.
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"
}
A box business spends its month in one burst: nothing, nothing, nothing, then the whole list in an afternoon. Free covers 50 shipments a month, which is enough to run a small cycle end to end and prove the run-book before you commit to anything. Past that, a cycle is Pro territory — a flat monthly plan with unlimited shipments and label pricing that falls as the list grows.
Volume pricing
illustrativea longer list → lower per-label rates
$0 / forever
Run a first cycle, save the column mapping, and see the flat line appear before you pay for anything.
The assistant that turns a mid-cycle message into a drafted, validated label runs unlimited on Free. Replacement boxes and gift orders never need a file of their own.
GET /api/v1/shipments
200 OK · plan: free
Unlimited calls on Free — still unlimited on Pro.
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 leaves your prepaid wallet — which is what makes per-label cost on the ledger a usable drift alarm rather than an estimate. Full pricing details
Coffee, books, crafts, or samples — the parcel differs, but the shape of the work is the same everywhere: one locked spec, one monthly list, and a ledger that has to notice drift before the margin does.
Coffee, tea, snacks, pet treats
The product rotates but the carton and packed weight barely move, which makes these the purest case for locking the spec. The monthly risk is entirely in the list — churned subscribers, moved subscribers, and the renewal-day export timing that decides who is actually in this cycle.

Books, ceramics, curated goods
The month the box carries a mug instead of a paperback is a different parcel wearing the same branding. These businesses re-weigh the packed box every cycle and treat a weight change as the re-quote trigger it is.
Spec check before batch buy
Packed weight vs spec sheet · re-quote on mismatch
The address update that skips the portal
A run-book instead of a fulfillment hire
6
run-book steps from export to archived baseline
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
Quote your packed box across four carriers, save the mapping on the first import, and turn the monthly batch into a run-book: export, diff, validate, buy.
Sign up in seconds. No card required. Your first cycle's mapping is saved for every cycle after.