01
About this dashboard
Four tiles give the weighted pipeline, the number of open opportunities, new customers this year and open support cases. Below them are the projected pipeline by stage, the win rate by month, new customers by month, open cases by priority, and the open opportunities table.
In the Opportunity pipeline by stage report, click Opportunities to open the deals behind a stage. Stages are your account's own customer statuses. The dashboard has no filters.
02
What it carries
The dashboard reads 6 reports. They travel in the same file, so the import creates them first.
- ReportOpportunity pipeline by stageOpen opportunities by sales stage, with count, projected and weighted value, and the next expected close.
- ReportOpen opportunitiesEvery open opportunity with stage, sales rep, expected close, probability and value.
- ReportNew customers by monthCustomers making their first purchase each month, and the running total of customers who have bought.
- ReportSupport cases by status and ageOpen support cases by status and priority, split by how long they have been open.
- ReportOpen support casesEvery support case not yet closed, with company, status, priority, owner and age.
- ReportOpportunities won and lost by monthOpportunities closed each month, won against lost, with their values and the win rate.
03
Sample preview
Fictional figures in the shape you will see. Yours come from your account.
| Widget | Kind | Reads |
|---|---|---|
| Weighted pipeline | stat | Opportunity pipeline by stage |
| Open opportunities | stat | Opportunity pipeline by stage |
| New customers, this year | stat | New customers by month |
| Open support cases | stat | Support cases by status and age |
| Pipeline by stage | bar | Opportunity pipeline by stage |
| Win rate by month | line | Opportunities won and lost by month |
| New customers by month | line | New customers by month |
| Open cases by priority | donut | Support cases by status and age |
04
The SuiteQL
This is the query each report runs. Read it, copy it, or change it after import.
SELECT NVL(BUILTIN.DF(t.entitystatus), '(no stage)') AS stage,
COUNT(*) AS opportunities,
SUM(t.projectedtotal * t.exchangerate) AS projected,
SUM(t.weightedtotal * t.exchangerate) AS weighted,
AVG(t.probability) AS avg_probability,
TO_CHAR(MIN(t.expectedclosedate), 'YYYY-MM-DD') AS next_close
FROM transaction t
WHERE t.type = 'Opprtnty'
AND t.status IN ('Opprtnty:A', 'Opprtnty:B', 'A', 'B')
GROUP BY NVL(BUILTIN.DF(t.entitystatus), '(no stage)')
ORDER BY avg_probability, stageSELECT t.id AS opportunity__id,
t.tranid AS opportunity,
t.title AS title,
NVL(e.altname, e.entityid) AS customer,
NVL(BUILTIN.DF(t.entitystatus), '(no stage)') AS stage,
BUILTIN.DF(t.employee) AS sales_rep,
TO_CHAR(t.expectedclosedate, 'YYYY-MM-DD') AS expected_close,
TRUNC(SYSDATE) - TRUNC(t.trandate) AS days_open,
t.probability AS probability,
t.projectedtotal * t.exchangerate AS projected,
t.weightedtotal * t.exchangerate AS weighted
FROM transaction t
JOIN entity e ON e.id = t.entity
WHERE t.type = 'Opprtnty'
AND t.status IN ('Opprtnty:A', 'Opprtnty:B', 'A', 'B')
ORDER BY t.expectedclosedateSELECT period, new_customers, customers_to_date
FROM (SELECT m.period,
m.new_customers,
SUM(m.new_customers) OVER (ORDER BY m.period) AS customers_to_date
FROM (SELECT TO_CHAR(c.firstsaledate, 'YYYY-MM') AS period,
COUNT(*) AS new_customers
FROM customer c
WHERE c.firstsaledate IS NOT NULL
AND c.parent IS NULL
GROUP BY TO_CHAR(c.firstsaledate, 'YYYY-MM')) m)
WHERE period >= TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -23), 'YYYY-MM')
ORDER BY periodSELECT x.status,
x.priority,
SUM(CASE WHEN x.age <= 2 THEN 1 ELSE 0 END) AS age_0_2,
SUM(CASE WHEN x.age BETWEEN 3 AND 7 THEN 1 ELSE 0 END) AS age_3_7,
SUM(CASE WHEN x.age BETWEEN 8 AND 30 THEN 1 ELSE 0 END) AS age_8_30,
SUM(CASE WHEN x.age > 30 THEN 1 ELSE 0 END) AS age_over_30,
COUNT(*) AS open_cases
FROM (SELECT NVL(BUILTIN.DF(sc.status), '(none)') AS status,
NVL(BUILTIN.DF(sc.priority), '(none)') AS priority,
TRUNC(SYSDATE) - TRUNC(sc.startdate) AS age
FROM supportcase sc
JOIN supportcasestatus s ON s.id = sc.status
WHERE s.stage <> 'CLOSED'
AND sc.isinactive = 'F') x
GROUP BY x.status, x.priority
ORDER BY open_cases DESCSELECT sc.id AS case__id,
sc.casenumber AS case_number,
sc.title AS subject,
BUILTIN.DF(sc.company) AS company,
NVL(BUILTIN.DF(sc.status), '(none)') AS status,
NVL(BUILTIN.DF(sc.priority), '(none)') AS priority,
BUILTIN.DF(sc.assigned) AS assigned_to,
BUILTIN.DF(sc.origin) AS origin,
TO_CHAR(sc.startdate, 'YYYY-MM-DD') AS start_date,
TRUNC(SYSDATE) - TRUNC(sc.startdate) AS days_open,
TO_CHAR(sc.lastmodifieddate, 'YYYY-MM-DD') AS last_modified
FROM supportcase sc
JOIN supportcasestatus s ON s.id = sc.status
WHERE s.stage <> 'CLOSED'
AND sc.isinactive = 'F'
ORDER BY sc.startdateSELECT 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 period