The method, in the open

How every number is worked out

Every figure the dashboard shows: what it counts, the sum, one worked example from the demo, and what it leaves out. Each definition follows the dashboard's code. If a figure ever disagrees with your own records, this is where to look first.

Worked examples: Demo Solar Ltd, a made-up company, October 2026 Data to 31 Oct 2026, both divisions

Three rules run through all of it. Leads, spend and calls count on the day the lead came in. Appointments, pitches and results count on the appointment day. A sale counts on its appointment day, unless it was agreed 3 or more days later (a pick-up), when it counts on the day it sold.

On the dashboard, tap a figure's label to see its sum with that period's own numbers, then open the rows behind it: the lead numbers, dates, source, area and outcome that make it up. The rows always add up to the figure, or the panel says so in red.

Leads #

Every lead that came in during the period, counted on the day it arrived.

The sum

Leads = leads with a lead date in the period, up to the report date

Worked example

October 2026: 3,049 leads = 1,674 Solar + 1,375 Windows.

Leaves out

Trade second visits: a second appointment on a lead already counted isn't a new lead. Duplicates are still counted here; Data health lists them so you can claim them back. A diary export with no lead dates shows a dash, not a guess.

Where

Overview (Leads in), Lead sources, the Monday email.

Booked and booking rate #

Of the leads that came in during the period, how many made it into the diary, whenever the appointment was made.

The sum

Booking rate = the period's leads confirmed into the diary (or sat) ÷ leads

When the diary's confirmations are imported, as in the demo, this step is Confirmed: booked and confirmed by the confirmer, or sat by a rep. Without them, it's every lead with an appointment.

Worked example

Lead sources, October's leads: 300 of 3,049 confirmed into the diary or sat: 10%.

Leaves out

Appointments made in the period for leads from earlier months: those are in Appointments. A lead booked next week still counts in the month it arrived, so a recent month's rate keeps rising for a while. Self Gen leads (the rep found the customer) are never "booked".

Where

Lead sources (How each source converts, and the lead journey), the source pages.

Appointments #

Every appointment in the diary dated in the period, up to the report date, whatever happened at it.

The sum

Appointments = appointments dated in the period, up to the report date

Confirmed = those the confirmer confirmed, or that a rep sat (sold or not sold).

Worked example

October: 450 appointments, 398 of them confirmed.

Leaves out

Appointments still to come (they show as "still to come", not as no-shows). Self Gen sales and sales with no appointment date, which never had an appointment anyone recorded. Trade second visits are included here, and shown on their own on the Trade page.

Where

Overview, Reps, Call centre, Trade.

Pitches and pitch rate #

A pitch is an appointment where the rep sat with the customer and it went one way or the other: Sold or Not sold.

The sum

Pitch rate = pitches ÷ appointments

Worked example

335 pitched of 450 appointments: 74%. The other 115: 67 no-shows, 46 cancelled and 2 on the report date with no result yet.

Leaves out

If an export records sales but never "Not sold", every sale would look like the only pitch (100% conversion), so pitches, conversion and hours per pitch show "Not recorded" rather than a figure that flatters everyone. A pick-up is pitched on its appointment day, even though it sold later.

Where

Overview, Reps, Call centre, the league when the client counts pitches.

Blowout rate #

The share of appointments where the rep went but couldn't pitch: a no-show, no customer in, turned away at the door, the customer thought it was free or won't spend, or the electricity bill is too low for solar to pay. The headline for appointments.

The sum

Blowout rate = blowouts ÷ appointments

A cancellation is never a blowout, however late it came: customers phone to cancel that morning. Cancellations are shown on their own, and a cancelled appointment never counts as confirmed, pitched or sold.

Worked example

67 blowouts ÷ 450 appointments = 15%. Lower is better. The 46 cancelled appointments aren't in it.

Leaves out

Cancellations. Appointments with no result yet, which sit in the bottom line but not the top, so the rate is a touch low until they're filled in (Data health lists them). A sale cancelled after the visit isn't a blowout: the rep pitched, so it counts as Not sold. A client can also choose (App Settings) to take a blowout off the count once that customer has been given another appointment.

Where

Overview, Reps, Call centre (by the agent who booked it), Lead sources.

