Analyzing Moderation and Flagging Activity Reports

Maintaining a healthy and inclusive community requires effective moderation, which can include reviewing flagged posts, analyzing moderator performance, and managing user content.

This guide contains a variety of SQL reports for Discourse designed to help analyze moderation-related activities.

In this topic you will find detailed Data Explorer queries for:

  • Flag resolution statistics.
  • Reviewable resolution percentages.
  • Moderator-specific performance metrics.
  • Insights into user flagging activity.
  • Comprehensive data of all flagged user, post, and topic actions

Post Flag Resolution Percentage by Type

SQL Query Explanation

This query calculates the percentage of resolutions (agreed, disagreed, deferred, deleted) for flagged posts, grouped by flag type.

-- [params]
-- date :start_date = 2024-01-01
-- date :end_date = 2025-01-01

WITH period_actions AS (
    SELECT pa.id,
           pa.post_action_type_id,
           pa.created_at,
           pa.agreed_at,
           pa.disagreed_at,
           pa.deferred_at,
           pa.agreed_by_id,
           pa.disagreed_by_id,
           pa.deferred_by_id,
           pa.deleted_at,
           pa.post_id,
           pa.user_id,
           COALESCE(pa.disagreed_at, pa.agreed_at, pa.deferred_at) AS responded_at,
           EXTRACT(EPOCH FROM (COALESCE(pa.disagreed_at, pa.agreed_at, pa.deferred_at) - pa.created_at)) / 60 AS time_to_resolution_minutes -- time to resolution in minutes
    FROM post_actions pa
    WHERE pa.post_action_type_id IN (3,4,6,7,8)
      AND pa.created_at >= :start_date
      AND pa.created_at <= :end_date
),
flag_types AS (
    SELECT pat.id,
           CASE 
               WHEN pat.id = 3 THEN 'off_topic'
               WHEN pat.id = 4 THEN 'inappropriate'
               WHEN pat.id = 6 THEN 'notify_user'
               WHEN pat.id = 7 THEN 'notify_moderators'
               WHEN pat.id = 8 THEN 'spam'
           END AS flag_type
    FROM post_action_types pat
),
flag_resolutions AS (
    SELECT
        pa.post_action_type_id,
        CASE 
            WHEN pa.agreed_at IS NOT NULL THEN 'agreed'
            WHEN pa.disagreed_at IS NOT NULL THEN 'disagreed'
            WHEN pa.deferred_at IS NOT NULL THEN 'deferred'
            WHEN pa.deleted_at IS NOT NULL THEN 'deleted'
        END AS resolution,
        COUNT(*) AS resolution_count
    FROM period_actions pa
    GROUP BY pa.post_action_type_id, resolution
),
flag_totals AS (
    SELECT
        pa.post_action_type_id,
        COUNT(*) AS total_flags
    FROM period_actions pa
    GROUP BY pa.post_action_type_id
),
resolution_percentages AS (
    SELECT
        fty.flag_type,
        fr.resolution,
        fr.resolution_count,
        ft.total_flags,
        ROUND((fr.resolution_count::decimal / ft.total_flags) * 100, 2) AS resolution_percentage
    FROM flag_resolutions fr
    JOIN flag_totals ft ON ft.post_action_type_id = fr.post_action_type_id
    JOIN flag_types fty ON fty.id = fr.post_action_type_id
),
pivoted_data AS (
    SELECT
        flag_type,
        MAX(CASE WHEN resolution = 'agreed' THEN resolution_percentage ELSE 0 END) AS agreed_percentage,
        MAX(CASE WHEN resolution = 'disagreed' THEN resolution_percentage ELSE 0 END) AS disagreed_percentage,
        MAX(CASE WHEN resolution = 'deferred' THEN resolution_percentage ELSE 0 END) AS deferred_percentage,
        MAX(CASE WHEN resolution = 'deleted' THEN resolution_percentage ELSE 0 END) AS deleted_percentage,
        MAX(CASE WHEN resolution = 'agreed' THEN resolution_count ELSE 0 END) AS agreed_count,
        MAX(CASE WHEN resolution = 'disagreed' THEN resolution_count ELSE 0 END) AS disagreed_count,
        MAX(CASE WHEN resolution = 'deferred' THEN resolution_count ELSE 0 END) AS deferred_count,
        MAX(CASE WHEN resolution = 'deleted' THEN resolution_count ELSE 0 END) AS deleted_count,
        MAX(total_flags) AS total_flags
    FROM resolution_percentages
    GROUP BY flag_type
)
SELECT
    flag_type,
    agreed_percentage,
    agreed_count,
    disagreed_percentage,
    disagreed_count,
    deferred_percentage,
    deferred_count,
    deleted_percentage,
    deleted_count,
    total_flags
