Calculation inputs: Step 1 pulls Xero bank data (background job). Step 2 classifies bank rows and re-matches deposits. Step 3 runs the profit engine. Use Bank Transactions to edit category/destination, then Save changes. Export actions: Download by party = same monthly layout as detailed, but bank lines summed per vendor. Download detailed = every bank transaction as its own row. Push Sheet (by party) / Push Sheet (detailed) fully wipe the month tab (e.g. Mar-25) then paste the matching export layout (same as the two download buttons). Nothing here writes money to Xero.

Profit distribution — results & summary

Sales invoices — edit cost & deposit

Same recognition month as the profit calc. Override equipment cost or deposit consumed, or exclude a row. Save, then click 3. Run calc to refresh KPIs. Invoice numbers open Xero. Use Numeric # only to show invoices whose number is digits only (e.g. Shopify 1479 / pre-suffix history), select rows, then bulk-set category or exclude — bulk actions apply only to the current filtered selection, never the full unfiltered list.

Pick company + month, then Run calc or Reload.

Unsaved invoice edits

Past months

Saved runs for this company. Tick months and use Push selected to queue Google Sheet updates (1 minute pause between months). Or push one month from its row buttons.

Pick a company above.

Bank transactions — one calendar month at a time

Xero enforces per-minute and daily API limits. Instead of one large pull, this walks the company's Xero history one calendar month at a time (starting July 2022, when this company's Xero data begins), pausing between months to stay well under those limits. Months already marked synced are skipped automatically on the next walk — including months already covered by an older full-history sync — so re-running this only spends API calls on months that are still pending or failed.

Pick a company above.

Invoices / sales — one calendar month at a time

Same walker, separate history: re-syncs invoices month by month so each line's Xero tracking category (e.g. state/region) gets captured — previously discarded on every sync. Needed once per historical month before the Machine Sales tab's "Fill from Xero data" button has real data to compute from. Shares the same per-company Xero connection as the bank walk above, so only one of the two can run at a time for a given company.

Pick a company above.

Machine sales — state × model matrix

Rows = models, columns = states (the same tracking-category states Xero uses). Cells = number of machines sold in that state this month. Feeds the Excel export's state-by-state block (row 15 states header, rows 16-25 models) directly — no more filling those cells in by hand after downloading.

Pick a company and month above.

Unsaved edits

Equipment cost table

Standard cost per model, looked up by the profit engine for every package/machine-sale invoice (Section A.3 of the design doc). Versioned by effective date — add a new row instead of editing an old one when a rate changes, so past months keep reproducing the same result. Rows marked "all companies" apply to every entity unless a company-specific row overrides them.

Pick a company above.

Equipment commission table

Trent's standing per-unit commission rate by model (Section K of the design doc), reported in Trent Extra — never netted into available profit.

Pick a company above.

Equipment component costs

Per-unit rate for each payment-hardware add-on (Nayax, Coin Mechanism, Note Reader, High Gain). The cost logic adds together the base model's cost (above) plus the rate for every component actually mentioned on the invoice — a component not mentioned simply contributes $0, so a combination missing one item is never refused for lacking a named combo. Component keys are NAYAX, COIN_MECHANISM, NOTE_READER, HIGH_GAIN.

Pick a company above.

Tracking categories

Read-only reference data pulled from Xero's own Tracking Categories setup (e.g. a "Region" category with options NT/QLD/NSW/...). This is what the Machine Sales tab's "Fill from Xero data" button matches invoices against — sync here first (or re-sync if a category is renamed / an option is added in Xero) so those names are current.

Pick a company above.

Sales classification rules

How each invoice gets bucketed into a category (Package deposit, Machine sale, Transport, Other, ...). Groups are checked in priority order (lower number first); within a group, its rules are checked in priority order too — first match wins. A rule's field can be the invoice number, an item code, a line description, an account code, or the contact name. Click Preview before saving a rule to see exactly which real invoices it would match and what they're currently classified as.

Pick a company above.

How equipment cost is assigned

The Equipment cost / component cost tables (Settings tab) are the data — this is the logic that decides how they combine for a given invoice. It scans ALL of an invoice's lines together (not one line in isolation) for a base model (RVM 3/4/5, SLAVE, 5/9 C Freezer, Fridge), then prices it additively:

unit cost = base model's standard cost + the rate of every payment-hardware component actually mentioned (Nayax, Coin Mechanism, Note Reader, High Gain) — a component not mentioned simply contributes $0, so any combination, including one that's missing an item or has extras, prices cleanly. Nothing is refused just for being an uncommon/partial combination any more.

NayaxCoin mechanismNote readerPriced as
base + Nayax + Coin Mechanism + Note Reader (= the historical "ALL PAYMENTS" rate, if stored)
base + Nayax (= the historical "NAYAX" rate, if stored)
base + Coin Mechanism + Note Reader (= the historical "WITHOUT NAYAX" rate, if stored)
base model cost only
any other combination (e.g. Nayax + Coin, no Note Reader) base + whichever of the three are present, each at its own rate

A stored historical combo rate (e.g. "RVM 5 + ALL PAYMENTS" = $5,010) is tried FIRST and wins if the exact row exists, for backward compatibility with rates that might differ from the plain additive sum. Otherwise the additive sum above applies. The explicit phrases "ALL PAYMENTS" / "WITHOUT NAYAX" anywhere in the text simplify straight to their signal set, skipping detection of the individual words. It's only flagged as an exception (never guessed) when: the base model or a present component has no cost-table entry yet, or a base-model line also bundles an unrecognized "Slave" unit or an explicit dollar adjustment (a genuinely compound/mixed line) — visible on the Run tab's invoice editor with the specific reason.

Try it

Paste in the line descriptions from a real (or hypothetical) invoice, one per line, and see exactly what the engine would detect and resolve — the same function the profit calculation actually calls, not a simulation.

Unresolved across history

Scans every invoice the engine would attempt to price, across the date range below (leave both blank for all history), and groups the ones that didn't resolve by reason — so a naming gap like "RVC3" shows up as one cluster of invoices instead of being found one at a time. Can take a while over a full multi-year history.

Bank transactions — edit category & destination

Header stays frozen while you scroll. Use Category / Destination dropdowns in the header to filter. Edit row fields then Save changes. Links open Xero when IDs exist.

Pick a company and month above.

Unsaved edits

Deposit ledger — all time

Server-side search + 50 rows per page. Invoice numbers link to Xero when available.

Pick a company above.