GoatLabels GoatLabels
Rate-shop the spec once. Run the list monthly.

The same box, hundreds of times, monthly


The list changes. The box does not.

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.

One spec quoted, four carriers answer

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.

UPSFedExDHLUSPS one spec
Locked box spec Dims, weight, service.
Reused every cycle Not re-decided monthly.
Drift watched Ledger flags the change.

One wallet funds cycle after cycle

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.

VisaMastercardAmerican ExpressApple PayGoogle PayBitcoinEthereumTether (USDT)
The list is the work Export, diff, validate.
Batch from balance Row by row, one wallet.
Cycle on the ledger Every label, every month.

Rate-shop once: locking the box spec and what invalidates 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 monthly cycle: export, diff, validate, buy

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.

Address churn: catching subscribers who moved before the box does

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.

Rate drift: noticing when your locked assumption stopped being true

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.

One cycle, start to finish

Export the list. Ship the month.

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.

1
The list, fresh from billing
Exported after renewals settle
subscriber_0288

Hey — moving next week, can you send this month's box to the new place? Updated my address in the portal.

The archive
Last cycle's file, kept for the diff
This cycle's export
Active subscribers, same day each month
The cycle status
Rows imported
mapped by saved preset
Diff vs last cycle
changed rows flagged
Validation
run before any purchase
Spec
locked — priced at batch quote
Drop this cycle's subscriber export

The diff catches addresses that changed on purpose. Validation catches the ones that changed underneath a subscriber who never updated anything.

2 Batch quote

One spec, priced across the file.

Billy AI
  • Every row quoted against the locked box spec, not re-decided per parcel
  • Per-label cost surfaced before purchase — a step change means re-rate-shop, not proceed
  • Addresses validated row by row while the fix is still an email, not a reship
  • Purchase runs row by row from the wallet, so a failed row never sinks the batch
Diffed. Validated. Bought.
3
Labels out, evidence archived
This cycle becomes next cycle's baseline
One balance debited
The whole cycle on one ledger
$12.47
USPS
Exceptions worked by row
Failed rows fixed, revalidated, rebought
$12.47

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.

Your billing platform is not a connector

The list is a file. The shop beside it can sync..

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.

Shopify logo Shopify
Etsy logo Etsy
WooCommerce logo WooCommerce
TikTok Shop logo TikTok Shop
Instagram logo Instagram AI Facebook logo Facebook AI
Amazon logo Amazon
eBay logo eBay
Show 15 more Show less
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 a box business actually reuses

Lock the decisions that repeat.
Work the ones that change.

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.

One wallet,
funded per cycle

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.

Wallet balance
$1,247.36 USD
AI

The mid-cycle order
without a spreadsheet

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.

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...

All-in per row,
flat line per cycle

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.

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

Four carriers quote
the locked spec

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.

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

Script the cycle
when volume says so

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.

POST /v1/shipments
{
"to": { "name": "Maya" },
"from": { "name": "Alex" },
"service": "ups_ground",
"label_format": "pdf"
}
Webhook delivered
GoatLabels mobile queue showing a cycle's shipments with all-in prices per label
Billy drafting a replacement-box label from a pasted message on mobile

Row rebought

Exception fixed · same spec, same balance

Cycle day happens at the packing table

The exceptions get worked where the boxes are.

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.

Failed rows are listed individually — fix, revalidate, and rebuy just those, from the floor.
Per-label cost is visible on the shipment, so a step change is spotted on cycle day rather than next quarter.
One-tap print to the share sheet or a thermal printer over Wi-Fi, box after box.
Void a mis-packed row and the credit returns to the same balance the batch spent.
A mid-cycle replacement or gift order: paste it, Billy drafts it, it joins the same queue.
Two hands on a box, one question

Ask where a subscriber's box is without putting it down.

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.

goatlabels.io/dashboard/shipments — Billy
Billy reading a subscriber shipment's delivery status back over the purchased labels list

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.

All-in quotes

Same box, same number, cycle after cycle.

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.

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

USPS

Priority Mail Intl

10–15 days

$7.40

$1.90 of taxes & duties included

all-in · the figure the ledger records

Locked for this spec
FedEx

FedEx

Intl Connect Plus

3–5 days

$8.90

$2.20 of taxes & duties included

all-in · the figure the ledger records

DHL

DHL

Express Worldwide

1–2 days

$9.80

$2.50 of taxes & duties included

all-in · the figure the ledger records