FROM pivoted_data
ORDER BY flag_type

Parameters Used

  • :start_date: The start date for filtering flagged posts.
  • :end_date: The end date for filtering flagged posts.

CTEs Explanation

  1. period_actions: Filters flagged posts within the specified date range and calculates the time to resolution for each flag.
  2. flag_types: Maps flag type IDs to human-readable names (e.g., off-topic, inappropriate, spam).
  3. flag_resolutions: Groups flags by type and resolution (agreed, disagreed, deferred, deleted) and counts the occurrences of each resolution.
  4. flag_totals: Calculates the total number of flags for each flag type.
  5. resolution_percentages: Combines resolution counts and total flags to calculate the percentage of each resolution type for each flag type.
  6. pivoted_data: Pivots the data to display resolution percentages and counts in separate columns for each resolution type.

Results Explanation

The final result is a table showing:

  • Flag type (e.g., off-topic, spam).
  • Percentages and counts for each resolution type (agreed, disagreed, deferred, deleted).
  • Total flags for each flag type.

Example Results

Flag Type Agreed % Agreed Count Disagreed % Disagreed Count Deferred % Deferred Count Deleted % Deleted Count Total Flags
off_topic 50.00 25 30.00 15 10.00 5 10.00 5 50
spam 70.00 35 20.00 10 5.00 2 5.00 3 50

Reviewables Resolution Percentages

SQL Query Explanation

This query analyzes the resolution statuses of reviewable items (e.g., flagged posts) within a given date range. It calculates the percentage and count of each resolution status for each flag type.

-- [params]
-- date :start_date = 2024-01-01
-- date :end_date = 2025-01-01

WITH flag_data AS (
    SELECT
        r.type AS flag_type,
        r.status AS resolution_status,
        COUNT(*) AS flag_count
    FROM
        reviewables r
    WHERE
        r.created_at BETWEEN :start_date AND :end_date
    GROUP BY
        r.type,
        r.status
),
flag_totals AS (
    SELECT
        flag_type,
        SUM(flag_count) AS total_flags
    FROM
        flag_data
    GROUP BY
        flag_type
),
flag_percentages AS (
    SELECT
        fd.flag_type,
        fd.resolution_status,
        fd.flag_count,
        ROUND((fd.flag_count::decimal / ft.total_flags) * 100, 2) AS percentage
    FROM
        flag_data fd
    JOIN
        flag_totals ft
    ON
        fd.flag_type = ft.flag_type
)
SELECT
    fp.flag_type,
    -- Percentages
    COALESCE(MAX(CASE WHEN fp.resolution_status = 1 THEN fp.percentage END), 0) AS pending_percentage,
    COALESCE(MAX(CASE WHEN fp.resolution_status = 2 THEN fp.percentage END), 0) AS approved_percentage,
    COALESCE(MAX(CASE WHEN fp.resolution_status = 3 THEN fp.percentage END), 0) AS rejected_percentage,
    COALESCE(MAX(CASE WHEN fp.resolution_status = 4 THEN fp.percentage END), 0) AS ignored_percentage,
    COALESCE(MAX(CASE WHEN fp.resolution_status = 5 THEN fp.percentage END), 0) AS deleted_percentage,
    -- Counts
    COALESCE(MAX(CASE WHEN fp.resolution_status = 1 THEN fp.flag_count END), 0) AS pending_count,
    COALESCE(MAX(CASE WHEN fp.resolution_status = 2 THEN fp.flag_count END), 0) AS approved_count,
    COALESCE(MAX(CASE WHEN fp.resolution_status = 3 THEN fp.flag_count END), 0) AS rejected_count,
    COALESCE(MAX(CASE WHEN fp.resolution_status = 4 THEN fp.flag_count END), 0) AS ignored_count,
    COALESCE(MAX(CASE WHEN fp.resolution_status = 5 THEN fp.flag_count END), 0) AS deleted_count
