Skip to content

Engagements

An engagement is work sold over time: a scope, deliverables accepted one by one, a schedule, and a price model, from proposal to close.

An engagement from proposal to close

Each deliverable is accepted on its own, and a change re-quotes before it runs. The point marks money you are paid.

What an engagement holds

An engagement is a case that runs for weeks or years. Every family of Work applies inside it, and these are its own.

FamilyWhat it does
ScopeWhat the work covers and excludes, in words the client accepts, versioned with every change order
Proposal and acceptanceA quote with the scope, the schedule and the price, accepted by click, signature or an agent in the call, as an agreement
DeliverablesEach a Thing of its own: versioned with every upload, reviewed by the client in rounds, and accepted, rejected or remedied on its own
Change ordersA move that re-quotes the work left; the new price waits on the client, and the scope's history keeps both
Schedule and forecastsA due date per deliverable, and a forecast date from how long the same steps took before, with how sure it is
Requests to the clientItems the work needs, with a due date and reminders; the case's clocks and service levels pause while the client owes them
Document intakeFiles the client sends are read into typed fields, each stamped Inferred and checked by the step's review before the work uses it
Time captureTime logged against each task by the people who did it, approved, and billed against a retainer or an hourly cap
Recurring serviceAn engagement that renews each period, such as a monthly close, with each period's deliverables made from one template
Close-outThe last invoice, a handoff packet to the client, and every record kept under its retention and legal hold
How it is pricedCharged whenGrade it may sell
FixedOnce, on acceptance of the wholeUp to confirmed
MilestonesAs the engagement enters each state the Offer namesUp to measured, each milestone on its own acceptance
RetainerEach month, with the hours it includes and an hourly rate past themUp to graded
Capped time and materialsHours captured and approved, up to the capUp to graded
ContingencyA share of an amount the record holds, such as a sum recoveredconfirmed, from an outside party's record
Recurring serviceEach period, on acceptance of its deliverablesUp to measured

The assurance grade rule holds: a price model never sells a grade its checks do not earn, and the publish is refused with grade_unearned.

Example

The filings product sells a year of filings by milestones. Starting asks the client for two documents, and the clocks wait for them.

definition.ts
23 lines
import { define } from 'apis.dev'

/** A year of annual reports for each client, filed by people under a licensed supervisor. */
export default define({
  name: 'filings', domain: 'filings.apis.dev',
  Engagement: {
    client: 'string', scope: 'markdown', reports: '<-Report.engagement',
    stage: {
      propose: [], accept: 'proposed',
      start: { in: 'accepted', ask: { items: ['articles', 'agent address'], within: '7d', pause: true } },
      change: { in: 'started', requote: true },        // a change order, re-quoted
      close: ['started', 'changed'],
    },
  },
  Report: {
    engagement: '->Engagement.reports', form: 'file?',
    status: { draft: [], review: 'drafted', revise: 'reviewed', approve: ['reviewed', 'revised'] },
  },
  offer: {
    'Engagement.propose': { milestones: { started: 500, closed: 1500 }, accept: 'customer', remedy: 'redo' },
    'Report.draft': 0, 'Report.review': 0, 'Report.revise': 0, 'Report.approve': 0,
  },
})

The client's agent reads the engagement while the work waits on it.

Response
HTTP/1.1 200 OK
Content-Type: application/json
X-Cost: price=0, currency="USD"
X-Request-Id: req_3d8e1f60a2c74b95e7a1

{
  "id": "engagement_1",
  "stage": "started",
  "waiting": "customer",
  "ask": {
    "items": [
      { "name": "articles", "received": true },
      { "name": "agent address", "received": false }
    ],
    "due": "2026-11-03T00:00:00Z",
    "clocks": "paused"
  },
  "reports": ["report_1", "report_2"],
  "forecast": "2026-11-14"
}

Engagements, deliverables and requests, state by state

Every move is a Verb the client, its agent or your team makes, and each writes its Event.

ThingStatesWhat moves it
An engagementproposed, accepted, started, changed, then closed; or declined, cancelled; waiting on the customer while a request is openThe client's acceptance, the moves the file declares, a cancel under the agreement's terms
A deliverabledrafting, in_review, revising, then accepted or rejected and remediedThe step that drafts it, the client's review rounds, and the remedy the Offer names
A change orderproposed, then accepted or declinedYour team or the client proposes; the client accepts the new price, and nothing it adds runs before
A request to the clientsent, partial, then received, overdue or waivedEach item the client sends; reminders by its channels; your team waives an item
A time entrylogged, approved, then billed or written_offThe person who did the work, a reviewer, the next invoice
A period of recurring serviceopen, delivered, accepted, invoicedThe period's template, its deliverables and the client's acceptance

What clients, your team and agents meet

  • A client. One place for the scope, the schedule, each deliverable's versions and every request it owes, with a date it can trust.
  • The client's agent. It accepts a proposal, sends documents, reviews a deliverable and approves a change order, all by Verb.
  • Your team. Requests that chase themselves, clocks that stop while the client is late, and a forecast built from your own history.
  • Finance on both sides. Each charge tied to an accepted deliverable, a milestone or approved hours, on a signed receipt.

An engagement sells work over time on the same Verbs as one order, so each deliverable, change and charge is accepted on its own.