Conversion #

How many pitches turn into a sale. The headline measure for reps.

The sum

Conversion = sales ÷ pitches

Turned round, pitches ÷ sales is pitches per sale. Reps are judged against 1 sale in 3 pitches by default; each client sets their own.

Worked example

87 sales ÷ 335 pitches = 26.0%, or 3.9 pitches per sale.

Leaves out

The sales and pitches in one period aren't always the same visits: the 87 include 12 pick-ups, counted on the day they sold, and 2 Self Gen sales that were never pitched. Over a few months this evens out; over one week it can move a rep's rate by a point or two. Not shown when the export records no "Not sold".

Where

Overview, Reps, each rep's profile, Lead sources, Money on the table, the coaching line.

Sales, revenue and average order #

A sale counts on its appointment day; its value is the sale value in the export.

The sum

Average order = revenue ÷ sales

On the appointment day: sales made at the visit or within 2 days. On the sale date: pick-ups (3 or more days later) and sales with no appointment date. Self Gen sales count as a sale only: never confirmed or pitched.

Worked example

October: 87 sales = 73 on the day + 12 pick-ups + 2 Self Gen. £680,750 ÷ 87 = £7,825 average order.

Leaves out

Revenue is whatever value the export carries: with or without VAT, finance fees and add-ons is a definition agreed with you before go-live. A sale cancelled or refunded after the visit counts as Not sold with no revenue, and is listed in Data health.

Where

Overview (against target), Reps, the league, the Monday email.

Cost per lead #

What a lead cost you on average.

The sum

Cost per lead = lead spend ÷ leads

Spend is each lead's cost, from the export or a cost per lead set per source, for the leads that came in during the period.

Worked example

£69,989 ÷ 3,049 leads = £23 a lead, free referrals included.

Leaves out

What it costs to work the lead: call centre hours are in their own line. Free leads (referrals, your own social) pull the average down; Lead sources also shows the paid-only figure.

Where

Lead sources, each source's page.

Cost per pitch #

What it cost to get a rep in front of a customer. Shown two ways: in lead spend, and in call centre time.

The sum

Lead spend per pitch = spend on the period's leads ÷ pitches those leads have had

Call centre cost per pitch = hours × cost per hour ÷ call centre pitches

Worked example

Lead sources, October's leads: £69,989 ÷ 254 pitches = £276. Call centre, October: 1,037 hours × £14 = £14,524 ÷ 312 pitches = £47.

Leaves out

Lead sources follows each lead to its result, so a recent month's leads are still being pitched and the figure falls as they are. The call centre line needs "Call centre cost per hour" in App Settings (wages and overheads); without it, it isn't shown.

Where

Lead sources (What each source costs and returns), Call centre (the cost line).

Cost per sale #

Lead spend for every sale. The question most installers can't answer per supplier, and the one this is built around.

The sum

Overview: lead spend in the period ÷ sales in the period

Lead sources: spend on the period's leads ÷ the sales those same leads made

Worked example

Overview, October: £69,989 ÷ 87 sales = £804. Lead sources, October's leads: £69,989 ÷ 66 sales so far = £1,060, shown in grey as too early to judge: 100% of those leads are under 6 weeks old.

Leaves out

The Overview figure divides this month's spend by this month's sales, and many of those sales came from last month's leads, so it's a running cost, not one supplier's true cost. For a supplier's true cost use Lead sources over leads old enough to have sold (6 weeks or more), or a source's verdict. Neither includes call centre or rep time.

Where

Overview, Lead sources, each source's page, Money on the table, the verdicts.

Revenue per £1 #

The sales value a supplier's leads brought in for every £1 spent on them.

The sum

Revenue per £1 = revenue from a source's leads ÷ spend on those leads

Worked example

Frame & Glaze Leads, leads from Jun – Aug 2026: £213,300 ÷ £27,237 = £7.83, against your Windows sources' average of £5.44.

Leaves out

It's sales value, not profit: a supplier whose jobs carry a thin margin can look better here than it is. Free sources have no figure. Recent leads are still converting, so the figure rises for about 6 weeks.

Where

Lead sources, What each source earns back, each source's page.

Money on the table #

