
Summarize with AI
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.
| Gate | Deliverable that must exist | Who signs |
|---|---|---|
| Discovery complete | Process documentation, decision log, gap list with build-or-configure calls | You, plus the process owners |
| Foundation configured | Chart of accounts, item and warehouse structure, naming series, all agreed in writing | Finance and operations |
| Data migration accepted | Reconciled totals per account and per warehouse against source | Finance |
| Configuration accepted | Standard flows demonstrated on migrated data | Process owners |
| Customization accepted | Each custom module mapped to the requirement it serves | You |
| Go-live | Rehearsal completed at full data volume, rollback point agreed | You, 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.

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.
FAQs
Similar Blogs


Odoo Consultant: Do You Need Functional or Technical?

.NET Framework to .NET 10 Migration: A Practical Playbook

Choosing an Odoo Partner: An Evaluation Framework for US and EU Buyers





