Bad data is always discovered during the load

In 24% of the 41 stalled implementations we have been called into, the primary cause was data that turned out to be worse than anyone knew — and it was almost always found during the load rather than during the diagnostic. The timing is the problem, not the data.

By Samuel Edwards — Chief Marketing Officer

Across the 41 stalled implementations we have been called into, data that turned out to be worse than anyone knew was the primary cause in 24% of them. That sample skews toward severe failures — people call us when a project is already in trouble, not when it is merely uncomfortable — and the full method is on the failure-modes page. The number is not the interesting part anyway. The timing is.

In almost every one of those cases the problem was found during the load. Not during selection, not during the diagnostic, not during design. During the load, which is to say after the contract was signed, after the design was agreed, and after a go-live date had been communicated to people who would be annoyed by it moving. This is the shape ERP data migration risk always takes: the danger was never in the software, it was in master data nobody had verified.

Where the 41 stalled implementations went wrong
24%Data worse thanassumed Data worse than assumed24% Every other cause76%
Sample of 41 stalled ERP implementations we were called into to diagnose. The sample skews toward severe failures by construction: these are engagements that had already gone bad.

Why it surfaces so late

Looking properly at your own data is unglamorous, unbudgeted and mildly humiliating, and no phase of a typical implementation forces anyone to do it. The diagnostic looks at process. The design looks at the target state. Both are conversations about how things ought to work, and neither requires anybody to open the customer master and count how many rows have a country code that is not a country. That is a data cleansing question, not a design question, and nothing before the load forces anyone to ask it.

The load is the first activity that cannot proceed on assumptions. It reads every row. It is also, by design, the last activity before go-live, which means the first honest look at the data happens at the exact moment there is no schedule left to absorb what it finds.

Every implementation plan contains a step where the data is finally examined. In most plans that step is called "cutover".

What actually gets found

Rarely anything exotic. The recurring set, in rough order of how often we see it:

  • Duplicate parties that were never duplicates in the old system, because the old system let two records share a name and the new one enforces a key. Merging them is a business decision about which history is real, not a technical one, and it needs someone who can make it.
  • Balances that tie in aggregate and not in detail. The trial balance is fine. The sub-ledger supporting it contains entries nobody can attribute. This is the one that turns a two-week load into a two-month one.
  • Fields used for something other than their name. A memo field carrying routing instructions, a customer reference holding a project code. Every one of these is a rule that exists only in somebody’s head and has to be discovered by asking.
  • History that was migrated once already and carries the scars of that migration — truncated descriptions, dates defaulted to the migration date, a currency column that means two different things either side of a cutover in 2019.
Failure classes a destructive dry load actually surfaces
Duplicate parties merged as one in the old system most common Balances that tie in aggregate, not in detail frequent Fields used for something other than their name occasional History already migrated once, carrying old scars least common
Ranked by how often each class shows up once every row gets loaded, most common first. Not a percentage breakdown — an ordering, drawn from repeated engagements.

The fix is a destructive dry load, early

The intervention is not better tooling and it is not a longer cleansing phase. It is moving the discovery forward, and the only reliable way to do that is to load everything into a throwaway environment before the design is agreed — not a sample, not the master data, everything, including the transactional history nobody intends to bring across. Treat it as the point where legacy data migration risk gets priced honestly, instead of discovered for free at cutover.

It will fail. That is the point. The failures are a list, the list is the real scope, and having it in week three rather than week twenty-six is the entire value of the exercise. The environment is then deleted, which is what makes it safe to be careless in.

Three things make it worth doing properly rather than as a formality:

  • Load the history, even the history you plan to leave behind. The decision to leave it behind is usually revisited once someone from finance discovers what "we will keep it in the old system" means in practice for an audit.
  • Count the rows that fail, and keep the count. A cleansing effort with no baseline cannot be shown to have worked, and "the data is much better now" is not a statement anyone should accept before a cutover.
  • Give every failure class an owner with a name. The duplicate-customer question is not a data question and cannot be closed by whoever is running the load.
When bad data actually gets found
wk 0 wk 5 wk 10 wk 15 wk 20 wk 25 Standard schedule diagnostic → design → build found at cutover Destructive dry load dry load design informed by real data found week 3
A standard schedule discovers data problems at cutover, with no time left to absorb them. A destructive dry load moves the same discovery to week three, while the design is still open.

What this costs us to say

A destructive dry load adds two to four weeks to the front of an engagement and produces nothing a buyer can look at. It is the least attractive thing we propose, it makes our timelines longer than the ones we are quoted against, and we have lost work over it.

We propose it anyway, because the alternative is not a faster project. It is the same discovery at a worse moment, which is what the 24% is a record of.

If you are earlier than that — still choosing — the diagnostic questions we ask are in the requirements guide, and what implementations actually cost, from 63 quotes we were shown, is in the pricing study. Neither substitutes for testing go-live readiness against your own data before the schedule locks you into a date.

The same underlying sample shows up elsewhere in how we think about implementations: what happens when nobody can decide stalls a schedule just as reliably as bad data does, what an agent structurally cannot do inside a ledger once it is live, the reference-call questions that would have surfaced a customisation problem before you signed, and why closing faster runs into the same kind of discipline problem after go-live.

The same discipline shows up elsewhere once the data is finally being moved: deciding who owns a field once systems can both write to it, treating a chart of accounts migration as more than an export-and-import exercise, building a rollback condition into the cutover plan rather than just a go-live date, and noticing when a quick custom field quietly becomes system design.

Samuel Edwards — Chief Marketing Officer

Samuel Edwards is Chief Marketing Officer at erp.io. He has spent 15+ years in technical SEO, content strategy and demand generation, running paid and organic operations for organisations ranging from venture-backed startups to Fortune 500 companies, and has spoken at the Search Marketing Expo series and on the TEDx stage.

He came to business software the way most marketers do not: by watching how finance and operations teams actually evaluate it. These buyers do not read brochures. They search for the specific failure they had at last quarter's close, they read until they find someone describing it accurately, and they form a view long before anyone in sales hears their name. That is why this blog has no gated downloads, no lead-capture forms in the middle of a post, and pages that state plainly what erp.io does not do.

His argument internally is simple: in a category where the buyer is closer to the work than the seller is, the only durable marketing position is to be accurate. Sam writes here about operations software as it is practised rather than as it is pitched — the configuration decisions that quietly determine whether an implementation holds, the seam between the ledger and everything feeding it, and what bad data costs when nobody is measuring it.

Who you actually work with is on the team page.

Keep reading

Other posts.

How to Build a Custom ERP With AI Instead of Using NetSuite

A build plan for a custom AI ERP that replaces NetSuite, covering the ledger, agent roles, controls, integrations and the realistic 90-day sequence.

21 October 2026 · Read →

The First Problems Your AI ERP Should Solve

A sequenced list of the finance workflows an AI ERP should automate first, from invoice coding to bank reconciliation, with the controls each one needs.

20 October 2026 · Read →

Inside an AI-Native ERP: Orchestration, RAG and Ledger Access

How an AI-native ERP actually works inside: the orchestrator, role-based agents, retrieval-augmented context, and why the ledger stays off-limits to models.

19 October 2026 · Read →

Everything else we publish.

Primary research with stated sample sizes, buyer guides, and comparisons scored on published weights.