What the biggest gaps are worth in sales value. It leads with the cautious figure, each gap closed a quarter of the way, and shows "worth up to" (every gap closed) underneath. An estimate, always shown as "about".

The sum

Reps are measured on appointments in the 3 months to the end of the period on screen (12 months for a year). Call speed and suppliers use leads old enough to have sold: those that came in over a window of the same length ending 6 weeks before the report date (or at the period's end, if earlier). Each line is then scaled to the period by its share of the leads and rounded to the nearest £1,000: a line under £500 is dropped, and £500 to £999 shows as £1,000. The total is the sum of the lines shown.

Reps below their division's conversionFor each rep with 10+ pitches below their own division's rate: (division rate − their rate) × their pitches = extra sales, × that division's average order (the data review's rule, the same code). That is "worth up to"; the figure shown is a quarter of it.
Slow first callsThose leads: the ones rung within an hour of calling time against those left over 4 calling hours or never rung. The gap in booking rate × the slow leads × sales per booking × the average sale is "worth up to"; the figure shown is a quarter of it.
Leads when nobody was on the phonesThe same, for leads that arrived in calling hours while the team's phones were shut.
Dearer suppliersWithin each division, suppliers with 3+ sales: each dearer supplier's sales × its extra cost per sale over the cheapest is "worth up to"; the figure shown is a quarter of it.

The headline is the sum of the lines' cautious figures; "worth up to" is the sum of their whole gaps.

Worked example

