CMPUT-401 · Lesson 11 of 12 · 33 min

Working with clients: contracts, scope and communication

Team Lumen does not own Driftwood's product; Driftwood does. That changes the product manager's job. In a product company the PM negotiates priorities with colleagues; in client work the PM, often called an engagement manager or delivery lead, must also manage a commercial relationship governed by a contract. Money, intellectual property, confidentiality, acceptance and liability all become explicit. This lesson covers the documents and practices that make client delivery work: statements of work, contract types, change control, intellectual property and licensing, confidentiality, communication cadence and the perennial problem of scope creep. For contract law and procurement in depth, see PMP-140 and BUS-220; nothing here is legal advice, and real contracts should be reviewed by a lawyer.

The statement of work

A statement of work (SOW) defines what a vendor will deliver for a client: objectives, scope, deliverables, milestones, acceptance criteria, assumptions, responsibilities on both sides, schedule, pricing and payment terms, and how changes are handled. It typically sits under a master services agreement (MSA), which holds the long-lived legal terms such as liability, confidentiality, intellectual property and dispute resolution, so that each new piece of work needs only a new SOW. A good SOW is specific enough to prevent disputes and flexible enough to allow learning.

Contract types

The pricing model decides who carries the risk of the work taking longer than expected. In a fixed-price contract, the vendor agrees to deliver defined scope for a set price; the client gets cost certainty, and the vendor carries overrun risk, so vendors add a risk premium and resist scope changes. In time and materials (T&M), the client pays for actual hours at agreed rates; the client carries the risk, but gains flexibility to change direction. Capped T&M pays actual hours up to a maximum, sharing risk. Many agile teams use hybrids: fixed price per sprint or per increment, with scope chosen sprint by sprint from a prioritized backlog, and a right for either side to stop after any increment.

Risk allocation under fixed price, T&M and capped T&M when actual effort is uncertain (illustrative)
# Who carries the risk? Simulate actual effort for a project estimated at 400 hours
# and compare client cost and vendor margin under three contract types (illustrative).
import random
random.seed(401)
rate, est = 110.0, 400            # hourly rate and estimated hours
fixed_price = rate * est * 1.25   # vendor adds a 25% risk premium to a fixed bid
cap = rate * est * 1.15           # capped T&M: client pays actual hours up to a cap
runs = 10000
res = {"fixed": [], "t&m": [], "capped": []}
for _ in range(runs):
    actual = est * random.lognormvariate(0.10, 0.35)   # skewed: overruns are common
    cost = rate * actual
    res["fixed"].append((fixed_price, fixed_price - cost))
    res["t&m"].append((cost, 0.0))
    paid = min(cost, cap)
    res["capped"].append((paid, paid - cost))
for name, rows in res.items():
    client = sorted(r[0] for r in rows)
    vendor = [r[1] for r in rows]
    loss = sum(v < 0 for v in vendor) / runs
    print(f"{name:7s} client median {client[runs // 2]:8.0f}  client p90 {client[int(runs * .9)]:8.0f}"
          f"  vendor loses money in {loss:5.1%} of runs")
Output
fixed   client median    55000  client p90    55000  vendor loses money in 36.1% of runs
t&m     client median    48671  client p90    76438  vendor loses money in  0.0% of runs
capped  client median    48671  client p90    50600  vendor loses money in 45.5% of runs

The simulation shows the trade-off. Under fixed price, the client always pays the same, including the premium, and the vendor sometimes loses money when effort overruns. Under T&M the client's cost varies widely and the vendor never loses. Capped T&M protects the client's budget almost as well as fixed price without paying the premium, so the vendor absorbs every overrun above the cap and loses money more often than under fixed price. None is universally best. Fixed price suits well-understood work with stable requirements; T&M suits discovery-heavy work where scope will change; agile increments suit products where the client wants to steer based on what each increment teaches. Because Driftwood's product depends on discovery and a feasibility pilot, Team Lumen proposed a fixed price for the discovery phase and per-sprint pricing afterwards.

