Why a cost landed in Unmapped Costs
Quick Reference
Inputs
A connected Shopify store supplying the product catalog; at least one cost-bearing integration (3PL, shipping provider, warehouse email invoices, or an ad platform); access to your Margin Briefing.
Outputs
A Missing Cost Data count and filter on Catalog Profit, plus data-quality signals naming the affected SKU, what arrived, what MarginOS could not do with it, and the action that fixes it.
Outcomes
Trust that your margins contain only costs MarginOS could actually attribute, see exactly which costs are still waiting, and fix the root cause instead of processing a queue.
When a cost arrives from one of your integrations and MarginOS cannot work out which product or order it belongs to, that cost is set aside rather than dropped or guessed at. In the app you see the result as Missing Cost Data on Catalog Profit, and as data-quality signals in your Margin Briefing naming the specific SKU. The cost is not lost, it is not silently spread across your catalog, and it is not counted as zero — it is held, with a reason, until it can be attributed correctly.
What does it mean when a cost is unmapped?
An unmapped cost is a real cost MarginOS received but could not attach to a specific product or order. It stays quarantined — visible and recoverable — instead of entering your margin math on a guess.
This matters because the alternatives are worse. Dropping the cost would overstate your profit by exactly the amount you were not shown. Spreading it evenly across the catalog would corrupt every SKU’s margin a little, in a way you could never trace back. Treating it as zero would make the affected product look more profitable than it is. MarginOS refuses all three: a cost either lands on the thing it belongs to, or it waits somewhere you can see it. Your margins are built only from costs MarginOS could actually attribute, and anything it could not is surfaced rather than buried.
Before you start
- A connected Shopify store, which supplies the product catalog MarginOS attributes costs against.
- At least one cost-bearing integration — a 3PL, a shipping provider, warehouse invoices forwarded by email, or an ad platform. Unmapped costs come from these feeds, so with none connected there is nothing to quarantine.
- Access to your Margin Briefing, where the signals that explain each gap are raised.
Where to find unmapped costs in MarginOS
- Open Catalog Profit and look at the Missing Cost Data card at the top. It counts the products whose key costs are missing, so their margin is unreliable.
- Click the Missing Cost Data filter to narrow the SKU table to just those products. This turns the count into a worklist.
- Open your Margin Briefing and read the data-quality signals. Each one names the affected SKU, what arrived, what MarginOS could not do with it, and the action that fixes it.
- Follow the signal’s action button. For the most common cause — a cost or shipment arriving for a product that is not in your catalog — it takes you straight to your Shopify connection to force a catalog sync.
- Check the connection health of the integration named in the signal, under Settings → Integrations. A feed that has lost authorisation will keep producing gaps until it is reconnected.
Why costs get held back
Every quarantined cost carries a reason. They fall into a few families, and the family tells you who has to act.
| Why it was held | What actually happened | What fixes it |
|---|---|---|
| The product is unknown to MarginOS | A cost, shipment or inventory record arrived for a SKU that is not in your MarginOS catalog, so there is nothing to attach it to. | Force a product sync from your Shopify connection. Once the product exists, the held cost attaches on its own. |
| The cost is genuinely store-wide | A 3PL billed for something that does not belong to any single SKU — storage, inbound handling, returns processing, account credits. | Usually nothing. These are valid costs awaiting attribution and resolve through their own path as the supporting detail arrives. |
| The incoming data did not match its contract | A provider sent a record MarginOS could not read — most often a shipment line with no SKU on it at all. | Usually nothing. MarginOS retries these automatically (see below). Persistent cases point at a data problem at the provider. |
| The provider cannot supply the detail | MarginOS knows a shipment was billed but the provider will not return its contents, so there is no line detail to attribute. | Check the integration’s health and re-authorise it if needed. If the provider genuinely no longer holds the record, the cost stays visible rather than being invented. |
| The parts did not add up to the whole | A cost was split across products but the pieces did not reconcile to the invoice total, so MarginOS declined to book any of it. | Nothing you can do directly — this protects you. Raise it with support if the same source keeps failing. |
| The order has no customer identity | A guest order arrived with nothing to link it to a customer, so it cannot join a cohort for lifetime-value math. | Nothing. Order-level profit is unaffected; only customer-level attribution is. |
| Ad spend could not reach a product | Ad platform spend arrived that MarginOS could not attribute down to specific SKUs. | Check your campaign mapping. Channel-level spend still counts; only product-level attribution is incomplete. |
How MarginOS handles a held cost
Quarantine is a waiting room, not a bin. Three things are true of every held cost.
It keeps enough of itself to recover. When MarginOS holds a record it stores what that record needs to re-drive itself later. Recovery therefore does not depend on the provider still being willing to hand the data over — which matters, because most providers will only re-serve recent records, and a cost held long enough would otherwise be stranded forever.
It retries itself. A sweep runs on a schedule and re-attempts the held records that are genuinely recoverable — the ones where the original data was complete but could not be read at the time. If a fix has since landed, the cost books itself and the gap closes with no action from you. Records that cannot recover are skipped rather than retried forever.
It heals when the blocker goes away. The largest category — a cost waiting on a product that did not exist yet — resolves the moment that product appears. Sync the catalog and the held costs attach themselves on the next reconciliation. You never clear these by hand.
What quarantine will never do is guess. A held cost is not apportioned “approximately”, not averaged in, and not written off. If MarginOS cannot say which product a cost belongs to, it says so, because a wrong attribution is more damaging than a visible gap — it looks like an answer.
Example
Your 3PL ships a new bundle SKU for the first time. The fulfillment charge reaches MarginOS before the product itself does, because the bundle was created in your store that morning and the catalog had not yet synced.
MarginOS holds the charge and raises a signal in your Margin Briefing: it received cost data for a SKU it does not recognise, and until the product exists that cost cannot be attributed. Catalog Profit’s Missing Cost Data count goes up by one.
You open the signal, click through to your Shopify connection, and force a product sync. The bundle appears in the catalog. On the next reconciliation the held charge attaches to it, the count drops back, and the bundle’s Data Trust grade rises now that its fulfillment cost is real rather than a store-wide default.
Note what did not happen in between: the bundle never showed a falsely healthy margin. Its cost was missing and MarginOS said so, rather than filling the hole with a zero.
FAQ
Are unmapped costs lost?
No. They are held, not discarded. The cost keeps enough of itself to be re-attempted later, and the ones that can recover are retried automatically. Nothing is written off just because it could not be attributed on the first pass.
Do unmapped costs affect my profit numbers?
Not directly — a held cost has not been booked to any product, so it is not in that product’s margin. The effect is on completeness: a SKU with costs waiting in quarantine is showing you less cost than it truly carries, which is exactly why it is flagged as Missing Cost Data and why its Data Trust grade drops.
Why does MarginOS not just spread the cost across my catalog?
Because that would quietly corrupt every SKU’s margin instead of visibly flagging one. An even split is a guess dressed up as a number, and you would have no way to trace it back or undo it. A visible gap you can fix is worth more than an invisible error you cannot.
What is the most common reason a cost is held?
A cost or shipment arriving for a product that is not in your MarginOS catalog yet — usually a newly created SKU whose costs reached MarginOS before the catalog sync did. Forcing a product sync from your Shopify connection resolves it, and the held costs attach themselves afterwards.
Do I have to clear unmapped costs manually?
Generally no. Most resolve on their own once the blocker is gone — the product syncs, the feed reconnects, or the automatic retry succeeds. Your job is to act on the Margin Briefing signal that names the underlying cause, not to process a queue.
Why is a store-wide 3PL charge showing as unmapped?
Because it genuinely is not a per-SKU cost. Storage, inbound handling, returns processing and account credits are billed at the account level, so there is no single product to attach them to. These are valid costs held pending attribution, not errors on your side.
My ad spend shows as unmapped — is my CAC wrong?
Your channel-level CAC is unaffected; the spend still counts against the channel that produced it. What is incomplete is the product-level view of that spend. Check your campaign mapping so MarginOS can attribute the spend further down.
Related
About the author
Aron Baczoni is the founder of MarginOS and a former decade-long veteran of Google's Ads and Global Business Operations units. His work is focused on bridging the gap between AI's promise and its practical implementation for direct-to-consumer (DTC) brands, helping them build a sustainable competitive advantage through strategic, high-ROI AI solutions.
Read Aron's story