FROM
    flag_percentages fp
GROUP BY
    fp.flag_type
ORDER BY
    fp.flag_type

Parameters Used

  • :start_date: The start date for filtering reviewables.
  • :end_date: The end date for filtering reviewables.

CTEs Explanation

  1. flag_data: Groups reviewables by flag type and resolution status, counting the occurrences of each combination.
  2. flag_totals: Calculates the total number of flags for each flag type.
  3. flag_percentages: Combines flag counts and totals to calculate the percentage of each resolution status for each flag type.

Results Explanation

The final result is a table showing:

  • Flag type.
  • Percentages and counts for each resolution status (pending, approved, rejected, ignored, deleted).

Example Results

Flag Type Pending % Pending Count Approved % Approved Count Rejected % Rejected Count Ignored % Ignored Count Deleted % Deleted Count
off_topic 20.00 10 50.00 25 10.00 5 10.00 5 10.00 5
spam 10.00 5 70.00 35 10.00 5 5.00 2 5.00 3

Moderator Flag Resolutions

SQL Query Explanation

This query provides insights into moderator activity by showing which moderators resolved flagged posts, the types of flags they handled, and the resolutions they applied. It calculates percentages and counts for each resolution type.

-- [params]
-- date :start_date = 2024-01-01
-- date :end_date = 2025-01-01
-- boolean :only_staff = false

