The one rule that makes everything work: if it moved, it's in the system.
Every case received, shipped, counted, made, or thrown away gets logged — under your own name. That's not bureaucracy; it's our food-safety traceability record, and it's what lets the next person trust the numbers.
Buttons marked ADMIN are only visible to admins (Ryder). Everything else is for everyone STAFF.
1 · Getting in
- Open https://wcs-inventory.pages.dev on any computer or phone.
- First time? Tap Create an account under the sign-in button. Enter your name, your work email, and a password you choose (8+ characters). Confirm the email it sends you.
- You'll see a "waiting for approval" screen — that's normal. Ryder approves each account by hand (Admin → Team & access). The moment he does, the app opens by itself; nothing to refresh.
- Install it as a real app: on iPhone, Share → Add to Home Screen; on a computer, click the install icon in the address bar. It gets its own icon and window, and the app itself opens even with no signal.
- Forgot your password? Use the Forgot password? link on the sign-in screen — it emails you a reset link. No need to ask anyone.
No shared logins, ever. Everything you do is recorded under your name — that's how the traceability record stays honest.
2 · Finding your way around
The left sidebar (bottom bar on phones) is the whole map: Dashboard · Products · Packaging · Fish · Orders · Purchasing · Contacts · Schedule · Count · Trace · Activity · Reports · Import · Admin.
Search everything: ⌘K
Press ⌘K (or tap Search at the top of the sidebar) and type anything — a SKU, barcode, item name, lot number, customer, phone number, email, order number, invoice number, or supplier. Enter opens the top result right where it lives. It's the fastest way to move around the entire system.
Scanning barcodes
The 📷 Scan button (Products, Count, Trace) uses your phone camera. It reads product UPCs and our own printed labels (lot barcodes and shelf labels). A USB scanner at a desk works too — it just types into whatever search box is focused.
3 · The Dashboard
The morning glance, top to bottom:
- Today — what needs doing: anything overdue, today's deliveries and shipments, follow-ups due, counts waiting. Each line is one click from its screen.
- The number tiles: items, units on hand, active lots, low/out, expiring soon, stock turns. The Low/out and Expiring tiles are clickable — they jump straight to the filtered product list.
- Getting set up: the remaining first-time setup steps. It disappears when done.
- Charts: 30 days of stock levels and daily in/out flow.
- Alerts: the system's own worry list — late orders, expiring lots, warm freezers, allergen conflicts, overdue follow-ups, old unpaid invoices, people waiting for account approval. Act now means today; Watch means soon. Each jumps to the right screen. (Ryder also gets this digest automatically every morning.)
- Cold chain: log a freezer/cooler temperature in two taps. Do it daily — it builds the audit record CFIA wants to see, and the system flags anything out of range.
- Shopify sync: live status of the web store connection. Web orders deduct stock here automatically every 10 minutes.
4 · Products, Packaging & Fish (the catalog)
Three sections, one idea: every item we handle, each with SKU, UPC, size, case pack, category, and an ABC class (A = the items that drive our volume).
Reading the table
- Filter by category, location, or status (Low & out · Expiring soon · On hold · Not counted), or just type in the search box — it also matches lot numbers.
- Click any row to open its lots: quantity, location, pack date, best-by, and per-lot buttons:
- 🏷 — reprint the case label (item, lot barcode, dates) if one got damaged or a case was repacked.
- Hold — quarantine the lot. Held stock cannot ship. Ask Ryder before releasing.
- Move — transfer some or all of it to another location.
- Ship / remove — take stock out (see §8).
- Correct ADMIN — fix lot details (never quantities — quantities change only by count or movement).
Adding an item ADMIN
- + Item → name, SKU (the suggest one link proposes the next free number), UPC if it has one, category, size, case pack.
- Shelf life in days — set it once and receiving fills in best-by dates automatically from the pack date.
- Allergens — tick what it contains. This powers the allergen matrix and the production-run warnings.
- Entering a whole shelf? Save & add another keeps the form open, keeping section and category.
- 📋 Recipe defines what one unit consumes (for smoked/processed items) — production runs then pre-fill themselves.
5 · Receiving stock
When a delivery arrives, book it the same day. + Receive on any product page:
- Pick the location it's going into and enter who it came from — the supplier name is the one-step-back traceability record. Set the pack date if it isn't today.
- One line per item: start typing a SKU or name and pick from the matches. Enter the lot number (from the case), the quantity, and the best-by (fills itself when the item has a shelf life set).
- Press Enter to jump to the next line — it works like a spreadsheet.
- Something on the truck that isn't in the system? + New item adds it without losing the sheet.
- Or let the scanner do the typing: 📷 Scan cases keeps the camera running — every case you scan adds 1 to that item's line (the line appears on the first scan). Scan the whole truck, close the camera, fill in lots and dates, done.
- Any raw fish on the sheet makes the harvest fields appear: species, harvest area, vessel, landing date. Fill them — finished product inherits them, so a case of lox traces back to the boat.
- 🏷 Labels prints a case label per line — tape one to each case.
- Receive all books everything. Lines that share a lot merge automatically, and a best-by earlier than the pack date is caught before it saves.
Ordered it first? Go to Purchasing → Receive against this PO instead — the sheet pre-fills with what's outstanding and checks the order off as it arrives.
Lot numbers are not optional. No lot, no entry. If the case truly has no lot, the date-based one the system suggests is fine — what matters is that the number on the record matches the number on the case.
6 · Counting stock
The screen that keeps the system true. It opens on Due for count — A items every 30 days, B every 60, C every 120 (Ryder can tune this in Settings). The scope menu also has Never counted — that's the walk list for a first stocktake — and per-class views.
On a phone (the freezer walk)
- Pick the location you're standing in.
- Tap 📷 Scan, point at the case barcode — the item card appears.
- Type what you actually count. Check the lot number (pre-filled) matches the case. Add the best-by if it's on the case.
- Save count → the next item appears. Skip → passes without saving.
- Wifi died in the freezer? Keep counting. Entries save on the device and upload themselves the moment you're back in range.
At a desk
Switch to 🖥 Desk mode: a fast table — type the count, Enter, next row. Or print Count sheets from Reports, walk with a clipboard, and enter afterwards.
Found something on the shelf that isn't in the system? + New item at the top of Count adds it and drops you straight into counting it. Item has no UPC? Print Shelf & bin labels from Reports — its SKU becomes a scannable barcode.
Every count is logged — even ones that match the system exactly. Those "boring" matches are what prove our accuracy on the Count variance report.
7 · Orders (the desk you run)
Every order in one list — wholesale orders you enter, plus Shopify web orders automatically. Search by order #, customer, invoice # or SKU.
Taking an order
- + Order → customer (type-ahead), ship-by date, then lines.
- Beside each line you see what's really available: on hand minus what's already promised to other open orders — the same case can't be promised twice. Anything you can't cover flags red before you commit.
Shipping it
- Open the order → Ship this order. The ship sheet pre-fills with what's still owed.
- Print the pick list — it names the exact lots to pull (oldest best-by first, grouped by location so you walk the building once).
- Pull the stock, add carrier & tracking, Ship all. Print the packing slip for the box.
- Partial shipments are fine — the order tracks shipped-vs-ordered per line until it's complete.
Getting paid
Once shipped: Mark invoiced (enter the Sage invoice #) → Mark paid. Dollar amounts stay in Sage; this tracks the paperwork state. The Invoice aging panel shows every unpaid invoice by days outstanding, worst first — and 30-day-old ones hit the alerts.
A Confirmation printout is available from any order to send the customer, and ↻ Reorder — same as last time on a customer's page starts a repeat order in one click.
8 · Shipping without an order, and write-offs
→ Ship order on a product page is the same sheet, just not linked to a promised order: destination, items, quantities. Stock deducts oldest best-by first; held stock is never touched. The destination becomes a customer record automatically — leads and past customers are even promoted to Current when they buy.
Choosing "Waste, damage or loss" instead asks what happened: damaged · expired · destroyed after hold · recall · sample/donation · production loss · missing · correction. Pick honestly — that's what makes the shrink report worth reading.
9 · Production runs (⚗ on Products)
- Pick the finished item and how much you made. If it has a recipe, the input lines pre-fill with the oldest usable lots and the required quantities; the yield % shows live.
- Adjust to what you actually consumed (real lots, real weights).
- If the inputs carry an allergen the finished item doesn't declare, you get a red warning before the run records — that's how undeclared-allergen recalls start, so fix the declaration or the recipe.
- Give the output a new lot number (pre-filled
RUN-YYMMDD), print its label, save. The output lot inherits the harvest details of the fish that went in.
10 · Purchasing
- + Purchase order ADMIN → supplier (remembered for next time), expected date, lines.
- Or let the math start it: ✨ Suggest order drafts a PO from the reorder-point engine — every item below its order-up-to level, quantities rounded to whole cases, biggest need first. Trim to what one supplier carries, then save.
- 🖨 Print PO on any order produces the document to email or hand the supplier — PO number, ship-to, expected date, lines with sizes and case counts. Quantities only, never prices.
- Open POs show received-vs-ordered per line and flag themselves Overdue past the expected date.
- When the truck arrives: Receive against this PO — pre-filled, checked off automatically.
11 · Customers & leads (Contacts)
One book, four views — the dropdown switches between Current customers · Potential new leads · Past customers · Suppliers; the segment filter narrows any of them. Big lists page with Show 60 more, and search matches names, addresses, people, and emails.
Moving people between stages
Every row has one-click buttons: a lead becomes a customer with ✓ Customer, a quiet customer moves → Past, a past customer worth re-working goes back to → Lead. Ship to anyone or enter their order and they're promoted to Current automatically.
Follow-ups — how nobody falls through
- Give anyone a next follow-up date and a note on what to do (Edit → Next follow-up).
- Due and overdue ones surface at the top of Contacts, on the Dashboard, in the Schedule, and in Ryder's Monday brief.
- Done logs it and clears it. +1wk pushes it a week.
The touch log
On any customer's page, log every call, email, visit, quote or catalog send in two taps — dated, under your name. That history is what lets anyone pick up a conversation where the last person left off. Files (price agreements, signed forms, CFIA docs) attach right to the customer.
The customer page
Click any name for the full picture: contact details (tap-to-call / tap-to-email), what they order, order history with invoice states, upcoming events, ↻ Reorder, and 🖨 Shipment history — every line ever sent to them with lot numbers, the exact document you want open when a customer calls about a product.
Admin tools ADMIN
⚑ Tag shown sets segment and/or zone on everyone matching the current view + search in one pass. Export CSV downloads whatever view you're looking at. The duplicate-finder with one-click merge lives under Admin.
Addresses matter — a current customer without one is flagged, because the address is what a CFIA recall record requires.
12 · Schedule & the Day sheet
Deliveries in (from POs), deliveries out (from order ship-dates) and customer follow-ups appear automatically; add production days, meetings and reminders with + Event. Grouped Overdue / Today / Next 7 days / Later.
🖨 Day sheet prints the warehouse morning on one page: overdue first, today's schedule, the cycle counts due (with blank columns to write on), and everything low or out. Print it with the coffee.
13 · Trace & recall
Type a lot number, SKU, product name, harvest area, vessel, species or supplier — or scan a label. For every matching lot you get:
- Where it came from — supplier, receipt date, harvest details, or the production run that made it.
- Where it went — every shipment (with the customer's address) and every production run that consumed it.
- Mass balance — in − out − on hand. Zero unaccounted = a clean record.
Hold all N quarantines every matching lot at once — that's the button for an area closure or a supplier problem. Print recall sheet produces the CFIA one-step-back / one-step-forward record for a single lot.
If a lot says ON HOLD, it does not ship. No exceptions. Ask Ryder.
14 · Activity & fixing mistakes
The complete audit log — every movement, filterable by type and person, searchable, exportable to CSV. Full history is kept (up to the most recent 30,000 movements in view).
Entered something wrong? ADMIN
Every entry has an ↩ undo button. It records a compensating movement and puts the lot back where it was — nothing is ever deleted, so the audit trail stays honest. If the system can't safely match the entry to a live lot, it will tell you to fix the quantity with a count instead.
| What went wrong | The fix |
| Wrong quantity received / shipped / counted | Activity → find the entry → ↩, then redo it right. Or just count the item — a count always sets the truth. |
| Wrong lot number or date on a lot | Products → open the lot → Correct ADMIN (details only, never quantities). |
| Stock in the wrong location | Open the lot → Move. |
| Shipped to the wrong name | ↩ the shipment, ship again to the right customer. |
15 · Reports (print-ready documents)
| Report | Use it when… |
| Stock summary | you want everything on hand, by section, on paper. |
| Lot traceability | an auditor wants the full lot history, including retired items. |
| Count sheets | walking the floor with a clipboard instead of a phone. |
| Count variance | after a stocktake — counted vs what the system believed, accuracy %, item by item. |
| Shelf & bin labels | items need scannable barcodes (SKU becomes Code 128). |
| Reorder points & safety stock | deciding what to buy — the math behind ✨ Suggest order, with confidence notes. |
| Allergen matrix | reviewing declarations; flags recipe carry-over conflicts. |
| Cold chain log | an inspector asks for temperature records. |
| Turns, cover & ageing | finding dead stock and lots nearing best-by. |
| Waste & shrink | seeing what we're losing and why, by reason code. |
| ABC & cycle count plan | understanding which items drive volume and the count rhythm. |
| Pipeline & CRM activity | the sales side — leads, conversions, follow-ups, team touches. |
| Full backup | downloading a complete JSON snapshot (see §18). |
| Sage export | handing the accountant clean quantities, with cases and lots. |
16 · Import (bulk loading) ADMIN
- Paste a CSV into Import (header row + data). Sage export column names are recognized automatically — see HOW-TO-load-your-Sage-data in this Drive folder, and the WCS-Opening-Stock-Template.csv.
- Check shows exactly what will happen — how many rows update existing items, create new ones, and carry opening quantities — before anything is written.
- A row with a quantity books the stock in as a real lot with a count movement. Location names match loosely; lot defaults to a dated
COUNT- number.
17 · Admin & Settings ADMIN
- Team & access: approve new sign-ups (they appear as an alert too), set staff vs admin, disable accounts.
- Locations: add/rename storage locations and set each one's temperature targets — those targets drive the cold-chain warnings.
- Duplicate customers: the finder proposes likely duplicates; merging moves history and files onto the keeper.
- Settings — make it yours: cycle-count rhythm (A/B/C days), the "expiring soon" window, backup reminder cadence, and custom item fields (e.g. Country of origin, Brine recipe) that appear on every item form. Changes apply everywhere, instantly.
- Self-test: runs 23 checks of the calculation engines (FEFO, allergens, reorder math, mass balance, date handling) against known answers. Touches nothing. Run it any time something feels off — all green means the math is right and the question is the data.
- Error log: the app quietly records its own errors so bugs get fixed from facts.
18 · Backups & recovery
- Automatic: every Monday ~9am the database snapshots itself in the cloud; eight weeks are kept. The daily watchdog raises an alarm if a snapshot ever fails to appear.
- Manual: the app nudges a weekly Download a backup (Admin) — a complete JSON file. Keep it wherever you keep important files.
- Verify it: 🔍 Check a backup file in the same panel opens any saved backup and confirms it's intact and restorable, table by table — do this once after downloading, so the file is proven before the day you'd ever need it.
- Recovery: the step-by-step restore procedure is RESTORE-RUNBOOK.md in this Drive folder. It has been drill-tested end to end.
19 · When something goes wrong
| Symptom | What to do |
| "Waiting for approval" after signing up | Normal — Ryder approves accounts by hand. The screen opens by itself when he does. |
| Forgot password | Forgot password? on the sign-in screen → email link → new password. |
| "Session expired — sign in again" | Just sign back in. Nothing was lost. |
| No wifi in the freezer | Keep counting — entries upload themselves when you're back in range. Receiving and shipping need a connection; do those at the desk. |
| Camera won't scan | Make sure you allowed camera access; type the UPC or SKU into search instead — same result. |
| Entered something wrong | See §14 — the ↩ undo, or a fresh count. |
| Numbers look wrong everywhere | Admin → run the Self-test. All green = the math is fine, so an entry is wrong — check Activity for the odd movement, or count the item. |
| A lot shows ON HOLD | It doesn't ship. Ask Ryder — releasing a hold is a decision, not a click. |
| Something looks broken | Tell Ryder what you were doing and what you saw. The app also logs errors on its own, so it's usually already on the list. |
20 · House rules — the habits that keep it perfect
- Receive the day it arrives.
- Ship through the system, never around it.
- Count what's due each week — minutes, not days.
- Lot numbers, always.
- Holds don't ship.
- Log temperatures daily.
- Log every customer touch — two taps now saves a lost conversation later.
- Back up weekly — the app reminds you.
Inventory HQ is built and maintained in-house for West Coast Select / Sundance Seafood. Questions, ideas, or something you wish it did? Tell Ryder — it changes fast.
The one-page How Our Day Works is the crew-room version of this manual. Companion guide: Items, UPCs, Scanning & Stock — Step by Step. Also in the office Drive folder: Team-Welcome-Note (the 2-minute version), WCS-Cheat-Sheet, HOW-TO-load-your-Sage-data, RESTORE-RUNBOOK, DEVELOPER-HANDOFF.