System
Migration from Zoho
The object inventory for the move off Zoho. Every source application, every form inside it, its record count, and the module it lands in. Spreadsheets currently held outside Zoho are inventoried alongside it. Primavera P6 is retained as an integration rather than migrated.
Source systems
13
7 Creator apps, CRM, Books, People, Sign
Objects
66
11 superseded rather than migrated
Records
748k
709k mapped and loaded
Deluge script
35.5k
lines of Deluge in the source applications
Exceptions
7
98,000 records, 0 blockers
No dry run recorded yet
A dry run loads all 748,210 records into a parallel environment, recomputes every derived figure (contract sums, claim values, retention, project margin) and reconciles them against the source figure line by line. Anything that does not reconcile is listed as an exception with a proposed resolution. Nothing is written back to Zoho; the export credentials are read-only.
Supporting tools in use
20 third-party tools and manual steps currently sit alongside the Zoho applications to complete a workflow. Each is listed against the function it supports so it can be retired or re-pointed at cutover.
| Object | Source | Records | Fields | Lands in | Outcome |
|---|---|---|---|---|---|
| QClad Quoting Zoho Creator owned by Dylan Fraser · built 2021 · 4,180 lines of Deluge 49,540 records | |||||
| Tender_Register | QClad Quoting | 1,842 | 34 | Tenders | Mapped |
| Tender_Line_Item | QClad Quoting | 41,206 | 18 | Tender lines | Mapped |
| Rate_Schedule 46 live rates plus 566 superseded versions. Only live rates come across as rates; the rest become rate history. | QClad Quoting | 612 | 22 | Pricing schedule | Mapped |
| Rate_Buildup | QClad Quoting | 3,190 | 14 | Rate cost build-up | Mapped |
| Quote_PDF_Log A log of which PDFs got generated. The document is generated on demand here, so there is nothing to log. | QClad Quoting | 2,204 | 8 | - | Superseded |
| Client_Contact | QClad Quoting | 486 | 21 | Clients | Mapped |
| QClad Projects Zoho Creator owned by Marcus Deng · built 2021 · 7,940 lines of Deluge 102,396 records | |||||
| Project_Master | QClad Projects | 318 | 41 | Projects | Mapped |
| Project_SOR_Line | QClad Projects | 9,884 | 16 | Schedule of rates | Mapped |
| Variation_Register | QClad Projects | 2,106 | 27 | Variations | Mapped |
| Variation_Line | QClad Projects | 8,412 | 12 | Variation lines | Mapped |
| Site_Diary | QClad Projects | 14,820 | 19 | Site diaries | Mapped |
| Project_Photo 61,408 photos, 214 GB in Zoho WorkDrive. Migrated by reference in the first pass, then bulk-copied over a weekend. | QClad Projects | 61,408 | 7 | Diary attachments | Mapped, review |
| Programme_Milestone | QClad Projects | 4,260 | 11 | Project programme | Mapped |
| Cost_Report_Snapshot A monthly frozen copy of a spreadsheet cost report. Superseded by the live project position; loaded as read-only history. | QClad Projects | 1,188 | 24 | - | Superseded |
| QClad Claims & Variations Zoho Creator owned by Janelle Roe · built 2022 · 5,320 lines of Deluge 55,470 records | |||||
| Progress_Claim | QClad Claims & Variations | 2,884 | 32 | Progress claims | Mapped |
| Claim_Line | QClad Claims & Variations | 46,180 | 15 | Claim measures | Mapped |
| Payment_Schedule | QClad Claims & Variations | 2,640 | 18 | Certification | Mapped |
| Retention_Register Currently reconciled by hand against an Excel sheet each month. Here it is computed from certified claims. | QClad Claims & Variations | 318 | 12 | Retention | Mapped |
| Sub_Claim | QClad Claims & Variations | 3,402 | 21 | Subcontractor claims | Mapped |
| BIF_Notice | QClad Claims & Variations | 46 | 14 | Claim notices | Mapped |
| QClad Timesheets Zoho Creator owned by Rebecca Tunstall · built 2022 · 6,610 lines of Deluge 281,306 records | |||||
| Day_Card The single largest object. Four years of day cards at ~55 people a day. | QClad Timesheets | 214,806 | 17 | Timesheets | Mapped |
| Timesheet_Approval | QClad Timesheets | 46,240 | 9 | Approval trail | Mapped |
| Allowance | QClad Timesheets | 18,940 | 11 | Allowances | Mapped |
| Payroll_Export_Log The Monday Excel export. Replaced by a direct payroll extract from the same rows. | QClad Timesheets | 214 | 6 | - | Superseded |
| Crew_Roster | QClad Timesheets | 1,106 | 13 | Crews | Mapped |
| QClad HSEQ Zoho Creator owned by Sam Kirkwood · built 2023 · 5,880 lines of Deluge 156,594 records | |||||
| SWMS | QClad HSEQ | 604 | 28 | Health & safety | Mapped |
| SWMS_Signon | QClad HSEQ | 38,412 | 8 | SWMS sign-on | Mapped |
| Take5 Held in a separate Zoho Forms app because Creator's offline mode drops records where there is no signal. Loaded against the Take 5 register. | QClad HSEQ | 96,840 | 12 | Take 5s | Mapped |
| Incident | QClad HSEQ | 486 | 34 | Incidents | Mapped |
| Toolbox_Talk | QClad HSEQ | 3,218 | 10 | Toolbox talks | Mapped |
| Competency_Ticket Ticket expiry matrix.xlsx holds the same data and loads into this object; the two are maintained separately today. | QClad HSEQ | 1,842 | 15 | Tickets & competencies | Mapped |
| Site_Induction | QClad HSEQ | 4,106 | 12 | Inductions | Mapped |
| ITP | QClad HSEQ | 1,204 | 19 | ITPs & handover | Mapped |
| ITP_Item | QClad HSEQ | 9,882 | 14 | ITP hold points | Mapped |
| QClad Procurement Zoho Creator owned by Toby Ellison · built 2023 · 3,440 lines of Deluge 25,806 records | |||||
| Purchase_Order | QClad Procurement | 4,218 | 26 | Purchasing | Mapped |
| PO_Line | QClad Procurement | 16,940 | 13 | PO lines | Mapped |
| Goods_Receipt | QClad Procurement | 3,886 | 11 | Receipts | Mapped |
| Supplier | QClad Procurement | 214 | 19 | Suppliers | Mapped |
| Material_Master | QClad Procurement | 486 | 21 | Materials | Mapped |
| Subcontractor | QClad Procurement | 62 | 24 | Subcontractors | Mapped |
| QClad Document Control Zoho Creator owned by Grace Lindqvist · built 2024 · 2,120 lines of Deluge 11,442 records | |||||
| Transmittal | QClad Document Control | 2,640 | 17 | Document control | Mapped |
| Drawing_Register | QClad Document Control | 8,204 | 22 | Drawings | Mapped |
| Handover_Pack | QClad Document Control | 186 | 15 | Handover | Mapped |
| Warranty | QClad Document Control | 412 | 13 | Warranties | Mapped |
| Zoho CRM Zoho CRM owned by Nathan Carter · built 2020 18,382 records | |||||
| Accounts | Zoho CRM | 486 | 38 | Clients | Mapped |
| Contacts | Zoho CRM | 1,204 | 41 | Client contacts | Mapped |
| Deals Overlaps the Tender_Register in Creator: the same tender exists in both, keyed differently. Deduplicated on client and site during the load. | Zoho CRM | 1,886 | 32 | Tenders | Mapped |
| Activities | Zoho CRM | 14,806 | 18 | Client activity | Archive only |
| Zoho Books Zoho Books owned by Rebecca Tunstall · built 2020 14,380 records | |||||
| Invoices | Zoho Books | 3,106 | 29 | Invoicing | Mapped |
| Bills | Zoho Books | 6,842 | 26 | Supplier invoices | Mapped |
| Chart_of_Accounts The ledger stays where it is. QClad keep their accounting package; this system posts to it and reads the payment status back. | Zoho Books | 214 | 12 | - | Integration |
| Payments | Zoho Books | 4,218 | 14 | Payment status | Integration |
| Zoho People Zoho People owned by Rebecca Tunstall · built 2022 6,488 records | |||||
| Employee 58 current, 84 past employees. Past employees migrate for the timesheet history to stay whole. | Zoho People | 142 | 46 | People | Mapped |
| Leave | Zoho People | 6,204 | 12 | Leave | Mapped |
| Onboarding_Checklist | Zoho People | 142 | 18 | - | Archive only |
| Zoho Sign Zoho Sign owned by Sam Kirkwood · built 2023 9,842 records | |||||
| Signed_Documents Signature images and audit trails come across as attachments against the SWMS or subcontract they belong to. | Zoho Sign | 9,842 | 9 | Signed records | Mapped, review |
| Excel, the sheets not yet in the system Excel owned by Rebecca Tunstall 3,484 records Sheets maintained outside Zoho, mostly covering functions not yet built there. Each is a view of data that already exists in another object, so they are superseded rather than migrated. | |||||
| Project cost report (one per live job) Rebuilt from claims, timesheets and purchase orders. It is the live project page. | Excel, the sheets not yet in the system | 24 | 60 | Project position | Superseded |
| Retention register.xlsx | Excel, the sheets not yet in the system | 318 | 14 | Retention | Superseded |
| Ticket expiry matrix.xlsx | Excel, the sheets not yet in the system | 1,842 | 9 | Tickets & competencies | Superseded |
| Store stock count.xlsx | Excel, the sheets not yet in the system | 486 | 11 | Materials | Superseded |
| Plant & EWP hire tracker.xlsx | Excel, the sheets not yet in the system | 214 | 12 | Purchasing | Superseded |
| Tender register (estimating copy).xlsx | Excel, the sheets not yet in the system | 486 | 22 | Tenders | Superseded |
| Subcontractor insurance tracker.xlsx | Excel, the sheets not yet in the system | 62 | 15 | Subcontractors | Superseded |
| Weekly labour forecast.xlsx | Excel, the sheets not yet in the system | 52 | 18 | Timesheets | Superseded |
| Primavera P6 Primavera owned by Marcus Deng 13,080 records Retained as an integration rather than migrated: the head contractors programme in P6. Activity IDs are held against the project so a P6 update lands on the right job, and dates read in both directions. | |||||
| Activity (imported) | Primavera P6 | 4,260 | 16 | Project programme | Integration |
| Resource assignment | Primavera P6 | 8,820 | 12 | Programme resourcing | Integration |
Nothing matches that filter.
Spreadsheets held outside Zoho
Each of these is a view of data that already exists in another object, so they are marked Superseded rather than migrated. The target module that reproduces each one is listed against it.
- Project cost report (one per live job) → Project position
- Retention register.xlsx → Retention
- Ticket expiry matrix.xlsx → Tickets & competencies
- Store stock count.xlsx → Materials
- Plant & EWP hire tracker.xlsx → Purchasing
- Tender register (estimating copy).xlsx → Tenders
- Subcontractor insurance tracker.xlsx → Subcontractors
- Weekly labour forecast.xlsx → Timesheets
Primavera P6
Retained as an integration rather than migrated: the head contractors programme in P6. Activity IDs are held against the project so a P6 update lands on the right job, and dates read in both directions.
- Activity (imported) 4,260 Integration
- Resource assignment 8,820 Integration
Activity IDs are held against the project (QRSAUP is QRSAUP.RC.4400, Saraji is SAR.WSU.2200), so a P6 update lands on the right job and dates read in both directions.
Field by field, for the highest-volume objects
Fields marked derived are not imported: they are stored figures that the target computes instead. A contract sum becomes the sum of its lines, retention a calculation on certified claims, and GST 10% of the net.
| Zoho field | Type | QClad field | Type | Rule | |
|---|---|---|---|---|---|
| Project_Number | Single Line | → | code | text | Kept verbatim. QClad's own numbering is the key everywhere else. Clean |
| Project_Name | Single Line | → | name | text | Straight copy Clean |
| Client_Lookup | Lookup → Client_Contact | → | client | ref → Clients | Resolved to the deduplicated client, since the same head contractor exists in both Creator and CRM. Transform |
| Site_Address | Address | → | site + state | text + enum | Split; state parsed out of the address and validated against AU states. Transform |
| Contract_Value | Currency | → | - | derived | Not imported. The contract sum is the sum of the schedule-of-rates lines, so a typed total can never disagree with them again. Decision |
| Status | Dropdown (11 values) | → | status | enum (7 values) | Eleven Zoho values collapse to seven. 'Awaiting PO', 'PO received' and 'Pending start' all become Awarded. Transform |
| PM_Email | → | pm | ref → People | Matched to the person record by email; 4 historic PMs no longer employed resolve to their archived record. Transform | |
| Retention_Pct | Decimal | → | retention | decimal | Straight copy Clean |
| P6_Activity_ID | Single Line | → | p6 | text | Kept, this is the join to Primavera. Clean |
| Cost_Report_Link | URL → WorkDrive | → | - | - | Dropped. The link points at an external spreadsheet superseded by the project position page. Decision |
| Zoho field | Type | QClad field | Type | Rule | |
|---|---|---|---|---|---|
| Employee | Lookup → Employee | → | person | ref → People | Straight copy Clean |
| Date | Date | → | date | date (ISO) | Zoho stores dd-MMM-yyyy; parsed to ISO with the Brisbane offset. Transform |
| Project | Lookup → Project_Master | → | project | ref → Projects | Straight copy Clean |
| Task_Text | Multi Line | → | task | text | Free text today. Kept as written, and a rate code is inferred where the wording matches a schedule item, 84% match rate on the sample. Decision |
| Hours | Decimal | → | hours | decimal | Straight copy Clean |
| OT_Hours | Decimal | → | otHours | decimal | Straight copy Clean |
| Approved_Flag | Checkbox | → | status | enum | Checkbox plus the separate approval record become one status: Draft, Submitted, Approved or Queried. Transform |
| Cost_Rate_Snapshot | Currency | → | - | derived | Not imported. Cost is read off the person's rate at the date of the card, so a rate change no longer needs a back-fill script. Decision |
| Zoho field | Type | QClad field | Type | Rule | |
|---|---|---|---|---|---|
| Claim_Number | Auto Number | → | id | text | Kept verbatim, these appear on lodged statutory documents and cannot be renumbered. Clean |
| Project | Lookup | → | project | ref → Projects | Straight copy Clean |
| Claim_Period | Date | → | period | month | Straight copy Transform |
| Claimed_Amount | Currency | → | - | derived | A lodged claim's amount is frozen against the measure it was cut from, so the figure is reproducible rather than stored twice. Decision |
| Retention_Amount | Currency | → | - | derived | Computed at the contract's retention rate. This is the number the Excel retention register exists to double-check today. Decision |
| GST | Currency | → | - | derived | 10% of the net. Today it is recalculated by hand before the claim reaches Books. Decision |
| Status | Dropdown (8 values) | → | status | enum (6 values) | 'Submitted (awaiting schedule' and 'Submitted) overdue' become one status with the BIF clock computed from the lodgement date. Transform |
| Payment_Schedule_Date | Date | → | certifiedOn | date | Straight copy Clean |
| Books_Invoice_Ref | Single Line | → | invoice | ref → Invoices | Straight copy Clean |
| Zoho field | Type | QClad field | Type | Rule | |
|---|---|---|---|---|---|
| Submitted_By | Lookup → Employee | → | person | ref → People | Straight copy Clean |
| Submitted_On | DateTime | → | date | date | Straight copy Transform |
| Project | Single Line (typed) | → | project | ref → Projects | Typed free text in the Forms app. Matched to a project by name; 1,204 records (1.2%) need a human eye, they are listed as exceptions. Decision |
| Hazard_1..5 | 5 × Single Line | → | hazards[] | text[] | Five fixed columns collapse to a list, so a sixth hazard no longer needs a schema change. Transform |
| Control_1..5 | 5 × Single Line | → | controls[] | text[] | Straight copy Transform |
| Offline_Sync_Flag | Checkbox | → | - | - | Dropped. The flag marks records the source app failed to sync; the target captures and syncs offline natively. Decision |
What did not reconcile, and what we did about it
Records the dry run could not reconcile automatically, each with a proposed resolution. 98,000 records across 7 issues, none of them a blocker.
Project typed as free text on 1.2% of Take 5s
The Take 5 form lives in Zoho Forms rather than Creator, so the project is a typed string with no lookup. 95,636 of 96,840 match a project by name. The remaining 1,204 are things like "Saraji", "MTW workshop" and "Bris rail": readable by a person, ambiguous to a loader.
Resolution. Loaded against the project their author was rostered to on that date, with the original string kept. 41 remain genuinely ambiguous and are listed for Sam to resolve by hand.
The same tender exists in both CRM and Creator
Estimating raise tenders in Creator; the same opportunities are tracked as Deals in CRM. 642 pairs are the same tender under two different keys, and the values disagree on 88 of them because one was updated and the other was not.
Resolution. Deduplicated on client + site + close date. Where values disagree the Creator figure wins (it is the one the quote was issued from) and the CRM value is kept as a note on the record.
Task text does not resolve to a rate code on 16% of day cards
Day cards carry free text rather than a schedule-of-rates item, so hours cannot always be attributed to a rate. 180,515 of 214,806 match a rate by wording. The rest are things like "general", "site" and "cleanup".
Resolution. Loaded with the text intact and no rate code. From cutover the crew app offers the project's own schedule of rates, so this stops accumulating on day one.
Stored contract value disagrees with the sum of the schedule-of-rates lines
27 projects have a typed Contract_Value that does not equal the sum of their SOR lines: variance from -$18,400 to +$62,900. This is the drift that happens when a total is typed and lines are edited separately.
Resolution. The typed total is not imported. The contract sum becomes the sum of the lines, which is the figure the claims were actually cut against. All 27 are listed with their variance for Janelle to confirm.
214 GB of site photos in Zoho WorkDrive
Photos are referenced from the diary records but stored in WorkDrive. Pulling them at API rate limits takes roughly 31 hours.
Resolution. Migrated by reference in the dry run so nothing is blocked, then bulk-copied across the cutover weekend. No diary loses its attachments.
Ticket expiry dates disagree between Creator and the Excel matrix
214 tickets have a different expiry date in the spreadsheet than in Creator, because the spreadsheet is the one that actually gets maintained. Three of them are expiries inside the next 30 days.
Resolution. The later of the two dates is loaded and both are shown on the record, flagged for Sam. After cutover there is one place for this to live.
The ledger is not migrated
QClad's accounting package stays exactly where it is. This system posts invoices to it and reads payment status back, the same as today.
Resolution. Kept as an integration. No accounting data moves.
The cutover, eight steps
Zoho remains the system of record until the parallel run reconciles twice. Crews move across one at a time, and no data entry stops during the changeover.
Read-only export from Zoho
Done 2 daysA full export of every Creator app, CRM module and Books ledger through Zoho's own API: read-only credentials, nothing written back. This is the analysis on this page.
Build partner + Wes Nakamura
Object inventory and mapping sign-off
Done 1 weekEvery form on this page mapped to a target, reviewed by the person who owns it. Anything marked Superseded is confirmed dead by its owner before it is dropped.
QClad module owners
Dry-run load into a parallel environment
Ready 3 daysAll 748,000 records loaded into a copy of this system. Every derived figure (contract sums, claim values, retention, project margin) recomputed and reconciled against the Zoho figure line by line.
Build partner
Reconciliation review with QClad
Planned 1 weekThe directors, the business manager and contracts administration review the parallel environment against their own reporting. Anything that disagrees is explained or corrected before cutover proceeds.
QClad directors + build partner
Parallel run, one claim cycle
Planned 4 weeksOne full month claimed in both systems. Zoho stays the system of record until the numbers match twice.
Janelle Roe
Crew app rollout by crew
Planned 4 weeksOne crew at a time, a week apart, so the leading hand of the crew already on it can help the next. Zoho timesheets stay open until every crew is across.
Sam Kirkwood
Delta load and cutover weekend
Planned 1 weekendEverything created in Zoho since the dry run is re-loaded, the 214 GB of site photos are bulk-copied, and Zoho goes read-only on the Monday. No data entry stops.
Build partner + Wes Nakamura
Handover
Planned 1 dayThe source repository, the schema, the deployment and the build pipeline are transferred to QClad, with a walkthrough for Wes and the QClad developer.
Build partner → QClad