WITH period_actions AS (
    SELECT 
        pa.id,
        pa.post_action_type_id,
        pa.created_at,
        pa.agreed_at,
        pa.disagreed_at,
        pa.deferred_at,
        pa.agreed_by_id,
        pa.disagreed_by_id,
        pa.deferred_by_id,
        pa.deleted_at,
        pa.post_id,
        pa.user_id,
        COALESCE(pa.disagreed_at, pa.agreed_at, pa.deferred_at) AS responded_at,
        EXTRACT(EPOCH FROM (COALESCE(pa.disagreed_at, pa.agreed_at, pa.deferred_at) - pa.created_at)) / 60 AS time_to_resolution_minutes -- time to resolution in minutes
    FROM post_actions pa
    WHERE pa.post_action_type_id IN (3,4,6,7,8)
      AND pa.created_at >= :start_date
      AND pa.created_at <= :end_date
),
flag_types AS (
    SELECT 
        pat.id,
        CASE 
            WHEN pat.id = 3 THEN 'off_topic'
            WHEN pat.id = 4 THEN 'inappropriate'
            WHEN pat.id = 6 THEN 'notify_user'
            WHEN pat.id = 7 THEN 'notify_moderators'
            WHEN pat.id = 8 THEN 'spam'
        END AS flag_type
    FROM post_action_types pat
),
flag_resolutions AS (
    SELECT 
        pa.user_id,
        pa.post_action_type_id,
        CASE 
            WHEN pa.agreed_at IS NOT NULL THEN 'agreed'
            WHEN pa.disagreed_at IS NOT NULL THEN 'disagreed'
            WHEN pa.deferred_at IS NOT NULL THEN 'deferred'
            WHEN pa.deleted_at IS NOT NULL THEN 'deleted'
        END AS resolution,
        COUNT(*) AS resolution_count
    FROM period_actions pa
    GROUP BY pa.user_id, pa.post_action_type_id, resolution
),
flag_totals AS (
    SELECT 
        pa.user_id,
        pa.post_action_type_id,
        COUNT(*) AS total_flags
    FROM period_actions pa
    GROUP BY pa.user_id, pa.post_action_type_id
),
resolution_percentages AS (
    SELECT 
        fr.user_id,
        fty.flag_type,
        fr.resolution,
        fr.resolution_count,
        ft.total_flags,
        ROUND((fr.resolution_count::decimal / ft.total_flags) * 100, 2) AS resolution_percentage
    FROM flag_resolutions fr
    JOIN flag_totals ft ON ft.user_id = fr.user_id AND ft.post_action_type_id = fr.post_action_type_id
    JOIN flag_types fty ON fty.id = fr.post_action_type_id
),
pivoted_data AS (
    SELECT 
        rp.user_id,
        rp.flag_type,
        MAX(CASE WHEN rp.resolution = 'agreed' THEN rp.resolution_percentage ELSE 0 END) AS agreed_percentage,
        MAX(CASE WHEN rp.resolution = 'disagreed' THEN rp.resolution_percentage ELSE 0 END) AS disagreed_percentage,
        MAX(CASE WHEN rp.resolution = 'deferred' THEN rp.resolution_percentage ELSE 0 END) AS deferred_percentage,
        MAX(CASE WHEN rp.resolution = 'deleted' THEN rp.resolution_percentage ELSE 0 END) AS deleted_percentage,
        MAX(CASE WHEN rp.resolution = 'agreed' THEN rp.resolution_count ELSE 0 END) AS agreed_count,
        MAX(CASE WHEN rp.resolution = 'disagreed' THEN rp.resolution_count ELSE 0 END) AS disagreed_count,
        MAX(CASE WHEN rp.resolution = 'deferred' THEN rp.resolution_count ELSE 0 END) AS deferred_count,
        MAX(CASE WHEN rp.resolution = 'deleted' THEN rp.resolution_count ELSE 0 END) AS deleted_count,
        MAX(rp.total_flags) AS total_flags
    FROM resolution_percentages rp
    GROUP BY rp.user_id, rp.flag_type
)
SELECT 
    u.id AS user_id,
    u.username,
    p.flag_type,
    p.agreed_percentage,
    p.agreed_count,
    p.disagreed_percentage,
    p.disagreed_count,
    p.deferred_percentage,
    p.deferred_count,
    p.deleted_percentage,
    p.deleted_count,
    p.total_flags
FROM pivoted_data p
JOIN users u ON u.id = p.user_id
WHERE (:only_staff = false OR (u.admin = true OR u.moderator = true))
ORDER BY u.username, p.flag_type, p.total_flags

Parameters Used

  • :start_date: The start date for filtering flagged posts.
  • :end_date: The end date for filtering flagged posts.
  • :only_staff: A boolean parameter to filter results to include only staff members.

CTEs Explanation

  1. period_actions: Filters flagged posts within the specified date range and calculates the time to resolution for each flag.
  2. flag_types: Maps flag type IDs to human-readable names.
  3. flag_resolutions: Groups flags by user, flag type, and resolution, counting the occurrences of each combination.
  4. flag_totals: Calculates the total number of flags for each user and flag type.
  5. resolution_percentages: Combines resolution counts and totals to calculate percentages for each resolution type.
  6. pivoted_data: Pivots the data to display resolution percentages and counts in separate columns for each resolution type.

Results Explanation

The final result is a table showing:

  • Moderator username.
  • Percentages and counts for each resolution type (agreed, disagreed, deferred, deleted).
  • Total flags handled by each moderator.

Example Results