October: about £38k = reps £20k (about 2 more sales if the reps below their division's rate (Solar 23%, Windows 28%) moved a quarter of the way up to it; about 10 all the way) + slow first calls £12k (leads rung within the hour booked at 14%, slow ones at 10%) + dearer suppliers £6,000. Worth up to £156k if every gap closed: reps £82k, slow first calls £49k, suppliers £25k.

Low end and worth up to

The same rule as the £350 data review: the figure shown closes a quarter of each gap (the review's low end); "worth up to" closes all of it. The review is only invoiced if the low-end savings on lead spend over 12 months, plus supplier credits claimable now, come to more than £350 (invoiced on delivery, payable within 14 days), and never if the export covers under three months of leads; sales value never counts towards that test. Reps are measured the same way in both: against their own division's rate, at its average order.

Leaves out

Profit: it's sales value. That reps or suppliers could really close the whole gap: some of it is lead quality, which is why the figure shown counts a quarter.

Where

Overview, third card; each line opens the page behind it.

Hours per pitch #

How many call centre hours it takes to put one pitch in the diary. The headline for the call centre: lower is better.

The sum

Hours per pitch = hours on the rota ÷ pitches from the call centre's bookings

Pitches count on the appointment day. Green at or under the target, amber up to 25% over, red beyond.

Worked example

October: 1,037 hours on the rota ÷ 312 pitches = 3.33, under the demo's target of 4. One agent, Jamie Docherty: 104 ÷ 38 = 2.74.

Leaves out

Trade bookings and the Trade share of anyone's hours: those are on the Trade line. Hours not on the rota. A rota with monthly totals only is spread evenly over the month, and the page says so.

Where

Call centre, each agent's page, the coaching line.

Called within the hour #

The share of new leads first rung within 60 minutes of arriving, in real time: what the customer waited.

The sum

Called within the hour = leads first rung within 60 minutes ÷ leads

Worked example

October: 1,297 ÷ 3,049 = 43%.

Leaves out

It needs first-call times in the export; without them it isn't shown. A first call logged before the lead arrived is a data error (usually two systems on different clocks), never a fast call. Part of Connected, where the dialler is linked in the build.

Where

Overview, Call centre (a single day), Insights (Speed to first call).

Calling hours #

A second clock that only runs while the team could be ringing, so a lead that arrives at 10pm isn't counted as hours of slow calling.

The sum

Calling time = minutes between the lead and the first call that fall inside calling hours

Calling hours and days are App Settings rows (the demo: 09:00–20:00, Mon–Sun). The team's own phone hours per day are set too; a lead that arrives inside calling hours while the phones are shut is counted apart.

Worked example

Lead 15131 came in 8 Oct 2026 20:31 and was first rung 9 Oct 2026 09:11: 760 minutes (12.7 hours) in real time, 11 minutes of calling time. In October, 400 leads came in during calling hours while the demo team's phones were shut (Saturday evenings and Sundays).

Leaves out

Called within the hour stays in real time: calling time is for judging the team, real time for what the customer felt. Bank holidays aren't known unless the days are set.

Where

Insights (Speed to first call), Money on the table, the alerts.

Worth a call #

Warm leads that cooled off but could still book, ranked for the call centre to ring while the diary has room. Lead numbers only: no names or phone numbers.

The rule

Leads 7 to 60 days old that never booked, or booked and then blew out or were cancelled

Ranked on four things multiplied together: how often the lead's source sells, how often leads that came in at that time of day book, what happened (a blowout counts double, as they wanted the appointment; a cancellation counts as normal) and age (a third less every 30 days). Leads whose division has a free diary slot in the next 3 days come first, with no more than 4 from one source in each block of 10. The list is cut to App Settings "Worth a call list size" (200 by default). Left off: anyone whose outcome said not to call again (Don't call again), and a customer who has since bought or has an appointment.

Worked example

At 31 Oct 2026, 3,413 warm leads could still book and the diary had 45 free slots in the next 3 days. Another 1,414 were left off because the outcome said not to call again. First on the list: lead 75423 from Referral / Repeat, in on 5 Oct 2026 09:54, 26 days old. Its appointment blew out, its division has a free slot, and booked now it would count as SU data.

Leaves out

Leads under 7 days old (still in normal dialling, several calls a day), Trade and Self Gen leads, and anything the CRM doesn't hold: a customer who said no on a call nobody logged is still on the list.

Where

Call centre page, and the CSV for the dialler (Connected).

Don't call again #

A customer whose outcome said not to call again (not interested, wrong number, do not call, a tenant or not the homeowner, already has solar) is never put on Worth a call. Every other figure counts the lead as its outcome, as before.

The rule

Not called = the refused lead + the same customer's leads that came in before it, or up to 30 days after it

The window is App Settings "Duplicate window days", the same window the duplicate checks and credit claims use. A lead from that customer after the window is a fresh enquiry (they filled in an ad again), so it's fair game. The refusals are kept per customer on the "Don't call again" tab and carried across imports, so a shorter export can't bring a refused customer back.

Worked example

The demo's tab lists 9,280 refused leads, and the window adds 98 more leads from the same customers. Lead 468 came in on 29 Nov 2025 and the customer said not to call again. They came in again as lead 16422 on 2 Dec 2025, 3 days later: inside the window, so it isn't called either. Had it come in more than 30 days after the refusal, it would be called.

Leaves out

A refusal the CRM doesn't record, or one typed in words the import doesn't recognise (Data health lists the outcomes it couldn't place). It never moves a figure: a refused lead still counts as Not booked, or as its appointment's result.

Where

Worth a call, the dialler CSV and the "Don't call again" tab in the workbook.

Pick-ups on the sale date #

A pitch that missed on the day and sold later. The pitch counts on its appointment day; the sale counts on the day it was agreed.

The rule

Pick-up = a sale dated 3 or more days after its appointment

Within 2 days (the 48-hour hold) it's a sale on the appointment day. Agents' pick-ups count on the sale date too, whatever the gap, and so do the league and the pay sheet.

Worked example

Lead 14277 was pitched 26 Sep and sold 20 Oct, 24 days later: its pitch is in September, its sale and its £11,750 in October. October had 12 pick-ups.

Leaves out

It needs a sale date in the export. Without one, every sale counts on its appointment day.

Where

Every sales figure; the sums say "a pick-up counts when it sold".

Sales that stick #

Of the sales signed, how many held. A sale cancelled or refunded after the visit is already counted as a pitch that didn't sell; here it's counted back in as signed, then cancelled.

The sum

Cancellation rate = cancelled after the visit ÷ (sales that held + cancelled after the visit)

Over the 12 months to the end of the period on screen, because a month has too few to read. A cancellation before the visit is a cancelled appointment, never a sale. Finance declines and installs show too, where the CRM records them.

Worked example

1 Nov 2025 – 31 Oct 2026: 969 sales signed, 69 cancelled after the visit (7%). The sales figures already leave those out: they count the 900 that held.

Leaves out

A cancellation the CRM doesn't mark as one. A sale cancelled months later moves out of its month's sales when it is next imported.

Where

Rep profiles, lead source pages, the one-to-one sheet, and What stands out when 10% or more cancel.

SU data #

Second-use data: a lead booked more than 7 days after it arrived. Harder work than a fresh lead, so it pays and scores more.

The rule

SU = booked date − lead date > 7 days

Any source. The 7 is an App Settings row ("SU after days"). A booking with no booked date counts as fresh.

Worked example

Lead 15470 came in 5 Oct and was booked 13 Oct, 8 days later: SU data. Its appointment was 15 Oct.

Leaves out

Why the lead waited: a lead that sat untouched and one that was rung ten times look the same.

Where

Pay sheet, call centre board, invoices.

Call centre points #

The call centre's own board. Points for each booking that gets pitched, one value each (never added together), ranked on points per hour worked so part-timers are judged fairly.

The rule
PitchedPitched, same or next-daySoldSold, same or next-day
Fresh10203040
SU30405060

Same or next-day: the appointment is 0 or 1 days after it was booked. A blowout (the rep couldn't pitch) or a cancellation scores 0. A pick-up scores its pitched value on the appointment day and the difference on the day it sold. Every value is a setting.

Worked example

October: Jamie Docherty scored 880 points in 104 hours = 8.46 an hour, top of the board. Darren Kelly scored more, 1,250, but in 160 hours = 7.81 an hour, so second.

Leaves out

Trade bookings, Self Gen and sales with no appointment date (no agent booked them). Someone with no hours on the rota ranks below everyone with hours.

Where

The call centre board (and its TV view), agents' own pages.

Pay sheet lines #

Each agent's week, as an invoice: hours, then pitches and sales, fresh and SU apart.

The rule

Total = hours × hourly rate + pitches × their rate + sales × their rate

The demo's rates: £12.71 an hour; a fresh pitch £5 and an SU pitch £10; a fresh sale £5 and an SU sale £10. A pitch pays in the week of its appointment; a sale pays in the week of its sale date, even if that's a later week. All rates are settings.

Worked example

Jamie Docherty, 19 Oct to 25 Oct, invoice JD-2026-W43:

Hours23.5 × £12.71£298.69
Pitches, fresh data6 × £5£30.00
Pitches, SU data1 × £10£10.00
Sales, fresh data2 × £5£10.00
Sales, SU data0 × £10£0.00
Total7 bookings listed one by one£348.69
Leaves out

Anything not in the diary or the rota: holiday pay, adjustments, deductions. The invoice says "check before paying". Hours estimated from a monthly rota are marked "est.".

Where

Pay sheet and weekly invoices (Connected; a £300 add-on to Core).

Rep commission #

What each rep earns on the sales declared in the month, with a one-page statement listing every sale, its rate and its commission. The rate is usually 5–10% per deal, set by the rep, and private between the company and the rep, so it is off unless you supply rates.

The rule

Commission = each sale's value × the rate agreed for that deal (plus any £ a sale)

The rate comes from your export's commission column (the Import Map's "Commission %"). A sale with no rate of its own uses App Settings "Rep commission default %" if you set one, and every statement marks it "assumed". With neither, commission is off: Vanzio never assumes a rate. A sale pays in the month it was declared, so a pick-up pays in the month it sold. A sale cancelled after the visit is counted as Not sold, so it pays nothing. A rate under 5% or over the full rate is listed in Data health.

Worked example

The demo's reps mostly take the full 10% and sometimes 7.5% or 5% (fictional rates). In October, Rhona Paterson declared 9 sales worth £67,150, each with its own rate: 3 at 10% worth £21,950 pay £2,195.00; 3 at 7.5% worth £20,900 pay £1,567.50; 3 at 5% worth £24,300 pay £1,215.00. Her commission: £4,977.50. Every rep together: £62,871.25 on 87 sales worth £680,750, where 4 sales with no rate in the export are assumed at the demo's default of 10%.

Leaves out

Anything not tied to a sale: a basic wage, car allowance, bonuses. A sale cancelled after its month was paid drops out when that month is shown again; taking it back is the client's own process.

Where

Reps › Commission this month, and each rep's statement.

Commission given up to close #

How much commission a rep gave up to cut the price and close, and the average rate they took. A coaching measure: a rep who often drops to 5% may be closing on price.

The sum

Given up = (full rate − the rate taken) × sale value, added up · Average rate = commission at those rates ÷ their sale value

Only sales with a rate of their own in the export count: an assumed default says nothing about the rep. The full rate is App Settings "Rep commission full rate" (10% unless you change it). The average is weighted by sale value, so bigger sales count for more. Under 10 sales with a rate is marked few.

Worked example

In October, Rhona Paterson's 3 sales at 7.5% (worth £20,900) gave up 2.5 points: £522.50. Her 3 at 5% (worth £24,300) gave up 5 points: £1,215.00. Her 3 at the full rate gave up £0.00. Given up to close: £1,737.50. Average rate taken: £4,977.50 ÷ £67,150 = 7.4%, from 9 sales (few). Every rep together: £5,203.75 given up, an average of 9.2%.

Leaves out

Sales with no rate of their own, and any discount the company gave on top of the rep's commission (the export doesn't say).

Where

Reps › Commission this month, the Reps table's Commission rate column, each rep's profile and one-to-one sheet.

Profit per sale #

What each sale leaves after the rep's commission, the lead cost and any other per-sale costs you supply, by rep, by source and for the whole business. Off until there is something to take off besides the lead cost.

The sum

Profit per sale = (sale value − rep commission − lead cost − product cost − install cost) ÷ sales

Lead cost per sale is the one on Lead sources ("Cost per sale, these leads"): a source's leads received in the period, their spend ÷ the sales they have made so far. Each sale declared in the period carries its source's figure, so the lead cost here is the sales' cost per sale, not the month's spend. A source whose leads in the period have no sale yet has no cost per sale: its spend is its own line, "Lead spend with no sale", and the reps' lines plus that line add up exactly to the whole business. Product and install cost come from your export (the Import Map's "Product cost" and "Install cost"); a cost you don't supply isn't taken off, and the page says what is included. A sale split over product lines adds up its product costs, and takes its install cost once unless App Settings "Install cost is per" says line.

