Home → Docs → Data & Integrations → Connect Shipfusion (3PL fulfillment costs)

Connect Shipfusion (3PL fulfillment costs)

Last updated: October 5, 2026 By Aron Baczoni

Quick Reference

Inputs

Admin access to your MarginOS workspace. A Shipfusion API key, created in Shipfusion 360 under Settings, Integrations, API Credentials. A connected Shopify store, so arriving costs have products to attach to. Shipfusion SKUs that match your Shopify SKUs

Outputs

Measured per-shipment fulfillment cost per SKU in place of your store-wide default. Services, shipping, packaging and insurance booked as the cost of fulfilling each shipment. Return-handling charges booked per SKU and counted against your margin after returns. Receiving fees split across the SKUs on an inbound shipment, by the units accepted, and counted toward what that stock cost to land. Charges MarginOS cannot attribute counted and set aside in unmapped costs instead of spread across your catalog.

Outcomes

SKU margins are built from what Shipfusion actually billed, not from an assumption. A parcel holding several SKUs is split by weight, so heavy items carry the shipping they really cause. A return charge is split across the SKUs that came back, counted against margin after returns rather than blended into ordinary fulfillment cost. A receiving fee lands on the stock it brought in, rather than on the parcels that later ship it out. A bill whose own parts do not reconcile is parked rather than split. Costs refresh daily, and Sync Now pulls and recalculates on demand.

Connecting Shipfusion takes one API key and about a minute. Once it is connected, MarginOS reads your Shipfusion invoices, splits each shipment’s real fulfillment charge down to the SKUs that were in that box, and uses those measured numbers instead of the store-wide pick-and-pack estimate you set during setup. The connection is read-only: MarginOS can see your Shipfusion billing and can never change an order, a shipment or a setting.

What the Shipfusion connection does

Your store knows what a customer paid. It has no idea that this particular parcel cost $17.85 to pick, pack, box and ship, or that the same SKU costs far less per unit when it ships two at a time. Shipfusion knows, because Shipfusion invoiced you for it.

The connection closes that gap. The panel describes the scope in one line under Data we sync: Every Shipfusion fulfillment cost, attributed down to the SKU — so your margins reflect what fulfillment really costs. The item listed underneath is Shipping & fulfillment costs — Per-shipment fulfillment costs from your Shipfusion invoices, attributed down to each SKU.

Concretely, MarginOS reads the itemized parts of each per-shipment charge on your invoice and books four of them as the cost of fulfilling that shipment:

  • Services — the pick-and-pack labour billed on the shipment.
  • Shipping — the carrier charge Shipfusion passed through to you.
  • Packaging — boxes, void fill and anything else consumed to make the parcel.
  • Insurance — declared-value cover charged on that shipment.

Parcels are not the only thing Shipfusion bills you for. A receiving fee — what the warehouse charges to take an inbound shipment in, check it and put it away — is read the same way and split across the SKUs on that inbound, by the units actually accepted. It counts toward what those units cost to get into stock, rather than toward the cost of shipping them back out.

Sales tax on the bill is read and kept on the record beside those four, but is deliberately not counted as a cost — the FAQ below explains why. The panel states the boundary underneath the list: read-only access, and MarginOS never modifies your Shipfusion orders, shipments, or settings.

Before you start

  • You need admin access to your MarginOS workspace. Account Setup shows an Access Restricted notice to everyone else.
  • You need a Shipfusion API key. Create one in Shipfusion 360 under Settings → Integrations → API Credentials, and copy the whole value — a key that arrives truncated is refused before MarginOS even tries it.
  • Your Shopify store should already be connected, so the costs that arrive have products to attach to. See connect your Shopify store.
  • Your Shipfusion SKUs need to match your Shopify SKUs. A charge for a SKU MarginOS cannot find is parked rather than guessed at.

Connect Shipfusion

  1. In Shipfusion 360, go to Settings → Integrations → API Credentials and create an API key. Copy it.
  2. In MarginOS, open Account Setup and go to the Integrations tab.
  3. Find the Shipfusion card. It reads Connect your Shipfusion 3PL account and is marked Available until it is connected.
  4. Click Configure. A panel slides in titled Shipfusion, described as Sync real fulfillment costs directly from Shipfusion into your margins.
  5. Paste the key into Shipfusion API key and click Connect Shipfusion.
  6. Wait for the check. MarginOS tests the key against Shipfusion before it stores anything, and refuses any key it cannot positively confirm rather than saving one that might not work.
  7. MarginOS confirms with Shipfusion Connected — Your Shipfusion account is now linked. Costs are syncing. The first pull starts on its own; you do not have to press anything to begin it.
  8. Reopen the card whenever you want to check on it. A connected panel shows the status badge, the opening characters of the stored key, the time of the Last successful sync, and a Sync Now button.

