End-to-end document lifecycle: templates, signing workflows, tracking, and analytics for platform contracts
documents {
_id: Id<"documents">
templateId: Id<"documentTemplates">
title: string
status: "draft" | "sent" | "viewed" | "partially_signed" | "completed" | "expired" | "voided"
jobId: Id<"jobs">
createdBy: Id<"adminUsers">
fileUrl: string
fileSizeBytes: number
expiresAt: number
docusealSubmissionId: string?
}
documentTemplates {
_id: Id<"documentTemplates">
name: string
status: "active" | "draft" | "archived"
sections: TemplateSection[]
mergeFields: string[]
usageCount: number
lastModifiedBy: Id<"adminUsers">
docusealTemplateId: number?
}
documentSignatures {
_id: Id<"documentSignatures">
documentId: Id<"documents">
signerName: string
signerEmail: string
role: "poster" | "contractor" | "platform"
order: number
status: "pending" | "sent" | "viewed" | "signed"
signedAt: number?
viewedAt: number?
reminderCount: number
lastReminderAt: number?
}
// Queries
api.documents.list({ status?, search?, page })
api.documents.getById({ documentId })
api.documents.stats()
api.documents.analytics({ dateRange })
api.documents.templates.list({ status? })
api.documents.templates.rankings()
api.documents.signing.pending()
api.documents.signing.status({ documentId })
// Mutations
api.documents.create({ templateId, jobId, parties })
api.documents.bulkAction({ ids, action })
api.documents.templates.update({ id, sections })
api.documents.signing.send({ documentId, parties, reminders })
api.documents.signing.nudge({ signatureId })
// Hooks
useDocuments() → { docs, stats, isLoading }
useDocumentDetail(id) → { doc, signatures }
useTemplates() → { templates, create, update }
useSigningFlow() → { send, nudge, status }
useDocumentAnalytics() → { metrics, charts }
useBulkSelect() → { selected, toggle, actions }
// Components
DocumentCard — doc summary row
TemplateCard — template with actions
SectionBlock — draggable builder block
MergeFieldChip — insertable merge tag
PartyRow — signing party with status
SignatureStatusRow — per-party sig state
TrackingRow — pending sig with nudge
StatusChart — horizontal bar chart
TrendChart — monthly bar chart
// DocuSeal (e-signatures)
createSubmission({ templateId, submitters })
getSubmission({ submissionId })
webhooks: form.completed, form.viewed
// SendGrid (notifications)
signing_request — initial send email
signing_reminder — nudge email
signing_completed — all-signed confirmation
document_expired — expiry notice
// Slack Alerts
ops_alerts: overdue signatures
admin_alerts: document expired/voided
// Convex Storage
documents/* — signed PDFs
templates/* — template source files