Worked example

The demo carries fictional product costs and no install costs. In October, Social (in-house)'s leads cost £12,892 and have made 14 sales: £921 a sale. Its 15 sales declared in October: £120,700 − £11,131 commission − £13,813 lead cost − £54,150 product cost = £41,606, or £2,774 a sale, the most of the sources with 10 or more sales. The whole business: £680,750 from 87 sales − £62,871 − £87,046 − £303,330 = £227,503, or £2,615 a sale. In the Windows division, Social (in-house)'s October leads haven't sold yet: £4,450 is the "Lead spend with no sale" line, and with the reps' £25,144 makes the division's £29,594.

Leaves out

VAT, finance fees, wages and overheads, and any cost your export doesn't carry. A sale cancelled after the visit has no value, so it isn't in it.

Where

Reps › Profit per sale, linked from Lead sources (Connected).

Supplier verdicts #

Each lead source gets one of four verdicts, from its last 3 full months whose leads are old enough to judge, against the average of like-for-like sources.

The rules, in order
Too few to judgeUnder 100 leads or under 10 pitches in the 3 months.
Cut backOnly on strong evidence: cost per sale at least 40% above the average in each of the 3 months, with 10+ pitches in each. Never for a free source.
Get moreCost per sale at least 20% below the average and revenue per £1 at or above it.
WatchCost per sale 15% or more above the average, or rising two months running, or a blowout rate 10+ points above the average.
KeepEverything else.

