Post-job feedback collection from both sides — posters rate contractors, contractors rate homeowners, and admins analyze sentiment & trends.
PosterFeedbackPrompt screen
useFeedback(jobId) · onSelectRating callback
PosterDetailedReview screen
submitReview mutation · uploadPhotos · createTip
ContractorFeedbackPrompt screen
submitPosterReview mutation · onChipToggle callback
NPSSurveyScreen screen
useNPS(userId) · submitNPS mutation · follow-up varies by score
SurveyBuilder screen
useSurveys() · createSurvey / updateSurvey mutations · drag-to-reorder
FeedbackAnalytics screen
useFeedbackAnalytics() · aggregateRatings / getNPSTrend queries
FeedbackDetail screen
getFeedbackDetail query · flagFeedback / respondPublicly mutations
FeedbackThankYou screen
useFeedbackMilestones() · shareReview action · navigateHome
_id — Convex document IDjobId — v.id("jobs")reviewerId — v.id("users")revieweeId — v.id("users")reviewerRole — "poster" | "contractor"overallRating — 1-5 stars (overall average)categoryRatings — { quality, communication, timeliness, value }emotionTag — "excellent" | "good" | "fair" | "poor"text — Written review (max 1,000 chars)photos — Array of storage IDswouldHireAgain — Boolean (poster only)tipAmount — Optional tip in centscontractorTags — Array of category chips (contractor only)isFlagged — Boolean, admin flaggedpublicResponse — Admin response text_creationTime — Auto timestamp_id — Convex document IDtitle — Survey namestatus — "draft" | "published" | "archived"targetAudience — "all" | "posters" | "contractors"questions — Array of { type, title, options? }createdBy — v.id("adminUsers")_creationTime — Auto timestamp_id — Convex document IDuserId — v.id("users")score — 0-10 NPS scorecategory — "detractor" | "passive" | "promoter"followUpTags — Array of selected chipscomment — Optional freeform text_creationTime — Auto timestampgetFeedbackForJob — Both sides’ feedback for a specific jobgetFeedbackDetail — Single feedback with full data + job contextaggregateRatings — Category averages over configurable time rangegetNPSTrend — NPS score moving average by periodgetFeedbackAnalytics — Response rates, sentiment keywords, category breakdownlistSurveys — Admin survey list with status filtersgetSurveyResponses — Aggregated results for a published surveysubmitPosterFeedback — Poster review with categories, text, photos, tipsubmitContractorFeedback — Contractor rating with tags and notessubmitNPS — NPS score + follow-up tags + commentcreateSurvey — Admin creates survey with questions arrayupdateSurvey — Edit questions, reorder, publishflagFeedback — Admin flags feedback for reviewrespondPublicly — Admin posts public response to feedbackremoveFeedback — Admin soft-delete (retains data)useFeedback(jobId) — Feedback state for a specific job (both sides)useNPS(userId) — NPS survey state & submissionuseSurveys() — Admin survey CRUD operationsuseFeedbackAnalytics() — Analytics aggregations & trendsuseFeedbackMilestones() — Badge progress & reward trackingPosterFeedbackPrompt — app/(poster)/feedback/rate.tsxPosterDetailedReview — app/(poster)/feedback/details.tsxContractorFeedbackPrompt — app/(contractor)/feedback/rate.tsxNPSSurveyScreen — app/feedback/nps.tsx (shared route)SurveyBuilder — app/(admin)/surveys/builder.tsxFeedbackAnalytics — app/(admin)/feedback/analytics.tsxFeedbackDetail — app/(admin)/feedback/[id].tsxFeedbackThankYou — app/feedback/thank-you.tsxonJobCompleted — Trigger feedback prompt 2h after completiononFeedbackSubmitted — Queue NPS survey 24h after feedbackonNPSDetractor — Alert ops_alerts Slack channel for scores ≤6onMilestoneReached — Award badge & send congratulations email