Skip to main content

Why your report shows no COGS, $0 COGS, or the wrong COGS

The common reasons a sales report shows a blank, $0.00 or wrong COGS, and how to fix each one.

Written by Rares Saftoiu

Your Product Sales report shows an empty COGS cell, or $0.00, or a number you know is wrong. This page walks you through the causes, in the order our team checks them.

It covers both versions of the Thrive catalog. Where the catalog screens differ — the Products, Variants and Bins lists and the product page — each step is written twice, once for the New Experience and once for the Old Experience. The catalog setting does not change any other screen on this page.

Background reading, if you want the full picture of how costs work: Inventory Costs (New Experience) · Inventory Costs (Old Experience) · Product Sales Report.


The one rule to start from

A report never works your cost out when you run it. Thrive stamps a cost onto each line item when it processes the sale, and the report simply adds those stamps up.

For an ordinary product, that cost comes from the first of these that has a value:

the lot the units came from → the default cost at the store where the sale happened

A bundle takes a different branch. It has no lot of its own, so Thrive works its cost out from its components at that store, plus any assembly cost. It never uses the bundle's own default cost.

If nothing on the branch has a value, the line item is stamped with no cost at all, and it stays that way until something goes back and fills it in. One exception: Shopify connections that use fulfillment orders record $0.00 instead — see Cause 3.

So: typing a default cost today does not re-cost sales that are already costed. There is one narrow exception. The first time a location's default cost goes from empty to a value for a variant, Thrive starts a backfill on its own for that variant. It covers only sales from before that sales channel was connected, and it runs in the background.


Cause 1 — the product has a default cost, but the lot does not

Someone typed a cost on the product page and assumed the report would use it. The report uses the cost that was stored on the sale, and for a tracked product that cost normally comes from the lot the units were taken from.

How to check: find the product in the Bins view (New) or the Products page (Old), as shown under "Where to find a lot cost" below. A Not Set in the Cost column tells you that today's lot has no cost. It is a strong hint, not proof: an older sale may have drawn on a different lot, and a sale from an uncosted lot can still have picked up the location's default cost instead. To be sure about one sale, look at the lot that sale drew on and the cost stored against it.

Two ways to fix it:

  • One product: open the lot history and edit the lot cost by hand. Sales that drew from that lot are re-costed automatically, in the background.

  • Everything at once: run Set default cost on all lots without cost, below. Set the default costs correctly first.

A product that has never had stock added or sold has no lot at all, so there is nothing to put a cost on — it will say "Not Set" even with a default cost in place. Add a quantity and a lot appears.


Cause 2 — the default cost is missing at the store where the sale happened

There are two costs here, and they are not the same thing.

  • The product default cost is one figure for the variant. A location set to use defaults takes that figure.

  • A location cost is an override for one store. Setting it at your main store does not set it anywhere else.

When Thrive falls back to a default cost on a sale, it uses the cost held for the store the sale rang up at — whether that came from the product default or from an override typed in at that store.

So on a two-store account, a store whose cost was never filled in and is not using defaults can produce blank COGS, while the very same product looks perfectly costed at the other store. It only comes out blank if there is no lot cost and no bundle cost to use either. If your blanks look scattered or random, check this.

How to check:

  • New Experience: open the product, then Pricing → By Location. The Location Cost column reads Using defaults where the store is taking the product figure; switch defaults off for that store to give it its own cost. On the Inventory card's By Location table, the row menu also offers Copy default cost to all variants at this location.

  • Old Experience: open the product's Locations tab and turn Use defaults off for that location to set a cost there.


Cause 3 — inventory tracking is off, or the item sold below zero

These are two different situations. Both can end up with no cost, but for different reasons.

Inventory tracking switched off. Sales of an untracked product create a stock entry with no lot attached, so Thrive falls back to the default cost for the location where the sale happened. No default cost at that location means no cost on the sale. On Shopify connections that use fulfillment orders, an untracked product takes the default cost from the first of its locations that has one, even if that is not the location that fulfilled the order. If none of its locations has a default cost, that sale is recorded at $0.00 instead of being left empty. Other Shopify connections use the sale location's default cost like everyone else. Switching tracking off does not erase the lot history the product already had — those lots are zeroed out, not deleted.

Selling below zero. When you sell more units than you have, Thrive opens an overage lot for the units you did not have and gives it the default cost for the location where the sale happened. The sale does have a lot. Three details matter:

  • If the sale also used up the last of your real stock, the cost recorded is a blend of what those units actually cost plus the default cost for the rest. It is not the default cost on its own.

  • If you were already below zero, the units come out of the lot Thrive opened last time and keep the cost it was given then. Today's default cost is not stamped on it again.

  • If the overage lot was opened with no cost, because there was no default cost at that store at the time, the sale falls back to the store's default cost the same way an untracked sale does. If that is missing too, the sale has no cost.

Stopping it happening again and repairing what has already happened are separate jobs:

  • To stop it: make sure a default cost exists at that store, and receive stock before it runs out.

  • To repair past sales: edit the lot cost (which re-costs the sales that drew on it) or run one of the two bulk tasks below. Receiving stock today does nothing for a sale that is already recorded.


