The Sales Matrix pivot table — grouped under Reports and titled "Sales analytics" in the command palette, live at `/app/reports/sales-analytics` — lets you slice your shop's numbers two ways at once instead of reading one report at a time. Pick a row dimension, a column dimension, and a metric, hit Compute matrix, and you get a heat-mapped grid where every cell shows that row/column pairing's value for the time window you picked. Click any cell to see exactly which quotes are behind the number.
One naming note up front, since it can trip people up: this is a different "Sales Matrix" from the in-store kiosk presentation flow, which uses the same Good/Better/Best tiering to sell window tint, ceramic coating, PPF, and flat glass (plus any shop-defined "Additional Services" categories) to a customer in person. Same name, unrelated tool — this one is a pure analytics view under Reports. Nothing you do here changes pricing or presents anything to a customer. It also isn't listed as a tile on the main Reports catalog page — you'll get to it from the command palette (search "sales analytics" or "matrix"), from a "Recent matrix" card that appears on your main dashboard once you've saved at least one snapshot, or by going straight to the URL.
Picking your axes
You choose four things before computing anything: a Rows dimension, a Columns dimension, a Metric, and a Window. The four dimensions available for rows and columns are Service category, Customer segment, Channel, and Vehicle type — you can't put the same one on both axes; the picker greys out whichever dimension is already selected on the other side, and the Compute matrix button stays disabled too if you somehow land on a match. Metrics are Quotes, Invoices, Revenue, Close rate, Avg ticket, and Margin %. Window options are Last 7 days, Last 30 days, Last 90 days (the default), and Last 12 months.
Reading the grid
Each cell shows the metric value in bold with a small "n=" count underneath (the number of quotes behind that cell), shaded on a green heat scale relative to the highest-value cell currently on screen — the darkest cell is your best-performing pairing at a glance. Click a cell (empty cells aren't clickable) to open a drill-down dialog listing up to 10 quotes for that intersection, sorted by total, each linking straight to the quote record with its quote status, invoice status, and totals. If nothing computes for your window, you'll see "No data in this window. Try widening to 90 days or 12 months."
Saving and comparing snapshots
Once you've computed a matrix, a second control row appears letting you optionally label and Save snapshot, which persists that exact grid. Saved snapshots show up in a "Recent snapshots" list at the bottom of the page, each with its own Compare button; picking one in the Compare to dropdown overlays it on your current grid, and every cell then shows a green "+" or red "–" delta versus that saved point in time. Once you've saved at least one snapshot, a "Recent matrix" card also shows up on your main app dashboard with a shortcut back into this page.
Gotchas worth knowing before you trust a number
Revenue only counts line totals from invoices that are PAID or PARTIAL — a cell can show a healthy quote count and still read $0 revenue if none of those quotes were ever invoiced, or the invoice never got paid. Margin % is currently a placeholder: there's no cost-of-goods tracking wired in yet, so every cell's margin is calculated as a flat 40% of its revenue rather than your shop's actual cost-adjusted margin — treat it as a stand-in, not a real number, until that's built out.
Customer segment buckets are: VIP (lifetime spend of $5,000 or more, computed live from completed payments), REPEAT (2 or more orders), NEW (customer record created within the last 90 days), and everything else falls into DORMANT. Channel buckets are derived by keyword-matching your customer's recorded source text — blank sources land in UNKNOWN and anything that doesn't match a known pattern lands in OTHER (the grid shows these as the plain, all-caps bucket keys, not a friendly label). Vehicle type always buckets fleet customers as FLEET regardless of make; otherwise it maps a short hardcoded list of makes to TRUCK/LUXURY/EXOTIC/EV, and anything else falls back to a model-year bucket (MODERN/MIDLIFE/STANDARD) or UNCLASSIFIED if there's no make on file.
Finally, a permissions note for owners managing staff access: unlike most of the reports under Reports, which require the "View financial reports" staff permission, the Sales Matrix's endpoints don't check that permission — any authenticated staff member who can reach the URL can compute, save, and drill into it. If you want sales analytics restricted to managers and up, that's a gap to be aware of rather than something the page enforces for you.