Moderator Flag Type Agreed % Agreed Count Disagreed % Disagreed Count Deferred % Deferred Count Deleted % Deleted Count Total Flags
mod1 off_topic 60.00 30 20.00 10 10.00 5 10.00 5 50
mod2 spam 70.00 35 20.00 10 5.00 2 5.00 3 50

Who is Flagging Posts

SQL Query Explanation

This query identifies the users who flagged posts within a specified date range and calculates the total number of flags submitted by each user.

-- [params]
-- date :start_date = 2024-01-01
-- date :end_date = 2025-01-01
-- boolean :only_staff = false

SELECT 
    u.id AS user_id,
    u.username,
    COUNT(pa.id) AS flag_count
FROM post_actions pa
JOIN users u ON u.id = pa.user_id
WHERE pa.post_action_type_id IN (3, 4, 6, 7, 8) -- flag types
  AND pa.created_at >= :start_date
  AND pa.created_at <= :end_date
  AND (:only_staff = false OR (u.admin = true OR u.moderator = true))
GROUP BY u.id, u.username
ORDER BY flag_count DESC, u.username
LIMIT 10

Parameters Used

  • :start_date: The start date for filtering flagged posts.
  • :end_date: The end date for filtering flagged posts.
  • :only_staff: A boolean parameter to filter results to include only staff members.

Results Explanation

The final result is a ranked list of users with their flag counts.

Example Results

User ID Username Flag Count
1 user1 50
2 user2 30
3 user3 20

User Notes

SQL Query Explanation

This query retrieves user notes stored in the plugin_store_rows table. It extracts details such as the user ID, creation date, note content, and the creator’s ID.

-- [params]
-- date :start_date = 2025-01-01
-- date :end_date = 2026-01-01

WITH user_notes AS (

    SELECT 
        REPLACE(key, 'notes:', '')::int AS user_id,
        notes.value->>'created_at' AS created_at,
        notes.value->>'raw' AS user_note,
        notes.value->>'created_by' AS created_by
    FROM plugin_store_rows,
    LATERAL json_array_elements(value::json) notes
    WHERE plugin_name = 'user_notes'
    ORDER BY 2 DESC 
)

SELECT 
    un.user_id,
    un.created_at::date,
    un.user_note,
    un.created_by AS created_by_user_id
FROM user_notes un
JOIN users u ON u.id = un.user_id
WHERE un.created_at::date BETWEEN :start_date AND :end_date
ORDER BY created_at DESC

Parameters Used

  • :start_date: The start date for filtering user notes.
  • :end_date: The end date for filtering user notes.

Results Explanation

The final result is a detailed list of user notes with relevant metadata.

Example Results

User ID Created At User Note Created By User ID
1 2025-01-01 This user is helpful. 2
2 2025-02-01 This user is associated with two other user accounts. 3

Moderator KPIs - Flags and Avg Flag Resolution Time

SQL Query Explanation

This query evaluates moderator performance by calculating the number of flags handled and the average resolution time (in minutes) for each moderator.

-- [params]
-- date :start_date = 2025-01-01
-- date :end_date = 2026-01-01

