GoatLabels GoatLabels
A migration guide for dev teams.

Migrating an integration off EasyPost, step by step


Four endpoints, one webhook, no more fees.

Porting from EasyPost means remapping a handful of REST endpoints — rates, buy, void, track — after which every API call on GoatLabels is free at any volume.

The same four calls pointed somewhere cheaper

Rates, buy, void, track across USPS, UPS, FedEx, and DHL — REST and JSON, Bearer auth.

UPSFedExDHLUSPS all quoted
Four quotes One rates response.
Idempotent Retries stay safe.
OpenAPI 3.1 Generate your client.

Prepaid wallet after the cutover

Card, Apple Pay, Google Pay, ACH, or crypto — labels debit a balance, not a monthly invoice.

VisaMastercardAmerican ExpressApple PayGoogle PayBitcoinEthereumTether (USDT)
One balance API and dashboard.
Free overlap Run both, pay nothing extra.
Voids credited Straight back to the wallet.
Endpoint mapping

What each EasyPost call becomes here.

Every shipping API models the same five nouns, which is why this is a remap rather than a rewrite. Here is where each part of your existing integration lands.

  On GoatLabels What changes in your code
Create a shipment POST /api/v1/shipments with from, to, and parcel — one JSON body, Bearer auth. Your existing create call. The fields you already collect map across directly.
Get rates Rates come back for USPS, UPS, FedEx, and DHL as all-in prices on the shipment. Wherever your code reads the rates array today, read ours instead.
Buy a label Purchase the chosen rate; the label debits your prepaid wallet, not a monthly invoice. Your buy step, minus the account funding assumptions behind it.
Void a label Void by shipment id — the amount is credited straight back to the wallet balance. Refund flow. Same trigger point in your code, different destination for the money.
Tracking updates Signed webhooks for tracking and label events — verify the signature, drop the poller. Swap the webhook URL and the signature verification; the event handling stays yours.
Retry safety Idempotency keys on writes: a retried purchase returns the original label, never a second one. Keep the retry logic you already trust; it just costs nothing to run here.

EasyPost is a trademark of its owner and is not affiliated with GoatLabels. This table describes the GoatLabels API and the concepts common to shipping APIs — check their current docs for their side.

Three reasons the port is smaller than it looks.

It is a remap, not a rewrite

Your integration already models a shipment, a rate, a purchase, a void, and a tracking event, because every shipping API models those. Porting means pointing four calls at new URLs and re-reading the response shapes — the business logic around them does not move.

The variable line disappears

After the cutover, API calls cost nothing at any volume. Retries, health checks, and re-quotes stop being budget decisions, and next month's shipping forecast is shipments times carrier rate with no second term.

You can run both at once

There is no monthly minimum here, so the overlap period is free. Send a slice of live traffic to the new integration, compare the all-in rates against what you would have bought, and move the rest when the numbers agree.

And when EasyPost is the right choice

  • You ship on a carrier or service outside USPS, UPS, FedEx, and DHL — that is our honest list, and no migration guide fixes a missing carrier.
  • Your integration depends on negotiated carrier contracts held on your own accounts, which is the model EasyPost is built around.
  • Your volume genuinely sits inside the free tier and your integration is stable — porting working code for a fee you are not paying is not engineering, it is churn.
The cutover, in order

Rates in parallel, then buy, then webhooks. Cut over when the diff is boring.

Start with the read-only call: point a copy of your rating step at GoatLabels and log both responses side by side for a week. Because rate lookups are unmetered, that parallel run costs nothing at all. Then move purchases behind a flag on a slice of live orders — idempotency keys mean a retry during the transition cannot produce two labels — and confirm the all-in price hitting the wallet matches the quote your code read. Voids and tracking webhooks follow the shipments the new path created, so they migrate last and by themselves. Finally, delete the polling you wrote to compensate for missed events and let the signed webhooks carry it.

1
Any order shape in
API, store sync, DM, or screenshot
maya_boutique

Hey! 2x hoodies (M) 1x tee (L) 😅 Ship to: Maya R. Austin, TX 78701

Shopify
Synced into To Ship
TikTok Shop
Synced into To Ship
DM screenshot
Order
#1847
Customer
Jordan Lee
Items
1x Hoodie (L)
Address
Brooklyn, NY
Drop the screenshot or paste the DM

Your API keeps its intake path; connectors and the dashboard cover the orders it never received.

2 Billy AI

The exceptions queue you were about to build.

Billy AI
  • Reads a pasted order, a screenshot, a voice note, or a synced record
  • Fills the addresses and the package details
  • Rate-shops USPS, UPS, FedEx, and DHL at the all-in price
  • Included free, so support stops filing integration tickets
Drafted. Checked. Yours to confirm.
3
Clean label out
Bought from the wallet
Paid from your prepaid balance
Card, Apple Pay, Google Pay, ACH, or crypto
$12.47
USPS
Label purchased
USPS Priority Mail — all-in rate
$12.47

