Filament inventory that does not drift
Every shop starts with an accurate filament list. Nobody has one six months later.
It is not carelessness. Inventory drifts because the events that change it are not the events anybody records. A print fails and the plastic is gone. Somebody uses half a spool for a test. A colour gets opened, printed once, and put back on the shelf where it reads as full. The count does not go wrong in one big step; it goes wrong ten grams at a time, and then one day a job stops at 3 a.m. because the spool everybody thought had four hundred grams on it had eighty.
Here is what actually keeps it honest.
Count spools, not kilograms
"2.4 kg of black PLA" is not a fact you can act on. Two spools with 1.2 kg between them cannot print a 900 g part; one spool with 1.3 kg can.
Track individual spools, each with a remaining weight. It is more rows, and it is the only version that answers the question you actually ask, which is can I start this job tonight.
Give each spool an identity the moment it comes out of the box. A number on a sticker is enough. Without it there is no way to tell two half-used black PLA spools apart, and no way to know which one has been sitting open since March.
Record the empty weight once, per brand
Remaining filament is the spool on the scale minus the empty spool.
The empty weight varies by brand and by material, and sometimes between production runs: cardboard spools are lighter than plastic, and a reusable core is lighter again. Weigh one empty spool per brand, write it down, and reuse it. Guessing 200 g for everything introduces an error of fifty grams or more per spool, which is exactly the size of the error that strands a print.
Decrement when the job runs, not when somebody remembers
This is the whole thing.
Any system where stock is updated by a person, later, on purpose, will drift - not because people are lazy but because the moment stock changes is the moment they are doing something else. The print finished, the customer is waiting, the plate needs clearing.
So make the deduction a consequence of something that was going to happen anyway: the job going on the machine. The grams it plans to use come off the spools it draws from at that moment. Nobody types a second thing.
That is one of the reasons LayerFlow3D ties orders to spools rather than keeping a separate stock list: starting a job is the event, and the stock follows from it. The next section says exactly what happens at each step.
If you are doing this with a spreadsheet, get as close to that as you can: one row per job, with the spool and the grams on the same row as the job, rather than a stock sheet somebody reconciles on a Sunday.
What LayerFlow3D does to a spool at each step
The short answer: nothing is held back while an order waits. The order's planned grams come off its spools in one go when somebody moves it to In progress, and nothing after that changes them again on its own. The figure is the slicer's plan, not a measurement, so a failed plate or a reprint shows up only when somebody weighs the spool.
| When | What happens to the spools | Done by |
|---|---|---|
| An order is saved as New, by hand or from the shop page | Nothing comes off. The order is planned onto spools, and its grams count as "queued" against that filament type, so the low-stock warning sees them coming. Two waiting orders can plan on the same grams. | Automatic |
| The order moves to In progress | The plan is worked out again (spools loaded in that printer first), then the full planned grams leave the spools. The Start Printing? dialog lists them under "Filament reserved from stock". | A person moves the order |
| Ready to ship, then Shipped | Nothing more. | - |
| The printer starts or finishes a print | Nothing. A notification can offer to move the next order, and a finished print is marked on the card. | Automatic notice only |
| Cancelled while New | Nothing was taken, so nothing comes back. | A person, with a reason |
| Cancelled while In progress | The dialog asks "Filament used up, g". That amount stays used; the rest goes back to the spools. | A person, with a reason |
| Cancelled after Ready to ship or Shipped | Nothing comes back: the job was printed. | A person, with a reason |
| A plate fails and is printed again on the same order | Nothing more comes off. The app does not know about the second attempt. | - |
| A spool is weighed and corrected (a stock-take) | The spool takes the figure typed in, with a reason such as Lost or Defective, and keeps it through later orders. | A person |
| A quantity, model or printer is changed after the start | Refused. A started order keeps its plan; clone it for a new one. | - |
Which number comes off. The grams written on the model's plate, or the figure measured for that plate on that printer, times the number of plates the order needs. An order for eight from a plate of four is two plates. The material waste percentage in the settings raises the price, not the grams. Whether purge is in the figure depends on what you entered: copy the slicer's total per filament, which includes it.
Several spools. Each filament type is planned separately. Spools loaded in the order's printer go first, then the open spool with the least left. One requirement can be split across two spools. If the shelf is short, the order is still taken and the last spool shows 0 g: a warning, not a refusal. Sealed boxes are never opened on their own.
A worked example. One 1,000 g spool of black PLA. A keychain plate holds four, and the slicer says the plate uses 80 g, purge included.
- An order for eight keychains is saved as New. It plans 2 plates x 80 g = 160 g. The spool still shows 1,000 g; the type shows 160 g queued.
- The order moves to In progress. The spool shows 840 g.
- The second plate fails halfway and is printed again. The spool still shows 840 g, although about 40 g more went into the bin.
- When the spool comes off, it weighs 800 g without its reel. A stock-take of 800 g with the reason Defective sets the spool to 800 g and records the 40 g difference.
- Ready to ship and Shipped leave it at 800 g.
Had the order been cancelled mid-print instead, with 40 g typed as used, the spool would have gone back to 960 g. This example is checked by a test against the application's own code, so it changes when the behaviour does.
What the app does not do: it does not weigh anything, it does not take extra grams for a failed plate on its own, and it does not move an order because a printer started. Where an AMS reports how much is left, see the section on what the printer says below.
Count the failures, on purpose
A failed print used real filament. If failures do not come off stock, your inventory is optimistic by exactly your failure rate, which is the number nobody knows.
The habit worth building: when a print fails, weigh what came off the plate and deduct it, and note the reason in one word. Within a month you will have something more useful than an accurate spool count - you will have a failure rate per machine and per material, and that number belongs in every price you quote.
Weigh a spool at the natural moments
You do not need to weigh everything regularly. You need to weigh at the two moments where the number is about to matter:
When a spool comes off the machine. It is already in your hand.
Before committing a spool to a long job. The estimate says 780 g and the system says 840 g remaining; that is close enough to be worth thirty seconds on the scale rather than a failure at hour nine.
Everything else can run on arithmetic. The scale is a correction, not a routine.
Know what a gram costs, not just what a spool cost
A spool's cost is what you paid plus what it took to get it to you: shipping, customs, and the electricity of drying it if you dry it. Divide that by the usable filament, not by the nominal kilogram - a 1 kg spool does not have 1 kg of printable filament on it once you account for the tail you cannot use.
The filament cost calculator turns a spool price into a cost per gram and a cost for a given job, which is the form you need for a quote.
Then keep the cost with the spool, not with the material. The black PLA you bought on sale in January and the black PLA you bought at full price in August are not the same cost, and a job that drew from one did not cost what a job that drew from the other did. Averaging them hides exactly the thing you are trying to see.
Storage is inventory too
A spool that has absorbed moisture is not the spool you counted.
Wet PETG or nylon prints badly, and the failure is indirect enough that people blame the profile, the nozzle, the machine - anything but the plastic. That is a stock problem wearing a technical costume.
Two rules cover most of it. Anything that is not PLA goes back in a sealed box with desiccant when it comes off the machine, and the desiccant gets replaced on a schedule rather than when somebody notices it has gone pink. And a spool that has been open in a humid room for months gets dried before a job that matters, not after it fails.
Multi-material eats more than the part weighs
If you run an AMS or any multi-material setup, the purge is not a rounding error. Every filament change flushes the hotend, and on a print with many changes the flushed material can outweigh the part.
That plastic came off real spools, in a ratio the model weight tells you nothing about. If your stock only ever moves by the part weight, a farm doing multi-colour work will drift faster than one doing single-colour work, in the same direction, every time. Deduct what the slicer says was consumed in total, per filament, not what the model weighs.
What the printer says is left, and why it is not what the order used
If your printers have an AMS, it is tempting to let the printer keep the stock: it already shows a percentage on every tray. We read those fields while building our own filament page, and they answer a narrower question than they seem to.
What we looked at. Two Bambu Lab A1 printers with an AMS Lite and an H2C with an AMS 2 Pro, read over the local network on 22 and 23 August 2026, with one more look at the H2C on 5 October. These are our notes from those days, not a fresh measurement and not a lab test, and a firmware update may change any of it. Here is the shape of what a tray reports, cut down by hand for illustration rather than copied from a printer:
{ "id": "0", "remain": 100, "tray_weight": "1000", "total_len": 330000 }
| What the printer reports | What we saw | What it tells you | What it does not tell you |
|---|---|---|---|
remain on an AMS Lite |
100 on all four trays through a whole five-hour print on one A1, and still 100 mid-print on the other the next day | Nothing about what is left on that unit | That the spool is full |
remain on an AMS 2 Pro |
Whole percentages that move, such as 5, 7, 27 and 80 | Roughly how much a spool holds | What one print used: 1% of a 1 kg spool is 10 g |
total_len |
330000 on every tray at once, beside a tray_weight of 1000 |
The nominal length of a full 1 kg spool of 1.75 mm filament | How much has been used or is left |
ams.version |
14, then 31, then 11 on the same A1 | Nothing we could rely on | Which model of AMS is attached |
| Humidity and temperature | Real figures on the AMS 2 Pro, zeroes on the AMS Lite | Whether that unit reports its surroundings | Anything about the spool's weight |
What Bambu Lab documents. Its AMS manual describes the remaining-filament figure as an estimate: the length of filament fed out while the spool's RFID tag turns a full circle, with "the complete 1kg filament roll" counted as 100% (Bambu Lab wiki). The AMS Lite's manual has no remaining-filament section at all. We have not found a Bambu Lab page that says an AMS weighs a spool, so we do not say it does: what the table describes is what the fields showed, not how the machine arrives at them.
Why an order still uses the slicer's figure. The two numbers answer different questions. The slicer says what a job plans to use, purge included, per filament, before it runs, which is what a price and a stock deduction need. The printer says, at best, roughly what is on a spool now. It cannot say which order took what: on the A1s a print carried no job id we could match to an order, and a 10 g step is most of a small part. So in LayerFlow3D an order takes its planned grams off its spools when you move it to In progress, and the AMS percentage is shown only on a unit that also reports humidity and temperature - never on an AMS Lite. Where it is shown, a spool that has drifted more than 2% from it is corrected, but only for a spool with an RFID tag linked to one on the shelf, only while that printer is not printing, and only with the workshop agent running. The correction is recorded as a stock-take, which feeds the month's "used more than planned" figure for that filament type, never the cost of one order.
What to do with this in the workshop:
- Do not read 100% on an AMS Lite as a full spool. Weigh a spool when it comes off the machine.
- Cost and deduct each job from the slicer's total per filament, not from the printer. The filament cost calculator turns that total into money.
- Use a printer's moving percentage as a cross-check over a month for each filament type, not as the record of one print.
- When the books and the printer keep disagreeing, put the spool on the scale and record a stock-take with the reason, so the difference becomes something you can see rather than something that quietly moves the total.
Reorder before you run out, using a number
"We're getting low on black" is not a reorder trigger. A minimum level is.
Set one per material and colour, based on how fast you get through it and how long resupply takes. If you use 1.5 kg of black PLA a week and delivery takes ten days, your minimum is around 3 kg, not one spool. Then the reorder is a decision the number makes, not one somebody has to notice.
The audit that is worth doing
Once a quarter, weigh everything. It takes an afternoon and it tells you two things: how far the count has drifted, and where it drifted.
If the gap is spread evenly, your per-job estimates are a little low - adjust the waste allowance. If it is concentrated in one material or one machine, you have found a failure rate or a leak nobody had noticed.
An audit that finds nothing is not a wasted afternoon. It is the only evidence that the rest of this is working.