Self-hosted means the shipping stack is yours to build
WooCommerce's defining trait cuts both ways for shipping: there is no platform label program, no marketplace prepaid label, no built-in postage account — and also no platform taking a cut or dictating your carrier. Your shipping stack is whatever you assemble from the plugin ecosystem: carrier-rate plugins that quote live prices at checkout, label plugins that buy postage from your own carrier accounts, and fulfillment integrations that sync orders to external tools. Total control, assembly required.
For a new store, the pragmatic starting stack is small: one shipping-rates plugin configured with honest package presets (real boxed weights, real dimensions), one label source (a discount platform or direct carrier account), and flat-rate shipping zones until volume justifies live rates. The classic WooCommerce mistake is over-engineering shipping before the tenth order — the plugin catalog makes it tempting.
Package presets: the setting that decides your quotes
Live-rate plugins quote carriers using the weights and dimensions stored on your products — which means checkout shipping prices are only as honest as your product data. A catalog entered with naked-item weights quotes too low and eats the difference on every order; guessed dimensions trigger dimensional-weight surprises on invoices weeks later. Weigh and measure products as packed, store those numbers, and your checkout quotes converge on what you actually pay.
The maintenance habit that keeps it true: whenever packaging changes — new mailer size, lighter void fill — update the presets the same day. A store's shipping margin usually erodes through stale package data, not through carrier price increases.
💡 Audit one month of orders against carrier invoices quarterly: quoted shipping versus billed shipping, per order. The gap is your package-data error, made visible.