Constructelligence
Guide · data

Construction data migration: move job cost history without losing a dollar

A contractor changing accounting systems, adding a project-management platform, or consolidating companies is moving the same thing: jobs, cost codes, vendors and years of posted cost. The move is judged by one test — after cutover, do the new system's numbers tie to the old system's, job by job? This guide covers what to move, how to map it, when to cut over, and the tie-outs that answer that test.

Updated · 13 minute read

Key takeaways
  • Clean and map the masters (jobs, cost codes, vendors) before anything that references them.
  • Open jobs move with full detail; older history can be summarized, as a written decision.
  • Cut over at a frozen month-end and tie out before anyone posts.
  • Tie out per job, not just in total — matching totals can hide cost moved between jobs.

What actually moves

Construction data falls into three kinds, and each moves differently:

KindExamplesHow it moves
MastersJobs, cost codes, cost categories, vendors, customers, employeesCleaned and mapped first. Everything else points at them.
Open itemsOpen AP and AR invoices, retainage held and owed, open commitments, unbilled workMoved in full, at cutover, so they can be paid, billed and closed in the new system.
HistoryPosted job cost, paid invoices, payroll, closed jobsMoved as detail, as summaries, or left readable in the old system — a decision, not a default.

Most migration trouble is a master problem showing up later: a cost code that mapped to two places, a vendor entered three times, a job number that changed format. Clean the masters before anything that references them moves.

A migration plan, week by week

Most of the work happens before cutover. A plan that leaves room for two trial loads looks like this, counted back from the cutover month-end:

WhenWorkDone when
8 weeks beforeInventory every master and open-item list; decide the history cutA written list of what moves, as detail or summary
7–6 weeksClean masters: merge duplicate vendors, close dead jobs, retire unused cost codesMasters frozen for mapping
6–5 weeksBuild and approve the crosswalks (cost codes, categories, GL accounts, job numbers)Every old value has a new value or a written rule
4 weeksTrial load #1 into a test company; run every tie-outDifferences listed and each one explained or fixed
2 weeksTrial load #2 with the fixes; train the people who will postTie-outs clean on the trial
CutoverClose, freeze, final load, tie-out, open for postingSigned tie-out pack
1 month afterFirst close in the new system, in parallel if possibleBoth systems agree on the month

The trial loads are the part teams are tempted to skip, and they are the part that finds the crosswalk mistakes while there is still time to fix them without a deadline.

Inventory−8 wk Clean masters−7 wk Crosswalks−6 wk Trial load 1−4 wk · tie-out Trial load 2−2 wk · tie-out Cutovermonth-end Parallelclose +1 mo fix before the deadline
Two trial loads, each with a full tie-out, find crosswalk mistakes while there is still time to fix them.

How much history to bring

History is what forecasts, estimate feedback and warranty questions run on, so dropping it has a cost — but so does moving ten years of detail through a crosswalk. A workable split:

Whatever the cut, write it down with the date. "Detail from 2019 on, summaries before" is a sentence an auditor or a new controller can work with; "some history" is not.

Mapping: the crosswalk is the migration

Every master gets a crosswalk: old value, new value, and who approved it. The cost code crosswalk matters most, because it decides whether cost lands where estimates and forecasts expect it:

Old codeOld descriptionNew codeNew cost typeNote
09-250Drywall labor09 21 16LaborOne-to-one
09-251Drywall material09 21 16MaterialTwo old codes → one code, split by cost type
01-900Misc——Review: re-code open-job cost by hand, summarize closed

Rules that keep the crosswalk honest:

The cost codes guide covers how to structure the new code list itself.

Cutover: pick a month-end and freeze

Cut over at a month-end close, never mid-period. The sequence that keeps both systems reconcilable:

  1. Close the period in the old system — payroll posted, AP entered, billing out, WIP adjustments booked.
  2. Freeze it. No new postings to the closed period. Anything late goes into the new system's first period.
  3. Extract masters, open items and history from the frozen period, run them through the crosswalks, and load.
  4. Tie out (next section) before anyone posts to the new system.
  5. Run one close in parallel if you can afford it: post the first new month in both systems and compare. The second system catches mapping mistakes that tie-outs on history can't, because they only show up in new postings.

The tie-outs that prove nothing was lost

Every tie-out compares one total in the old system with the same total in the new one, at the cutover date. A difference is either explained (a documented mapping or summarization) or it is an error. Run them in this order, broadest first:

Tie-outOld systemNew systemMust match
Trial balanceEvery GL account balanceSame accounts after the chart-of-accounts mapTo the cent, per account
Job cost by jobCost to date per jobCost to date per jobPer job
Job cost by cost typePer job × labor/material/sub/equipment/otherSamePer job and type
AP and AR agingOpen balance by vendor / customer and age bucketSamePer vendor / customer
RetainageHeld from subs, held by ownersSamePer job
CommitmentsCommitted and remaining per subcontract / POSamePer commitment