Signed webhooks replace the poller. Voids credit the wallet the purchase debited.

What you can stop maintaining.

Connectors for the storefronts, less code for you.

Shopify, Etsy, WooCommerce, and TikTok Shop sync into To Ship and push tracking back when a label prints. If your integration currently carries that plumbing, the migration is a chance to delete it rather than port it.

Via AI tiles: an order that never became a record still becomes a label.

13 connected today 2 via AI 8 coming soon
Connected today 13 storefronts sync to To Ship
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
Square logo Square
BigCommerce logo BigCommerce
Magento logo Magento
Temu logo Temu
Via AI

DM and screenshot parsing — the AI builds the label.

Coming soon
Shopify Plus logo Shopify Plus Soon
Zapier logo Zapier Soon
NetSuite logo NetSuite Soon
Ecwid logo Ecwid Soon
Shein logo Shein Soon
ChannelAdvisor logo ChannelAdvisor Soon
SkuVault logo SkuVault Soon
Zoho Inventory logo Zoho Inventory Soon
What survives the port, and what you gain.

Everything your integration relies on.
Plus the parts you were writing yourself.

A migration should not cost you rate shopping, idempotency, or webhooks — those all come across. What arrives with them is a dashboard your support team can use, AI drafting for the orders that never reached your API, and a wallet instead of a platform invoice.

One prepaid wallet,
five ways to fund it

Card, Apple Pay, Google Pay, ACH bank transfer, and crypto all top up the same balance, and every method buys identical rates, carriers, and features. Voiding over the API credits that same balance immediately.

Wallet balance
$1,247.36 USD
AI

AI drafting for the orders
your API never saw

A DM, a comment thread, a voice note, a screenshot — Billy reads any of them into a drafted label. Every one of those is an edge case you would otherwise ticket, scope, and ship.

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

No monthly minimum
to print

The overlap period costs nothing beyond the labels you buy, which is what makes a parallel run practical. Pro is a flat optional plan for unlimited shipments and cheaper label pricing once you are fully cut over.

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

USPS, UPS, FedEx, and DHL
in one response

One rates call returns four all-in prices, and the number your code selects is the exact amount that leaves the balance. Discounted rates are built into the account, so the migration does not stall on carrier contract negotiation.

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

Idempotency and webhooks
you already assume

REST and JSON, one Bearer header, idempotency keys on writes, signed webhooks for tracking and label events, and an OpenAPI 3.1 spec so you can regenerate a client instead of hand-writing one.

POST /v1/shipments
{
"to" : { "name" : "Maya" },
"from" : { "name" : "Alex" },
"service" : "ups_ground" ,
"label_format" : "pdf"
}
Webhook delivered
GoatLabels mobile shipments queue with all-in carrier prices
Billy drafting a label from a pasted DM on mobile

Label ready

CL-1038 · Brooklyn, NY

Ship while the port is in flight

A dashboard on the same account.

During a migration the worst moment is the label nobody can print because the code is half-moved. The web and mobile app runs on the same account and the same balance, so anyone can buy, reprint, or void a shipment manually while the integration catches up.

Paste the DM, snap the thread, or drop the screenshot — Billy pulls the name, the address, and the parcel out of it.
Reprint or void a label your code bought, without shipping an admin tool first.
USPS, UPS, FedEx, and DHL come back as four all-in prices on one screen.
Buy from the prepaid balance and one-tap print to a share sheet or a thermal printer over Wi-Fi.
Hold the mic at the packing table and say the address — Billy drafts it and reads the rate back.
Debugging without a query console

Talk to Billy, not to your logs.

Mid-migration, half the questions are just where did this parcel go and what did it cost. Hold the mic, ask, and Billy answers from the same shipments your API created, then drafts the next label against the same prepaid balance. This is the real product, not a render.

goatlabels.io/dashboard/shipments — Billy
Billy reading back a 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

Plain English in — names, addresses, weights, carriers, services · same shipments your API created · reads the all-in rate back before a cent leaves the wallet · phone, browser, or Telegram.

All-in quotes

The quote is the debit.

Three carriers on the same parcel, each an all-in number that is the exact amount leaving your prepaid balance. That is what makes a parallel run easy to evaluate: the price your code read is the price that moved, with no platform fee to add back before you compare.

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

USPS

Priority Mail Intl

10–15 days

$18.30

$10.00 of taxes & duties included

all-in · no surprises

Best balance
FedEx

FedEx

Intl Connect Plus

3–5 days

$22.80

$11.00 of taxes & duties included

all-in · no surprises

DHL

DHL

Express Worldwide

1–2 days

$26.20

$12.20 of taxes & duties included

all-in · no surprises

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

Port it here. Then stop paying per shipment.

REST, JSON, one Bearer header. Real idempotency keys so a retried request cannot double-buy a label, signed webhooks for tracking and label events instead of polling, and errors that name what to fix. The OpenAPI 3.1 spec means your client can be generated rather than transcribed.

