Odoo Development, Enterprise Application 17 August 2026

Odoo Implementation Partner: What to Demand in the Contract

Key Takeaways:

  • ERP contracts fail on ambiguity about who decides, not on rates. Name the decision owner for every phase or you’ll pay for the argument.
  • Phase gates with named deliverables are the single most useful structure. Each gate is a point where you can stop.
  • Data migration needs its own acceptance criteria, specifically reconciled totals, not “data loaded.”
  • Change control has to be cheap to use. A process nobody uses becomes verbal scope creep, and verbal scope is unbillable and undeliverable in equal measure.
  • Agree the go-live rollback condition in writing, in advance, including who has authority to call it.

Most ERP contract disputes aren’t about money. They’re about who was supposed to decide something.

Whose job was it to agree the chart of accounts. Who signed off that the opening balances were right. Who decided that returns go back to the transit warehouse. When those questions have no documented answer, the project stalls while two organizations discover they each assumed the other owned it, and both are billing.

Rates are the thing everyone negotiates and roughly the least important variable. A well-structured engagement at a higher rate beats a cheap one with undefined gates, because the cheap one recovers margin through change requests on decisions nobody assigned.

So this covers the clauses that decide whether an implementation is recoverable when it goes sideways. For selecting the partner in the first place, see choosing an Odoo partner.

Phase gates, and why they’re the load-bearing structure

Structure the engagement as phases with a named deliverable at each boundary, and a decision at each gate about whether to continue.

That does two things. It gives you exit points, so a project going wrong can be stopped at a gate rather than abandoned mid-build. And it forces the deliverable to exist, because the gate can’t be passed without it.

GateDeliverable that must existWho signs
Discovery completeProcess documentation, decision log, gap list with build-or-configure callsYou, plus the process owners
Foundation configuredChart of accounts, item and warehouse structure, naming series, all agreed in writingFinance and operations
Data migration acceptedReconciled totals per account and per warehouse against sourceFinance
Configuration acceptedStandard flows demonstrated on migrated dataProcess owners
Customization acceptedEach custom module mapped to the requirement it servesYou
Go-liveRehearsal completed at full data volume, rollback point agreedYou, with named authority

The gate people skip is data migration acceptance, and it’s the one that costs the most. Which brings us to the clause I’d fight hardest for.

Six contractual phase gates for an Odoo implementation shown left to right: discovery complete, foundation configured, data migration accepted, configuration accepted, customization accepted, and go-live. The third gate, data migration accepted, is drawn heavier and marked as requiring reconciled totals signed by finance, and annotated as the gate most often skipped and the most expensive to skip.
Six gates, each with a named deliverable and signatory. The third is the one that quietly gets waived.

Data migration acceptance means reconciled totals

“Data has been migrated” is not an acceptance criterion. It’s an observation.

The criterion is that totals reconcile: trial balance per account, stock value and quantity per warehouse, open receivables and payables, against the source system, as of a stated cutover date. Signed by whoever will later be asked whether the opening position was right.

Get this wrong and the consequences are slow and expensive. Nobody notices at go-live because everyone is watching whether orders can be placed. Finance notices at the first month-end, or the first audit, and by then you have three months of transactions layered on an opening position nobody can defend.

Two things belong in the contract:

The reconciliation document is a named deliverable, produced by the partner, reviewed by your finance function, retained.

Migration re-runs are in scope until reconciliation passes. Without that clause, a failed reconciliation becomes a change request, which is a bad incentive to hand a partner.

Change control has to be cheap to use

Every ERP project changes scope. The question is whether changes go through a process or accumulate as verbal understandings.

A change process that requires a formal document and a week’s turnaround for a two-hour change won’t get used. People will agree things in meetings, nobody will write them down, and at the end you’ll have a disagreement about what was included that neither side can evidence.

What works:

  • A lightweight path for small changes. A logged decision, an estimate in hours, an email approval. Same day.
  • A formal path for anything that moves a gate. Written, estimated, and explicitly accepted or declined.
  • A standing decision log both sides can read, listing every change and who approved it.
  • A stated position on rework. If a change is needed because a requirement was documented incorrectly during discovery, whose cost is that? Answer it in the contract, not during the argument.

That last one is the clause people leave out and later wish they hadn’t.

Who shouldn’t call us

If you want a fixed price for the whole implementation including discovery, we’ll decline, and you should be wary of anyone who agrees. The scope that matters is discovered during discovery, and a fixed price set before it either carries a large risk premium or becomes a change-request business.