A worked tie-out for one job, J-1104:

Old system cost to date$1,230,418.72
New system cost to date$1,229,968.72
Difference$450.00
Explained: two misc-code lines ($450.00) held for re-coding$450.00
Unexplained$0.00

Only the unexplained column matters, and its tolerance is zero at the job level. Totals that tie at the company level while individual jobs differ mean cost moved between jobs — the worst kind of error, because every job's forecast and WIP line is now wrong while the trial balance looks perfect.

CalculatorTie-out variance
1. Trial balanceevery GL account, to the cent2. Job cost by jobcost to date per job3. Job cost by cost typeper job × L / M / S / E / O4. AP and AR agingopen balance by vendor / customerBroadest first: a trial balance that ties out rules out most errors before the detail is checked.
Old total against new total at the cutover date. Every difference is either documented mapping or an error.

Migrating off Sage 300 CRE or QuickBooks

The two systems contractors most often leave have their own shapes, and each one decides part of the crosswalk:

Common data migration mistakes

When two systems stay live: ERP and project management

Not every migration retires a system. A contractor adding Procore or Autodesk Construction Cloud next to the ERP keeps both, and the job is keeping them agreeing rather than moving data once:

Constructelligence reads both sides without writing to either: Sage job cost from the reporting database, and projects, commitments, change orders, RFIs and submittals from Procore or ACC, matched to jobs by number. The reporting database setup guide covers the SQL side.

Checklist
Cost code crosswalk in Excel, filled in with example rows — columns: Old code, Old description, New code, New cost type, Rule / note, Approved by
The cost code crosswalk as it opens in Excel: example rows in italics, calculated columns shaded.
Free template · Cost code crosswalk (Excel & CSV)An Excel workbook with drop-downs, validation and formulas built in — or the same columns as a CSV for Google Sheets and Numbers.
Download Excel (.xlsx)
What this template captures

Each old cost code mapped to its new code and cost type, with the rule and who approved it.

6 columns: 6 you fill in. In the Excel version, the header row stays frozen with filters on it, and the workbook opens on an Instructions sheet that lists every column below.

Every column, and how it is captured
ColumnTypeWhat goes in it
Old codeTextFree text.
Old descriptionTextFree text.
New codeTextFree text.
New cost typeTextFree text.
Rule / noteTextFree text.
Approved byTextFree text.

See it on real-looking numbers

Constructelligence is a construction intelligence platform: it reads your ERP, project and field systems read-only and does this arithmetic every week, for every job. The demo runs it on a sample eight-job portfolio.

Try the demoJoin the private beta

Frequently asked questions

How long does a construction ERP migration take?

It depends mostly on master-data cleanup and how much history moves, not on the load itself. Plan the cutover for a month-end, allow at least one full close to run in parallel if you can, and schedule the tie-outs before anyone posts to the new system.

Should I migrate all historical job cost data?

Move full detail for open jobs and for closed jobs inside your warranty and forecasting look-back, summaries by job and cost code for older jobs, and keep a read-only copy of the old system. Moving everything as detail is rarely worth the crosswalk effort for jobs nobody will query.

What is a cost code crosswalk?

A table mapping every old cost code to its new code and cost type, with a note for each code that splits, merges or needs review. It decides where historical cost lands, so estimate-versus-actual and forecasts keep meaning the same thing after cutover.

How do you verify a data migration?

Tie out totals between the old and new systems at the cutover date: the trial balance by account, job cost by job and by cost type, AP and AR aging, retainage and commitments. Every difference must be explained by a documented mapping; unexplained differences are errors, even if company totals match.

Why cut over at month-end?

A closed, frozen period gives both systems the same starting point. Cutting over mid-period splits a month's postings across two systems, and neither one can then produce a clean month-end or WIP schedule for it.

What is a parallel run?

Posting the first month after cutover in both the old and the new system and comparing the results. It catches mapping mistakes that only show up in new transactions, which tie-outs on history cannot find.

What data should be cleaned before a migration?

The masters: duplicate vendors (match on tax ID, then name and address), closed or dead jobs, unused cost codes, and inconsistent job number formats. Anything left uncleaned becomes a permanent row in the new system.

How do you migrate from QuickBooks to a construction ERP?

Decide which QuickBooks field played the cost-code role (items or classes), map customer:job pairs to jobs, gather committed cost and retainage from wherever they were tracked outside QuickBooks, then cut over at a month-end and tie out job cost, AP, AR and retainage per job.

CI
Written by the Constructelligence teamConstruction finance and software. Worked examples use the sample demo portfolio; formulas are standard practice. Reviewed September 2026.

More in Data & integrations

All data & integrations resources →