Manufacturing

Inventory and batch tracking for a small brewery

Inventory for a small brewery. Track raw ingredients in and finished batches out, record what went into each batch so a bad batch can be traced back, and warn when a grain or hop is about to run out before the next brew.

Automatically generated draft

Written by machine against our own engineering playbook. The company is invented; the decisions are the ones we would make on a real build. A reviewed blueprint goes further — nine sections, agreed line by line, and it is what the build is tested against.

Section 01 · What has to work

The system must reliably link every ingredient lot to its finished batch, and alert the team before a key ingredient runs out.

Section 03 · Screens

Every screen, and what it is for.

  • ›Dashboard — A team member sees low-stock alerts and current brews. Alerts must be visible instantly.
  • ›Ingredients — A team member views all materials and current stock levels. Filtering by ingredient type must be instant.
  • ›Receive Lot — A team member logs a new ingredient delivery. Finding the parent ingredient must be instant.
  • ›Brew Log — A team member views all past and in-progress batches. Searching for a batch must be instant.
  • ›Start Brew — A team member creates a new batch, selecting ingredient lots to use. Available lots must load instantly.
  • ›Batch Details — A team member traces which ingredient lots went into a specific batch. The ingredient list must be instant.

Anything not on this list is not in version one. That is what keeps a fixed price fixed.

Section 04 · The data model

What it stores, and who can read a row.

Ingredient

uuid id, text name, enum('grain', 'hop', 'yeast', 'adjunct', 'chemical') category, numeric(10,2) low_stock_threshold, text unit_of_measure

Access · Any authenticated team member can read any ingredient.

IngredientLot

uuid id, uuid ingredient_id, text lot_number, numeric(10,2) quantity_initial, numeric(10,2) quantity_remaining, timestamptz received_at, date best_by_date

Access · Any team member can read any lot.

Batch

uuid id, text name, timestamptz started_at, enum('planned', 'brewing', 'fermenting', 'packaged', 'recalled') status, text notes, jsonb quality_control_data

Access · Any team member can read any batch record.

BatchConsumption

uuid id, uuid batch_id, uuid ingredient_lot_id, numeric(10,2) quantity_used

Access · Any team member can read any consumption record.

Those access rules belong in the database, not in the screens. Someone who edits the address bar still cannot read a row that is not theirs — and the test that proves it blocks delivery if it fails.

Section 05 · States

Planned → Brewing → Fermenting → Packaged | Recalled

Most scope arguments three weeks into a build are really arguments about a state nobody named at the start.

Section 06 · Where this breaks

What bites products like this one.

Concurrent brews using the same ingredient lot cause inaccurate inventory counts.

Use database transactions with row-level locking when deducting ingredient quantities to ensure serializable updates.

Poor connectivity on the brew floor leads to lost ingredient usage data.

Design actions to queue updates locally, allowing offline use and syncing when connection is restored.

A brewer enters 100kg instead of 10.0kg, corrupting stock levels and traceability.

Implement sanity checks on inputs with warnings for unusually large values before a required confirmation step.

Section 08 · Deliberately left out

What version one does not do.

  • ×Detailed cost-per-batch reporting. It requires integrating purchasing data, complicating the ingredient model. Add when traceability is stable.
  • ×Pre-defined recipe management. V1 logs ingredients used, not brews from a recipe, which simplifies batch creation significantly.

This is the section that protects the date, and the only place in the document where somebody says no. It is also why clients trust the rest of it.

Still open

What we would ask before quoting.

  • How are ingredient units measured (e.g., metric, imperial, mixed)? Does one hop come in pounds and another in kilos?
  • Can one brew be split into multiple fermenters that need separate tracking, or is a batch always one vessel?
  • Who is responsible for correcting an inventory error, and what does that adjustment process look like?

Your product, not this one

Get this written for what you are actually building.

Describe it in a sentence and the generator returns the same sections for your own product. Free, no email, nothing saved to a list.

Next step

Find out if your idea fits in 10 working days.

Tell us what you want to build. We reply the same day with a straight yes, no, or here is what we would cut.

NDA available on request