Shipping

Generate shipping labels, assign tracking numbers, and ship packed orders through your carrier.


Shipping is the final stage of fulfillment. Once items are packed into shipments, OpenMRP generates shipping labels through the Shippo integration, assigns tracking numbers, and marks the shipment as shipped: getting packages from your dock to the customer's door.

On the factory floor

The typical shipping workflow looks like this:

  1. Packed cases arrive at the shipping dock
  2. A worker opens the shipment in OpenMRP and confirms the shipping details (carrier, service level, weight, addresses)
  3. They generate labels: OpenMRP calls Shippo to create a label for each shipping case
  4. Labels are printed and affixed to the cases
  5. The carrier picks up the packages

Carrier setup

Before you can ship, connect a carrier through OpenMRP's Shippo integration:

  • Add a carrier account: connect your UPS, FedEx, USPS, or other supported carrier account to Shippo
  • Configure carriers in OpenMRP: set up carriers and service levels that map to your Shippo accounts
  • Service level discovery: available service levels are automatically pulled from Shippo, so you always see the options your carrier account supports

Carriers and service levels can be defaulted at the customer level and overridden per sales order.

Generating shipping labels

When you ship a shipment, OpenMRP calls Shippo to generate instant labels:

  • One label per case: each shipping case in the shipment gets its own label with a unique tracking number
  • Validation: the system validates freight weights and addresses before generating labels to catch errors early
  • Storage: labels are uploaded to storage and are downloadable directly from the shipment

What happens when you ship

Shipping a shipment triggers the following sequence:

  1. Labels created: OpenMRP calls Shippo to generate a label for each shipping case
  2. Labels uploaded: label files are stored and linked to the shipment
  3. Tracking numbers assigned: each case receives its own tracking number
  4. Master tracking number recorded: the shipment gets a master tracking number for the overall delivery
  5. Shipment marked as shipped: a shipped timestamp is recorded
  6. SSCC codes generated: each case receives a Serial Shipping Container Code for logistics tracking

Shipping rate estimation

Before you ship, OpenMRP fetches rates from Shippo so you can see the estimated cost. Rates are calculated based on:

  • Parcel dimensions: length, width, height of each shipping case
  • Weight: total freight weight
  • Origin and destination: ship-from and ship-to addresses
  • Service level: the carrier service selected (e.g., Ground, 2-Day, Overnight)

This lets you compare costs and confirm the service level before committing.

Cross-carrier rate shopping

Rate shopping quotes every carrier and service level configured on your account in one pass, instead of pricing a single carrier at a time, and returns the options sorted cheapest first.

  • Carriers linked to a Shippo carrier account are priced from Shippo, matched to your service levels by service token, and carry the carrier's delivery-day estimate when it provides one.
  • Carriers with no Shippo carrier account are still listed, at a rate of 0 — they are options you can pick, not priced quotes.
  • Carriers that are mapped to a Shippo carrier account are dropped from the results entirely when your account has no Shippo integration connected, or when their rates cannot be fetched — a Shippo carrier is never shown at a fabricated zero. If every carrier you have configured is Shippo-mapped and Shippo is not connected, rate shopping returns no options at all; connect Shippo to price them.
  • If the ship-from address is not supplied, the account's configured origin (its default billing address) is used. This is how customer portal callers rate shop without knowing your address; portal callers also only see the carriers and service levels you have enabled for the portal.

How freight rules shape the options

Your freight rules are applied on top of the quoted rates, and each outcome is reported back as an exemption type:

OutcomeWhat you see
Freight exemptNo options at all. Freight is not charged
Flat rateEvery option's carrier rate is replaced by the shipping term's flat amount
Minimum order metEligible options are rated at zero; the rest keep their quoted rate
NoneStandard carrier rates, unchanged

The rules resolve in this order:

  1. Freight-exempt product line: if any product line on the order is freight exempt, rate shopping returns an empty option list and reports freight_exempt.
  2. Freight-exempt customer: the same happens when the customer, its type group, or any of its price groups is freight exempt.
  3. Free-freight shipping term: a customer whose shipping term is free freight also returns no options and reports freight_exempt.
  4. Free-shipping minimum order value: when the term sets a minimum order value and the order total is strictly above it, eligible options are rated at zero and the result reports minimum_order_met. If the term restricts free shipping to specific service levels, only those are zeroed; anything else keeps its carrier or flat rate. A met minimum takes precedence over a flat rate in the reported outcome.
  5. Flat-rate shipping term: otherwise a flat-rate term substitutes its flat amount for every option's carrier rate and reports flat_rate. A flat-rate term with no amount stored falls through to the carrier's quoted rate, and a carrier-rate term keeps live carrier rates even if a flat amount happens to be stored on it.

An empty option list is therefore a legitimate, expected answer — it means freight is not being charged, not that rate shopping failed. Omitting the customer skips the customer, shipping-term, minimum-order and flat-rate rules and returns plain carrier rates; the freight-exempt product-line check in step 1 still applies, because it is evaluated from the product lines on the request rather than from the customer.

Voiding a shipment

If you need to cancel after labels have been generated, you can void the shipment. Voiding:

  • Refunds the Shippo transaction: the label charge is reversed
  • Removes labels: generated labels are deleted from the shipment
  • Reopens the shipment: the shipment returns to a packable state

Voiding is only possible if the shipment hasn't been finalized.

Sandbox behavior

In sandbox mode, Shippo API calls are skipped entirely. Instead, OpenMRP generates fake tracking numbers and simulates the label creation process. This lets you test the full picking, packing, and shipping workflow without incurring carrier charges or needing a live carrier account.

Next: Collect Payments