Change control and scope creep

Scope creep is the gradual, uncontrolled growth of a project's scope without matching changes to time, budget or resources. It rarely arrives as one big request; it arrives as many small ones: could the schedule also show fares; the island association asked whether we could add road cameras; the regulator wants every page in a second language. Some changes are valuable and should happen; the problem is changes that happen without anyone deciding to trade something for them. Change control is the process that makes each change a decision.

A simple change control process has four steps. The request is written down, with who asked and why. The team assesses its impact on scope, schedule, cost, risk and quality. The client's decision-maker approves, rejects or defers it, choosing what to trade. And the decision is recorded and the plan updated. In fixed-price work, approved changes usually come with a price; in agile contracts, they usually displace lower-priority backlog items. The code applies this logic to three requests against the capacity forecast from lesson 7.

Assessing change requests against remaining capacity (invented numbers)
# Assessing a change request against remaining capacity (invented numbers).
remaining_capacity = 34        # items the team can finish before the summer date (85% forecast)
committed = 30                 # items already in the release
requests = [
    ("Show fares on the schedule page", 3, "Should"),
    ("Integrate with regional road-camera feed", 9, "Could"),
    ("Second-language version of all pages", 6, "Must"),
]
slack = remaining_capacity - committed
print(f"slack before changes: {slack} items")
for title, size, moscow in requests:
    if size <= slack:
        slack -= size
        verdict = "accept within current plan"
    elif moscow == "Must":
        verdict = f"accept only by swapping out {size - slack} items of lower priority, or extend"
    else:
        verdict = "defer to a later release or fund as additional scope"
    print(f"- {title} ({size} items, {moscow}): {verdict}")
print(f"slack after decisions: {slack} item(s)")
Output
slack before changes: 4 items
- Show fares on the schedule page (3 items, Should): accept within current plan
- Integrate with regional road-camera feed (9 items, Could): defer to a later release or fund as additional scope
- Second-language version of all pages (6 items, Must): accept only by swapping out 5 items of lower priority, or extend
slack after decisions: 1 item(s)

The second-language version is a must in this example because of a regulatory expectation, so it goes in only by swapping out lower-priority work or extending the date: the client chooses which. The road-camera feed is deferred. The point is not the arithmetic but that every change is visible and someone with authority made the trade. Burn-up charts that show total scope as a separate line make creep visible too.

Burn-up numbers showing scope growth alongside completed work (invented data)
# Scope creep made visible: a burn-up chart's numbers, with scope growing each week.
done_per_week = [4, 5, 3, 6, 5, 4, 6, 5]
scope = 40
added = [0, 3, 2, 4, 0, 5, 3, 2]           # items added by change or discovery
done = 0
print("week  done  scope  remaining")
for w, (d, a) in enumerate(zip(done_per_week, added), start=1):
    done += d
    scope += a
    print(f"{w:4d}  {done:4d}  {scope:5d}  {scope - done:9d}")
print(f"scope grew {scope - 40} items ({(scope - 40) / 40:.0%}) while the team finished {done}")
Output
week  done  scope  remaining
   1     4     40         36
   2     9     43         34
   3    12     45         33
   4    18     49         31
   5    23     49         26
   6    27     54         27
   7    33     57         24
   8    38     59         21
scope grew 19 items (48%) while the team finished 38
A burn-up chart over eight weeks. A rising solid line shows completed items reaching 38. A stepped dashed line above it shows total scope rising from 40 to 59. The gap between the lines closes only slowly.
A burn-up chart: completed work rises, but so does scope, so the gap closes slowly

Intellectual property and licensing

Who owns the code? The answer depends on law and contract, and assumptions are dangerous. A client paying for software usually expects to own it; a vendor may want to reuse its own libraries across clients; and the code almost certainly includes open-source components with their own licences. The contract should say explicitly who owns newly written code, what pre-existing vendor materials are licensed rather than assigned, and what the client may do with them.