What you see once it is connected

On the panel What it is telling you
Connected The key works and the daily sync is running.
Syncing… A pull is in progress right now. It clears itself when the pass lands.
Attention (data quality) The connection is no longer in a healthy state, and MarginOS hides Sync Now while it shows. Disconnect and reconnect with a fresh key from Shipfusion 360 to clear it.
Key: abc123•••• The opening characters of the key you pasted, so you can tell which key is in use. The rest is never shown again — your key is encrypted at rest and cannot be read back out of the screen.
Last successful sync The last time a pass finished cleanly end to end. A pass that was cut short or hit an error deliberately does not update this, so the timestamp stays honest rather than reassuring. It reads Never until the first clean pass lands.
24H Failures Charges that arrived from Shipfusion in the last 24 hours that MarginOS could not attach to a product, and so parked rather than guessed at. The badge appears only when there is at least one. See why a cost landed in Unmapped Costs.
Sync Now Starts a pull immediately instead of waiting for the daily one. Safe to press more than once — repeated pulls of the same invoice do not double-count it, and pressing it mid-sync simply answers Already syncing.

How MarginOS uses what arrives

  • Measured costs replace your defaults. The pick-and-pack figure you entered in your cost structure is a fallback for products with no measured cost. Once Shipfusion has billed a shipment, the real number takes over for the SKUs that were on it.
  • A parcel’s cost is split across what was in it, by weight. A box holding a 1.8 kg pan and a 200 g trivet did not cost the same to ship for both, and MarginOS does not pretend it did. Where a weight is missing, the split falls back to unit counts.
  • Shipment, return and receiving charges are attributed to products; nothing else is. A per-shipment charge is split across the SKUs that were in that parcel. A return charge is split across the SKUs that came back, by units, and is counted against your margin after returns rather than blended into ordinary fulfillment cost. A receiving charge is split across the SKUs on that inbound shipment, by the units your warehouse accepted, and counts toward what those units cost to land. Shipfusion bills other things too — a monthly account fee, for instance — and a line that is none of those three has no shipment and no SKUs behind it, so MarginOS parks it — visible and un-booked — rather than attributing it to products it may not belong to. A payment line, which only records that you settled an invoice, is not a cost at all and is skipped.
  • If a bill’s own parts do not add up, we park it rather than split it. Every charge is checked against its own itemized components before anything is booked. A total that does not reconcile with its parts is a bill we do not understand, and a cost you can see is missing beats a cost quietly landed on the wrong SKU.
  • The same charge is never counted twice. Every line is recognised by its own identity, so the daily pull and any number of Sync Now presses can all see the same invoice without adding it again.
  • A cost that cannot be attributed is parked, not spread. It appears in the 24H Failures count and waits for you rather than quietly distorting a margin.
  • Syncing runs daily, and re-reads recent invoices rather than only new ones. Shipfusion adds charges to invoices after the fact, so a pass that looked only forward would miss them.
  • Your margins are recalculated as part of the job. After a connect or a Sync Now, MarginOS reworks the affected SKUs itself — you do not have to trigger anything for the new costs to show up in your numbers.

Example

You sell a 1.8 kg cast-iron pan for $129. During setup you told MarginOS to assume $5.00 of pick-and-pack per order, because that was the number you remembered.

Shipfusion connects on a Tuesday. By Wednesday the pan’s margin has moved, and nothing about the pan changed:

  • A typical single-pan parcel bills $4.20 of services, $11.60 of shipping, $1.15 of packaging and $0.90 of insurance — $17.85 of real fulfillment against the $5.00 you assumed. Every unit was overstating profit by $12.85.
  • A parcel holding the pan and a $19 trivet bills $19.40 altogether. The pan is nine times the trivet’s weight, so it carries close to nine tenths of that charge — not the $9.70 each that an even split would have dropped on the trivet.
  • A monthly account charge on the same invoice bills no shipment, no return and no inbound, so it is parked instead of being smeared across everything you sold that month.

The pan still sells for $129. It simply stopped looking more profitable than it is, which is the entire point of measuring instead of assuming. Where each number sits on the accuracy ladder is explained in Data Trust levels.

FAQ

Where do I find my Shipfusion API key?

In Shipfusion 360, under Settings → Integrations → API Credentials. The MarginOS panel repeats that path on screen so you do not have to remember it. Create a key there, copy the whole value, and paste it into the Shipfusion API key box.

