Skip to main content

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:

ReasonDescriptionCommon For
spamPromotional or repetitive contentLines, Reviews
harassmentBullying or targeted abuseLines, Reviews, Users
hate_speechDiscriminatory or hateful contentLines, Reviews, Users
misinformationFalse or misleading informationReviews
inappropriateViolates community guidelinesLines, Reviews
otherIssue not covered by other categoriesAny

Report Statuses

StatusDescriptionNext Action
pendingAwaiting admin reviewReview and action
reviewedReviewed, no action neededNone (closed)
action_takenContent hidden or user actionedNone (closed)
dismissedReport invalid or incorrectNone (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, dismissed
  • notes - 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:

  1. Hide reported content
  2. Warn the user
  3. Note in user's record
  4. 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:

  1. Review all reports together
  2. Look for common themes
  3. Assess if coordinated or legitimate
  4. Make one decision for all
  5. Update all related reports

Conflicting Reports

Situation: Content has reports both supporting and opposing it.

Approach:

  1. Focus on guidelines, not popularity
  2. Review content objectively
  3. Consider multiple perspectives
  4. Document reasoning clearly
  5. Accept that some will disagree

Reporter Abuse

Situation: User is filing many invalid reports.

Approach:

  1. Track reporter's report history
  2. Look for patterns of abuse
  3. Dismiss invalid reports
  4. Consider warning the reporter
  5. May restrict reporting privileges (future)

Borderline Cases

Situation: Content is questionable but unclear.

Approach:

  1. Discuss with other admins
  2. Review similar past cases
  3. Consider community impact
  4. Err on side of allowing (generally)
  5. 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;

Next Steps