Triage
Ticket Queue
9:41
Support
18
Open
7
In Progress
3
Escalated
12
Resolved Today
All28 Open18 In Progress7 Escalated3 Resolved
Payment charged but escrow not funded
Poster Sarah Mitchell
Contractor not responding after contract signed
Poster James Wilson
How do I update my service area?
Contractor Mike's Plumbing LLC
Feature request: bulk bid submission
Contractor Summit Roofing Co.
Unable to upload insurance documents
Contractor Ohio Electric Pro
AdminTicketQueue screen
useTickets(filters), onPress navigates to TicketDetail
Ticket Detail
9:41
#TK-1847
Payment charged but escrow not funded
Opened Feb 24, 2026 at 5:22 AM
Reporter
Sarah Mitchell
sarah.m@email.com
Poster
Category Payments
Priority
Urgent
Status In Progress
Assigned
MK
Maria Kim
SLA 2h remaining
Description
I was charged $2,450 on my credit card for a bathroom remodel project, but the escrow status still shows "Pending." The contractor says they can't start work until escrow is funded. It's been over 24 hours since the charge appeared on my statement.
Attachments
cc-statement.png
receipt.pdf
Related
Internal Notes + Add Note
MK
Maria Kim
Checked Stripe dashboard — PaymentIntent pi_3Q... succeeded but webhook failed to fire. Manually triggering escrow update.
Today at 7:15 AM
AI
AI Auto-tag
Classified: Payment → Escrow Sync Issue. Similar to #TK-1790, #TK-1802.
Today at 5:23 AM
Reply to Reporter
Escalate
AdminTicketDetail screen
useTicketDetail(ticketId), onReply opens thread, onEscalate opens flow
Resolve
Conversation Thread
9:41
Conversation
SLA: 2h Payment charged but escrow not funded In Progress
SM
Sarah Mitchell · Poster
Hi, I was charged $2,450 on my card but the escrow still shows pending. What's going on?
5:22 AM
AI
Auto-Response
Thank you for reaching out, Sarah. We've received your ticket and an agent will review it shortly. Your ticket ID is #TK-1847.
5:22 AM
SM
Sarah Mitchell · Poster
Here's a screenshot of my credit card statement showing the charge.
cc-statement.png (342 KB)
5:25 AM
MK
Maria Kim · Support
Hi Sarah, I can see the charge went through on our end too. It looks like there was a webhook sync issue between our payment processor and escrow system. I'm resolving this manually now and your escrow should update within the next 30 minutes.
7:18 AM
SM
Sarah Mitchell · Poster
Thank you! Will the contractor be notified automatically when it updates?
7:24 AM
Escrow Updated Refund Initiated Need More Info Escalating
Type a reply...
AdminTicketThread screen
useTicketMessages(ticketId), onSend calls sendTicketMessage, AI icon opens suggestions
AI Suggested Responses
9:41
AI Assist
Suggested Responses
Gemini 3 Flash
Best Match
Yes, the contractor will receive an automatic notification via email and push notification as soon as the escrow status updates to "Funded." They'll be able to begin work after the standard 24-hour hold period. I'll also send them a direct message confirming the update.
94%
Alternative
Great question! Yes, once the escrow is funded the contractor gets notified automatically. The 24-hour hold period starts from the funding timestamp. Would you like me to also reach out to the contractor directly to give them a heads-up?
78%
Formal
The contractor will be automatically notified via our notification system once the escrow transitions to "Funded" status. Per our standard process, work may commence following the mandatory 24-hour hold period. No further action is required on your part.
61%
Similar Resolved Tickets
#TK-1802 — Escrow not updating after payment
Resolved Feb 20 · Webhook retry fixed it
#TK-1790 — Charge appeared but escrow pending
Resolved Feb 18 · Manual Stripe sync
#TK-1756 — Payment successful, project stuck
Resolved Feb 12 · Escrow status mismatch
AdminAISuggest sheet
useAISuggestions(ticketId, context), onUse inserts into reply, onEdit opens editable draft
Escalation Flow
9:41
Escalate Ticket
SLA breach in 1h 47m
Urgent tickets require resolution within 4 hours
Escalation Reason
Technical
System bugs, API failures, sync issues
Billing
Payment disputes, refunds, escrow problems
Dispute
Contractor-poster disagreements, quality issues
Legal
Contracts, liability, compliance matters
Assign To
Priority Override
Low Medium High Urgent
Notes
Stripe webhook for pi_3Q... failed to fire. Manual escrow sync resolved the funding issue, but root cause needs investigation by engineering team to prevent recurrence.
Escalate Ticket
AdminEscalateTicket sheet
useEscalation(ticketId), onEscalate calls escalateTicket mutation, triggers Slack alert
Monitor
Bulk Actions
9:41
4 Selected
2 possible duplicates detected
#TK-1845 and #TK-1832 — same reporter, similar subject
Merge
Tickets
Payment charged but escrow not funded
#TK-1847 · Sarah Mitchell · Urgent
Contractor not responding after contract
#TK-1846 · James Wilson · High
How do I update my service area?
#TK-1845 · Mike's Plumbing · Medium
Feature request: bulk bid submission
#TK-1844 · Summit Roofing · Low
Can't find my completed job reviews
#TK-1843 · Akron Home Co. · Low
Bid withdrawal not processing
#TK-1842 · Pro Painters OH · Medium
Tag Management
payments escrow onboarding billing feature-request bug
Batch Close Template
Batch Assign
Batch Close
AdminBulkTicketActions screen
useTicketBulk(selectedIds), onBatchAssign/onBatchClose call bulk mutations, onMerge merges duplicates
SLA Dashboard
9:41
SLA Metrics
86%
SLA Compliance
Response Times
Avg First Response
18 min
Target: 30m
Avg Resolution Time
3.2 hrs
Target: 4h
First Contact Resolution
42%
+8% WoW
Breached Tickets 3 Active
#TK-1839 — Refund not received
Overdue by 2h 15m
Urgent
#TK-1835 — Double charge on project
Overdue by 45m
High
#TK-1841 — Profile verification stuck
Overdue by 10m
Medium
By Category
Payments
72%
Onboarding
89%
Disputes
65%
Technical
95%
General
91%
Trending Issues This Week
Escrow sync failures
8 tickets this week (+300%)
Spike
Service area update issues
4 tickets this week (+50%)
Watch
AdminSLADashboard screen
useSLAMetrics(dateRange), useBreachedTickets(), useTrendingIssues() queries
Knowledge Base
9:41
Knowledge Base
Categories
Payments & Escrow
12 articles
Account & Onboarding
8 articles
Disputes & Resolutions
6 articles
Popular Articles
How to manually sync escrow status
Processing a partial refund via Stripe
Contractor service area update guide
Article Preview
How to manually sync escrow status
When a Stripe PaymentIntent succeeds but the webhook fails to fire, the escrow status can get stuck in "Pending." Follow these steps to manually resolve:
1
Verify payment in Stripe
Open the Stripe dashboard and search for the PaymentIntent ID. Confirm status is "succeeded" and amount matches.
2
Check Convex escrow record
In the Convex dashboard, find the escrow record by job ID. Note the current status field.
3
Trigger manual sync
Run the syncEscrowFromStripe internal action with the PaymentIntent ID. This re-processes the webhook payload.
Link to Ticket #TK-1847
Article Analytics
234
Views
92%
Helpful
18
Linked
AdminKnowledgeBase screen
useKBArticles(search, category), onLinkToTicket calls linkArticleToTicket mutation
Data Architecture