In Canada, under the Copyright Act, the employer owns copyright in works made by an employee in the course of employment, unless agreed otherwise. Independent contractors, however, generally own the copyright in what they create unless they assign it in writing. A client that hires a contractor or a student team without a written assignment may end up with only an implied licence to use the code. Canadian law also gives authors moral rights, including the right to be associated with the work and to its integrity; these cannot be assigned but can be waived, and IP clauses in Canadian contracts commonly include a moral rights waiver. University policies may also say who owns student work, so student teams should check their institution's IP policy before signing anything.

Open-source licences matter too. Permissive licences such as MIT, BSD and Apache 2.0 allow use in proprietary products with attribution (Apache 2.0 also includes an express patent licence). Copyleft licences such as the GPL require that distributed derivative works be released under the same licence; the AGPL extends this to software offered over a network, which matters for web services like Driftwood's. The team should keep an inventory of dependencies and their licences, often called a software bill of materials, check compatibility with the client's plans, and hand it over with the code.

Confidentiality and NDAs

A non-disclosure agreement (NDA) or confidentiality clause obliges parties to protect each other's confidential information: business plans, customer data, pricing, source code. NDAs can be one-way or mutual, and define what counts as confidential, permitted uses, exceptions (information already public or independently developed), how long the obligation lasts and what happens to information when the relationship ends. For student teams, NDAs can conflict with the need to present work for grading or in a portfolio, so agree in advance what may be shown publicly, for example a demo with invented data and no client financials. Personal information about travellers is governed by privacy law regardless of what the NDA says (lesson 12).

Communication and governance

Most client relationships fail through communication rather than code. A communication plan sets the cadence and audience for each kind of update. Team Lumen agreed on: a weekly 30-minute check-in with the client owner for decisions and blockers; a sprint review every two weeks with staff representatives; a one-page written status report every Friday covering progress against goals, risks, decisions needed and budget burned; and a steering meeting each month with the owner and Driftwood's finance lead to review the roadmap and contract. Escalation paths say who to contact when something is stuck, and on what timeline.

Good status reports are honest early. Green, amber and red status labels are useful only if amber appears before red: a project that is green every week until it is suddenly red has hidden its problems. When news is bad, deliver it quickly, with what happened, the impact, options and a recommendation. Clients forgive late features far more easily than surprises. Managing expectations also means saying no clearly, using the techniques from lesson 4, and confirming verbal agreements in writing: a short email after each meeting summarizing decisions prevents most later disputes.

Acceptance, handover and the end of an engagement

Acceptance is the client's formal confirmation that a deliverable meets the agreed criteria, often tied to payment. The SOW should define acceptance tests, a time limit for the client to accept or report defects, and what happens if the client neither accepts nor rejects (deemed acceptance). Handover includes the code repository, deployment credentials transferred to the client's accounts, documentation, the dependency and licence inventory, runbooks for operations, and training for whoever will maintain the product. A product nobody can operate after the vendor leaves is a liability, not an asset.

Worked examples

Worked problem

Choosing a contract type

Driftwood wants cost certainty, but discovery may change the feature list. Propose a contract structure.

Show solution
  1. Discovery is uncertain but short: fix the price for a three-week discovery phase with defined outputs (research report, prioritized backlog, pilot results).
  2. Delivery is steered by learning: price per two-week sprint with a not-to-exceed total, and a right to stop after any sprint.
  3. Scope within delivery is chosen from the prioritized backlog at each sprint planning.

Answer: Fixed-price discovery, then capped per-sprint delivery: cost certainty per phase with flexibility on features.

Worked problem

Handling a verbal change

In a check-in, the owner says: Can you also show fares? It should be quick. What should the PM do?

Show solution
  1. Thank the owner and log a written change request with the reason.
  2. Assess impact: about 3 items; fits current slack per the code.
  3. Confirm in writing that it is accepted within the current plan, and update the backlog.

