How to manually sync escrow status
Zendesk/Intercom-grade helpdesk for managing poster and contractor support requests with AI-assisted resolution
_id: Id<"supportTickets">
ticketNumber: string // "TK-1847"
subject: string
description: string
status: "open" | "in_progress" | "escalated" | "resolved" | "closed"
priority: "low" | "medium" | "high" | "urgent"
category: "payments" | "onboarding" | "disputes" | "technical" | "general"
reporterType: "poster" | "contractor"
reporterId: Id<"posterUsers"> | Id<"contractorUsers">
assignedAgentId: Id<"adminUsers"> | undefined
relatedJobId: Id<"jobs"> | undefined
relatedContractId: Id<"contracts"> | undefined
tags: string[]
slaDeadline: number // timestamp
firstResponseAt: number | undefined
resolvedAt: number | undefined
mergedInto: Id<"supportTickets"> | undefined
attachments: Id<"_storage">[]
_id: Id<"ticketMessages">
ticketId: Id<"supportTickets">
senderType: "poster" | "contractor" | "agent" | "system" | "ai"
senderId: string
body: string
isInternal: boolean // internal notes
attachments: Id<"_storage">[]
cannedResponseId: string | undefined
_id: Id<"ticketEscalations">
ticketId: Id<"supportTickets">
reason: "technical" | "billing" | "dispute" | "legal"
fromAgentId: Id<"adminUsers">
toTeam: string
toAgentId: Id<"adminUsers"> | undefined
priorityOverride: string | undefined
notes: string
slackAlertSent: boolean
_id: Id<"knowledgeBase">
title: string
slug: string
category: string
body: string // markdown
steps: { title: string, body: string }[]
views: number
helpfulYes: number
helpfulNo: number
linkedTicketIds: Id<"supportTickets">[]
authorId: Id<"adminUsers">
isPublished: boolean
// Hooks
useTickets(filters): SupportTicket[]
useTicketDetail(ticketId): TicketDetail
useTicketMessages(ticketId): TicketMessage[]
useAISuggestions(ticketId, ctx): Suggestion[]
useSLAMetrics(dateRange): SLAMetrics
useBreachedTickets(): SupportTicket[]
useTrendingIssues(): TrendingIssue[]
useKBArticles(search, cat): KBArticle[]
useTicketBulk(ids): BulkState
// Convex mutations
support.createTicket(args)
support.updateTicket(ticketId, fields)
support.assignTicket(ticketId, agentId)
support.sendMessage(ticketId, body, attachments)
support.escalateTicket(ticketId, reason, team, notes)
support.batchAssign(ticketIds, agentId)
support.batchClose(ticketIds, templateId)
support.mergeTickets(sourceId, targetId)
support.resolveTicket(ticketId, resolution)
kb.createArticle(title, body, steps)
kb.linkArticleToTicket(articleId, ticketId)
// Actions
ai.generateSuggestions(ticketId) // Gemini 3 Flash
ai.findSimilarTickets(ticketId)
slack.sendEscalationAlert(ticketId) // #ops_alerts