User Reports
Handle user-submitted reports of content and behavior that violates community guidelines.
Overview
Users can report three types of targets:
- Lines - Shared book quotes/passages
- Reviews - Book reviews
- Users - User profiles/behavior
Reports are the primary mechanism for community-driven moderation on BookWish.
Report System
Report Reasons
Users can report content for these reasons:
| Reason | Description | Common For |
|---|---|---|
| spam | Promotional or repetitive content | Lines, Reviews |
| harassment | Bullying or targeted abuse | Lines, Reviews, Users |
| hate_speech | Discriminatory or hateful content | Lines, Reviews, Users |
| misinformation | False or misleading information | Reviews |
| inappropriate | Violates community guidelines | Lines, Reviews |
| other | Issue not covered by other categories | Any |
Report Statuses
| Status | Description | Next Action |
|---|---|---|
| pending | Awaiting admin review | Review and action |
| reviewed | Reviewed, no action needed | None (closed) |
| action_taken | Content hidden or user actioned | None (closed) |
| dismissed | Report invalid or incorrect | None (closed) |
Viewing Reports
List All Reports
API Endpoint:
GET /api/admin/reports
Authorization: Bearer <admin_token>
Response:
{
"reports": [
{
"id": "report_123",
"status": "pending",
"reason": "harassment",
"details": "User is targeting me in multiple posts",
"createdAt": "2025-12-08T10:30:00Z",
"reporter": {
"id": "user_abc",
"username": "reader123",
"displayName": "Book Reader"
},
"reportedLine": {
"id": "line_xyz",
"content": "...",
"userId": "user_def"
},
"reportedReview": null,
"reportedUser": null
}
]
}
Filter by Status
Pending Reports Only:
GET /api/admin/reports?status=pending
Authorization: Bearer <admin_token>
Other Filters:
?status=reviewed- Closed reports, no action?status=action_taken- Reports where action was taken?status=dismissed- Dismissed reports
Reviewing Reports
Review Process
Step 1: Gather Information
- Read the report reason and details
- View the reported content (if line/review)
- Check reporter's history (frequent reporter?)
- Review reported user's history (repeat offender?)
Step 2: Evaluate Content
- Does it violate community guidelines?
- Is the report valid and accurate?
- What's the severity of the violation?
- Is context being considered?
Step 3: Check Patterns
- Are there other reports on this content?
- Does the reported user have prior violations?
- Is the reporter filing many reports?
- Are there related incidents?
Step 4: Decide Action
- Hide content (if guidelines violated)
- Dismiss report (if no violation)
- Warn user (if borderline or first offense)
- Escalate (if serious or unclear)
Step 5: Document Decision
- Set appropriate status
- Add detailed notes
- Record action taken
- Update related systems
Reviewing a Report
API Endpoint:
PUT /api/admin/reports/:reportId
Authorization: Bearer <admin_token>
Content-Type: application/json
{
"status": "action_taken",
"notes": "Content hidden for violating harassment policy. User warned."
}
Required Fields:
status- One of:reviewed,action_taken,dismissednotes- Explanation of decision (optional but recommended)
Response:
{
"report": {
"id": "report_123",
"status": "action_taken",
"resolutionNotes": "Content hidden for violating harassment policy. User warned.",
"reviewedAt": "2025-12-08T11:00:00Z",
"reviewedBy": {
"id": "admin_123",
"username": "admin_jane",
"displayName": "Admin Jane"
}
}
}
Action Types
Action Taken
When to Use:
- Content was hidden
- User was warned or suspended
- Guideline violation confirmed
- Action was necessary
Typical Actions:
- Hide reported content
- Warn the user
- Note in user's record
- Set status to
action_taken
Example:
# Step 1: Hide the content
curl -X PUT https://api.bookwish.com/api/admin/content/line/line_xyz/hide \
-H "Authorization: Bearer <admin_token>"
# Step 2: Review the report
curl -X PUT https://api.bookwish.com/api/admin/reports/report_123 \
-H "Authorization: Bearer <admin_token>" \
-H "Content-Type: application/json" \
-d '{
"status": "action_taken",
"notes": "Line hidden for harassment. User warned via email."
}'
Reviewed (No Action)
When to Use:
- Content reviewed but doesn't violate guidelines
- Report was accurate but content is borderline
- Decided not to take action
- Issue resolved without moderation
Example:
{
"status": "reviewed",
"notes": "Content reviewed. While negative, it does not violate harassment policy as it criticizes the book, not a person."
}
Dismissed
When to Use:
- Report is clearly invalid
- Reporter misunderstood guidelines
- Content doesn't match report reason
- Reporter appears to be abusing system
Example:
{
"status": "dismissed",
"notes": "Report dismissed. Content is a negative book review, which is allowed. Reporter appears to be the book's author."
}
Report Types
Line Reports
Common Issues:
- Spam (repetitive quotes)
- Offensive content (out of context)
- Harassment (targeting someone)
- Inappropriate material
Review Considerations:
- Is it a legitimate book quote?
- Is context being considered?
- Is it spam or genuine sharing?
- Does it target a specific person?
Review Reports
Common Issues:
- Fake/spam reviews
- Harassment of authors
- Misinformation
- Off-topic content
Review Considerations:
- Negative reviews are allowed
- Criticism vs. personal attack
- Review authenticity
- Spoiler handling
User Reports
Common Issues:
- Harassment patterns
- Multiple guideline violations
- Impersonation
- Coordinated abuse
Review Considerations:
- Look at user's full history
- Check for pattern of violations
- Consider account-level action
- See User Management
Handling Difficult Reports
Multiple Reports on Same Content
Situation: Single piece of content has many reports.
Approach:
- Review all reports together
- Look for common themes
- Assess if coordinated or legitimate
- Make one decision for all
- Update all related reports
Conflicting Reports
Situation: Content has reports both supporting and opposing it.
Approach:
- Focus on guidelines, not popularity
- Review content objectively
- Consider multiple perspectives
- Document reasoning clearly
- Accept that some will disagree
Reporter Abuse
Situation: User is filing many invalid reports.
Approach:
- Track reporter's report history
- Look for patterns of abuse
- Dismiss invalid reports
- Consider warning the reporter
- May restrict reporting privileges (future)
Borderline Cases
Situation: Content is questionable but unclear.
Approach:
- Discuss with other admins
- Review similar past cases
- Consider community impact
- Err on side of allowing (generally)
- Document for guideline clarification
Best Practices
Response Time
Target Response Times:
- Critical reports (threats, doxxing): < 1 hour
- High-severity (harassment, hate): < 4 hours
- Standard reports: < 24 hours
- Low-priority: < 48 hours
Documentation
Always Document:
- Reasoning for decision
- Guidelines referenced
- Related reports or patterns
- Actions taken
- Context considered
Good Documentation Example:
Status: action_taken
Notes: Content hidden for harassment (Community Guideline 3.2). User's line targeted another user by username and contained threatening language. User has 1 prior warning for similar behavior (see report #456). User emailed warning and given 7-day post restriction.
Consistency
Maintain Consistency:
- Apply guidelines uniformly
- Review similar cases similarly
- Don't favor certain users
- Document exceptions and why
Regular Review:
- Weekly team meetings
- Discuss borderline cases
- Align on guideline interpretation
- Share challenging examples
Communication
With Reporters:
- Thank them for reporting (automated)
- Don't share specific actions taken
- Maintain reporter privacy
- Provide feedback on invalid reports (if pattern)
With Reported Users:
- Explain violation clearly
- Reference specific guidelines
- Outline consequences
- Provide path to appeal (future)
Report Analytics
Metrics to Track
Report Volume:
- Total reports per day/week/month
- Reports by type (line/review/user)
- Reports by reason
- Reports by status
Response Performance:
- Average time to first review
- Percentage actioned vs. dismissed
- Reports per admin
- Backlog size
Content Health:
- Report rate (reports per content item)
- Repeat offender rate
- False positive rate
- Appeal success rate (future)
Using Analytics
Identify Trends:
- Spike in certain report types
- Increasing/decreasing report volume
- Seasonal patterns
- Platform health indicators
Improve Moderation:
- Find bottlenecks
- Adjust team coverage
- Refine guidelines
- Train on common issues
Database Queries
Find Pending Reports
SELECT * FROM reports
WHERE status = 'pending'
ORDER BY created_at ASC;
Find High-Priority Reports
SELECT r.*, COUNT(r2.id) as related_reports
FROM reports r
LEFT JOIN reports r2 ON r.reported_line_id = r2.reported_line_id
AND r2.id != r.id
WHERE r.status = 'pending'
AND r.reason IN ('harassment', 'hate_speech')
GROUP BY r.id
ORDER BY related_reports DESC, r.created_at ASC;
Find Frequent Reporters
SELECT reporter_user_id, COUNT(*) as report_count
FROM reports
WHERE created_at >= NOW() - INTERVAL '30 days'
GROUP BY reporter_user_id
HAVING COUNT(*) >= 10
ORDER BY report_count DESC;