Select a date range to generate a report from stored dispatch history. Upload new Shopify/Square files via the Data tab first.
Maps each month (YYYY-MM) to the coffee used for Surprise Me / subscription boxes. Used to resolve subscription orders into named coffees for roast planning.
Defines what each gift bundle expands into. Format: bundle name → array of {coffee, size, grind} objects. Each bundle line item in an order expands into these component bags for volume and roast planning.
Normalise variant names from different sources into a single canonical name. "From" = the name as it appears in your data; "To" = what it should be called in reports. Only applies to Retail and Subscription rows.
Log sales from channels not in Shopify or Square (e.g. a market stall, direct account). Each entry is saved permanently to Firebase. Use the date range below to pull a period into your report — duplicates are detected automatically.
Normalise wholesale coffee names independently from retail. "From" = the name as it appears in your data; "To" = what it should be called in reports. Only applies to Wholesale rows.
Unit prices per coffee and size, used to calculate revenue in Analytics. Prices are also auto-updated when a Square TSV is uploaded. Use canonical coffee names (after aliases are applied).
Orders before this day/time are included in the current dispatch week; orders after belong to the next week.
Between-batch gap and default roast days → Roast Schedule tab
Price database, aliases, bundle config → Dispatch tab → Config
Upload Shopify CSVs, Square TSVs, a Subscription CSV, or a System Backup JSON. Multiple files accepted — format is auto-detected.
Download a complete snapshot of all roastery data as a JSON file, including the metadata registry.
No roast plan yet — go to Roast Schedule and click 📋 Build Roast Plan
How each section of Roastery Tools works.
/ — Open cross-tab search⌘ N / Ctrl N — New brew entry (while on Brew Log tab)Esc — Close any open modal or editor← → — Shift analytics range (when Analytics tab is active)? — Open keyboard shortcuts helpMorning overview of your roastery. Loads automatically on sign-in.
The cutoff day and time (default: Friday 14:00) is set in Settings.
Processes daily order exports from Shopify or Square and summarises volumes by coffee and bag size.
Each line item is tagged as one of: Retail, Wholesale, or Subscription. Use the channel filter pills at the top of the report to focus on a single channel. Only Retail prices are used to update the price database.
Click + Add Manual to record an order that doesn't appear in an export (e.g. a walk-in sale). Manual orders are archived after the day is saved so they don't duplicate on re-upload.
Uploaded CSV files are written to dispatch_history/{date} when you confirm them in Settings. Existing dates are merged into the dispatch history by date.
Toggle Revenue in the report header to see estimated £ values alongside kg. Prices are pulled from the price database — upload a fresh CSV to keep them current.
Charts dispatch volumes (kg or £ revenue) over time using saved history.
Use the range pills — 4w, 8w, 13w, 26w, 52w, All time — or the natural presets This month, Last month, This year, Last year, MTD, and YTD. You can also enter exact dates and click Apply.
All time may require confirmation before loading the full dispatch_history collection on first use.
The Day / Week / Month / Year toggle controls how bars are grouped. The default is chosen automatically based on your selected range, but you can override it.
Toggle Revenue to switch the chart from kg to estimated £. Prices come from coffee_price_db, populated when you upload dispatch CSVs.
Click a coffee name in the legend to isolate it in the chart. Click again to show all.
While in Week grouping, click any bar to open an inline note editor. Notes are saved to analytics_week_notes/{weekStart} and appear in the bar tooltip on hover.
Controls when a dispatch "week" rolls over. Configured in Settings. Default: Friday 14:00.
Manages per-coffee roast targets and feeds the Roast Plan with how much to roast and when.
Click + Add Coffee to create a new row, or use 🔄 Sync from Stock to pull all coffees from the Coffee Stock tab in one go. Sync shows a preview before applying — existing manual overrides are skipped.
Click the 🧩 button on any row to define blend components. Each component gets its own batch size and loss %. The parent row tracks total roasted stock; components track the individual green coffees to roast.
Click ✓ Roasted on a row to log actual green-in / roasted-out weights. The yield % is saved and used to calibrate future loss estimates for that coffee.
Generates a day-by-day roast schedule from the Roast Schedule targets, with start times and batch ordering.
Drag a batch group within a day to reorder it, or drag it to a different day column entirely.
Each batch has an actual kg field. Fill this in after roasting for an accurate logbook record.
Click 📲 Share to get a QR code and URL. Anyone who scans it opens the same live plan — useful for sharing with staff on the roastery floor.
Completed sessions appear at the bottom of the tab: date, total kg in/out, yield %, and any notes entered during the session.
The roast plan saves automatically to Firestore as you edit it. If another user updates the same plan, a reload notice appears so you can refresh to the latest version.
Tracks roasted coffee on hand (large tubs + loose bags) and green bean inventory.
All fields are inline-editable. Add each physical tub as a separate weight entry using + Add Tub. Changes auto-save after a short delay.
Each coffee has a configurable low-stock alert (default 5 kg). When stock drops below this the tab badge turns amber and the coffee appears in the Dashboard attention list.
Click 📸 Save Stock Take to write a timestamped snapshot to stock_history. Snapshots power the sparkline charts next to each coffee name and the run-out prediction badges.
Click 📋 Friday Stocktake for a guided count. Enter actuals for each coffee — the form shows the expected count (from the last snapshot) and highlights variances. Confirming saves the result to stock_takes/{date}.
The Green Coffee tab tracks unroasted stock: coffee name, supplier, origin, kg on hand, cost per kg, and arrival date. Records are stored in green_inventory.
Use Receive Intake to log incoming green bean deliveries and save a matching intake record in green_intake_logs. Green history snapshots power runout sparklines, and low green stock is surfaced in the Dashboard and global slash-search.
Tracks bag and packaging material inventory and projects run-out dates.
Enter current counts for each packaging item inline. Changes save automatically.
Based on average weekly usage from saved snapshots, each item shows a projected weeks-remaining badge (green / amber / red).
Click 📋 Stocktake to record a full physical count. Actuals are compared against the last snapshot and variances are highlighted before you confirm.
Tracks subscription dispatch volumes month by month from your subscription platform export.
Go to Settings tab → Upload File(s) and select your subscription CSV. The app strips all customer PII before saving — only billing date, product name, and quantity are stored in subvol/{YYYY-MM} and used for subscription volume reporting.
Rows show each subscription product; columns show monthly totals. The rightmost column is the current month.
The comparison panel below the table shows current vs previous month: total kg, order count, and a per-coffee breakdown with ↑/↓ change indicators.
Records brew recipes for reference and dialling in. Useful for tracking what's working across different coffees and methods.
Click + New Entry (or press ⌘ N on the Brew tab). Fill in coffee, roaster, origin, and choose a brew method from the pills. Entries auto-save on confirmation.
Toggle between yield mode (enter dose + yield in grams, ratio is calculated) and ratio mode (enter dose + ratio, yield is calculated). The derived value is shown in real time as you type.
Score aroma, sweetness, acidity, body, and bitterness out of 5. A spider chart is generated automatically and shown on the entry card.
Click ⚙ Grinders to add your grinders by name. Once added, each entry has a grinder selector. Recent grind settings for the same coffee appear as a quick-reference panel when you start typing the coffee name.
Use the method pills or grinder pills to filter the list. The search box matches across coffee name, roaster, grinder, notes, and grind setting.
Click the copy icon on any card to open the editor pre-filled with that recipe — useful when dialling in the same coffee on a different day.
Click ↓ CSV to download all entries as a spreadsheet.
Central file upload and full database backup / restore.
Use the Settings tab Upload File(s) control with multiple files to bulk-load past CSVs. Dispatch files backfill dispatch_history, while subscription CSVs are stored in subvol/{YYYY-MM}. Existing historical dates are merged by date.
Click ⬇ Export Full Database to download a full JSON snapshot of all Firestore collections. Sensitive customer fields are stripped from the exported file by key name where possible.
When restoring a .json backup, the app prompts you to confirm before writing any data. Only restore from a trusted backup file — this is a privileged operation that may overwrite the entire Firestore dataset.