FY2018–FY2025 · 168 customers · All amounts in ZAR
Re-import your sales file with a Date column (any standard date format) to enable this view. The current dataset only has FY-level totals.
| Financial Year | Total Qty | Total Amount (R) | Unique Parts | Avg Price/Unit | YoY Qty | YoY Revenue |
|---|
| # | Part No (New) | Old Part No | Type | Range | Veh | Origin | Total Qty | Total Amt (R) | Avg Price/Unit | Customers | Txns | Custs View | Description |
|---|
| Financial Year | Qty Sold | Revenue (R) | Avg Price/Unit | Customers Buying | YoY Qty | YoY Revenue | Active |
|---|
| # | Part No (New) | Old Part No | Type | Range | Veh | Origin | Total Qty | Total Amt (R) | Price/Unit | Txns | Description |
|---|
| Financial Year | Qty Sold | Revenue (R) | Price / Unit | YoY Qty | YoY Revenue | Active |
|---|
Forecasts use linear regression on historical FY data. Projections are estimates for planning purposes only.
| # | Part No (New) | Type | Hist Qty (Total) | FY+1 Qty ▲ | FY+1 Revenue ▲ | FY+2 Qty ▲ | FY+2 Revenue ▲ | Trend | Description |
|---|
| # | Part No (New) | Type | Qty | Amount (R) | Global Rank | Description |
|---|
| # | Part No (New) | Type | Mkt Qty | % Gap | Other Custs | Description |
|---|
| # | Product Origin | Total Qty | Share | Trend |
|---|
| # | Product Origin | Total Amount (R) | Share | Trend |
|---|
| # | Product Type | Total Qty | Share | Trend |
|---|
| # | Product Type | Total Amount (R) | Share | Trend |
|---|
| # | Product Range | Total Qty | Share | Trend |
|---|
| # | Product Range | Total Amount (R) | Share | Trend |
|---|
| # | Part No (New) | Old Part No | Type | Range | Veh | Origin | Custs Lapsed | Total Qty | First FY Bought | Last FY Bought | Mkt Total Qty | Description |
|---|
The sales figures on every tab are the reorder system's sales history, kept current straight from SOS Inventory. Each day at 09:30 the server re-reads the latest month's invoices and credit notes from SOS (and adds any newer months) and replaces that month on the seeded history, exactly as the reorder system's own sync does. Seed the history once with the workbook from sos_sales_import.py (drop it below and Apply, or run it with --push); after that the SOS sync keeps it live. Re-seed only when the older years or a part mapping change.
Upload a sales data file. Supported format: .xlsx
Accepts .xlsx
| Column | Type | Required | Notes |
|---|
Multi-sheet workbook with all selected sections
All part sales rows as single-sheet workbook
Products no longer being purchased
Parts not bought that the market is buying
Shelf depth, reorder cadence and mix per line
Export a single workbook covering every customer — useful for sharing or archiving the full dataset.
KPI summary row per customer
Every part × customer row as Excel
Every lapsed part across all customers
One sheet per customer, itemised lapsed parts
Revenue, COGS and profit per part per customer
One sheet per customer, itemised by part number
Every SOS invoice line with unit price, revenue, COGS, profit and sales rep
Every part's class, demand, target stock and the value-sleeper watchlist, as the reorder system works them out
Every customer rolled up by Exedy branch, with the suggested stock holding per part and per customer
Every shelf line across all customers, one row each
One sheet per customer, itemised shelf profile
Overview + Parts + Lapsed in one XLSX
Add recipient email addresses for the monthly Lapsed Products report. Addresses are saved in this browser. Clicking Send generates the Excel file and opens your email client with all recipients pre-filled — just attach the downloaded file and send.
A disciplined, stage-gated way to forecast revenue, prioritise effort, and coach deals to close. Every deal lives in exactly one stage, advances only when objective exit criteria are met, and carries a confidence weighting that feeds the weighted pipeline.
Most forecasts fail because deals are graded by optimism instead of evidence. This methodology fixes that by treating every stage transition as a gate: a deal cannot advance until the customer has done something that proves the stage is real.
Each stage carries a confidence weighting. Weighted pipeline = sum of (deal value × stage weight).
| Stage | Confidence | Definition | Exit Criteria (must all be true to advance) |
|---|---|---|---|
| Lead | 15% | An account with a plausible need. No commitment yet from either side. |
|
| Qualified | 30% | The customer has agreed the problem is worth solving and is willing to engage on a solution. |
|
| Proposal | 50% | A formal quote is in the customer's hands and under active review. |
|
| Negotiation | 75% | Commercial terms are on the table — price, scope, delivery — and both sides are working to close. |
|
| Won | 100% | The deal is committed in writing — PO, signed quote, or equivalent. |
|
| At Risk | 20% | A deal that has stalled, been blocked, or is drifting. Parked here until recovered or lost. |
|
Use this as a two- to three-week rollout. You do not need new tooling — the Pipeline tab in this dashboard is enough to get started.
A worked example grounded in the actual data in this dashboard. MASTERPARTS is a long-standing top-tier account: R 26.5M lifetime revenue, R 8.41M in FY25 (+8% vs FY24), 163 unique parts, 1,931 transactions. The opportunity is a defensive growth play — win back 48 lapsed SKUs and convert 10 market-gap SKUs the customer doesn't currently stock.
| # | Task | Customer | Type | Priority | Owner | Due Date | Status | Actions |
|---|
The operational discipline that makes the pipeline work. Sales Ops exists to do two things: remove friction from the seller's day, and add signal to the forecast. Every process, report, and tool is justified by one of those two tests — if it does neither, kill it.
Sales Operations is the function that keeps revenue predictable. Not by adding more admin, but by making sure the right information moves to the right person at the right time — and by making sure the rep spends their day on the customer, not on the system.
Everything Sales Ops does falls under one of four pillars. If you can't place an initiative under one of these, it's probably not sales ops work.
| Pillar | What it owns | Core question it answers |
|---|---|---|
| ① Data Hygiene | Customer master, product master, deal records, activity capture, deduplication, naming conventions. | "Do we trust the numbers?" |
| ② Cadence Discipline | Weekly pipeline reviews, monthly account reviews, quarterly win/loss, annual planning. Each has a fixed agenda and fixed attendees. | "Are we meeting often enough — and are the meetings productive?" |
| ③ Account Coverage | Territory & account ownership, quota allocation, follow-up SLAs, escalation paths, rep load balancing. | "Does every account that matters have an owner who is actually working it?" |
| ④ Insight Loop | Win/loss analysis, lapsed-customer review, gap-SKU review, pipeline-leak analysis, rep coaching inputs. | "What did we learn this month that changes next month?" |
Sequence matters. Do these in order — data hygiene before cadence, cadence before coverage plans, coverage before insight loops. Skipping ahead builds on sand.
Cadence is what turns process into culture. Every review has a fixed agenda, fixed outputs, and fixed attendees — no ad-hoc meetings replacing the scheduled ones.
| Cadence | Length | Purpose | Fixed outputs |
|---|---|---|---|
| Daily stand-up | 10 min | Surface blockers. What moved yesterday, what's at risk today. | Updated deal notes, SLAs attended to. |
| Weekly pipeline review | 30 min | Walk every Proposal / Negotiation / At Risk deal. One question per deal: what does the customer need to do next? | Updated stages, new close dates where justified, At-Risk flags logged. |
| Monthly account review | 2 hours | Review top-20 accounts by segment — revenue trend, lapsed SKUs, gap SKUs, relationship health. | Account plan updates, new deals created, At-Risk accounts escalated. |
| Quarterly win/loss | ½ day | Cross-functional: sales, ops, product. Walk through wins and losses of the quarter, extract patterns. | 3–5 playbook changes for next quarter. Documented win reasons per segment. |
| Annual planning | 1–2 days | Territory, quota, account assignments, target customer list for the year. | New coverage map, revised targets, hiring plan. |
Generate customer-specific pipeline reports from the actual sales data, and read how the Profit & Loss figures reconcile to SOS Inventory. For the Pipeline methodology see the 🏗️ Pipeline tab; for the Sales Operations methodology see the 📋 Customer Operations tab.
Select a customer to generate a pipeline-ready report from their actual sales data — account snapshot, FY trend, top products, gap opportunities, and lapsed SKUs.
The dashboard's Profit & Loss agrees with SOS Inventory's Profit and Loss by Customer report in every fiscal year from FY2018 to FY2026, once two known definitional differences are applied: the dashboard excludes non-inventory invoice lines, and its data is as of the morning pull on the day it was built. Cost of goods sold agrees to within 0.1% in every year. Every variance is itemised below.
This explains how the dashboard's Profit & Loss figures are derived from SOS Inventory, and reconciles them to SOS's own Profit and Loss by Customer report for every fiscal year from FY2018 (1 April 2018 – 31 March 2019) to FY2026 year-to-date (1 April 2026 – 17 September 2026). Fiscal years run 1 April to 31 March and are named by the calendar year in which they start.
All amounts are in South African rand, excluding VAT.
SOS Inventory is the company's inventory and invoicing system. Its Profit and Loss by Customer report lists, for a date range, every customer's revenue, COGS, profit and profit percentage. Revenue is taken from invoices and credit notes dated in the range. COGS is taken from shipments in the range, valued at average cost. The report was run directly from SOS for each fiscal year on 17 September 2026 with the settings in section 10.
The dashboard's Profit & Loss tab is built by a script that reads the same invoices and credit notes from SOS (active and archived documents, from the first invoice in April 2018), keeps only the lines that are stock items, and summarises them to one row per customer, per part number, per fiscal year. Its COGS is not calculated independently: it is taken from SOS's Profit and Loss by Item report, run one month at a time, and shared across the customers who bought that part in that month in proportion to units. The result is written to a workbook (SOS Profit and Loss, dated) and published to the dashboard.
| Measure | SOS Profit and Loss by Customer | Sales Dashboard P&L |
|---|---|---|
| Revenue | Every line on every non-voided invoice and credit note in the period, whatever the item type | Only lines whose item is an Inventory Item, Assembly or Kit. Non-inventory lines (section 5) and lines with no item are excluded |
| COGS | Cost of shipments in the period at SOS average cost | The same SOS figure, taken from the Profit and Loss by Item report month by month and split across customers by units shipped |
| Profit | Revenue less COGS | Costed revenue less COGS, where costed revenue is the revenue of lines SOS was able to cost |
| Margin % | Profit ÷ revenue | Profit ÷ costed revenue |
| Coverage % | Not reported | Costed revenue ÷ revenue. Shows how much of the revenue carries a cost |
The dashboard reports profit on costed revenue rather than on all revenue so that a line with no cost is never shown as pure profit. From FY2022 onwards SOS costs practically every line, so coverage is 99.8%–100% in every reconciled year and this choice has no material effect on the totals.
SOS figures are the sum of the customer rows in the Profit and Loss by Customer report run on 17 September 2026. Dashboard figures are from the workbook built at 18:49 on 17 September 2026. A positive variance means SOS is higher.
| FY | SOS revenue | Dashboard revenue | Variance | Explained by | SOS COGS | Dashboard COGS | COGS var. |
|---|---|---|---|---|---|---|---|
| 2018 | 52 274 515 | 51 411 047 | 863 468 | Non-inventory 855 366; no item 8 101 | 40 927 884 | 40 927 535 | 350 |
| 2019 | 34 244 668 | 31 965 161 | 2 279 507 | Non-inventory 2 279 507 | 25 820 701 | 25 799 994 | 20 707 |
| 2020 | 38 661 615 | 38 516 832 | 144 783 | Non-inventory 144 783 | 28 566 789 | 28 542 228 | 24 561 |
| 2021 | 73 263 567 | 73 254 745 | 8 821 | Non-inventory 8 821 | 55 130 980 | 55 126 408 | 4 572 |
| 2022 | 63 272 522 | 63 209 256 | 63 266 | Non-inventory 63 266 | 50 681 714 | 50 683 000 | −1 286 |
| 2023 | 60 192 165 | 60 281 221 | −89 056 | Non-inventory −89 056 | 47 728 799 | 47 719 591 | 9 208 |
| 2024 | 88 346 333 | 89 024 815 | −678 481 | Non-inventory −678 481 | 67 398 878 | 67 397 795 | 1 084 |
| 2025 | 64 608 732 | 64 596 010 | 12 721 | Non-inventory 12 721 | 46 131 241 | 46 131 215 | 26 |
| 2026 YTD | 31 418 104 | 31 240 205 | 177 899 | Non-inventory 84 122; five invoices after the pull 93 777 | 21 583 380 | 21 551 407 | 31 973 |
The dashboard P&L is a product-level report. It keeps only invoice lines for stock items (Inventory Item, Assembly or Kit) because each row is a part number, and a margin only has meaning where a part with a cost was sold. SOS's report keeps every line on the invoice. The difference is the value of the lines that are not stock items — booked in SOS as non-inventory items under the ADM category and similar, and used for accounting entries that pass through the sales ledger.
| FY | Non-inventory lines excluded | Main items |
|---|---|---|
| 2018 | 863 468 | Exchange Difference 871 547; Sample −19 439; freight 3 259; 8 101 on lines with no item |
| 2019 | 2 279 507 | Exchange Difference 2 117 210; FRT AIR 124 711; Reimburse 37 586 |
| 2020 | 144 783 | Exchange Difference 133 725; MISC 26 200; Reimburse −18 793; freight and courier 3 650 |
| 2021 | 8 821 | Small freight and adjustment lines |
| 2022 | 63 266 | Small freight and adjustment lines |
| 2023 | −89 056 | Discount allowed −89 356; freight 300 |
| 2024 | −678 481 | Discount allowed −452 820; BAD Debt −331 302; Exchange Difference 101 728; Disposal of Fixed Asset 3 913 |
| 2025 | 12 721 | Disposal of Fixed Asset 53 478; Discount allowed −40 757 |
| 2026 YTD | 84 122 | Sundry Income 44 859; BAD Debt 31 372; Discount allowed 7 891 |
These lines carry no cost of goods, so they change revenue and profit by the same amount in SOS's report and do not change COGS. Where the excluded lines are negative (FY2023 and FY2024, driven by Discount allowed and BAD Debt), SOS's revenue is lower than the dashboard's. Every line is still present in SOS and in the dashboard's source data; the dashboard excludes them by item type, not by editing.
The dashboard's invoices were pulled from SOS at 09:54 on 17 September 2026. SOS's report was run that evening. Five invoices dated 17 September were raised between the two:
| Invoice | Customer | Amount excl. VAT |
|---|---|---|
| ESA17787 | STAR BRAKE & CLUTCH DISTRIBUTORS CC | 3 780.00 |
| ESA17788 | WEPORT PTY LTD | 10 022.00 |
| ESA17789 | Gemini Parts (2) | 23 050.10 |
| ESA17790 | Walkers Midas-Kathu | 2 975.00 |
| ESA17791 | Goeie Hoop Onderdele | 53 949.61 |
| Total | 93 776.71 |
Together with the 84 122 of non-inventory lines in section 5, this accounts for the full FY2026 revenue variance of 177 899. The same five invoices explain most of the FY2026 COGS variance of 31 973, because SOS had shipped and costed them by the time its report ran.
The dashboard does not value stock itself. Its COGS is SOS's own figure, taken from the Profit and Loss by Item report run for each calendar month with archived items included. SOS values COGS from shipments at average cost, so within one part in one month the cost per unit is the same for every customer. The dashboard divides the month's reported COGS for a part by the units sold of that part in the month to get a unit cost, and multiplies each customer's units by it. Summed back over all customers this returns SOS's monthly COGS exactly.
Where a part has revenue in a month but no cost in that month's report — SOS books revenue on the invoice date and COGS on the shipment date, which can fall in different months — the dashboard uses the part's unit cost for the fiscal year instead. Within a year the timing washes out.
Because the non-inventory lines in section 5 carry revenue but no cost, they raise SOS's margin percentage in the years where they are large and positive, and lower it where they are negative. The dashboard's margin is the margin on stock items only.
| FY | SOS margin % | Dashboard margin % | Difference | Cause |
|---|---|---|---|---|
| 2018 | 21.71 | 20.39 | 1.32 | Exchange Difference 871 547 with no cost |
| 2019 | 24.60 | 19.29 | 5.31 | Exchange Difference 2 117 210 and air freight with no cost |
| 2020 | 26.11 | 25.90 | 0.21 | Exchange Difference 133 725 with no cost |
| 2021 | 24.75 | 24.75 | 0.00 | — |
| 2022 | 19.90 | 19.82 | 0.08 | Small non-inventory lines |
| 2023 | 20.71 | 20.84 | −0.13 | Discount allowed reduces SOS revenue |
| 2024 | 23.71 | 24.29 | −0.58 | Discount allowed and BAD Debt reduce SOS revenue |
| 2025 | 28.60 | 28.59 | 0.01 | — |
| 2026 YTD | 31.30 | 31.01 | 0.29 | Sundry Income and BAD Debt with no cost; five later invoices |
In SOS Inventory, run Reports → Profit and Loss by Customer, with the date range set to the fiscal year (for example 2025-04-01 to 2026-03-31), all locations, archived customers shown, and no name filter. Sum the customer rows; the Total row on the export should agree with that sum.
Open the workbook SOS Profit and Loss (dated) produced by the P&L import, sheet By Fiscal Year. Revenue, COGS and Margin % per fiscal year are on that sheet. The Detail sheet holds every customer, part and year row that adds up to it.
From the same SOS invoices, total the lines whose item type is not Inventory Item, Assembly or Kit for the year (the ADM items in section 5), and any lines with no item. SOS revenue less those lines should equal dashboard revenue. For the open year, also add invoices dated after the workbook's build time.
Run Profit and Loss by Item for each month of the year with archived items shown and sum the COGS column; this is the figure the dashboard allocates. It should agree with the by-customer report's COGS for the same period, and with the dashboard within the residuals in section 7.