If nobody on your side can sign off the chart of accounts and the approval rules, don’t contract yet. That’s not a gap a partner fills. It’s a decision your finance and operations leads have to make, and the project cannot pass its second gate without it.

And if you need go-live before a date that doesn’t allow a full-volume rehearsal, we’d rather not take it. Compressed cutovers fail in ways that damage the client more than the partner, which is a bad asymmetry to sign up to.

The go-live clause most contracts lack

Two sentences, and they matter more than most of the document.

The rollback condition. At what point, on what observable condition, is the cutover abandoned and the old system resumed. Stated as a time and a test, not a judgment.

Who has authority to call it. One named person on your side, available on the night, empowered to stop without seeking further approval.

Deciding this at 3am, with a half-migrated database and a partner arguing for one more hour, is how a bad cutover becomes a much worse one. The reason it gets left out is that writing it down feels like planning for failure. It’s the opposite: it’s the clause that lets you fail cheaply once instead of expensively.

Alongside it, agree hypercare explicitly. The four weeks after go-live are heavier than configuration, and they decide adoption. Define the response times, the hours of coverage, and what’s included versus billable, because that ambiguity produces friction at exactly the worst moment.

What belongs in the statement of work

A checklist you can hold any partner to, including us.

  • Phase gates with named deliverables and named signatories
  • Data migration acceptance defined as reconciled totals, with re-runs in scope
  • Change control, with a cheap path for small changes and a stated rework position
  • Client-owned repository from the first commit
  • Documentation as a deliverable, in that repository, listed item by item
  • Upgrade-path commitment for custom modules written against supported extension points
  • Named team with substitution notice
  • Go-live rollback condition and the person authorized to invoke it
  • Hypercare period with defined coverage and response times
  • Ownership boundary stating who decides what, per phase

Nine of those ten are free to agree before work starts. The tenth, hypercare, has a price, and it’s the one worth paying for.

The clause I’ve argued against and lost

I’ll name one where the client was right and I wasn’t.

I used to resist tying any payment milestone to data migration reconciliation. My argument was that reconciliation depends heavily on source data quality, which is the client’s, and that making our payment contingent on their data being clean was an unfair transfer of risk. That’s a real point.

A client pushed back and held. Their position was that if reconciliation isn’t a payment gate then nobody prioritizes it, and they’d been through an implementation where it slipped past go-live and cost them a restatement.

They were right about incentives. What we do now is tie the milestone to reconciliation passing or the variance being documented and formally accepted, so a genuine source-data problem doesn’t block payment, but it does have to be surfaced and signed rather than quietly carried forward.

That’s a better clause than either of our starting positions, and I only got to it because someone refused my version.

The bottom line

ERP contracts fail on undefined decision ownership rather than on rates. So structure the engagement as phases with named deliverables and named signatories, and treat each gate as a point where the project can genuinely be stopped.

Define data migration acceptance as reconciled totals per account and per warehouse, signed by finance, with re-runs in scope until it passes. That single clause prevents the most expensive quiet failure in ERP delivery.

Make change control cheap enough that people actually use it, and state in advance whose cost it is when a requirement was captured wrong during discovery.

Then write down the go-live rollback condition and name the person authorized to invoke it, and buy hypercare deliberately rather than discovering you needed it.

Blog Book a Call Blog

FAQs

Phase gates with named deliverables and signatories, data migration acceptance defined as reconciled totals, a usable change control process, client-owned repository from the first commit, documentation as a deliverable, an upgrade-path commitment, a named team, a written go-live rollback condition, and a defined hypercare period.
By reconciled totals rather than by data being loaded. Trial balance per account, stock value and quantity per warehouse, and open receivables and payables, all matched against the source as of a stated cutover date and reviewed by finance. Migration re-runs should stay in scope until it passes.
Not including discovery. The scope that matters emerges during discovery, so a price fixed before it either carries a large risk premium or turns into a change-request business. Fixed pricing works for well-defined phases after discovery has produced a documented scope.
The intensive support period immediately after go-live, typically four weeks. It's heavier than the configuration phase and it decides adoption, because process gaps that survived testing surface as soon as real volume arrives. Define coverage hours, response times, and what is billable in advance.
One named person on the client side, available during the cutover window, empowered to invoke the rollback without seeking further approval. Agree the condition and the authority in writing beforehand, because deciding it during a struggling cutover reliably makes the outcome worse.
Author
Author

Hardik Soni

Hardik Sonii is the CEO and Sales Director at CodeTrade's official Odoo Partner operation in Dubai. He works across Odoo, AI/ML, Python, Django, and e-commerce, and has spent years helping businesses in the Middle East adopt technology that fits their scale and industry requirements.