Overview
CommunityPay's electronic signature system (SimpleSign) provides signature workflows for governance documents — board resolutions, vendor contracts, compliance notices, and financial documents. Every document is protected by SHA-256 content hashing, and every action in the signing lifecycle is recorded in an audit trail whose hash is sealed in the certificate of completion.
Document Integrity
SHA-256 File Hashing
Every document uploaded to the system receives a SHA-256 hash computed from the raw file content. This hash is stored on the Document record and serves two purposes:
- Tamper detection: Any modification to the document after upload will produce a different hash
- Chain of custody: The hash links the signed version to the exact content that was presented to signers
Document Types
The system supports 11 document types for association governance:
| Type | Purpose |
|---|---|
| Contract | Vendor and service agreements |
| Resolution | Board resolutions requiring formal vote |
| Agreement | General agreements between parties |
| Form | Standardized forms |
| Notice | Official notices to owners |
| Violation | Violation notices requiring acknowledgment |
| ARC Request | Architectural review committee requests |
| Meeting Minutes | Board meeting minutes requiring attestation |
| Budget | Budget documents requiring board approval |
| Policy | Policy documents requiring adoption |
| Other | Any other document |
Signature Request Workflow
Document Lifecycle
Draft -> Pending Signatures -> Partially Signed -> Completed
-> Declined
-> Expired
-> Voided
Role-Based Signing
Each signature request specifies a signer role from 11 roles:
- Board President, Board Member, Board Secretary, Board Treasurer
- Property Manager, Homeowner, Vendor, Contractor
- Witness, Notary, Other
Signing Order Enforcement
When enforce_signing_order is enabled on a document, the system prevents out-of-sequence signing:
- Each
SignatureRequesthas asigning_orderinteger - The
can_signproperty checks that all previous signers (lower order numbers) have statussigned - If any predecessor has not signed, the current signer cannot proceed
This is essential for governance documents where the board president must sign before the secretary certifies, or where a vendor must countersign after the board approves.
Signer Authentication
Each signature request carries a unique access link, sent to the signer's email address. The link is the credential: a request is found by its token, and a link that is invalid, expired, declined, or voided never reaches the signing page.
The request records an authentication method, and the signing flow uses email. The setting also names SMS code, access code, knowledge-based authentication, ID verification, and none; those values are recorded on the request and the signing flow does not enforce them. Only the email link is enforced at signing today.
Signature Capture
The Signature model records each signature and the metadata around it.
Signature Types
- Hand drawn (canvas capture)
- Typed (the signer's typed name, affirmed at signing)
The signing page accepts those two types. The record also has room for an uploaded image, a digital certificate, and an organizational stamp; the signing page does not accept them.
Recorded With Every Signature
- IP address: Network origin of the signing event
- User agent: Browser and device identification
- Typed name: The full legal name the signer types and affirms, stored for drawn signatures as well as typed ones
- Consent and intent to sign: Recorded as affirmed when the signature is submitted
- Timestamp: Server-side timestamp
The record also carries fields for geographic location, signature biometrics, and an external time-stamping authority. The signing page does not populate them, and the browser's geolocation is disabled by policy.
Audit Trail
The AuditLog model records 17 distinct action types across the document lifecycle:
| Action | Description |
|---|---|
created |
Document created in system |
uploaded |
Document file uploaded |
sent |
Signature requests dispatched |
viewed |
Document viewed by signer |
signed |
Signature completed |
completed |
All signatures collected |
declined |
Signer declined to sign |
voided |
Document voided by creator |
expired |
Document reached expiration |
downloaded |
Document downloaded |
reminder_sent |
Signing reminder dispatched |
field_filled |
Form field completed |
authentication |
Authentication attempt |
access_granted |
Access verified |
access_denied |
Access rejected |
modified |
Document metadata changed |
deleted |
Document removed |
Every audit entry records the user, signature request (if applicable), action details (JSON), IP address, user agent, and server timestamp.
Certificate of Completion
When all signatures are collected, the system generates a CertificateOfCompletion:
- Certificate number: Unique identifier for the certified document
- Summary: Human-readable summary of the signing events
- Signatures data: JSON snapshot of all signature metadata
- Audit trail hash: SHA-256 hash of the audit trail at the time of certification. It covers each entry's action, timestamp, signer email, and IP address, in time order, so a later change to any of those four fields no longer matches the sealed hash. Other fields of an entry, such as the user agent and the action details, are not in the hash
- Certificate PDF: Generated document stored alongside the original
Document Templates
The DocumentTemplate system provides reusable templates across 8 categories (Board, Vendor, Homeowner, Compliance, Financial, Maintenance, Legal, Other) with:
- Pre-defined signature field placements
- Merge field mappings for dynamic content
- Per-community or public availability
- Usage tracking for template analytics
How CommunityPay Enforces This
- Every document receives a SHA-256 file hash at upload for tamper detection
- Signing order enforcement prevents out-of-sequence signatures when enabled
- Each signer is identified by a unique signing link sent to their email address, and the method is recorded on every request
- Certificate of Completion includes audit trail hash for integrity verification