↓ Download PDF

AroFlo Workflow Map — CRAWA

Read-only deep scan · Refreshed 2026-05-04 · Full pagination across all 42 zones
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.

#WorkflowActive12-mo total"Active" definition
W1Quote → Cash 25100 Quotes in In Progress or Pending Approval
W2Service dispatch 1,33815,218 Tasks in Not Started / Pending / Quote
W3Asset lifecycle 101101 Assets where archived = false
W4Procurement 2,283 POs · 56 bills170 POs · 181 bills POs not yet processed · Bills approved not processed
W5Scheduling / resourcing 2,24616,687 Schedules with startdate ≥ today
W6Time, payroll & costing 13,291*13,291 Timesheet entries in last 12 months
W7Financial sync (Xero/MYOB) 347 invoices6,375 invoices · 631 payments Invoices with linkprocessed = false (still in AroFlo)
W8Customer onboarding 5,651 clients · 6,925 contacts · 487 suppliers · 44 locations Where archived = false
W9Internal admin 38 users · 4 BUs · 10 perm groups · 6 tracking centres · 12 transaction terms · 8 priorities · 13 task types Lookup tables & staff records
W10Inventory & van stock 133 stock levels · 248 categories · 42 assemblies · 1 item Currently visible to API user
W11Documents & photos 11 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

Automation hooks

HookStuck-quote nudge — Pending Approval > 7 days → branded reminder via Outlook
HookRejection capture — Rejected → require reason in CustomField, feeds estimator scorecard
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

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
HookData hygiene — Tasks completed without photos / signature / notes → tech-level scorecard

W3Asset lifecycle (HVAC / refrigeration equipment)

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

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

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
HookPrice drift — Same SKU bills increasing >X% YoY → review

W5Scheduling / resourcing

Connects Tasks to Users at a date/time. 500/500 schedule entries audit who created them; 476/500 have an assignee.

Automation hooks

Hook"Who's free in 4hrs?" — emergency dispatch lookup
HookSchedule adherence — Schedule.start vs first productive Timesheet entry per user/day
HookSmart routing — by skill (User CustomField) + proximity (Task GPS) + workload

W6Time, payroll & costing

Single source for all hours. Each entry carries both chargerate (customer) AND costrate (internal) — gross-margin signal is per entry, in real time.

Observed in data

Automation hooks

HookReal-time GP per task — no need to wait for invoice
HookTech utilisation dashboard — already built in staff_productivity_score.py
HookAnomaly detection — >12h day, weekend without OT worktype, etc.

W7Financial sync to Xero/MYOB

linkprocessed + linkprocesseddate are the bridge. Same pattern on Invoices, Bills, and Payments.

flowchart LR IA[Invoice approved] --> SX[Synced to Xero/MYOB] SX --> IP[Invoice processed
linkprocessed=true] IP --> Cust([Customer pays]) Cust --> XR[Recorded in Xero] XR --> PA[Payment syncs back
linkedto invoiceid]

Observed in data

Automation hooks

HookAR ageing — invoices processed but no Payment after N days
HookSync stalls — invoices approved > 24h but linkprocessed=false → ops queue
HookDSO per client — invoice date → payment date

W8Customer onboarding & relationship

Static / slowly-changing data attached to each Client.

Automation hooks

HookCustomer portal lite — Manager-access contacts get magic-link emails for status
HookRisk profile — Aggregate Priorities (SLA), on-time rate, AR behaviour
HookTerritory analytics — geographic clustering for routing

W9Internal admin

EntityCountNotes
Users38 active / 82 archivedAll accesstype=Use Permission Groups
BusinessUnits4 (2 active)Likely North/South + 2 cost segments
PermissionGroups10All active
UserPosition4Tradesman / Management / Admin / blank
TrackingCentres6Revenue/cost allocation buckets
TransactionTerms12Net 7, Net 14, Net 30 etc.
Priorities8SLA: days / hours / weeks / none

W10Inventory & van stock

Two-tier stock model — per-tech van stock and per-org warehouse stock.

Automation hooks

HookWorkshop QR system writes to InventoryStockLevels per-bin/per-tech
HookAuto-reorder — Van min/max + scheduled jobs this week
HookAssembly suggestions when quoting common job types

W11Documents & photos (cross-cutting)

Attaches to: Tasks, Quotes, Clients, Suppliers, Assets, Users, WorkOrders, PurchaseOrders. Captured by user, with category.

HookCompliance evidence — Photos per ARCtick gas job
HookService reports — Auto-assemble notes + photos + gas log → branded PDF
HookTender / RFQ assets — Past similar-job galleries by tasktype

§3Cross-cutting concerns

Lifecycle vocabulary

EntityStates
QuoteIn ProgressPending ApprovalApproved / Rejected
TaskQuotePendingNot StartedCompletedArchived
Invoicepending approvalapprovedprocessed (linkprocessed=true)
PurchaseOrderin progresspending approvalapprovedprocessed
Billapprovedprocessed
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:

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

Confirmed via the scan

ItemFindingStatus
API user permissions on Assets / Locations / Inventory / DocsRestricted — needs to be widenedaction
AroFlo's "no-where-clause" default scopeReturns a tiny restricted subset on many zones (incl. Users, Contacts, Clients, Suppliers, POs); always supply explicit filters. Affects: users, contacts, clients, suppliers, quotes, purchaseordersknown
WorkOrders / Projects / Stages / MessageBoard / MessageTemplates / SubstatusAll return 0 even with broad filters — most likely genuinely unused features at CRAWAconfirm
ClientNotes / TaskMaterials / TaskLabours / TaskExpenses / BillLineItems / WorkOrderLineItemsChild zones — best queried with parent ID context (Quotes & Tasks "join=" approach)known
Rate limit (status=6 "Exceeded Per Second")Confirmed — ~3 req/s safe with backoff. Agent must token-bucketknown

Confirmed data hygiene issues

Things AroFlo does NOT track

§5Implications for the agent build

Dashboard data is unblocked

Highest-leverage automations now feasible

#AutomationWhy now
1Quote follow-up engine43% of open quotes sit in Pending Approval
2Service-report PDF auto-generationTask → branded PDF → customer in minutes
3AR / DSO dashboardInvoice + Payment shape is clean
4Workshop QR via van-stockInventoryStockLevels per-tech already tracked
5ARCtick refrigerant logOnce Task CustomFields mapped (open Q1)

Constraints to design around

§6What we still need to confirm

#QuestionHow to answer
1What CustomFields exist on Tasks (especially refrigerant)?Pull 50 sampled tasks with join=customfields
2What CustomFields on Assets?Same approach on Assets
3Real Supplier count and structure?Try alternate where-clauses
4Inventory item shape?Try where=lastupdateutc>...
5Are WorkOrders genuinely unused?Confirm with you
6What does TrackingCentres map to internally?Pull all 6 + sample invoices grouped by it
7Substatus vocabulary per task type?Tasks with join=substatus over recent window

All answerable in a follow-up read-only pass.