01
About this report
Closed Won and Closed Lost opportunities by month of close date, or of expected close date when the close date is empty, for the last 24 months. Each row gives won and lost counts, won and lost projected values in base currency, and the win rate, which is won divided by all closed.
When you group by Quarter or Year, the win rate is recalculated from the counts. A falling win rate with steady volume usually points at qualification.
02
Sample preview
Fictional figures in the shape you will see. Yours come from your account.
| Month | Won | Lost | Closed | Won value | Lost value | Win rate |
|---|---|---|---|---|---|---|
| 2026-06 | 5 | 7 | 12 | 184,000 | 142,500 | 0.42 |
| 2026-07 | 4 | 4 | 8 | 96,500 | 88,000 | 0.50 |
| 2026-08 | 7 | 5 | 12 | 241,300 | 97,250 | 0.58 |
| 2026-09 | 3 | 6 | 9 | 72,000 | 131,400 | 0.33 |
03
The SuiteQL
This is the query each report runs. Read it, copy it, or change it after import.
SELECT TO_CHAR(NVL(t.closedate, t.expectedclosedate), 'YYYY-MM') AS period,
SUM(CASE WHEN t.status IN ('Opprtnty:C', 'C') THEN 1 ELSE 0 END) AS won,
SUM(CASE WHEN t.status IN ('Opprtnty:D', 'D') THEN 1 ELSE 0 END) AS lost,
COUNT(*) AS closed,
SUM(CASE WHEN t.status IN ('Opprtnty:C', 'C') THEN t.projectedtotal * t.exchangerate ELSE 0 END) AS won_value,
SUM(CASE WHEN t.status IN ('Opprtnty:D', 'D') THEN t.projectedtotal * t.exchangerate ELSE 0 END) AS lost_value,
SUM(CASE WHEN t.status IN ('Opprtnty:C', 'C') THEN 1 ELSE 0 END) / COUNT(*) AS win_rate
FROM transaction t
WHERE t.type = 'Opprtnty'
AND t.status IN ('Opprtnty:C', 'Opprtnty:D', 'C', 'D')
AND NVL(t.closedate, t.expectedclosedate) >= ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -23)
GROUP BY TO_CHAR(NVL(t.closedate, t.expectedclosedate), 'YYYY-MM')
ORDER BY period04