A month whose leads are 30% or more under 6 weeks old is stepped past. A source with 80% or more of its leads in one division is judged against that division's sources; any other against all your sources. Self Gen isn't judged: it goes straight to a sale.

Settings (App Settings rows): the lead and pitch minimums, the 20%, 15% and 40% lines, the pitches a month for Cut back and the blowout points. Fixed in the code: the 3 months, the young-month rule and the 80% division rule.

Worked example

Judged on Jun – Aug 2026 (Sep and Oct leads are still converting). Frame & Glaze Leads: Get more, cost per sale £681, 28% below your Windows sources' average of £948, and £7.83 per £1 against £5.44. Northlight Leads: Watch, £1,411 a sale, 22% above the average of £1,154, and rising: £1,116 in Jun, £1,192 in Jul, £2,680 in Aug.

Leaves out

Anything the export doesn't carry, such as a supplier's credit for duplicates or a price change mid-month. A verdict is where to look, not an order: it says why, line by line.

Where

Each source's page (Lead sources › a source).

Data health checks #

Rows with something to fix in the CRM, found on every import, with the lead number so it can be found.

The checks
  • Duplicates: two or more rows with the same customer (a Trade second visit isn't one), and a lead ID on more than one row.
  • Missing outcome: an appointment before the report date with no result.
  • Double bookings: one rep with two bookings at the same time on the same day.
  • Dates out of order: first call before the lead came in, appointment before the first call or the lead, a lead dated in the future.
  • Sold with no appointment date; a division not on the Lists tab.
  • To know about, not to fix: not called within a day (that's speed, not a data error), a sale cancelled after the visit, a row typed in since the import, a sale whose commission rate is under 5% or over the full rate.

Data score = rows with nothing to fix ÷ all rows, rounded down to 0.1%

Worked example

35,763 rows, 632 with something to fix: 98.2% clean. Duplicates 454, double bookings 68, dates out of order 121, missing outcomes 0. Not called within a day: 5,086, kept out of the score.

Leaves out

Mistakes that look like real data: a wrong rep or a mistyped value can't be spotted from the row alone. A row can have more than one problem, so the counts add up to more than the rows to fix.

Where

Data health (the badge in the menu), the Data Checks tab in the workbook.

The forecast and its range #

The month ahead from the diary: what's booked, what usually gets booked in the time left, and recent rates.

The sum

Appointments = in the diary already + still to fill

Sales = sold so far + appointments × pitch rate × conversion

"Still to fill" is each day's usual appointments for that weekday (the last 8 weeks) less the share the diary usually has that many days ahead. Pitch rate is pitches ÷ settled appointments and conversion is sales ÷ pitches, both over the last 90 days.

Worked example

November 2026: 56 already booked + 325 still to fill = 381 appointments × 74% pitched = 281 pitches × 25.4% = about 71 sales, likely 66 to 77.

The range

The same method is run the day before each of the last 6 months and checked against what happened. The range is as wide as 4 in 5 of those misses, never narrower than 8%. Here: 8% either side; it came within 10% in 5 of the 6 months.

Leaves out

Anything the last 90 days didn't have: a new supplier, a price rise, a rep leaving, a holiday. The sliders on Insights show what a change would do. Not shown when the export records no "Not sold".

Where

Insights (Forecast), the Overview's month strip, the trend chart's pale bar.

Small samples #

A figure from too few to trust is marked, never hidden: a dotted underline and the word "few", with the count on hover.

The rule

Few = under 10 pitches (or leads, or appointments)

Other lines are set where they're used: a verdict needs 100 leads and 10 pitches; a rep's coaching line needs 8 pitches in 4 weeks; Money on the table only counts reps with 10+ pitches. The "few" line of 10 is fixed in the code.

Worked example

Isla Buchanan, October, on the Reps table (first visits; her Trade visits are on the Trade page): 2 sales from 7 pitches = 28.6%, marked "few": one more or one less sale moves it by 14 points.

Leaves out

Nothing is dropped: the figure still shows at full strength, so you can see it and judge it yourself.

Where

Reps, the heatmap on Insights, areas, sources.

Checked against your own figures #

Before you see your dashboard, a few months you know well are checked against your own records: your sales, revenue and appointments.

How

You type them into a Reconcile tab; Vanzio fills in its own figures beside them and says where they differ. A difference is usually a definition to agree, not a bug: sales on the signing date rather than the appointment, cancelled sales left in, revenue with VAT or finance.

Leaves out

It proves the counting matches yours for the months checked. It can't prove the export was complete, which is why the data health checks run on every import.

See it on the demo, or on four of your own numbers.

The demo is Demo Solar Ltd, a made-up installer, with every figure above. The 4-number check works out cost per sale per supplier from your spend, leads, pitches and sales, on your screen only.

Worked examples are filled in from the demo's own data by the same code the dashboard runs, and checked on every release.