Answer: Even small changes go through written change control, so the plan stays honest.

Worked problem

Spotting an IP gap

The team plans to use an AGPL-licensed mapping component in the hosted Driftwood app, and the contract assigns all code to the client. What risks arise?

Show solution
  1. AGPL requires offering source of modified versions to network users, which may conflict with the client's expectations.
  2. The team cannot assign ownership of third-party code; the contract must carve out open-source components.
  3. Consider a permissively licensed alternative, or get the client's informed agreement.

Answer: Inventory licences, carve out third-party components in the IP clause, and resolve copyleft obligations before using the component.

Common mistakes

  • MistakeFixed price is always safer for the client.

    InsteadFixed price shifts risk to the vendor, who charges a premium and resists change; it suits stable scope only.

  • MistakeSmall changes do not need to be written down.

    InsteadLog every change request and record the decision; small changes add up to scope creep.

  • MistakeIf the client paid for the code, the client owns it.

    InsteadOwnership depends on law and contract; contractors usually need a written assignment.

  • MistakeCode on a public website is free to use.

    InsteadCode without a licence is all rights reserved; check licences before use.

  • MistakeReport green until a problem is certain.

    InsteadRaise amber early with options; surprises damage trust more than delays.

Summary and key terms

  • A statement of work defines objectives, scope, deliverables, acceptance, responsibilities and change control.
  • Contract types allocate overrun risk: fixed price to the vendor, T&M to the client, hybrids share it.
  • Change control turns each scope change into a recorded decision; burn-ups make creep visible.
  • Code ownership depends on law and contract; get written assignments and handle moral rights or work-for-hire terms.
  • Track open-source licences, especially copyleft, in a software bill of materials.
  • NDAs protect confidential information; privacy law applies regardless.
  • A communication plan with honest status reports and written follow-ups prevents most disputes.
Statement of work
A document defining the work a vendor will deliver for a client.
Master services agreement
The overarching contract holding long-lived legal terms for multiple SOWs.
Fixed-price contract
A contract delivering defined scope for a set price.
Time and materials
A contract paying for actual hours and costs at agreed rates.
Change request
A formal proposal to alter agreed scope, schedule or cost.
Scope creep
Uncontrolled growth in scope without matching changes in time or budget.
Copyleft
A licence requiring derivative works to carry the same licence.
Software bill of materials
An inventory of software components and their licences.
Non-disclosure agreement
A contract obliging parties to protect confidential information.
Acceptance
Formal client confirmation that a deliverable meets agreed criteria.

Practice problems

Work each problem on paper first, then reveal the answer to check.

  1. What is the difference between an MSA and an SOW?

    Show answer

    The MSA holds long-lived legal terms; each SOW defines a specific piece of work.

  2. Name four sections of an SOW.

    Show answer

    Any four of objectives, scope, deliverables, acceptance, responsibilities, assumptions, change control, pricing.

  3. In the contract simulation, which contract type never loses the vendor money?

    Show answer

    Time and materials.

  4. Why does a fixed-price bid include a premium?

    Show answer

    To compensate the vendor for carrying overrun risk.

  5. List the four steps of change control.

    Show answer

    Record the request, assess impact, decide and trade, record and update the plan.

  6. How much did scope grow in the burn-up example?

    Show answer

    By 19 items, about 48 per cent.

  7. Who owns copyright in code written by an independent contractor in Canada without a written agreement?

    Show answer

    Generally the contractor; the client may have only an implied licence.

  8. Why does the AGPL matter for a hosted web app?

    Show answer

    It requires offering source of modified versions to users who interact with it over a network.

  9. What should a student team agree about NDAs and portfolios?

    Show answer

    What may be shown publicly, for example demos with invented data.

  10. What makes a status report useful?

    Show answer

    Honest early warning, decisions needed, risks, and options with recommendations.

Lesson quiz · 5 questions

Score 60% or more to complete this lesson.

Take the quiz