WITH period_actions AS (
    SELECT pa.id,
           pa.post_action_type_id,
           pa.created_at,
           pa.agreed_at,
           pa.disagreed_at,
           pa.deferred_at,
           pa.agreed_by_id,
           pa.disagreed_by_id,
           pa.deferred_by_id,
           pa.post_id,
           pa.user_id,
           COALESCE(pa.disagreed_at, pa.agreed_at, pa.deferred_at) AS responded_at,
           EXTRACT(EPOCH FROM (COALESCE(pa.disagreed_at, pa.agreed_at, pa.deferred_at) - pa.created_at)) / 60 AS time_to_resolution_minutes -- time to resolution in minutes
    FROM post_actions pa
    WHERE pa.post_action_type_id IN (3,4,6,7,8) -- Flag types
      AND pa.created_at >= :start_date
      AND pa.created_at <= :end_date
),
moderator_actions AS (
    SELECT pa.id,
           pa.post_id,
           pa.created_at,
           pa.responded_at,
           pa.time_to_resolution_minutes,
           COALESCE(pa.agreed_by_id, pa.disagreed_by_id, pa.deferred_by_id) AS moderator_id
    FROM period_actions pa
    WHERE COALESCE(pa.agreed_by_id, pa.disagreed_by_id, pa.deferred_by_id) IS NOT NULL
),
moderator_stats AS (
    SELECT
        m.moderator_id,
        u.username AS moderator_username,
        COUNT(m.id) AS handled_flags,
        AVG(m.time_to_resolution_minutes) AS avg_resolution_time_minutes
    FROM moderator_actions m
    JOIN users u ON u.id = m.moderator_id
    GROUP BY m.moderator_id, u.username
)
SELECT
    ms.moderator_username,
    ms.handled_flags,
    ROUND(ms.avg_resolution_time_minutes::numeric, 2) AS avg_resolution_time_minutes
FROM moderator_stats ms
ORDER BY ms.handled_flags DESC, ms.avg_resolution_time_minutes ASC

Parameters Used

  • :start_date: The start date for filtering flagged posts.
  • :end_date: The end date for filtering flagged posts.

CTEs Explanation

  1. period_actions: Filters flagged posts within the specified date range and calculates the time to resolution for each flag.
  2. moderator_actions: Identifies flags resolved by moderators and calculates the time to resolution for each flag.
  3. moderator_stats: Groups flags by moderator and calculates the total number of flags handled and the average resolution time.

Results Explanation

The final result is a ranked list of moderators with their handled flag counts and average resolution times.

Example Results

Moderator Username Handled Flags Avg Resolution Time (Minutes)
mod1 50 15.00
mod2 30 20.00

All Flag Data

SQL Query Explanation

This query provides a comprehensive dataset of all flagged user, post, and topic data within a specified date range. It combines data from multiple tables to include details such as the flag type, flagged item, flag reason, flag source, resolution decision, and related messages.

-- [params]
-- date :start_date = 2020-01-01
-- date :end_date = 2026-01-01

WITH flag_data AS (
    SELECT
        r.id AS flag_id,
        p.id AS post_id,
        p.topic_id,
        p.raw AS flagged_item_text,
        p.user_id AS post_author_id,
        fu.username AS flagged_by_username,
        r.created_at AS flagged_date,
        r.type AS flag_type,
        r.reviewable_by_moderator AS flag_source,
        r.payload AS flag_reason,
        r.status AS review_status,
        rs.reviewed_by_id,
        rs.reviewed_at,
        rs.score AS review_score,
        ru.username AS reviewed_by_username
    FROM
        reviewables r
    LEFT JOIN posts p ON r.target_id = p.id AND r.target_type = 'Post'
    LEFT JOIN users fu ON r.created_by_id = fu.id
    LEFT JOIN reviewable_scores rs ON rs.reviewable_id = r.id
    LEFT JOIN users ru ON rs.reviewed_by_id = ru.id
    WHERE
        r.created_at BETWEEN :start_date AND :end_date
),
review_decisions AS (
    SELECT
        0 AS status_code, 'pending' AS decision_name
    UNION ALL
    SELECT
        1 AS status_code, 'agreed' AS decision_name
    UNION ALL
    SELECT
        2 AS status_code, 'disagreed' AS decision_name
    UNION ALL
    SELECT
        3 AS status_code, 'ignored' AS decision_name
),
flag_types AS (
    SELECT
        3 AS post_action_type_id, 'off_topic' AS flag_type_name
    UNION ALL
    SELECT
        4 AS post_action_type_id, 'inappropriate' AS flag_type_name
    UNION ALL
    SELECT
        6 AS post_action_type_id, 'notify_user' AS flag_type_name
    UNION ALL
    SELECT
        7 AS post_action_type_id, 'notify_moderators' AS flag_type_name
    UNION ALL
    SELECT
        8 AS post_action_type_id, 'spam' AS flag_type_name
    UNION ALL
    SELECT
        10 AS post_action_type_id, 'illegal' AS flag_type_name
)
SELECT
    fd.flag_id,
    fd.post_id AS flagged_item,
    fd.flagged_by_username,
    fd.flagged_date,
    ft.flag_type_name AS flag_type,
    fd.flag_source as reviewable_by_moderator,
    fd.flag_reason,
    fd.flagged_item_text,
    pa.related_post_id AS related_message_id_post_id,
    regexp_replace(rp.raw, '(https?://[^\s]+)', '', 'g') AS related_message_text, -- Removes only URLs
    fd.reviewed_by_username AS reviewed_by,
    rd.decision_name AS review_decision
