Why I Built Yet Another Spreadsheet for Reagents

The problem with chemistry inventory tracking isn't that it's hard. It's that every tool built for it either becomes too complicated to maintain or too simplistic to be useful. I spent about three years running lab inventories across two different institutions before I stopped trying to adapt commercial solutions and wrote something myself. The result is what I now call a Minimalist Chemistry Tracker. It's not a product. It's a system. The core idea is brutally simple: track only what matters, update only when something changes, and never let the tracking itself become the job. Most people I've seen try to build elaborate dashboards with expiry alerts, automated reorder triggers, and multi-user syncing. That kind of thing works fine until someone forgets to log a reagent that arrived last Tuesday at 11 PM, and suddenly your "automated" system tells you to order more of something you already have six bottles of. I learned that the hard way. We lost about two weeks of parallel experiments because we couldn't trust our inventory data.

What a Minimalist Chemistry Tracker Actually Is

A Minimalist Chemistry Tracker is a lightweight inventory system designed around the principle that the fastest way to lose track of chemicals is to build a system that demands constant input. The tracker I use relies on a flat-file structure—essentially a CSV with a small Python wrapper that handles lookups, additions, and depletion logging. No database. No web interface. No authentication layer. When I say flat-file, I mean it literally. Each row is one chemical entry with fields for catalog number, concentration, lot number, received date, opening date, storage location, and current quantity. That's it. The Python script I wrote lets me query by any of those fields and write updates back without needing to format anything. The tracker also includes a simple decay model for reagent shelf life. Not the fancy kind with degradation kinetics—just a static half-life table keyed to chemical class. Acetone? Six months after opening. Enzymes? However long the vendor claims, minus a buffer. This matters more than you'd think if you've ever run a gel and wondered why everything smeared.

How It Works in Practice

Let me walk through the actual workflow. When a shipment arrives, I open the tracker file and add the entries. Takes about ninety seconds for a standard reorder of fifty to sixty items. Each entry gets logged with the exact date, the lot number from the certificate of analysis, and where it's being stored. If a bottle is split between two cabinets, it's two rows with the same lot number and a quantity split across locations. When someone uses a reagent, they log it. I mean that literally—anyone in the lab opens the file, finds the chemical, and decrements the quantity. There's no separate logbook. There's no "tell the postdoc who then writes it down." It's just there, sitting in a shared network folder, and everyone treats it like a shared Google Doc would, which is to say some people use it religiously and others ignore it entirely. The tracker survives this because it doesn't require anything fancy to update. You can edit it with any text editor. You don't need to sign in. The Python wrapper adds some structure without adding complexity. It can do bulk depletion based on usage records, flag chemicals that are below threshold quantities, and cross-reference lot numbers against the lab's purchasing history. But you can strip all that away and still have a working system. The bare CSV is functional on its own.

Get the Full Details

Chemistry Tracker | PDF
Chemistry Tracker | PDF

Minimalist Chemistry Tracker and the Edge Case That Nearly Broke It

Here's the problem that made me realize the original design had a gap: lot number collision. We received two separate shipments of the same chemical within three months, both from the same manufacturer with slightly different lot codes. The tracker initially stored lot numbers as a free-text field, and when I ran a query for all entries of a particular compound, the results came back unsorted and visually ambiguous. Two lots, same catalog number, different expiry dates, different concentrations if they happened to be the same chemical purchased from different vendors over time. The fix was ugly but effective. I added a compound hash column that combines the catalog number, vendor code, and lot number into a single string. It's not elegant. It makes the CSV slightly harder to read at a glance. But it completely eliminated the lookup errors and let me run automated checks for duplicate entries across shipments. If the same lot number appears twice in the database, the tracker flags it immediately. We caught two nearly identical orders placed by different people because of this check alone. That saved roughly four hundred dollars in redundant purchases. I also learned that the decay model I'd built was too rigid. The vendor-specified shelf life is accurate under ideal conditions. In practice, lab storage is inconsistent. A desiccator in a non-air-conditioned room degrades things faster than the certificate suggests. I adjusted the model to apply a 15% buffer reduction to all shelf life estimates and added a manual override field for specific chemicals where I had direct experience with degradation rates. This is the kind of thing you can't get from a spreadsheet template. It comes from making the same mistake twice.

What This Approach Misses

I'm not going to pretend this is a complete solution. It has clear limitations. First, there's no version control. Multiple people editing the CSV simultaneously will cause conflicts, and the Python wrapper doesn't handle that gracefully. It's fine if one person is the primary updater, or if edits happen sequentially rather than in parallel. It is not fine if three people are updating it at the same time from different machines. I've worked around this by designating two people as primary editors and having the rest of the lab request changes through a simple ticket system in our messaging channel. It adds a step, but it prevents data corruption. Second, the system doesn't integrate with procurement. If your lab uses an online ordering portal with automated reordering thresholds, this tracker will not talk to it. You have to manually enter received shipments. That's a feature, not a bug—the manual entry process forces you to actually verify what arrived—but it does mean there's a data entry step that automated systems skip.

Third, the decay model is static. It doesn't account for real-time storage conditions, thermal cycling from frequent access, or batch-to-batch variability in manufacturer quality. For most reagents this is adequate. For critical enzymatic reactions or standard curves that depend on precise activity, you should test the reagent before trusting the tracker's expiry estimate. The tracker tells you when something might be degraded. It doesn't tell you whether it actually is. If you need real-time multi-user editing, automated procurement integration, or environmental monitoring, this system won't satisfy you. Look at LabCollector, LabArchives, or even a properly configured Airtable base. They cost money and have learning curves, but they solve the problems I just described. The Minimalist Chemistry Tracker is for people who want to know exactly what's in their lab and don't want a subscription to learn it.

Chemistry Tracker | PDF
Chemistry Tracker | PDF

Building Your Own

You don't need the Python wrapper to start. A CSV with the right columns is enough. Here's the column structure I use: Catalog Number, Compound Name, Supplier, Lot Number, Quantity (mL or g), Concentration, Storage Location, Received Date, Opened Date, Expiry Estimate, Notes That's eleven columns. The Python wrapper I wrote adds functionality for bulk depletion, duplicate detection, and threshold alerts. The wrapper is small—about two hundred lines—and it depends on nothing outside the standard library plus pandas. If you're comfortable with Python, you can modify it to your needs. If you aren't, the CSV works without it.

The source code for the wrapper is available on my GitHub. I don't market it as a product. It's a tool I maintain because I use it every week, and I'll push updates when something breaks or when I find a better way to handle a particular case. The current version supports batch depletion logging from usage records and exports a summary report formatted for lab safety audits. The biggest insight I have about building these systems is that simplicity is not the same as minimalism. A minimalist system removes everything that isn't essential to accurate tracking. A simple system removes features until nothing useful remains. The distinction matters because the first one gets used and the second one gets abandoned on a shared drive where nobody checks it anymore. I've watched more elaborate inventory tools die in my labs than I care to count. They were always well-intentioned, usually well-funded, and always replaced by something simpler within six months. The Minimalist Chemistry Tracker survived because it stopped trying to solve problems that weren't there and started solving the one problem that actually mattered: knowing whether the thing you need is still usable.