Concepts
- A Contract is a template — content, placeholders, signature requirements. Tenant-scoped, reusable.
- A ContractUser is one instance of a contract assigned to a specific User or Contact. It carries the signature state, the rendered placeholder values, and the signed PDF.
- A Placeholder like
{{firstName}}is resolved at assignment time from the recipient’s profile + any custom fields you map.
Step 1 — Create a contract template
hash field — a unique fingerprint of the contract’s content. If you later edit the content materially, you’ll need to regenerate the hash via PATCH /api/v1/contracts/{id}/ask-resign (see below).
displayInProfile
When true, the contract automatically shows up in the profile of every User in the assigned Unit. They can self-serve a signature from their member dashboard. When false, contracts only appear after explicit assignment via Step 2.
Step 2 — Assign the contract to a member
user or contact is required (not both). For Contacts who haven’t yet become Users, contracts can still be assigned — they sign via a magic link.
Response:
Step 3 — Sign membership contract in advance
For the membership-defaults contract (configured on the tenant), there’s a shortcut endpoint that creates-or-fetches an unsigned ContractUser for the calling user:Step 4 — Bulk mark as signed (paper signatures)
For members who signed on paper, mark the contract complete without requiring a digital signature:COMPLETE, locks the record, and records the calling admin as signedBy. Useful for backfilling pre-Orgo contracts.
Step 5 — Apply admin default signature
For contracts that require an admin co-signature (after the member signs), Orgo can apply a pre-stored default admin signature in one call:- Validates a default signature exists for the tenant
- Validates the contract hasn’t already been admin-signed
- Sets the admin signature, locks the record, records the signature date
- Generates a signed PDF, uploads to S3
- Generates a contract certificate
Step 6 — Force re-signing after content changes
When you materially edit a Contract’s content, existing unsigned ContractUsers become stale (their placeholder values may no longer match). To regenerate the contract hash and cancel all unsigned instances:hash on the Contract and marks every unsigned ContractUser as canceled (with timestamps + canceledBy). Already-signed instances are untouched. The next assignment cycle generates fresh ContractUser instances with the new content.
Listing and reporting
Members with unsigned contracts
Member’s contracts in their profile
displayInProfile: true for groups they belong to.
Common gotchas
Placeholders rendered as `{{firstName}}` literally in the signed PDF
Placeholders rendered as `{{firstName}}` literally in the signed PDF
The resolution happens once when the ContractUser is created (or refreshed). If the member’s profile is missing
firstName, the placeholder is replaced with an empty string. Check the user’s profile first; for custom-field placeholders, ensure the field is mapped on the Contract template.Delete contract returns 409 — `contract has signed instances`
Delete contract returns 409 — `contract has signed instances`
Contract templates with any signed ContractUser cannot be deleted (audit trail). Either delete the signed instances first (rarely advised), archive the contract by setting
displayInProfile: false and unassigning, or simply leave it in place.The signed PDF is missing the admin signature
The signed PDF is missing the admin signature
use-default-signature requires the tenant to have a stored admin-signature image, configured under Settings → Branding → Default Signature. If missing, the endpoint returns 400. The admin signature appears next to the date on the rendered PDF.Can I attach attachments to a contract (annexes, riders)?
Can I attach attachments to a contract (annexes, riders)?
Not as separate fields. The convention is to embed annexes inline in the
content HTML or include them as external links. The signed-PDF generation captures whatever is in content.What to do next
- Onboard a new member — pair contract assignment with the adhesion success
- Handle webhooks —
contract_user.updatedfires on every signature - Manage local centers and permissions — scoping contracts per local center