Create, rate-shop, and buy — the same three calls you already write
Signed webhooks for tracking and label events instead of polling
Real idempotency keys — a retried request never buys two labels
OpenAPI 3.1 spec, no SDK lock-in, unlimited calls on every plan
Read the API docs Get an 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": 1.2, "weight_unit": "kg" },
  "service": "fedex_intl_priority"
}
What the migration is worth

After the cutover, calls are free.

Free covers 50 shipments a month with the public API, the store connectors, and Billy all unlimited underneath it — we make a little on each label instead. Pro is a flat monthly fee for unlimited shipments, cheaper label pricing, and Billy on Telegram. Neither plan meters requests, which is what makes the parallel run and the eventual volume both free.

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

Enough to run the whole parallel evaluation on.

50 shipments a month, no monthly minimum to print
USPS, UPS, FedEx, and DHL rate-shopped on every parcel
The full REST API with unlimited calls and signed webhooks
Billy AI in the web app, unlimited — paste, screenshot, or speak
Shopify, Etsy, WooCommerce, and TikTok Shop sync included

Billy is not a paid tier

The assistant that reads a DM, a screenshot, or a voice note into a drafted label 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

Unlimited calls on Free — still unlimited on Pro.

Bring the invoice you pay today

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

ShippoPirateShipShipStation
No contracts No monthly minimum to print Start in seconds
USPS UPS FedEx DHL

Label prices are quoted live from USPS, UPS, FedEx, and DHL and shown as one all-in number — the same number that leaves your wallet. EasyPost's tiers and fees move, so model the saving against their current pricing page. Full pricing details

Who should schedule the port

Not every integration is worth moving.

A migration is only ever worth its own cost, so this is the shortlist of teams for whom the maths clears — and the ones who should leave working code alone are named on this page too.

Teams past the free-tier cap

TikTok Shop & live commerce

Unlimited

If the platform line on your bill now grows every month, a few days of remapping buys back a variable cost permanently.

4 carriers per quote unlimited API calls free overlap period
goatlabels.io/dashboard/shipments
GoatLabels shipments queue with purchased labels

Teams without carrier contracts

Etsy & independent creators

If you never negotiated your own accounts, a platform built around bringing them is doing you no favours. Discounted rates come with the account here.

Rates first, then buy

Order #1024 · parallel run, zero call cost

Sellers living in the DMs

The orders that never became JSON

got the dress! can you ship to Austin?
Label drafted · CL-1024

Devs who inherited the integration

REST and the UI, one balance

4

calls to remap: rates, buy, void, track

Real sellers, real words

Teams running on the API they ported to.

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

EasyPost migration FAQ

How hard is it to migrate from EasyPost to GoatLabels?
For most teams it is a few days of work, because the concepts line up one to one: create a shipment, read rates, buy the chosen rate, void when needed, and receive tracking webhooks. You remap those calls to the GoatLabels REST endpoints, swap the Bearer token, re-point and re-verify the webhook, and keep the surrounding business logic exactly as it is.
What is the recommended migration order?
Rates first, because it is read-only and free — run it in parallel and diff the prices against what you pay now. Then buy, behind a feature flag on a slice of traffic. Then void and webhooks, since they follow the shipments the new path created. Cut the remaining traffic over once a week of real orders looks right.
Do I need to change my retry logic?
No, and you should keep it. Writes accept an idempotency key, so a retried purchase returns the original label rather than buying a second one. Because calls are unlimited and free, aggressive retries cost nothing beyond the label itself.
How do webhooks differ?
GoatLabels sends signed webhooks for tracking and label events, so the change is the endpoint URL and the signature verification step. Everything downstream — how you update an order, notify a buyer, or close a ticket — stays untouched, and you can drop any polling you added to work around gaps.
How does funding work after the switch?
Labels debit a prepaid wallet you top up with card, Apple Pay, Google Pay, ACH bank transfer, or crypto, rather than accruing on a monthly platform invoice. Voids credit the wallet directly, and the dashboard and the API spend the same balance, so there is nothing to reconcile between them.
Can I keep both integrations running?
Yes. There is no monthly minimum and no per-call fee, so an overlap costs only the labels you actually buy on each side. Most teams run the rates call in both for a week before moving purchases.
What do I lose by moving?
Carrier breadth, if you ship outside USPS, UPS, FedEx, and DHL — that is the honest trade and it is the first thing to check. What you gain is a free unlimited API, discounted rates built into the account without your own carrier contracts, and a dashboard your support team can use without you building one.

Still deciding rather than porting? Read GoatLabels vs EasyPost, the pricing teardown, or what the free unlimited API covers.

Run the rates call in parallel this week.

Remap four endpoints.
Delete the per-shipment fee.

Generate an API key, fund a wallet with card, Apple Pay, Google Pay, ACH, or crypto, and diff your next real quote against USPS, UPS, FedEx, and DHL before you move a single purchase.

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