Audience: Product, Legal, Developers
Outcomes: Consistent schemas, predictable IDs
Core fields (reference)
Field | Type | Required | Example |
title | string | ✓ | “Design SOW” |
description | string | ✓ | short scope |
contractType | string | ✓ | service_agreement, msa, nda |
currency | ISO-4217 | ✓ | USD |
amount/value | integer/decimal | ✓ | 150000 (minor) |
terms | object | — | payment / delivery |
paymentTerms | object | — | deposit, milestones |
parties | array | ✓ | emails or user IDs |
signers | array | — | signer objects |
references | array | — | PO #, quote # |
effectiveAt / expiresAt | timestamp | — | UTC ISO-8601 |
number | string (auto) | — | NXT-<ts>-<rand> |
Identifiers & numbering
Internal ID:
ct_<id>
Human number (default):
NXT-<timestamp>-<random>
(overrideable policy)Always attach a business reference (PO, Opportunity ID) for reconciliation
Attachments
Appendices/exhibits stored separately; version-pinned into the contract bundle at signature
Edge cases
Zero-decimal currencies (e.g., JPY) ⇒ store/display without /100
Contract currency vs. settlement currency (crypto) ⇒ store conversion rate used
QA checklist
Number is immutable post-issuance
Exhibit hash present in bundle metadata
API rejects non-ISO currency codes
Runbook: “Wrong contract number sequence”
Fix policy in Admin for future numbers; do not change existing numbers