Inventory App Starter · Industry version
Store-level stock control — cycle counts, shrinkage visibility, transfer between shops — in a codebase you own.
Retail inventory fails in the gap between the system and the shelf. This starter treats each store as its own stocked location, makes counting a routine instead of an annual event, and hands you the code — so the fixes for your particular gaps are edits, not feature requests.
01 · The problem
Generic inventory tools assume stock sits in a warehouse until it ships. Retail stock lives on shelves where customers, staff, and suppliers all touch it — so the interesting number isn't on-hand, it's the gap between what the system says and what the shelf holds, and most tools can't even represent that gap.
Store operations also don't pause for stocktakes. A shop that closes for a wall-to-wall count twice a year is guessing the other 363 days. Retail needs rolling cycle counts — a few categories per week, folded into opening routines — and a generic tool without count scheduling turns that discipline into a manager's memory.
And the totals mislead. Six units across four stores is not availability if five of them are in the wrong region. Chain-level sums hide store-level stockouts, so replenishment and transfer decisions need per-store visibility that warehouse-shaped schemas flatten away.
02 · Data model
Everything in the base Inventory starter —
itemswarehousesstock_movementssupplierspurchase_ordersreorder_rules— plus the entities this industry actually runs on:
| table | what it holds |
|---|---|
stores | Selling locations with hours, region, and staff — distinct from warehouses, because a shelf is not a rack. |
cycle_counts | Scheduled partial counts by category and store, with counted-versus-expected recorded per item. |
shrinkage_events | Categorized loss — theft, damage, expiry, admin error — so the write-off report shows causes, not just totals. |
03 · Screens
Every movement is tied to a store or the warehouse, so on-hand is answerable per location and the transfer screen shows exactly which shop is starving while another sits on excess. Sell-through by store falls out of the same rows.
Counts are scheduled per store per category, and each completed count posts adjustment movements with the variance attached. Over a quarter that builds the report retail actually argues about: which categories, stores, and shifts leak.
Reorder rules run per store, and the suggestion engine checks sister stores before suppliers — an inter-store transfer is faster and cheaper than a PO. The alert queue reads like a morning task list, not a data export.
04 · In practice
The opening manager sees this week's assigned categories, counts forty items in twenty minutes, and enters quantities on the count screen. Variances post as adjustments with the count attached — no end-of-year mystery write-off.
A size sells out downtown while the mall store holds four. The transfer creates paired movements, prints a slip, and shows in-transit until the receiving store confirms — so both managers see the same truth all day.
The Wednesday supplier drop is received against its PO line by line. Shorted lines stay open, damaged units are rejected with a reason, and the shelf quantity updates the moment the cage is checked in.
Yes — stores are first-class locations alongside warehouses, with per-store on-hand, per-store reorder rules, and transfers between any two locations. Chain totals are a roll-up, not the only number you get.
Every loss is a categorized event — theft, damage, expiry, admin error — posted as an adjustment movement. That turns shrinkage from one scary year-end percentage into a weekly report by store, category, and cause you can actually act on.
The generated app has a standard schema, so a POS integration is an import job or webhook that writes sale movements into your own tables. You own the code on both ends of that pipe, which is exactly what makes the sync debuggable.
Both — a single store with a back room is two locations, and everything above applies at that scale. The difference from chain retail is configuration in your data, not a different product tier.
Dual7 App Starters
Store-level stock control — cycle counts, shrinkage visibility, transfer between shops — in a codebase you own. Describe your version to start — the output is a project you own.