Schema: supportTickets

_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">[]

Schema: ticketMessages

_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

Schema: ticketEscalations

_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

Schema: knowledgeBase

_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 & Queries

// 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

Mutations & Actions

// 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
Queue & Ticket Detail
9:41

Ticket Queue & Ticket Detail

Ticket Queue
Queue Summary
Open 8
In Progress 4
Waiting on User 3
Resolved Today 12
Priority Breakdown
Critical 1
High 3
Medium 5
Low 2
Recent Tickets
#TKT-892 Payment not received — High
#TKT-891 Can't upload photos — Medium
#TKT-890 Account locked — Critical
Ticket Detail
Ticket #TKT-892
Subject Payment not received
User Sarah Johnson (Poster)
Priority High
Created 2h ago
SLA 4h remaining
Conversation
Sarah I funded escrow 3 days ago but the contractor says they haven't received payment.
System Escrow status: funded. Hold period: complete. First payout: processing.

AI Response & Escalation
9:41

AI Suggested Responses & Escalation Flow

AI Suggested Responses
Suggested Reply
Confidence 92%
Template Payment Processing Delay
Response Hi Sarah, I can see your escrow payment has cleared the hold period and the first payout is currently processing...
Alternative Suggestions
Escalate to Finance If payout stuck > 24h
Request Screenshot Ask for bank statement
Refund Path If error confirmed
Escalation Flow
Escalation Path
Level 1 Support Agent (current)
Level 2 Senior Support
Level 3 Finance Team
Level 4 Admin Review
Escalation Actions
Assign to Team Finance / Ops
Set Priority Critical
Add Internal Note Payment trace needed
Notify Slack #ops_alerts

SLA & Knowledge Base
9:41

SLA Dashboard & Knowledge Base

SLA Dashboard
SLA Performance
First Response 12min (target: 15min)
Resolution Time 4.2h (target: 8h)
CSAT Score 4.7/5
SLA Compliance 96%
Bulk Actions
Close Resolved 12 tickets
Reassign Select agent
Merge Duplicates 2 pairs found
Export Report CSV / PDF
Knowledge Base
Popular Articles
Payment FAQ 342 views
How Escrow Works 289 views
Getting Started 267 views
Dispute Resolution 198 views
KB Stats
Total Articles 48
Avg Helpfulness 87%
Deflection Rate 34%
Last Updated 2 days ago
Support Command Center
https://admin.3bids.io/support
3Bids Admin
admin.3bids.io
MAIN
Queue
AI Assist
Escalations
SLA
Knowledge Base
Reports
Settings
DA
Danny Admin
Platform Admin

Support Ticketing

8 Open Tickets 96% SLA
Overview
Dashboard
Complete support ticketing with real-time data, analytics, and management tools.
Quick Actions
Full desktop layout combines all mobile screens into a dense, actionable dashboard with sidebar navigation, data tables, charts, and management controls.
Web DashboardThis web view consolidates all mobile screens into a single responsive dashboard. Sidebar navigation replaces tab-based mobile flow, with data density optimized for desktop viewport.