PuroClean Kelowna · every automated process and what it is telling us · 2026-08-25
135 days
is how long it takes PuroClean Kelowna to get paid.
Industry norm for a restoration contractor is 45–60 days. Every extra day holds about $8,633 of our own money.
135
days to get paid (DSO)
industry 45-60
$1,166,503
owed to us right now
101 jobs
$390,722
over 90 days old
33 jobs
$3,150,915
invoiced last 12 months
421 invoices
The tail is the problem, not the average. Half of all invoices are paid within 31 days. But the mean is 70.1 and the slowest tenth take 159 days or more. 90 of 421 invoices took over 90 days. Collections are not broadly broken — a set of stuck invoices that nobody owns is dragging everything else.
Where the money is sitting
Age measured from the invoice date. Amber and red are past 90 days — the point where a carrier receivable starts becoming an argument instead of a payment.
0-30
$175,55915 jobs
31-60
$66,82411 jobs
61-90
$120,2987 jobs
91-180
$122,0958 jobs
181-365
$230,3108 jobs
365+
$38,31717 jobs
Finished work we have not billed
$113,416
unbilled and still owed
10 jobs · real cash
$326,900
paid, but no invoice date recorded
69 jobs · a record gap, not money
These two are deliberately not added together. The second group has already been paid in full — only the invoice date field is blank. Adding them gives $440,316 of apparently unbilled work, of which 74% is not cash at all. It is shown anyway, because it is evidence of the real problem: 88 jobs that received money carry no invoice date, so the record cannot answer basic questions about its own timing.
Unbilled and owed — every one
Job
Customer
PM
Finished
Days
Owed
K26-1901-WM
Definity / Economical / Family Ins
Emily Mulder
2026-05-04
112
$44,317
K26-1961-WM
Definity / Economical / Family Ins
Emily Mulder
2026-06-18
67
$18,187
K26-2003-WM
SeaFirst Insurance
Emily Mulder
2026-07-17
38
$16,686
K26-2022-WM
Definity / Economical / Family Ins
Emily Mulder
2026-07-08
47
$8,170
K26-2076-CATWM
Allstate Insurance - Alberta Regio
Kyle Brandon
2026-07-30
26
$8,106
K26-1991-WM
Devon Properties - Starlight
Bob (Robert) Brown
2026-07-31
25
$7,269
K25-1428-CNT
Definity / Economical / Family Ins
Emily Mulder
2025-12-11
256
$5,677
K26-2028-CATWM
Allstate Insurance - Alberta Regio
Kyle Brandon
2026-06-23
63
$3,521
K26-2046-CATWM
Definity / Economical / Family Ins
Kyle Brandon
2026-08-05
20
$1,333
K26-2091-WM
Definity / Economical / Family Ins
Emily Mulder
2026-06-30
55
$150
Biggest unpaid invoices
Job
Customer
PM
Invoiced
Days
Owed
K25-1412-WNTY
TD Insurance
Andrew Chapman
2025-12-05
263
$85,117
K25-1635-FM
Definity / Economical / Family Ins
Emily Mulder
2026-02-04
201
$50,551
K26-0004-FM-
BCAA
Andrew Chapman
2026-02-28
178
$50,517
K26-1779-WR
HUB International Insurance Broker
Kyle Brandon
2026-04-29
117
$50,000
K25-1777-FM
Definity / Economical / Family Ins
Kyle Brandon
2026-01-31
206
$42,901
P26-2118-WM
Definity / Economical / Family Ins
Bob (Robert) Brown
2026-08-05
20
$41,597
K26-0004-CNT
BCAA
Andrew Chapman
2026-05-31
85
$39,337
K26-1911-FM
Optimum West Insurance
Andrew Chapman
2026-05-31
86
$27,926
K26-2068-CATWM
Allstate Insurance - Alberta Regio
Kyle Brandon
2026-07-31
24
$22,897
K26-1813-WR
Intact Insurance Company
Kyle Brandon
2026-06-25
61
$22,075
Who owes it
Definity / Economical / Family Insurance alone accounts for $413,094 of everything outstanding. One carrier relationship is 35% of the problem.
Carrier / customer
Jobs
Owed
Definity / Economical / Family Insurance
25
$413,094
Allstate Insurance - Alberta Regional Office
10
$109,804
TD Insurance
3
$98,268
BCAA
3
$97,971
Westland Insurance
16
$65,068
HUB International Insurance Brokers
2
$53,464
Intact Insurance Company
4
$44,197
CHUBB Insurance
2
$41,725
Strong Pilates
1
$40,890
Coast Claims
1
$38,176
65
adjusters waiting on us
oldest 60 days
65
need a written answer
only 0 could be templated
240
inspected, no estimate
median 39.0 days waiting
127
of those over 30 days
nothing bills until the estimate exists
Read the coverage table before you believe the response times below. These medians are computed only over jobs where both dates were actually stamped in PSA. For the estimate milestone that is under a third of open jobs. The honest reading is not “we respond slowly” — it is we cannot prove how fast we respond, and the record thins out precisely where the money is.
Recorded response times
Jobs with a loss date in the last 12 months (n = 829).
Interval
Median
Slowest 10%
Target
Hit rate
Jobs measured
Loss to Contacted
90 h
677 h
1 h
12%
670
Loss to Inspected
107 h
677 h
24 h
21%
566
Inspected to Estimate complete
380 h
1,464 h
72 h
24%
217
Loss to Estimate complete
566 h
1,786 h
96 h
14%
229
How much of the clock we actually record
Of 548 open jobs, how many carry each date. This is the foundation everything above rests on — and it collapses exactly at the estimate.
Loss
93%507 of 548
Contacted
88%481 of 548
Inspected
74%407 of 548
Estimate complete
32%174 of 548
Completed
30%162 of 548
Invoiced
26%145 of 548
Approved
19%105 of 548
The reply queue
Claims where the newest note in XactAnalysis came from outside PuroClean and nobody here has answered. Found and classified automatically every night by the Edmonton pipeline — xa-replies-2026-08-25.json.
6
days waiting, median
24
days, slowest 10%
60
days, the oldest
65
need a person
not automatable
15
automated processes
running unattended
2
need attention today
1
unaccounted items
scheduled tasks nothing watches
10
rows at weak confidence
of 15 — self-reported
Something is running that nothing is watching.
unregistered scheduled task 'PuroClean Edmonton Night Run Page' (Ready) -- no process row checks it
Why the page admits its own weak spots. Ten of these rows grade their own evidence as weak. That is the system telling you it can prove a step ran but not that its output was delivered. A monitoring page that only ever showed green would be worth nothing — this one is built so that the absence of evidence is never reported as health.
Intake
no coverage
Nothing automated here yet. This gap is deliberate and visible — it is what the roadmap is for.
Estimating
no coverage
Nothing automated here yet. This gap is deliberate and visible — it is what the roadmap is for.
Documentation
1 process
Kelowna notes coverage weekly draftNOT DUE
Not scheduled today
notes.morningweak
Compliance
6 processes
Edmonton nightly compliance chainDEGRADED
Partial hold 18 days old (over 14): XactAnalysis date writes are HELD -- the interface cannot back-date a milestone.
edmonton.nightlyweak
Edmonton pipeline watchdogPENDING
Due at 20:45
edmonton.watchdogweak
Edmonton claims board (published)PENDING
Due at 20:30
edmonton.boardweak
Edmonton morning chain (export, notes, digests)OK
All checks passed [partial hold: HOLD-AUTOSEND-andrew.txt (4d)]
edmonton.morningstrong
Edmonton PSA/XactAnalysis reconcilePENDING
Due at 19:00
edmonton.reconcileweak
Edmonton retention reviewNOT DUE
Not scheduled today
edmonton.retentionweak
Sales
no coverage
Nothing automated here yet. This gap is deliberate and visible — it is what the roadmap is for.
Marketing
1 process
Marketing post generatorDORMANT
Dormant - not scheduled
marketing.postweak
Finance
3 processes
PM commission dashboardOK
All checks passed
pm.dashboardweak
PM dashboard health checkDEGRADED
peer check says: [2026-08-25T05:40:04] UNHEALTHY - The scheduled task 'PuroClean Edmonton XactAnalysis Automation' last exited 1 (0x1) at 2026-08-24 19:00 -- the 19:00 PSA export reported a failure. Check Edmonton's Reports\xactanalysis\last-export.log.
pm.healthcheckweak
Accounts Receivable dashboardSUPERSEDED
Superseded - see reason
ar.dashboardweak
Equipment
1 process
SupplyTrack consumables and sign-outDORMANT
Dormant - not scheduled
tracking.supplytrackweak
People
no coverage
Nothing automated here yet. This gap is deliberate and visible — it is what the roadmap is for.
Intelligence
3 processes
Edmonton master listHELD
Iterating on the not-ours / PM-view change -- Jonathan, 2026-08-24. Do not publish yet.
edmonton.masterlistweak
PM operations overviewOK
All checks passed
pm2.overviewweak
Control Tower self-checkOK
All checks passed [partial hold: HOLD-ALERTS.txt (11d)]
controltower.selfstrong
The roadmap was not invented for this meeting. The Control Tower has tracked ten departments since the day it was built, and it has always rendered an empty one as a visible coverage gap rather than as nothing. 4 are still empty: Intake, Estimating, Sales, People. Filling them, cash first, is the plan.
135
days to get paid now
target 75
4
departments with no automation
15
processes already automated
built and running
12
weeks to all four stages
Stage 1Get the cash inWeeks 1-4
Fills the Finance department
DSO is 135 days. $1,166,503 is outstanding and $390,722 of it is over 90 days old.
Reconnect the QuickBooks aging feed -- the collections cockpit already exists, it lost its data source on 2026-06-25
Reconcile PSA against QuickBooks so we stop having two answers to 'what are we owed'
Daily chase list, ranked by amount x age, to a named owner -- not a shared inbox
Release the 10 finished-but-unbilled jobs worth $113,416
Target: DSO 135 -> 75 days~$517,980 of working capital
Stage 2Answer the adjustersWeeks 3-6
Fills the Documentation department
65 claims where an adjuster asked us something and nobody has replied. The oldest has been waiting 60 days.
Extend the Edmonton reply engine to Kelowna -- it already finds who is waiting, quotes what they asked, and drafts an answer
An SLA clock per claim, escalating when a reply passes 3 days
Posting stays manual on purpose: on the first run 12 of 13 auto-proposals would have answered a real question wrongly
Target: Zero adjusters waiting over 3 daysFaster approvals, fewer stalled files
Stage 3Close the estimate gapWeeks 5-8
Fills the Estimating department
240 jobs have been inspected with no estimate written. Median 39 days since inspection. Nothing bills until the estimate exists.
An estimate-due clock from the inspection date, with a daily chase list per PM
Automatic date capture, so the record stops depending on somebody remembering
Surface the jobs where the estimate is the only thing between us and an invoice
$331,315 of cost overrun on the 39% of jobs where cost is even recorded. Realized margin is 38.8% against a 45% target.
Purchase orders issued and approved before a subtrade starts work
Match every subcontractor invoice against its PO before it is paid
Cost recorded on every job, so margin stops being a guess on 61% of the book
Target: Margin 38.8% -> 45%~$180K/yr on current volume
What this does to the work
Not fewer people — the same people pointed at work that actually needs a person. Every hour below is currently spent copying a number from one system into another.
Today, by hand
After
Chasing which invoices are overdue across PSA and QuickBooks
A ranked daily list arrives with an owner against each line
Reading 64 adjuster notes to find who is waiting
The queue is built overnight, sorted by how long they have waited
Remembering to stamp dates in PSA
Dates are written from the source system automatically
Finding out a subtrade overran after the invoice arrives