Read-only deep scan · Refreshed 2026-05-04 · Full pagination across all 42 zones
Read-only: every AroFlo call this session was a GET. No data modified.
Zones scanned
42 / 42
Active + 12mo total counts captured
Workflows identified
11
Mapped from status enums & cross-refs
Approved invoices (last 12 mo)
$11.75M
6,351 finalised invoices, 652 clients
Active users
38
19 Tradesman · 7 Mgmt · 7 Admin · 5 blank
§0Workflow activity at a glance
"Active" = records currently in flight under each workflow. "12-mo total" = records updated/created/dated within the last year, where applicable. Counts come from a paginated read-only scan against the live AroFlo tenant.
Last 12 months — almost certainly under-scoped (see permissions note)
† AroFlo's default API scope returns a heavily restricted subset for several zones — these "totals" are under-counts; lifetime numbers are likely much higher. The "active" filtered counts are accurate. ‡ The API service-account (sweeny.studios1) appears to have restricted permissions on Assets, Locations, Inventory, and DocumentsAndPhotos — counts here look implausibly low (CRAWA tracks 10,000+ assets per company materials; we see 101). Almost certainly a permissions config issue in AroFlo Site Administration. Worth fixing before these numbers are quoted to anyone. * "Active" for time/payroll isn't really a state — shown as 12-month total for context.
§1How CRAWA's data is actually structured
AroFlo is a hub-and-spoke job/asset management system. Three entities sit at the centre: Tasks (the operational unit), Clients (the relationship), and Invoices (the financial bridge to Xero).
graph TB
C[Client] --> L[Locations]
C --> CT[Contacts]
C --> A[Assets]
C --> Q[Quote]
Q --> T[Task central unit]
A --> T
T --> S[Schedule]
T --> TS[Timesheets]
T --> PO[Purchase Orders]
T --> I[Invoice]
PO --> B[Bill]
I --> P[Payment]
classDef central fill:#0e7a8b,color:#fff,stroke:#0e7a8b;
classDef money fill:#fff7e6,color:#80470b,stroke:#ecd2b0;
class T central
class I,P,B,PO money
W1Quote → Cash (project / quoted work)
flowchart LR
E([Estimator]) --> Q1[Quote created In Progress]
Q1 --> Q2[Sent to customer Pending Approval]
Q2 -- accept --> Q3[Approved]
Q2 -- reject --> Q4[Rejected]
Q3 --> T1[Linked Task Quote → Pending → Not Started]
T1 --> T2[Completed]
T2 --> I1[Invoice pending approval]
I1 --> I2[Invoice approved]
I2 --> I3[Processed linkprocessed=true]
I3 --> Pay[Payment received linked to invoiceid]
classDef state fill:#e6f3f5,color:#0e7a8b,stroke:#0e7a8b;
classDef terminal fill:#fce8e8,color:#9c1c1c,stroke:#e0a3a3;
class Q1,Q2,Q3,T1,T2,I1,I2,I3,Pay state
class Q4 terminal
Observed in data
Quote status distribution (n=99): Pending Approval 43, Approved 30, In Progress 20, Rejected 6
Every Quote has a linked Task via quote.task.taskid — a quote = a task
Every Quote captures quote.estimator.userid — basis for sales attribution
All Quotes seen are type=Simple — no multi-stage quotes used
Automation hooks
HookStuck-quote nudge — Pending Approval > 7 days → branded reminder via Outlook
HookPre-flight on approval — Approved → reserve schedule slot, draft parts list, prep job pack
HookPer-estimator conversion — Sales scorecard from quote-accepted ÷ quote-generated
W2Service dispatch (breakdown / ad-hoc)
The dominant workflow — ~80% of CRAWA's task volume is service work without a quote.
flowchart LR
Call([Customer call/email]) --> T1[Task created Not Started]
T1 --> Sch[Schedule entry scheduledto=tech]
Sch --> Field[Tech on site]
Field --> TS[Timesheets type=Productive]
Field --> Mat[TaskMaterials]
Field --> Doc[Photos / signature]
Field --> CF[CustomFields gas log etc.]
TS --> Comp[Task Completed]
Mat --> Comp
Doc --> Comp
CF --> Comp
Comp --> Inv[Invoice see W7]
classDef state fill:#e6f3f5,color:#0e7a8b,stroke:#0e7a8b;
class T1,Sch,Field,TS,Mat,Doc,CF,Comp,Inv state
Observed in data
Task status distribution (n=500): Archived 475 · Not Started 16 · Completed 5 · Quote 2 · Pending 2
Task type mix: Refrigeration-Service 223 · Air Con-General 177 · Maintenance 79 · Installation 21
440/500 tasks have a tasklocation (88% — geographic data is consistent)
112/500 tasks have an assetid (~22%) — asset linkage is not universal
498/500 tasks have a client (essentially universal)
Automation hooks
Hook"Tech en route" SMS — Schedule confirmed → automatic ETA window to customer
HookService report PDF — Task Completed → assemble notes/photos/gas log → email to customer
HookStale-task escalation — Breakdown priority sitting Not Started > X hours
Long-lived; spans years. CRAWA tracks 10k+ assets across WA.
flowchart LR
Inst[Asset installed/ commissioned] --> Reg[Registered asset.client + category]
Reg --> Hist[Service history accumulates]
Hist --> BrkD[Breakdown Tasks + parts + gas log]
Hist --> PM[Maintenance Tasks scheduled PM]
Hist --> Up[Installation/upgrade Tasks]
BrkD --> Hist
PM --> Hist
Up --> Hist
Hist --> EoL[End-of-life archived=true]
Observed in data
Only 101 assets visible to the API user — vs CRAWA's stated 10,000+. Almost certainly a service-account permissions restriction (see §4); not a real data gap.
Of the 101 visible: 3 archived · 66 linked to a client · 88 categorised
AssetCategories tree: 101 categories, 92 with a parent (deep hierarchy available)
Automation hooks
HookPredictive replacement — Assets with N+ breakdowns in 12mo → upsell flag in dashboard
HookARCtick logbook — Aggregate refrigerant gas movements per asset per year
HookPM gap detection — Assets without a Maintenance task in N months → upsell candidates
HookWarranty alerts — Capture install/warranty dates as CustomField; alert before expiry
W4Job-driven procurement (PO → Bill → Payment)
flowchart LR
Need[Tech identifies need on a Task] --> POc[PO created in progress]
POc --> POp[Pending Approval]
POp --> POa[Approved]
POa --> Send[Sent to supplier]
Send --> Bill1[Bill received links back to POid]
Bill1 --> Bill2[Bill approved]
Bill2 --> Bill3[Processed → Xero]
Observed in data
PO status distribution (n=170): processed 101 · in progress 50 · pending approval 18 · approved 1
Every Bill (181/181) links back to a PurchaseOrder — POs and Bills are 1:1 in CRAWA
All visible Suppliers are suppliertype=wholesaler (default scope showed 3 — likely a filter quirk)
Automation hooks
HookAuto-draft PO from a Task's parts list (Inventory + TaskMaterials + preferred supplier)
HookThree-way match — PO line ↔ delivered (packing slip photo) ↔ Bill line
HookStale-PO cleanup — In-progress > N days → cleanup queue
in progress → pending approval → approved → processed
Bill
approved → processed
Payment
(always linkprocessed=true when visible)
The accounting bridge: linkprocessed
On Invoices, Bills, and Payments, the linkprocessed boolean +
linkprocesseddate flag whether the record has been synced to Xero/MYOB.
Any agent automation must respect this — once linkprocessed=true, the source of truth shifts to Xero; corrections happen there, not in AroFlo.
CustomFields are the extension surface
Available on Tasks, Quotes, Clients, Suppliers, Locations, Users, Assets. Almost certainly where CRAWA-specific metadata lives:
Refrigerant log fields on Tasks (gas type, kg added, kg recovered, leak found)
Client metadata (account manager, payment behaviour, special terms)
User metadata (skills, ARCtick licence number / expiry)
Not visible in the API listing — must pull samples from each parent zone with join=customfields to map what's actually populated.
Rate limiting
AroFlo enforces per-second rate limiting (we hit Exceeded Per Second Rate Limit on bulk fetches mid-scan). The agent must implement a token bucket; ~5 req/s is a safe starting point with exponential backoff on 429-equivalents.
§4Data quality observations & gaps
Top finding: The API service-account user sweeny.studios1 appears to have restricted permissions on Assets, Locations, Inventory and DocumentsAndPhotos. Counts returned (101 assets, 44 locations, 1 inventory item, 1 document) are inconsistent with CRAWA's actual scale (10,000+ assets per company materials; ~5,651 active clients each typically having multiple locations). Fix in AroFlo Site Administration → Users → sweeny.studios1 → Permissions before relying on these zones.
Confirmed via the scan
Item
Finding
Status
API user permissions on Assets / Locations / Inventory / Docs
Restricted — needs to be widened
action
AroFlo's "no-where-clause" default scope
Returns a tiny restricted subset on many zones (incl. Users, Contacts, Clients, Suppliers, POs); always supply explicit filters. Affects: users, contacts, clients, suppliers, quotes, purchaseorders