No carrier invoice the day after Void → credit straight back to your wallet Multi-currency display
Public API v1

A retried batch, not a doubled one.

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.

Real idempotency keys — a job retried mid-cycle never buys a second label for a row
Signed webhooks report label and tracking events per row, so exceptions surface without polling
The same parse, validate, quote, and purchase lifecycle the dashboard runs
REST, JSON, OpenAPI 3.1, and unlimited calls on every plan including Free
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 a monthly cadence

Two plans. One is shaped like a cycle.

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.

Pro

Most popular
$40 / month
Unlimited shipments — the whole list in one afternoon, every month
Cheaper label pricing that scales down as the list grows
Billy AI on Telegram — check a subscriber's box without opening the dashboard
API access still free and unlimited

Volume pricing

illustrative
less volume more volume

a longer list → lower per-label rates

Free

$0 / forever

Run a first cycle, save the column mapping, and see the flat line appear before you pay for anything.

50 shipments a month, no monthly minimum to print
USPS, UPS, FedEx, and DHL quoted against your locked box spec
Per-row address validation before any money leaves the balance
Billy AI unlimited in the web app for the mid-cycle one-offs
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 mid-cycle message into a drafted, validated label runs unlimited on Free. Replacement boxes and gift orders never need a file of their own.

Web — every plan Telegram — Pro

API free on every plan

GET /api/v1/shipments

200 OK · plan: free

Unlimited calls on Free — still unlimited on Pro.

We'll beat your current rates

Bring your invoice — on Pro we work with you to beat the rates you're getting from

ShippoPirateShipShipStation
No contracts No monthly minimum to print Mapping saved after the first cycle
USPS UPS FedEx DHL

Label 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

Who ships on a cycle

Different boxes, identical cadence.

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.

Consumable boxes on a strict monthly clock

Coffee, tea, snacks, pet treats

Same spec every cycle

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.

1 spec, re-quoted on triggers diff every cycle one wallet
goatlabels.io/dashboard/shipments
GoatLabels shipments queue with purchased labels

Boxes whose weight swings month to month

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

Club sellers whose subscribers DM their moves

The address update that skips the portal

moving on the 1st! new address for next month's box
Row updated · flagged in the diff, validated at import

Founders still running the cycle solo

A run-book instead of a fulfillment hire

6

run-book steps from export to archived baseline

Subscription box shipping, answered

How do I ship the same box to hundreds of subscribers every month?
Treat the box and the list as two separate problems. The box gets rate-shopped once: quote the packed spec across USPS, UPS, FedEx, and DHL, pick the winner, and reuse that decision every cycle until something invalidates it. The list gets processed every cycle: export it from your billing platform, import it as a file, validate every address, and buy the batch — the column mapping, per-row validation, and row-by-row purchase mechanics are covered on /bulk-shipping-labels-from-csv.
How do I catch subscribers who moved since last cycle?
Diff this cycle's export against last cycle's file before you buy anything. Rows that changed are deliberate updates and take care of themselves; the danger is the subscriber who moved and never updated their profile, which no diff can see. That is what per-row address validation is for — it runs against every row before money moves, and it flags the address that stopped being deliverable even though the text never changed.
Should I re-rate-shop every cycle?
No — that would defeat the point of locking the spec. Re-quote on triggers instead: the box contents changed enough to move the packed weight, the packaging changed dimensions, the carriers ran their annual rate event, or a seasonal surcharge window opened. Between triggers, a once-a-quarter glance at per-label cost on your ledger is enough to confirm the locked answer still holds.
What does peak season do to a box business?
It multiplies. A seasonal surcharge lands on one parcel profile hundreds of times in the same week, so a per-parcel fee an ad-hoc seller shrugs off becomes a line item on a box business's month. What triggers those windows, and how they land on small senders, is /shipping-surcharges-explained's subject — the takeaway here is that the cycles inside a surcharge window deserve a fresh quote even when nothing about your box changed.
Can I automate the monthly batch?
Yes, with your own script against the REST API — unlimited calls on every plan. The CSV import endpoints cover the same parse, validate, quote, and purchase lifecycle the dashboard runs, signed webhooks report label and tracking events back instead of polling, and idempotency keys mean a retried job never buys a label twice. The API reference at /docs covers the endpoints.
Real sellers, real words

Senders who run the same box every month.

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

Scripts the cycle
No monthly minimum to print. Ideal for monthly senders.

Lock the spec once.
Ship every cycle from it.

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.