guides
How to Draft a Statement of Work for an ML Integration Project

A vague SOW turns a 6-week ML integration into a 4-month scope-creep nightmare. Here's exactly what to put in each section so it doesn't.
The client thinks "ML integration" means the chatbot will magically understand every customer forever. Your team thinks it means shipping a model that hits 85% accuracy on last month's data. Nobody wrote either assumption down, and now you're six weeks into a project that was quoted for four.
That's the actual failure mode with most ML integration projects — not the model, not the code, the paperwork. A weak Statement of Work (SOW) is the single biggest reason ML projects blow their budget and timeline, because "add machine learning" is not a scope, it's a wish.
What Should a Statement of Work for an ML Integration Project Include?
A solid ML integration SOW needs at minimum 7 core sections: project overview, data requirements, model performance criteria, integration architecture, deliverables and milestones, acceptance criteria, and change control process. Skip the acceptance criteria section and you have no legal basis to say a deliverable is "done" — which is exactly where most ML disputes start.
Unlike a standard software SOW, an ML SOW has to account for uncertainty that traditional dev work doesn't have. You can't guarantee a model will hit 95% accuracy the way you can guarantee a button will be blue. So the document needs to define success in probabilistic terms, not absolute ones.
Why Do ML Projects Need a Different SOW Than Regular Software Projects?
Because model performance is not binary and data quality is outside your control at signature time. A regular software SOW says "build feature X." An ML SOW has to say "build a model that achieves at least Y% precision on a held-out test set, given data that meets Z quality criteria" — and specify what happens if the data doesn't meet those criteria.
This is the part clients hate hearing but need to hear: you cannot commit to a specific accuracy number before you've seen the training data. The fix isn't avoiding the commitment — it's structuring the SOW so the commitment is conditional and staged.
Section-by-Section: What Goes in Each Part
Project overview — one paragraph stating the business problem the ML component solves (e.g., "auto-classify inbound support tickets by urgency"), not the technology used to solve it.
Data requirements — exact data sources, minimum volume (e.g., "10,000 labeled examples minimum"), data owner responsible for delivery, and a data quality gate before model work begins.
Model performance criteria — the specific metric (precision, recall, F1, latency), the target threshold, and the test set it's measured against. Never leave this as "high accuracy."
Integration architecture — where the model lives (API endpoint, embedded service, batch job), what systems it talks to, and who owns the infrastructure post-launch.
Deliverables and milestones — broken into phases: data pipeline, baseline model, integration, production deployment. Each with a date and a defined output artifact.
Acceptance criteria — the exact test that determines a milestone is complete and payment is due. Tie this to numbers from the performance criteria section, not subjective sign-off.
Change control process — how new requests get scoped, priced, and approved once the SOW is signed. This is the clause that saves you from scope creep.
How Do You Set Realistic Performance Benchmarks Before You've Seen the Data?
Use a two-phase structure: a short discovery phase (typically 1-2 weeks) to assess data quality first, then commit to hard performance numbers only after that assessment. Anyone who quotes a firm accuracy target before touching the actual dataset is guessing — and you'll be the one holding the bag when the guess is wrong.
Structure the SOW so the discovery phase is its own billable milestone with its own deliverable: a data quality report and a revised, evidence-based performance target for phase two. This protects both sides. The client isn't locked into a number pulled from thin air, and you're not stuck guaranteeing something a messy dataset can't support.
What Belongs in the Integration Architecture Section?
This section answers one question: how does the model actually reach the systems people use every day? For most B2B teams, that means defining exactly which CRM, messaging platform, or internal tool the model output needs to flow into — and via what mechanism (webhook, REST API, batch export).
If the integration touches outreach or lead workflows, be specific about the endpoint. For example, if the ML output needs to trigger a Telegram-based sales sequence or update a CRM record, name the exact API you're integrating against rather than writing "connects to CRM" and hoping everyone agrees later what that means. The requirements you gather during the client brief should map directly into this section — don't leave a gap between what was discussed and what's contractually scoped.
CRMChat includes a developer API that lets you push model outputs — like lead scores or classification tags — directly into contact records and outreach sequences, which is exactly the kind of integration point an SOW should name explicitly rather than leave vague. If your ML project outputs feed into a Telegram CRM workflow, reference the CRMChat API documentation directly in the architecture section so both sides are scoping against the same technical surface.
How Do You Handle Scope Creep on an ML Project Specifically?
ML projects invite scope creep more than regular software because "just retrain it on this new data" sounds like a small ask but often isn't. Put a hard rule in the SOW: any request to retrain, re-tune, or add new data sources after the baseline model is accepted triggers the change control process, no exceptions.
Define the exact training dataset and cutoff date in the SOW — anything outside it is a change request.
Set a fixed number of retraining cycles included in the base price (e.g., "up to 2 retraining iterations included").
Price additional retraining cycles or new label categories as a separate line item upfront, not negotiated after the fact.
Require written sign-off on the change order before work resumes — verbal "just add this" requests don't count.
Log every change request in a shared document referenced by the SOW, so there's a paper trail if the project scope is disputed later.
What Does a Realistic Timeline and Milestone Structure Look Like?
Most mid-sized ML integration projects break into four phases over 6-12 weeks: data assessment (1-2 weeks), baseline model development (2-4 weeks), integration and testing (2-3 weeks), and production rollout with monitoring (1-2 weeks). Tie payment milestones to phase completion, not calendar dates — calendar-based payment terms ignore the reality that phase two can't start until phase one's data quality gate is passed.
Agencies that manage this well for clients — the same way outreach agencies report progress to clients — build in a status update at every milestone, not just at project end. It's the same discipline: define the checkpoint, report against it, don't let ambiguity accumulate for months before someone notices the project drifted.
Common Mistakes That Sink an ML SOW
Writing "improve accuracy" instead of a number. If it's not measurable, it's not enforceable.
Skipping the data quality gate. Committing to a model timeline before confirming the data exists in usable form.
No defined test set. Without a fixed held-out test set, "accuracy" can be gamed or disputed after the fact.
Vague ownership of retraining. Who retrains the model six months post-launch when data drifts? Put it in writing now.
No rollback plan. What happens if the model underperforms in production? Define the fallback before launch, not during an incident.
None of this is unique to fancy AI vendors — the same discipline that keeps a chatbot development project priced correctly also keeps an ML integration project from quietly doubling in cost. Specificity in the SOW is what protects the budget, not the sophistication of the model.