Cause 4 — the cost was put right after the sale

Editing a cost today does not always reach back to sales that already happened. It depends on which cost you edited.

What you edited

What happens to past sales

A lot cost

Sales that drew on that lot are re-costed automatically, in the background.

A default cost

Sales that already have a cost are left alone. To fill in sales with no cost, run Backfill costs for prior sales. Filling in a location's default cost for the first time also starts a narrow backfill on its own, as described at the top of this page.

Three limits on the automatic re-costing:

  • It rewrites every line on the affected receipt for that variant, not only the line that came from the lot you edited. On a receipt that drew from two lots, both lines can end up with the edited lot's cost.

  • It replaces the line's whole cost, so if the original cost included an add-on (a modifier), that part is dropped. A wrong cost on an add-on is not something you can repair from the catalog — start a chat with us.

  • Nothing tells you when it is done. It runs in the background with no progress bar and no entry on the tasks page. Check the cost on the report again a little later.


Cause 5 — it is a bundle

Bundles do not have lots of their own. A bundle's cost is worked out from its components at the moment it sells, and it is never stored on the bundle. For each component, Thrive takes the current lot cost where the component is tracked and in stock, and otherwise the component's default cost at that store — falling back to the component's product default. Any assembly cost on the bundle is added on top. That has three consequences:

  • You cannot directly edit the calculated bundle cost in the catalog. Fix the components, or start a chat with us: our team has a separate tool that can re-cost a bundle's past sales.

  • One wrong component cost spoils every bundle built on it. A component received at the wrong unit cost — say a case price typed as a unit price — inflates the cost of every bundle that contains it.

  • A bundle never falls back to its own default cost. But its components' default costs do count, and an assembly cost on its own is enough to give the sale a cost. The bundle's sale comes out with no cost only when no component has a cost of any kind and there is no assembly cost.

How to check: open the bundle and go through its components one at a time — the lot cost of each, the default cost of each, and the quantity of each that the bundle uses. Check the assembly cost too. A bundle sold at a positive price for less than the cost it adds up to will show a negative margin, which is usually the first thing people notice.


Cause 6 — the sales are split across a duplicate or discontinued product

If a product was imported twice, or replaced rather than edited, your sales are sitting on two records. One of them may be costed and the other not, which makes the report look half-right.

How to spot it: add the SKU column to the Product Sales report and look for the same SKU, or near-identical product names, on more than one row. The SKU column is there in both versions of the report.

What you can do: lot costs on a discontinued or duplicated copy can still be edited while that record exists, and fixing them fixes the sales attached to it.

What you cannot do: deleting a product and creating a fresh one does not move its sales. Those sales stay attached to the old record. If you need to tidy up duplicates, start a chat with us before you delete anything.


Where wrong lot costs come from in the first place

A lot cost is set when stock is received — typed in by whoever brings it in, or taken from the default cost when nobody types one. Any of these can put the wrong number on a lot:

  • receiving against a purchase order,

  • adding stock from the catalog (Actions → Add, or the bulk actions on the catalog pages),

  • a manual stock adjustment or reconciliation — adjusting a count upward opens a new lot at the default cost,

  • a bulk upload,

  • the mobile barcode scanner app.

The classic mistake is entering what a whole case cost as the cost of one unit.


Two more things that move the number

Average Cost. If this is switched on for your account, Thrive costs sales at a blended average of the stock on hand rather than the specific lot's own cost. The setting matters here because lots with no cost are blended in as zero, which drags the average down across everything sold from that stock. Switching it on does not by itself recalculate earlier sales. It does not stay frozen either: correcting a lot cost afterwards recalculates the averages on the related lots and re-costs the sales that drew on them. You cannot switch the setting on or off yourself. See Average Cost (New Experience) · Average Costs (Old Experience).

Add-ons and modifiers. On Square and Clover, a sale with an add-on can get a recorded cost — sometimes $0.00 — even when the stock it drew on had none. An add-on with neither a cost nor a price of its own adds nothing. That is why a variant can show $0.00 rather than an empty cell for reasons that have nothing to do with its lots.


Step 1 — can you see costs at all?

Look at the report's columns first. If the cost, profit and margin columns are missing altogether, that is your user permission. Thrive takes those columns out of the report for a user without the view cost and profit permission — in every version of the report.

Ask an owner or admin on your account to check your user's permissions, or start a chat with us.

If the columns are there but the cells are blank, this is not a permission problem. It means the sales underneath carry no cost. Carry on to step 2.


Step 2 — is the cell empty, or is it a number?

They mean different things, and Thrive decides it per variant — not per product. Two variants of the same product can disagree side by side.

What you see

What it means

Empty

Not one sale of that variant in the period carried a cost.

A number, including $0.00

At least one sale of that variant carried a cost. Any sales of it that had no cost were added in as zero.

