Skip to content

Extracting Termination Clauses From a Contract

10 min read · updated August 11, 2026

A termination section contains several independent rights with different holders, different triggers and different notice. Extracted as one clause with one notice period, it produces a number that is right for one of them and wrong for the rest.

Two different rights in one clause

The basic split is for cause and for convenience, and they are not variations of one thing. Termination for cause is conditional: it requires a trigger, usually a material breach, and it usually requires the other party to be given a chance to fix it. Termination for convenience is unconditional: a party may end the agreement for no reason at all, on notice.

Because they are unconditional, convenience rights are often asymmetric — held by one party and not the other — and often carry a longer notice period than cause. So the two facts “this agreement can be terminated on 30 days’ notice” and “this agreement can be terminated on 90 days’ notice” are both true of the same contract and neither is the answer on its own.

The extraction unit is therefore a termination right, and a contract has a list of them. Each right has a holder (which party, or both), a kind, a trigger, a notice requirement and an effect. A model asked for “the termination clause” returns a paragraph; a model asked for an array of rights with those fields has to enumerate, and enumeration is what makes the output usable.

Notice period and cure period are not the same number

This is the specific error the document invites. A typical for-cause sentence reads: either party may terminate this Agreement if the other materially breaches and fails to cure such breach within thirty (30) days after written notice thereof.

There is exactly one number in that sentence and it is a cure period, not a notice period. The notice referred to is notice of the breach, which starts the cure clock; termination itself may then be immediate, or may require its own separate notice, and the sentence does not always say which. An extraction that fills noticePeriodDays with thirty has recorded the wrong quantity under a name that will be trusted downstream.

The grammatical discriminator is reliable and worth building on. A cure period attaches to the failure: fails to cure within, such breach is not remedied within, remains uncured for. A notice period attaches to the termination and is typically prepositional and forward-looking: upon sixty days’ prior written notice, by giving not less than, on at least. When both appear in one sentence there are two numbers and both belong in the output as separate fields; when only one appears, which field it goes in is decided by that phrasing and not by position.

A third quantity hides in the same neighbourhood: a wind-down or transition period after termination, during which obligations continue. It is also expressed in days, it is also near the word termination, and it belongs to the effect of termination rather than to the right.

Days, business days, and when the clock starts

A bare integer is not an extraction of a period. Three attributes travel with it and each changes the resulting date:

  • The unit. Days, business days, months. Thirty business days is roughly six weeks. Contracts mix them within one section, and business day is frequently a defined term with its own entry in the definitions, excluding public holidays in a named place.
  • The anchor. Notice periods run from when notice is given, but the notices clause — a different section entirely — commonly states when notice is deemed given: on personal delivery, on transmission, a stated number of days after posting. The effective deadline needs both clauses, so a termination extraction that ignores the notices clause is incomplete by construction.
  • The reference point. Convenience and non-renewal notice is often expressed relative to a moving target — not less than a stated period before the end of the then-current term — which cannot be resolved into a date without the term and renewal structure from the renewal clause. Store it as a relative expression with its anchor named, not as a date.

Store the numeral as written and the spelled-out form beside it. The doublet convention — thirty (30) — gives you two independent readings of the same quantity, and a disagreement between them is a genuine finding rather than an OCR artefact to be smoothed over. It happens in real documents when a period is amended by editing only one of the two.

The triggers that are not breach

Termination rights that have nothing to do with performance are easy to miss because they use none of the vocabulary a breach-focused prompt looks for, and they are frequently in a different subsection or a different section altogether:

  • Insolvency. Bankruptcy, receivership, assignment for the benefit of creditors, an inability to pay debts as they fall due. Often immediate, with no cure and no notice.
  • Non-payment. Frequently carved out of the general cure period with a shorter one of its own, and frequently living in the payment section rather than the termination section — so a section-scoped extraction never sees it. Cross-check against the payment terms.
  • Change of control. Triggered by a corporate event rather than by conduct, sometimes with an exception for reorganisations, sometimes only where the acquirer is a competitor.
  • Force majeure of extended duration. A right to terminate if a force majeure event continues beyond a stated period, living inside the force majeure clause with a number that looks like every other number in this page.
  • Regulatory or legal impossibility. A right arising if performance becomes unlawful.

The practical instruction is that termination extraction cannot be scoped to the section named “Termination”. Run the clause classifier over the whole document and let the section heading be one feature among several, because at least two of the triggers above are reliably somewhere else.

A schema that survives all of it

{
  "terminationRights": [
    {
      "id": "cause-material-breach",
      "holder": "either",              // "customer" | "supplier" | "either"
      "kind": "for_cause",             // for_cause | convenience | insolvency
                                       // | change_of_control | non_payment
                                       // | force_majeure | other
      "trigger": "material breach of this Agreement",
      "curePeriod":  { "value": 30, "unit": "days", "raw": "thirty (30) days" },
      "noticePeriod": null,            // null = not stated, not zero
      "noticeMethod": "written",
      "sourceSection": "12.2",
      "sourceText": "Either party may terminate ..."
    },
    {
      "id": "convenience-customer",
      "holder": "customer",
      "kind": "convenience",
      "trigger": null,
      "curePeriod": null,
      "noticePeriod": { "value": 90, "unit": "days", "raw": "ninety (90) days" },
      "noticeMethod": "written",
      "sourceSection": "12.3",
      "sourceText": "Customer may terminate ..."
    }
  ],
  "survivingSections": ["7", "9", "11", "14"],
  "findings": ["no_convenience_right_for_supplier"]
}

Two details in there are load-bearing. noticePeriod being null rather than zero preserves the difference between a clause that is silent and a clause that permits immediate termination, which are different documents. And sourceSection with sourceText is what makes the output reviewable: a reviewer checking twelve rights needs to land on the sentence, not to re-read the contract. Everything about how that review queue is built and sampled belongs to review sampling rather than to this page. What this page owes it is an output shape where a wrong answer is visible in one line.