Setting up live ShipStation rates at WooCommerce checkout really comes down to one connection: your ShipStation v2 API key and secret. After that, you give the plugin a few real details about how you ship: your origin address, the boxes you actually pack, and the services you offer. Then quote a single rate to confirm it reached ShipStation. Whether you work through the WooCommerce settings screens, type the commands at a terminal, or pass the sequence to an AI agent that runs them for you and stops to ask for your key, the route is up to you. Pick whichever desk you like; the order of operations behind it never moves.
Here is the part that catches almost everyone. You connect ShipStation expecting rates at checkout the way they appear on Shopify, then you watch checkout and nothing happens. ShipStation’s official WooCommerce integration imports orders and prints labels. It does not quote a price to your buyer. The Checkout Rates feature that would do that runs on Shopify, BigCommerce, Magento, and Wix. WooCommerce is not on the list.
This is not a cosmetic problem. Long before an order ever reaches your fulfillment desk, checkout has one job: put an accurate shipping price in front of the buyer while they are still deciding whether to stay. Baymard Institute puts documented cart abandonment at roughly 70% on average, and surprise shipping costs rank among the top reasons people bail. When a buyer can’t see what shipping costs, plenty of them just go. The ones who stay pay a flat rate, and a flat rate is wrong in both directions:
- The nearby order gets overcharged and bails.
- The heavy cross-country order underpays, and you eat the difference.
What you actually need is a plugin that asks ShipStation for a quote the moment a buyer enters an address.
The plugin we’ll use here holds a 5.0 out of 5 rating across 15 reviews, and we build and support it ourselves. One thing to flag before you start: the v1-versus-v2 credential mix-up covered below is the question we field more than any other on this integration. Get it right the first time and you’ll save yourself an afternoon.
Try ShipStation Shipping Free on WordPress.org | See ShipStation Shipping PRO Features
TL;DR
What you need:
- A ShipStation plan that includes API access. Plan names and prices change, so check the current tiers on the ShipStation pricing page.
- A ShipStation v2 API key and secret (a key plus a secret, not a single token).
- The free ShipStation shipping plugin from WordPress.org. PRO adds labels, tracking, box presets, and bulk fulfillment.
The setup, in six steps:
- Confirm your ShipStation plan includes API access, then generate a v2 API key and secret.
- Install the free ShipStation shipping plugin and confirm the CLI namespace with
wp help | grep shipping. - Discover the credential keys with
settings list, then set the key, secret, and origin. - Audit product weights and dimensions, add your boxes, and enable your services.
- Run
validateand a realrates quoteto confirm the carrier is reachable. - Attach the plugin to your shipping zones and turn on live rates.
Rather not run any of it yourself? Install the skill once and an assistant like Claude Code handles the whole sequence:
$ npx skills add https://github.com/1TeamSoftware/skills --skill 1teamsoftware-wc-shippingWhat the official ShipStation integration does and skips
The official ShipStation for WooCommerce integration handles fulfillment, not checkout pricing: orders flow from WooCommerce into ShipStation, you fulfill them there, and tracking comes back. ShipStation is good at that back end. It pulls orders in from your sales channels, batches them, buys labels at your negotiated USPS, UPS, FedEx, and DHL rates, and pushes tracking back out.
What it never does is quote a rate to your customer. The typical WooCommerce store on ShipStation ends up lopsided: fulfillment is accurate, checkout is guessing. You fall back to flat rate or table rate and hope the math works out. It rarely does. A buyer one state over pays your $12 flat rate while the real label costs $19, so you swallow the $7. Someone across the country buys four heavy items and your flat rate is off by $40. Light local orders get overcharged, and a chunk of those carts never convert.
The fix is a plugin that asks ShipStation for a live rate the moment a buyer enters an address, using your actual box sizes and weights. You keep your ShipStation account, your carriers, your negotiated rates. The plugin adds the one piece ShipStation leaves out on WooCommerce: the checkout quote.
| Capability | Official ShipStation for WooCommerce | ShipStation Shipping plugin (1TeamSoftware) |
|---|---|---|
| Import orders into ShipStation | Yes | Your ShipStation account still does this |
| Live rates at WooCommerce checkout | No | Yes |
| Multi-box dimension and weight packing | No | Yes (PRO) |
| Buy and print labels in WooCommerce | Yes | Yes (PRO) |
| Bulk labels merged into one PDF | Partial | Yes (PRO) |
| Tracking back to the customer | Yes | Yes (PRO) |
| Per-zone boxes, services, and from-address | No | Yes |
| Multivendor origin (Dokan, WCFM, WCMP, YITH) | No | Yes |
| WP-CLI and AI agent setup | No | Yes |
One row in that table needs a plain-English note. Multivendor origin only matters if you run a marketplace where different sellers ship from their own addresses. Plugins like Dokan, WCFM, WCMP, and YITH turn one WooCommerce site into that kind of marketplace, and our plugin can quote each vendor’s parcel from their own location. Sell your own products out of a single warehouse? Ignore that row entirely.
For the full feature-by-feature breakdown, see the ShipStation Shipping PRO product page.
Before you start
Three things have to be in place before live rates can work: a ShipStation plan with API access, a v2 API key and secret, and the free plugin. Line them up first and the rest is quick.
- A ShipStation plan with API access. The plugin pulls rates through ShipStation’s API, so your account needs a plan that exposes it. Plan names and prices shift over time, so check the current tiers on the ShipStation pricing page. No plugin can route around a plan that locks the API.
- A v2 API key and secret. ShipStation moved from its legacy v1 API to a v2 API, and the current plugin runs on v2. A v2 credential is two parts, a key and a secret, not a single token. Generate it in ShipStation under Settings, then Account, then API Settings, and copy both halves. Paste a v1 credential where v2 belongs and you get auth errors that look like a dead connection but are just the wrong credential. This is the one that bites first-time setups more than anything else.
- The free plugin. Install the free ShipStation shipping plugin from WordPress.org. It covers the connection and live rates. Labels, tracking, box presets, and bulk fulfillment live in PRO.
Set it up from the command line
Every 1TeamSoftware shipping plugin puts its entire setup behind WP-CLI, so the whole fulfillment connection can be wired up with typed commands rather than clicked together across admin screens. If you prefer the keyboard, this is the way to go. It’s the same workflow as the pillar guide, configure WooCommerce shipping with AI and WP-CLI, pointed at ShipStation.
The current ShipStation plugin runs on the carrier’s API v2, so it registers its commands under the namespace wc-shipstation-shipping-v2. The legacy v1 plugin used wc-shipstation-shipping. Check which one you have before you script anything:
$ wp help | grep shippingUse whatever namespace it prints back. Every example below assumes wc-shipstation-shipping-v2.
See where you stand
Run these two first. Each one reads back the configuration as it stands and flags trouble before you change a single setting.
$ wp wc-shipstation-shipping-v2 status $ wp wc-shipstation-shipping-v2 validate
status prints a snapshot of your config: plugin version, carrier, the sandbox and debug toggles, whether live rates are on, the origin, and how many method instances exist. It deliberately skips any “is the API reachable” indicator, because only a rates quote proves connectivity. validate walks every configuration check and tags each one PASS, FAIL, WARN, INFO, or PENDING. It returns a non-zero exit code the moment something fails, so you can drop it straight into a deploy pipeline as a gate.
Discover the credential keys, then set them
ShipStation v2 uses a key and a secret, and you want the exact setting key names from the source rather than guessing them. List the settings first. Secrets come back as [REDACTED], so this is safe to run anywhere:
$ wp wc-shipstation-shipping-v2 settings listPull the API key and secret key names out of that output, then set them along with your origin address:
$ wp wc-shipstation-shipping-v2 settings set <apiKeyName> "your_shipstation_v2_api_key" $ wp wc-shipstation-shipping-v2 settings set <apiSecretName> "your_shipstation_v2_api_secret" $ wp wc-shipstation-shipping-v2 settings set enableLiveShippingRates yes $ wp wc-shipstation-shipping-v2 settings set origin '{"name":"My Store","address":"123 Main St","city":"San Francisco","state":"CA","postcode":"94105","country":"US"}'
Swap <apiKeyName> and <apiSecretName> for the exact keys from settings list. Origin needs address, city, country, and postcode at minimum. Add state for US and Canada addresses; it makes the rates more accurate.
Audit your products
Accurate rates need accurate weights and dimensions, full stop. A product with no weight silently drops its rate, and that’s one of the most common reasons a quote comes back empty:
$ wp wc-shipstation-shipping-v2 products audit --detailed --format=json --limit=0The per-product lists (missing_weight_products, missing_dimensions_products, suspicious_data_products) only show up with --format=json. In table mode, --detailed gives you the same summary as plain audit. Pass --limit=0 so a big catalog isn’t capped at 500. Virtual and downloadable products drop out automatically, and variations inherit weight and dimensions from the parent.
Find your services and enable them
List the carrier services your account exposes, then enable only the ones you actually ship with.
$ wp wc-shipstation-shipping-v2 services --format=json $ wp wc-shipstation-shipping-v2 settings set services '{"usps_ground_advantage":{"enabled":true,"name":"USPS Ground Advantage"}}'
services lists the real service IDs your ShipStation account exposes, each with its enabled status. That’s the list you set from, not features, which only reports capability flags. Always pass valid IDs from services into settings set services. Don’t invent IDs; they won’t match and the rate won’t appear.
Quote a rate to prove it works
Run a real quote against your credentials. This is what confirms ShipStation is reachable and handing back prices.
$ wp wc-shipstation-shipping-v2 rates quote --products="123" --destination="New York, NY 10001, US"rates quote spins up a temporary order, asks ShipStation for a live quote, then deletes the order. Minimum input is a ZIP or postcode plus a country; a full street address sharpens the result. A quote that returns rates is the only real proof the carrier is reachable, and there’s no separate test-connection command, by design. One gotcha when you script it: the command prints a human-readable log line before the JSON, so parse the array from the first [ to the matching ] instead of leaning on 2>/dev/null.
A note on --format while you’re here. status, validate, features, services, zones, and rates accept the full table|json|csv|yaml|count range. The products subcommands, boxes, track, and settings list stick to table|json, and anything outside that errors out instead of guessing what you meant.
For every command, flag, and output field, see the full WP-CLI command reference.
The fast path: hand it to an AI agent
Install the skill once and an assistant like Claude Code drives every command above from plain English. It ships with playbooks for the jobs that actually come up: first-time setup, auditing products, sizing boxes, tuning rates, and tracking down why checkout has gone quiet. It picks the right playbook for what you asked. There’s no hidden layer here. It runs the same CLI you would, and it stops to ask for secrets instead of making them up.
$ npx skills add https://github.com/1TeamSoftware/skills --skill 1teamsoftware-wc-shippingOnce it’s installed, just describe what you want with real constraints. These are the kinds of multi-step requests it’s built for:
- “Set up ShipStation from scratch. Here are my v2 API key and secret. We ship from 215 Clayton St, San Francisco 94117. Before you turn on live rates, audit my catalog for missing weight or dimensions, recommend a starter box set from what I actually sell, and prove rates come back with a real quote. Ask me one question at a time.”
- “Customers in some regions say no shipping options appear. Make the plugin active for both my US domestic zone and Rest of World, then show me the zone coverage table so I can confirm it’s attached where it needs to be.”
- “Our shipping is undercharging. Survey live ShipStation rates for my three best sellers to a few US zones, then add a 15% markup plus a flat $2 handling fee, show me the before and after, and apply it only after I confirm.”
Show live ShipStation rates at checkout
This is the switch that actually turns rates on: the plugin has to be attached as a shipping method on every zone you sell to. With that in place, a buyer enters an address, the plugin packs the cart into your configured boxes, sends the parcel and destination to ShipStation, and gets real carrier prices back. Those show up as shipping options, the same numbers ShipStation quotes you when you buy the label. If rates appear for some customers but not others, a zone is missing the method, and the zones situation further down has the command to fix it.
A few settings tidy it up. Cap how many options appear so buyers aren’t staring at a dozen choices (maxShippingRates), rename services so they read clearly, and add a handling fee or percentage markup when the margins call for it. Rates render on both the classic checkout and the WooCommerce Blocks cart and checkout, and the whole thing is HPOS-aware. Run a marketplace like Dokan or WCFM? Rates can calculate from each vendor’s origin. Every checkout control is on the ShipStation Shipping PRO page.
Verify it works, then go live
Do not trust the settings screen. Trust a quote.
$ wp wc-shipstation-shipping-v2 validate $ wp wc-shipstation-shipping-v2 rates quote --products="123" --destination="500 5th Ave, New York, NY 10001, US"
A rates quote returns one row per enabled service. The shape looks like this (the real cost and ETA figures only fill in when you run it against your own ShipStation credentials):
$ wp wc-shipstation-shipping-v2 rates quote --products="123" --destination="500 5th Ave, New York, NY 10001, US" Quoting rates for 1 product(s) to 500 5th Ave, New York, NY 10001, US | Service | Cost | Days | |-----------------------|---------------|---------| | USPS Ground Advantage | <live cost> | <eta> | | USPS Priority Mail | <live cost> | <eta> | | UPS Ground | <live cost> | <eta> |
Prices on screen means the connection is live. Now confirm it in a browser: add a product with a real weight, head to checkout, enter an address, and check that the same options appear. Last, make sure the ShipStation method is attached to every zone you actually serve.
Common situations you’ll hit
With live rates running at checkout, the next things you hit are the everyday messes: a catalog with gaps, oversized boxes, a zone you forgot to attach. Here is how each one gets handled from the command line.
Fix products missing weight or dimensions
The situation: a catalog that grew over years of imports, and rates quietly vanish because some products carry no weight. Send ShipStation a weightless parcel and it hands back nothing, so the buyer sees no shipping option and stalls.
What you type: “Audit every physical product for missing weight and dimensions, give me the completeness percentage and the full list of what’s incomplete (don’t cap it, I have a big catalog), then research real specs from manufacturer sources, apply only high-confidence values to the parent and every variation in my store’s units, and list the rest for me to confirm by hand. Never make up a number.”
What runs:
$ wp wc-shipstation-shipping-v2 products audit --detailed --format=json --limit=0The agent reads the missing_weight_products, missing_dimensions_products, and suspicious_data_products arrays, looks up the real specs, converts them into your woocommerce_weight_unit and dimension_unit, then writes them with wp wc product update across the parent and every variation. Only high-confidence numbers get applied. The low-confidence and not-found ones come back to you for sign-off. A value lands in the suspicious bucket once a weight climbs past about 70 lb (32 kg) or a single dimension runs beyond about 72 in (183 cm). It won’t fabricate a spec it can’t source, which is the whole point.
The result: completeness climbs, rates stop disappearing, and you’re left with a short list of genuine unknowns instead of a catalog-wide guessing game.
Recommend a box set from what you actually ship
The situation: rates look high because parcels are quoted in oversized boxes nobody matched to the real catalog. A small item priced as if it ships in a large box shows the buyer an inflated number, and that number is often the difference between a completed order and a closed tab.
What you type: “Analyze my last six months of orders and my catalog, recommend a box set that covers about 90% of what I ship, prefer USPS flat-rate boxes where they’d be cheaper for heavy items, show me the coverage table before applying anything, and keep my existing custom boxes.”
What runs:
$ wp wc-shipstation-shipping-v2 products stats --format=json $ wp wc-shipstation-shipping-v2 products orders --since=2025-12-01 --format=json $ wp wc-shipstation-shipping-v2 boxes presets --carrier=USPS --format=json $ wp wc-shipstation-shipping-v2 products fit-box --length=12 --width=8 --height=6
products stats and products orders describe the real product shapes and the carts they ship in. products fit-box takes box dimensions (all three required) and reports coverage plus a sample of products that won’t fit; it rotates parcels for you. Here’s the catch: boxes presets output can’t be pasted into the boxes setting as-is. The agent reshapes each field first (rename name to boxName, add an enabled flag, drop carrier and maxweight), shows you a coverage table, and only then writes the merged set with settings set boxes. boxes itself is a PRO command; on a free install you write the boxes setting straight through the free settings set boxes.
The result: a box set sized to your actual catalog and order patterns, with coverage you can eyeball before you commit.
The “no rates at checkout” fix: shipping zones
The situation: rates work for some customers and not others. Of every “no rates at checkout” ticket that lands on the support desk, this is the one we see more than any other. The plugin only returns rates on the zones where it’s attached as a shipping method, so any zone it’s missing from shows the buyer nothing.
What you type: “rates quote works from the CLI but checkout shows nothing for some customers. Figure out which zone those addresses fall into, check whether the plugin is actually attached, and add it where it’s missing.”
What runs:
$ wp wc-shipstation-shipping-v2 zones $ wp wc shipping_zone_method create --zone_id=2 --method_id=wc-shipstation-shipping-v2 --user=1
zones lists each zone alongside its plugin_active, instance_id, and method_id. Wherever plugin_active: no shows up, that’s a zone missing the method. Run zone-based mode and any zone the method skips hands those orders no rate at all; run global mode and that gap stops mattering. Once the method is attached, you can layer per-zone overrides through --instance, for example a different box or service mix for international versus domestic, while your global defaults stay untouched. Every wp wc command needs --user=1.
The result: the plugin is attached to the zones that need it, and checkout returns rates.
Rate tuning: markup, floors, and which services show
The situation: shipping is undercharging, the checkout shows too many options, or a $1.50 rate is slipping through. The adjustment fields all live in the free plugin and you write them with the free settings command.
What you type: “Survey live rates for my best sellers to a few US zones, add a 15% markup plus $2 handling, hide anything under $5, keep only the cheapest three, and show me before and after first.”
What runs:
$ wp wc-shipstation-shipping-v2 settings set priceAdjustmentPercent 1.15 $ wp wc-shipstation-shipping-v2 settings set priceAdjustment 2.00 $ wp wc-shipstation-shipping-v2 settings set minRateCost 5.00 $ wp wc-shipstation-shipping-v2 settings set maxShippingRates 3
Watch the multiplier here: priceAdjustmentPercent is exactly that, a multiplier, so 1.15 adds 15%. Put 15 in that field and every rate balloons fifteenfold. The adjustments apply in a fixed order: carrier rate, then the percentage, then the fixed amount, then the floor and ceiling, and last the max-count cap. Re-quote afterward and eyeball the new numbers before you sign off.
The result: rates land inside a sane band, the checkout list stays short, and only the services you picked show up.
Buy a test label and read its tracking
The situation: you want to watch the full fulfillment pipeline run once before real customers hit it. This is a PRO workflow. Buying labels, reading tracking, and merging manifests inside WooCommerce all belong to ShipStation Shipping PRO. ShipStation doesn’t hand out a separate sandbox credential the way some carriers do, so you test against your live account: buy a real label on a single order, then refund it. No sandbox toggle to flip.
What you type: “Buy a test label for order 1240, then pull its tracking so I can see the whole pipeline before we go live.”
What runs:
$ wp wc-shipstation-shipping-v2 labels purchase --orders=1240 $ wp wc-shipstation-shipping-v2 track <shipment-id> --order=1240 --format=json $ wp wc-shipstation-shipping-v2 labels pdf --orders=1240 --output=/tmp/test-label.pdf $ wp wc-shipstation-shipping-v2 labels refund <shipment-id> --order=1240
labels purchase creates the shipment if needed and logs how many labels it bought (Order 1240: N label(s) purchased). It does not print the tracking number. Pull that from track or shipments get, then export the printable PDF with labels pdf (or labels download for a single label, which errors if the target file already exists). track wants both the positional shipment ID and --order. Since this was only a test, labels refund gives you the postage back.
The result: a confirmed label, tracking you can pull on demand, and a PDF ready to print.
Troubleshooting
No rates at checkout? Work down these in order:
- Run
validateand read the failures. - Confirm the plugin is active on the buyer’s zone with
zones. A zone where it’s off returns nothing. - Run
products auditto rule out missing weights. A weightless product silently drops its rate. - Run a
rates quoteto test the carrier directly.
If a complete product on a covered route still comes back empty, that’s a WARN, not a connectivity failure. ShipStation fronts a lot of carrier sub-accounts, and a specific route may simply not be served. Try a different destination.
- Auth or “invalid key” errors. Nine times out of ten it’s a v1 versus v2 credential mix-up. Confirm you generated a v2 API key and secret under ShipStation’s API Settings and pasted both in full. Re-check the configured keys with
settings list(values stay redacted, exactly as they should). - Rates worked yesterday, now nothing. Check your ShipStation plan and billing first. A downgrade or a lapsed payment that knocked your account off an API-access plan will stop rates cold. Nothing’s wrong with the plugin; the API door just closed.
- Rates show in admin but not at checkout. That’s a zone problem.
zonesshows exactly which zones the plugin is on. Add the method to the zone your buyers fall into. - Settings changed but rates look stale. Caching is hiding your change. Check
settings get cacheand the TTL, runwp cache flush, and if a persistent object cache is desyncing, flipsettings set cache noto confirm that’s the culprit, then turn it back on. - Quote times out on a big cart. Bump the timeout with
--timeout=0on therates quotecommand, and switch on rate caching so checkout stays quick under load.
Frequently asked questions
No. ShipStation’s official WooCommerce integration imports orders, prints labels, and sends tracking, but it never quotes a rate to your buyer at checkout. The Checkout Rates feature that would do that runs only on Shopify, BigCommerce, Magento, and Wix. To put live ShipStation rates in front of WooCommerce shoppers, you need a plugin like ShipStation Shipping PRO.
You need a ShipStation plan that includes API access, since the plugin pulls rates through the API. Plan names and prices change, so check the current tiers on the ShipStation pricing page before you start. No plugin can route around a plan that doesn’t expose the API.
The current plugin runs on ShipStation’s v2 API, and a v2 credential is two parts: a key plus a secret, not a single token. The legacy v1 API used a different credential for a different API version. Generate both halves under ShipStation’s API Settings and enter them where the plugin asks for the key and secret. Use a v1 credential where v2 is expected and you’ll get auth errors that look like a broken connection but aren’t.
Yes, and it’s the fastest way. The plugin exposes its full setup under the wc-shipstation-shipping-v2 WP-CLI namespace, including status, settings list, settings set, products audit, services, validate, and rates quote, plus boxes, labels, track, and manifest in PRO. Confirm the namespace on your site with wp help | grep shipping. A successful rates quote is what proves the connection is live.
Yes. Install the 1teamsoftware-wc-shipping skill with npx skills add https://github.com/1TeamSoftware/skills --skill 1teamsoftware-wc-shipping, point an assistant like Claude Code at your site, and say “set up ShipStation shipping for my store.” It runs the documented WP-CLI commands and stops to ask you for the API key and secret when it needs them. Same CLI a human would run, no hidden layer.
Usually it’s a zone or product-data problem, not the key. The plugin only returns rates on zones where it’s active (check with zones), and products with no weight silently drop their rate (check with products audit). If a complete product on a covered route still comes back empty, ShipStation may just not serve that exact route. Try another destination.
Run wp help | grep shipping to see the namespace. The current API v2 plugin uses wc-shipstation-shipping-v2; the legacy v1 plugin used wc-shipstation-shipping. From there, wp wc-shipstation-shipping-v2 settings list shows the exact setting keys with secrets redacted, services gives you valid service IDs, and boxes presets lists carrier box dimensions. Read them from the source instead of guessing.
Use ShipStation if you already run fulfillment there on a plan with API access; bolting live rates on top is the obvious move. If you ship low volume and don’t lean on ShipStation’s dashboard, a direct carrier plugin is usually cheaper. Weigh the options in ShipStation vs Shippo vs EasyPost.
Get live ShipStation rates on your store
ShipStation already runs your fulfillment. The one piece it leaves out on WooCommerce is the checkout, the spot where your buyers still need a real price before they’ll commit. Install the free ShipStation shipping plugin from WordPress.org (rated 5.0 out of 5 across 15 reviews), connect your v2 API key and secret, and quote a real rate to confirm it works. When you’re ready for labels, tracking, multi-box packing, and bulk fulfillment inside WooCommerce, that’s all in ShipStation Shipping PRO.
$ npx skills add https://github.com/1TeamSoftware/skills --skill 1teamsoftware-wc-shipping1TeamSoftware builds and maintains the ShipStation shipping plugin for WooCommerce and eight other carrier plugins.

