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 editorMorning 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.
Click Save to History. The report for the selected date is written to dispatch_history/{date}. Re-saving the same date overwrites the previous entry.
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 preset pills — 4 W, 3 M, 6 M, 1 Y, All — or pick exact dates with the custom range fields. All time reads the entire dispatch_history collection from the local cache, so it's fast.
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.
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 Inventory section below tracks unroasted stock: coffee name, supplier, origin, kg on hand, cost per kg, and arrival date. Records are stored in green_inventory.
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 Data tab → Upload File and select your subscription CSV. The app strips all customer PII before saving — only billing date, product name, and quantity are stored in dispatch_history under the Subscription channel.
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 Import Historical Data to bulk-load a folder of past CSVs and backfill dispatch_history. Existing dates are not overwritten.
Click Export Backup to download a full JSON snapshot of all Firestore collections. Keep a copy before any major import or data migration.