Two things follow, and both matter:

  • $0.00 does not prove anything on its own. It can mean every cost really was zero. It can also mean some sales were costed and some were not. You have to look at the sales underneath to tell.

  • A mix is the dangerous case. Once one costed sale exists, the variant is out of the "empty" group, and every uncosted sale of it quietly adds revenue with no cost against it. Missing costs make the reported profit and margin incomplete: an uncosted sale adds nothing to the profit total, while its revenue still counts in the margin. Neither number then describes the variant as a whole.

This works the same way in the classic report and in the newer, faster ones.

a Product Sales report showing one variant with an empty COGS cell and another with $0.00

Where to find a lot cost, and how to edit it

Almost every cause above needs this, and it is the one thing that is genuinely different between the two versions.

New Experience

  1. Go to Catalog → Bins.

  2. Look at the Cost column. A lot cost shows as a green, clickable amount. A lot with no cost shows the words Not Set.

  3. Click the green amount to open that bin's lot history.

  4. To change a cost, click through to the Bin Details page and use Edit.

There is also a Default Cost column on the same view, and you can open lot history from the Variants view by clicking the cost there — but that view covers every location at once, so filter it.

Use the Bins view when you are hunting for lots that still need a cost. It says "Not Set" in plain words, as does the Variants view. The Product Details page and the Bin Details page show a dash (-) in the same situation, which is much easier to miss.

Old Experience

  1. Go to the Products page (Products & Variants).

  2. Look at the Cost column. The lot cost is the blue amount, with the default cost in small gray type underneath. A lot with no cost shows Not Set.

  3. Click the blue amount to open the lot history.

  4. Use Edit in the top right and type over the cost — no need to clear the box first.

If Average Cost is switched on for your account, only lots that still have stock left get an editable box here. A lot you have already sold through cannot be edited on this screen.

In the lot history, a green dot means that lot still has stock and a red dot means it does not.

One thing to watch in the Old Experience: in the lot lists you export to PDF or CSV, a genuine cost of $0.00 is printed as "Not Set" as well. On screen the two are different; in those two exports they are not.

the New Experience Bins view Cost column, showing a green lot cost and a Not Set

the Old Experience Products page Cost column, showing the blue lot cost with the gray default underneath

The two bulk fixes on the Advanced page

Both live on Settings → Advanced, on the page headed Advanced Settings. They do different jobs, and it is worth being clear which one you need.

"Set default cost on all lots without cost"

What it does: finds every lot that has no cost and gives it the default cost for that variant at that lot's location. Because past sales are re-costed from the lots they drew on, this also corrects sales that came out of those lots.

It fills in every lot with no cost, whether or not the units are still in stock. Lots you have already sold through are included.

Four things limit it:

  • The lot has to have no cost at all. A lot saved at $0.00 counts as having a cost, so it is skipped — and running the task again will never change it.

  • A default cost has to exist for that variant at that lot's location. Lots at a location with no default cost are left alone. This is one reason the task can look as though it did nothing.

  • You need both the "manage account and billing" and the "manage products" permissions, or it refuses to run.

  • Each lot is only ever filled in once this way. The confirmation screen says so.

The confirmation screen names the account back at you, then says:

THIS CANNOT BE UNDONE. Double-check this is the right account before running:

Account ID: … · Business name: …

Are you sure? Your default cost will be applied to all lots without cost data. Each lot can only be updated once through this process.

The button is Set default costs.

Get your default costs right before you run it. There is no self-service undo. Our team can rewrite the numbers again afterwards, but the ordinary cost-setting path will not put a lot back to empty.

How it rewrites past sales, exactly: for each receipt that took stock from a lot it fills in, it stamps that lot's cost onto every line on that receipt for the same variant, including a line whose stock actually came from a different lot. It then works the receipt's profit out again. Where Average Cost applies, it stamps the lot's average cost instead. It replaces the line's whole cost, so if that sale's cost had included an add-on (a modifier), that part is dropped.

"Backfill costs for prior sales"

What it does: finds line items that have no cost and fills them in with the current default cost for that variant at that sale's location.

  • It only touches lines with no cost. A line already recorded at $0.00 is invisible to it, for ever.

  • It uses today's default cost, not the cost that was right on the day of the sale.

  • It is worked out per store. A two-store account gets each store's own default cost applied to that store's sales.

  • For a bundle with no default cost, it uses the bundle cost worked out from today's component costs at that store.

  • A line is skipped, and stays empty, if no cost can be found for it — no default cost for that variant at that store, and no bundle cost that can be worked out today.

  • Each sale is only ever backfilled once.

The confirmation is titled Backfill Receipt Costs?. It carries the same "THIS CANNOT BE UNDONE" heading with your account id and business name, then says: "Your current default costs will be applied to all sales missing cost data. Each sale can only be updated once through this process." The button is Backfill costs.

Only one run of each task at a time per account. Clicking again while one is going does nothing.

Settings → Advanced Settings showing both cost tasks


Still not right?

Start a chat with us with:

  • the product name and the variant,

  • the location,

  • the date range you ran,

  • what the report shows and what you expected,

  • a screenshot of the lot history for that product.

Did this answer your question?