Can MarginOS change anything in my Shipfusion account?

No, and the panel says so twice: your key is encrypted at rest and used read-only, and MarginOS never modifies your Shipfusion orders, shipments, or settings. It reads invoices and the contents of the shipments, returns and inbound shipments they bill. That is the whole permission.

How long until Shipfusion costs show up in my margins?

The first pull starts the moment you connect, so recent invoices land within minutes. MarginOS also reaches back over recent months of billing history on that first pass, which takes longer to work through. Receiving fees get a longer look still: on that first pass, and once a month after it, MarginOS also reads the receiving charges on older invoices, because the stock you sell today may have been received long before the invoices it re-reads every day. After that it syncs once a day on its own, and Sync Now is there for when you do not want to wait. If Shipfusion is briefly unreachable or rate-limiting requests during a sync, MarginOS does not treat that pass as complete — it re-reads the same window on the next pass instead of moving on, so a delay never means a cost was skipped.

Why was my API key rejected?

MarginOS tests the key against Shipfusion before saving it, and tells you which of four things happened. That Shipfusion API key looks too short means the value was truncated on the way over — copy it again in full. That Shipfusion API key was rejected (invalid key) means Shipfusion itself refused it, so generate a new one. Could not reach Shipfusion to validate the key means Shipfusion did not answer; wait a moment and try again. And Shipfusion did not confirm this key means the test itself was untrustworthy: MarginOS checks its own result by also presenting a deliberately invalid key, and if that one is accepted too, the check proved nothing. We refuse rather than store a key we have not actually verified.

What does 24H Failures mean?

Charges that arrived from Shipfusion in the last day that could not be attached to a product. MarginOS parks them instead of spreading them across your catalog, because a cost on the wrong product is worse than a cost you can still see is missing. Each parked charge carries a plain reason, and they come in four families: the line bills something with no SKUs behind it at all, such as a monthly account fee; the shipment, return or inbound it names could not be read, was never named, or came back with nothing on it; the contents did come back but a line on them has no SKU, no usable quantity, or nothing received yet, or every unit on them was rejected; or the charge did not reconcile with its own itemized parts. A charge with no usable billing date is parked too, since there is no day to record it against.

One kind of charge also raises an alert: a charge of a type MarginOS has no cost model for yet. An alert titled Shipfusion charges MarginOS cannot price yet appears in your account, counting those charges by type. They are kept, not dropped, but they stay out of your gross profit and CM1 until they are priced, so if any are large, tell MarginOS support and that type gets priced next. The alert clears on its own once none remain.

Parked is not the same as stuck. A charge parked because Shipfusion was briefly busy, or because receiving has not finished yet, is retried on its own and clears the moment the answer arrives — nothing is needed from you. These charges are reviewable in the same list as ShipStation’s parked labels, and every row still in line for a retry carries a badge saying so. The row to look at is the one with no badge at all: that absence — not the wording on any badge — is what tells you MarginOS has nothing left to retry and a write-off is the honest call. Connect ShipStation walks through that list and the write-off itself.

Does Shipfusion sync my inventory levels too?

Not today. This connection brings in fulfillment costs, not stock counts. Your on-hand numbers come from your store catalog and are unaffected by connecting or disconnecting Shipfusion.

Is sales tax on my Shipfusion bill counted as a cost?

No, and that is a deliberate call rather than an oversight. Sales tax charged on a 3PL bill is often recoverable by the merchant, and MarginOS cannot yet tell whether yours is. Counting it would understate your profit wherever it is recoverable. So the tax is read and kept on the record next to the charge it came from — it simply is not booked as a cost. If that treatment ever changes, nothing has to be re-imported, because the number was never thrown away.

What happens if I disconnect?

MarginOS asks you to confirm, then removes your stored Shipfusion key and stops pulling new invoices. Costs already attributed to your margins stay exactly as they are; nothing is unwound. Disconnecting ends the feed, it does not rewrite your history. You can reconnect later with a new key, and the next sync picks the billing history back up.

Related

About the author

Aron Baczoni

Founder of MarginOS, a Profit & Inventory OS for Shopify DTC brands who live and die by margin. Previously 11 years at Google across Ads and Global Business Operations, building large-scale systems. Now focused on giving DTC operators true profit by product, channel, and customer after COGS, 3PL, shipping, returns, and fees, and on showing exactly how much to trust every number behind those decisions.

Read Aron's story

Get Your Profit & Inventory Command Center

See your real margins in real time, not in spreadsheets.

Get your Profit & Inventory Command Center

Or email sales@marginos.com to see your real margins on your own data.