FROM
    flag_data fd
LEFT JOIN post_actions pa 
    ON pa.post_id = fd.post_id
LEFT JOIN posts rp 
    ON pa.related_post_id = rp.id
LEFT JOIN flag_types ft 
    ON pa.post_action_type_id = ft.post_action_type_id
LEFT JOIN review_decisions rd 
    ON fd.review_status = rd.status_code
ORDER BY
    fd.flagged_date DESC

Parameters Used

  • :start_date: The start date for filtering flagged posts.
  • :end_date: The end date for filtering flagged posts.

CTEs Explanation

  1. flag_data: Retrieves detailed information about flagged posts, including the flag ID, flagged item, flag type, flag reason, flag source, and review details.
  2. review_decisions: Maps review status codes to human-readable decision names (e.g., pending, agreed, disagreed, ignored).
  3. flag_types: Maps post action type IDs to human-readable flag type names (e.g., off-topic, inappropriate, spam).

Results Explanation

The final result is a detailed table that includes:

  • Flag ID: Unique identifier for the flag.
  • Flagged Item: The ID of the flagged post.
  • Flagged By Username: The username of the user who flagged the post.
  • Flagged Date: The date when the flag was created.
  • Flag Type: The type of flag (e.g., off-topic, spam, inappropriate).
  • Reviewable By Moderator: Indicates whether the flag was raised by a user or the system.
  • Flag Reason: The reason provided for the flag.
  • Flagged Item Text: The content of the flagged post.
  • Related Message ID: The ID of any related message (if applicable).
  • Related Message Text: The content of the related message, with URLs removed.
  • Reviewed By Username: The username of the moderator who reviewed the flag.
  • Review Decision: The decision made by the reviewer (e.g., agreed, disagreed, ignored, deleted).

Example Results (Anonymized)

Flag ID Flagged Item Flagged By Username Flagged Date Flag Type Reviewable By Moderator Flag Reason Flagged Item Text Related Message ID Related Message Text Reviewed By Username Review Decision
10001 20001 user123 2025-02-13T16:16:15Z inappropriate true {“targets_topic”:false} “Example inappropriate content” NULL NULL mod001 agreed
10002 20002 user456 2025-02-13T14:28:34Z spam true {“targets_topic”:false} “Example Spam Content” NULL NULL mod002 ignored
10003 20003 user789 2025-02-13T14:27:54Z off_topic true {“targets_topic”:false} “off topic discussion.” NULL NULL mod003 ignored
10004 NULL system 2025-02-13T10:38:09Z NULL true {“username”:“ExampleUser”,“name”:“Example Name",“email”:"example@example.com”,“bio”:“Example bio text.”,“website”:“https://example.com”} NULL NULL NULL mod004 disagreed
10005 20005 user321 2025-02-13T10:08:20Z notify_moderators true {“targets_topic”:false} “A post requiring moderation attention” 30001 “This is a related message providing additional context for the flagged post.” mod005 agreed
2 Likes