Enquiries arrive faster than anyone can answer them
Some get called back in minutes, some wait until tomorrow, and that is normal in a busy week. What is usually missing is a measure of which is which — and what the difference is worth.
REVENUE LEAK INTELLIGENCE
Loupe analyzes the records you already have — from leads and quotes to invoices and payments — to find revenue leaks, prove the dollars at stake, and show exactly what to fix.
Example · demo records · your figures come from your own exports
Data · the exports you already have
Reporting that stops at booked never sees what was raised or collected. Loupe reads to the end of the trail.
Where the money leaves
$21,700/mo
Inbound leads waiting over an hour for a first reply — found by joining the call log to the leads it never got answered from.
The arithmetic, term by term
=$21,700a month at stake
The change, with an owner
Instant lead routing to the on-call tech, with a five-minute response SLA.
Owned by the front office. A finding without a named change and a named owner is a chart, and a chart has never recovered a dollar.
What the change returned
+$18,400/mo
Recurring, from completed actions — measured back out of the same exports that found the leak. $64,200 recovered cumulatively over ten months.
Every business has a few of these, and none of them are anyone’s fault: an enquiry that waited a day too long, a quote that never got a second call, a good customer who simply drifted. Your own records already know. We read them, put a number on each one, and show you the arithmetic so you can check our work.
For B2B and service companies of any size. Nothing to install, nothing to migrate, and nothing about the way you already work has to change.
The free check gives you an estimate from three numbers you already know. A full diagnostic replaces every estimate with a figure from your own records.
No seals, no badges, no assurance that we follow industry standard practice. 8 plain answers about where your rows go, who can reach them, and how to get them back out — each describing what the product does today.
There is nothing to connect.
You export CSV or Excel from the tools you already run, and upload the files. Today that is the only path your records take into Loupe: no login to your CRM, no key to your accounting system, no background job reaching into anything, and nothing pointing the other way — Loupe reads, and has no ability to write back. Live connectors were descoped on purpose. You do not need another integration.
CheckOne import endpoint, and no scheduled sync of any kind.
The columns you mapped. Not your file.
Import shows you a preview and asks you to map your columns onto the fields a detector needs. Only those fields are written — every other column in that spreadsheet is dropped at the door, and the file itself is never kept, only its name. When you re-upload a record type the newest file is the one your reports use, and earlier uploads are kept until replaced or pruned so your numbers stay explainable. We do not state a retention period here, because there is no prune enforced in code yet and a period we do not enforce would be a worse claim than none.
CheckThere is no file store attached to this product — no bucket, no object storage.
TLS you cannot opt out of.
Every request is HTTPS, and the domain is HSTS-preloaded for two years, so a browser refuses to talk to it in plaintext at all. At rest your rows sit in Cloudflare D1 and are encrypted by the platform. We do not add a second, application-level encryption layer over your records — we would rather write that down than let a padlock icon imply it.
CheckStrict-Transport-Security: max-age=63072000; includeSubDomains; preload
Your workspace id is inside the query, never a filter after it.
D1 is SQLite and has no row-level policies, so isolation lives in application code — which means one forgotten clause would be enough. Because that is true, it is pinned by a test that reads every prepared statement in the codebase and fails any that touches a workspace-scoped table without constraining by workspace, then seeds two workspaces into a real database and proves nothing crosses. Nothing is pooled either: you are measured against your own history, never against other companies.
Checksrc/lib/tenant-isolation.test.ts
Two factors on the door, four roles behind it.
A password never opens an account on its own — every password sign-in also needs a six-digit code emailed to the address on file, and an unverified address gets the verification screen instead of the product. Inside a workspace, four roles decide what each person may do; the table fails closed on a role it does not recognise, and nobody can grant a role above their own. There is no support-impersonation route and no staff view of your findings. Direct database access exists, as it does at every hosted company, and it is limited to named people — we would rather say that than imply a barrier the code does not have.
Checksrc/lib/auth/rbac.ts — a capability table, not a role check at each call site.
That something happened. Never what was in it.
Sign-ins, role changes, invitations, imports and deletions are recorded as an event name and an account id. No record contents, no email addresses, and never a whole IP — addresses are truncated to a /24 before they are stored. Rows are pruned after 365 days. One honest limit: that trail is not yet readable from inside the portal, so today you would have to ask us for it.
Checksrc/lib/audit/log.ts — the fields it refuses to accept are listed at the top.
No model sees your records.
Every figure is computed by deterministic software from your own rows — run it twice on the same records and you get the same answer, which is what makes the arithmetic something we can show you. Nothing about your business is sent to a model provider, because there is no such call anywhere in the product.
CheckNo model provider SDK, endpoint or binding exists in the codebase.
One button, one transaction.
Deleting your account runs as a single database transaction: all of it goes, or none of it does. If you were the last person in the workspace it takes the workspace with it — imports, finding state, invitations, audit rows and rate-limit counters. You type the words to confirm, and the screen tells you how many imports are about to disappear before you do.
Checksrc/app/api/account/route.ts — the delete is one db.batch(), which D1 commits atomically.
What we do not claim. We hold no SOC 2 report and no ISO certificate, and there is no badge on this page pretending otherwise. A SOC 2 Type II audit is on the roadmap; when it is done you will be able to read the report rather than look at the logo. Backups, incident response and the platform-by-platform detail are on the security page.
Leads, quotes, jobs, invoices, calls — five exports from the tools you already use. Nothing to install, nothing plugged into your systems.
Every row gets read. The ones that stopped moving — the enquiry nobody called back, the quote gone quiet, the invoice still unpaid — get set aside and costed.
One list, biggest number first, with the arithmetic printed beside each line. If we can't show you the working, it doesn't go on the list.
38 of 119 open quotes past 30 days
38 × $3,420 × 0.34 × 0.38 = $16,500/mo
Your records already hold the answer. We open the stack, read every row, and set aside the ones that stopped moving — with the arithmetic beside each so you can check it.
Every finding opens to its own arithmetic, and every term opens to the records behind it. Software does the calculation; AI only explains it.
Example report · demo data. Every figure in your own report is computed from the records you upload, with the arithmetic shown line by line.
Every finding carries the same chain: the leak, the evidence, the arithmetic, the rows it was computed from, the fix, its owner and deadline, and what actually came back. Open one and read it end to end — nothing here is a screenshot.
Example · demo records · your figures come from your own exports
$21,700/mo
Median first response rose from 12 minutes to 2h 47m after the front-desk change in May. Leads left waiting over an hour book materially worse than leads answered inside five minutes — 41 a week land on the slow path.
Read from Jobber · CallRail
Estimated monthly revenue at stake~$21,700/mo
| Time | Caller | Source | Waited |
|---|---|---|---|
| Jul 17, 2:14 PM | (720) 555-0142 | Google LSA | 3h 12m |
| Jul 17, 11:03 AM | (303) 555-0188 | Website form | 4h 40m |
| Jul 16, 4:51 PM | (720) 555-0117 | Google Search | 18h 09m |
| Jul 16, 9:22 AM | (303) 555-0075 | Google LSA | 2h 02m |
| Jul 15, 3:38 PM | (720) 555-0093 | Meta | 5h 51m |
164 slow-path leads this month · showing the latest 5
Instant lead routing to the on-call tech, plus a five-minute response SLA.
Nothing yet — this fix is still in progress, so there is no measured recovery to print. The line fills in only when a later export moves the median. One fix has landed in this same example: a weekend answering service, measured at +$4,300/mo since Jun 8.
Example · demo records · your figures come from your own exports
Every figure in a Loupe report is a chain of multiplications you can run yourself. Here is the biggest leak in the demo report, one rung at a time, with the running subtotal beside each step. Open a rung to see which records it came from — and where a number is a judgement rather than a measurement, it says so there.
In the product this finding lists all 164 leads — time, caller, source, and how long each one waited. That table sits behind sign-in. There is no public records view, so this page shows you the arithmetic rather than staging a drill-down that is not here.
Leads wait too long for a first call back
Example · demo records · your figures come from your own exports
Source exports: Jobber · CallRail
Measured from the records in this workspace
From the leads export. A lead counts as slow when its first-contact timestamp lands more than 60 minutes after the lead arrived. Those are counted across the whole export and divided by the months it covers, so the figure is per month rather than per file.
When it refuses
If nine in ten timestamps land exactly on midnight — which is what a bare-date export looks like — every gap computes as a multiple of 24 hours and every lead reads as slow. On an export like that the detector makes no claim at all.
Measured from the records in this workspace
Two groups from that same export: leads reached inside 5 minutes, and leads that waited over an hour. Take each group's booking rate and subtract. Twenty-nine points is the difference measured in these records — not an industry benchmark, and not a figure carried over from another company.
The assumption inside this rung
That the slow leads would have booked at the fast group's rate if someone had reached them promptly. It is the load-bearing assumption in the whole calculation, which is why it is written down rather than buried in the multiplication.
When it refuses
The comparison needs at least 30 leads on each side, and a gap that rounds below one point produces no finding at all. A nought-point gap printed beside a dollar total is incoherent on its face.
Measured from the records in this workspace
Completed jobs divided by won leads. Leads and jobs arrive as separate exports and nothing makes them cover the same months, so the jobs are windowed to the leads' own date range before the division — otherwise a three-year jobs file gets divided by one quarter of leads.
When it refuses
Fewer than 30 jobs inside that window and the rate falls back to every completed job on record, stated in the finding as a wider period than the gap was measured over. Above 100% — more completed jobs than won leads — the two exports plainly do not describe the same work: the rate is capped at 100%, the cap is written into the assumptions, and the finding's confidence drops. A cap is not a measurement.
Measured from the records in this workspace
The mean value of the completed jobs inside that window: $251,800 across 180 jobs.
Why the blend, not the best channel
These leads arrive from local service ads, search, Meta and the website form. Pricing all of them at the strongest channel's $1,480 ticket overstated this leak by 6%, so the blended figure is the one that ships.
Our assumption — no record produces this number
This is the one rung on the ladder that is not measured. It is our default assumption about how much of a gross leak a fix actually brings back, and it is applied as a visible rung rather than as a quiet haircut on the total — a shown calculation only means anything if the steps on screen reproduce the number on screen.
Where it is better grounded, it is replaced
A pricebook correction captures nearly all of what it finds; a disputed change order captures much less. Those findings carry their own realization figure instead of this default. If 35% is wrong for your shop, this is the rung to argue with — and the other four do not move when you do.
Estimated monthly revenue at stake
$21,700 per month
Rounded for display. The arithmetic itself runs unrounded:
164 × 0.29 × 0.93 × 1,399 × 0.35 = $21,657.61
Finding totals are stated to the nearest hundred, which is where $21,700 comes from.
A leak is only worth naming if something in your exports gives it away. Here is what gives each one away, what the detector reads, and — for the four that ship today — the point at which it refuses to put a number on it.
Reads
leads · jobs
The arithmetic
slow leads / month × (fast booking rate − slow booking rate) × average completed-job value × completion rate
It declines when
Fewer than 30 leads in either the fast or the slow bucket, or the export carries dates without clock times — 90% of stamps at midnight means the file cannot answer this question, so it is not asked.
Example finding$21,700/moLeads waiting too long for follow-upExample · demo records · your figures come from your own exports
The five-minute rule, measured on your own leadsReads
quotes
The arithmetic
value sitting in stale quotes / month × the close rate you already achieve on quotes that did resolve
It declines when
Fewer than 20 aged quotes that reached a decision, so there is no close rate to price the pile against — or fewer than 5 stale ones, which is a forgotten job rather than a pattern.
Reads
jobs · leads
The arithmetic
(customers past their return window × late-return rate × average repeat-job value) ÷ typical return cycle in months
It declines when
Fewer than 20 repeat gaps observed in your history, because a percentile of a handful of gaps is arithmetic dressed as a measurement — or fewer than 10 customers currently overdue.
Reads
invoices
The arithmetic
overdue value / month × the share of long-settled invoices that were never collected at all
It declines when
Fewer than 20 invoices old enough to have settled — the never-collected rate is measured only past 120 days, because a recent unpaid invoice is late, not lost.
Reads
calls · leads
The arithmetic
No figure today. The pattern is real and the exports are already imported — the detector that prices it is not written, so Loupe says nothing rather than estimating.
Reads
ad exports · leads · jobs · invoices
The arithmetic
No figure today. The pattern is real and the exports are already imported — the detector that prices it is not written, so Loupe says nothing rather than estimating.
Reads
quotes · jobs
The arithmetic
No figure today. The pattern is real and the exports are already imported — the detector that prices it is not written, so Loupe says nothing rather than estimating.
Reads
jobs
The arithmetic
No figure today. The pattern is real and the exports are already imported — the detector that prices it is not written, so Loupe says nothing rather than estimating.
The four below the line are on the list, not in the product. They are printed anyway because a page that quietly implies eight working detectors is the same page that would quietly imply a number.
A projection is where every other tool stops. Once a fix ships, the same exports that found the leak measure what came back — against a starting number agreed in writing on day one, which never moves afterwards. Here is one leak, all the way through.
$21,700/mo at stake − $18,400/mo recovered = $3,300/mo still open · 85% of the projected opportunity, measured
$64,200 total, one-off
Money measured back, added up as it landed.
A running total counts what actually arrived each month, so it is not the monthly figure multiplied by anything — and it is never added to the $18,400/mo beside it. Those are two different units. Their sum would not mean anything, so this page does not have one.
Example · demo records · your figures come from your own exports
Questions
Only when it beats the retainer. Ten percent passes $3,000 once a month's measured money back passes $30,000 — below that, you simply pay the flat $3,000. The share is computed from the exports you send, against starting numbers we agree in writing on day one, and your month is never more than $9,000.
About an hour to start, then one monthly review call. We handle the setup and monitoring — you just decide which fixes to ship.
We only read the exports you upload and never touch your systems, encrypted throughout, isolated per client, deleted when you leave. Full detail on the Security page — including which platforms publish a read-only scope and which don't.
Loupe reads the records you already keep. It does not care what industry you are in — only that you take enquiries, send proposals, and have customers who come back.
Some get called back in minutes, some wait until tomorrow, and that is normal in a busy week. What is usually missing is a measure of which is which — and what the difference is worth.
You know roughly what went out. Harder to know at a glance is how many are still live, how many have quietly gone cold, and what that pile adds up to this month.
Nobody ever tells you they have stopped. They simply go quiet, and the gap tends to show up a year later — which is exactly the kind of thing a record can catch early.
These are the three leaks the free check estimates — and the three a paid diagnostic measures against your own records, to the dollar.
Free · about 30 seconds · no signup