Mar 29, 2025·8 min

Building a Web App to Run Content Moderation Workflows

Learn how to design and build a web app for content moderation: queues, roles, policies, escalation, audit logs, analytics, and safe integrations.

Building a Web App to Run Content Moderation Workflows

Define scope and success metrics

Before you design a content moderation workflow, decide what you’re actually moderating and what “good” looks like. A clear scope prevents your moderation queue from filling with edge cases, duplicates, and requests that don’t belong there.

What counts as “content”

Write down every content type that can create risk or user harm. Common examples include user-generated text (comments, posts, reviews), images, video, livestreams, profile fields (names, bios, avatars), direct messages, community groups, and marketplace listings (titles, descriptions, photos, pricing).

Also note sources: user submissions, automated imports, edits to existing items, and reports from other users. This avoids building a system that only works for “new posts” while missing edits, re-uploads, or DM abuse.

Your goals (and the trade-offs)

Most teams balance four goals:

  • Speed: short time-to-decision so harmful content is handled quickly
  • Consistency: similar cases get similar outcomes across reviewers
  • Policy compliance & safety: decisions align with your rules and legal obligations
  • Cost control: reviewer time is finite; automation and prioritization matter

Be explicit about which goal is primary in each area. For example, high-severity abuse may prioritize speed over perfect consistency.

Actions you need to support

List the full set of outcomes your product requires: approve, reject/remove, edit/redact, label/age-gate, restrict visibility, place under review, escalate to a lead, and account-level actions like warnings, temporary locks, or bans.

Success metrics to track

Define measurable targets: median and 95th-percentile review time, backlog size, reversal rate on appeal, policy accuracy from QA sampling, and the percentage of high-severity items handled within an SLA.

Stakeholders to involve early

Include moderators, team leads, policy, support, engineering, and legal. Misalignment here causes rework later—especially around what “escalation” means and who owns final decisions.

Model the moderation workflow end to end

Before you build screens and queues, sketch the full lifecycle of a single piece of content. A clear workflow prevents “mystery states” that confuse reviewers, break notifications, and make audits painful.

Map the lifecycle as explicit states

Start with a simple, end-to-end state model you can put in a diagram and in your database:

Submitted → Queued → In review → Decided → Notified → Archived

Keep states mutually exclusive, and define which transitions are allowed (and by whom). For example: “Queued” can move to “In review” only when assigned, and “Decided” should be immutable except through an appeal flow.

Separate automated signals from human decisions

Automated classifiers, keyword matches, rate limits, and user reports should be treated as signals, not decisions. A “human-in-the-loop” design keeps the system honest:

  • Signals influence priority and recommended actions.
  • The reviewer’s decision is the authoritative outcome.

This separation also makes it easier to improve models later without rewriting policy logic.

Plan for appeals and re-review

Decisions will be challenged. Add first-class flows for:

  • User appeal submission (linked to the original case)
  • Re-review by a different reviewer or a specialized team
  • Possible outcomes: uphold, reverse, modify, or request more information

Model appeals as new review events rather than editing history. That way you can tell the full story of what happened.

Decide what must be traceable

For audits and disputes, define which steps must be recorded with timestamps and actors:

  • Assignment changes
  • Evidence viewed (where appropriate)
  • Decision, policy reason, and enforcement action
  • Notifications sent

If you can’t explain a decision later, you should assume it didn’t happen.

Design roles, permissions, and team structure

A moderation tool lives or dies on access control. If everyone can do everything, you’ll get inconsistent decisions, accidental data exposure, and no clear accountability. Start by defining roles that match how your trust and safety team actually works, then translate them into permissions your app can enforce.

Core roles to support

Most teams need a small set of clear roles:

  • Moderator: reviews items in a moderation queue, applies outcomes (approve/remove/label), and leaves internal notes.
  • Senior reviewer: everything a moderator can do, plus overrides, handling escalations, and coaching (e.g., resolving disputes).
  • Policy editor: updates policy text, rule definitions, and decision guidelines, but can’t directly moderate items.
  • Admin: manages users, roles, team settings, integrations, and high-risk actions.
  • Read-only: can view dashboards, cases, and audit log entries, but cannot change anything.

This separation helps avoid “policy changes by accident” and keeps policy governance distinct from day-to-day enforcement.

Least-privilege permissions (RBAC)

Implement role-based access control so each role gets only what it needs:

  • Limit who can view sensitive user data (PII, reports, device signals).
  • Restrict high-impact actions like bulk decisions, account-level penalties, and case deletion.
  • Split permissions by capability (e.g., can_apply_outcome, can_override, can_export_data) rather than by page.

If you later add new features (exports, automations, third-party integrations), you can attach them to permissions without redefining your whole org structure.

Multi-team structure (language, region, product)

Plan for multiple teams early: language pods, region-based groups, or separate lines for different products. Model teams explicitly, then scope queues, content visibility, and assignments by team. This prevents cross-region review mistakes and keeps workloads measurable per group.

Impersonation safeguards and approvals

Admins sometimes need to impersonate users to debug access or reproduce a reviewer issue. Treat impersonation as a sensitive action:

  • Require a specific permission to impersonate.
  • Log who impersonated whom, when, and why.
  • Display a persistent “impersonating” banner and disable risky actions by default.

For irreversible or high-risk actions, add admin approval (or two-person review). That small friction protects against both mistakes and insider abuse, while keeping routine moderation fast.

Build queues, prioritization, and assignment

Queues are where moderation work becomes manageable. Instead of a single endless list, split work into queues that reflect risk, urgency, and intent—then make it hard for items to fall through the cracks.

Define the queue types

Start with a small set of queues that match how your team actually operates:

  • New items: fresh content waiting for first review.
  • High-risk: items likely to cause harm (e.g., minors, self-harm signals, known scam patterns).
  • Escalations: anything a reviewer can’t confidently decide, or that needs a specialist.
  • Appeals: user-submitted requests to reconsider actions.
  • Backlog: older items, lower urgency, or overflow during spikes.

Keep queues mutually exclusive when possible (an item should have one “home”), and use tags for secondary attributes.

Choose prioritization rules that won’t be gamed

Within each queue, define scoring rules that determine what rises to the top:

  • Severity (policy category + confidence)
  • Virality/reach (views, shares, follower count)
  • User reports (count, reporter reputation, unique reporters)
  • SLA timers (age, escalation deadlines, time since first report)

Make priorities explainable in the UI (“Why am I seeing this?”) so reviewers trust the ordering.

Prevent duplicate work with claiming + timeouts

Use claiming/locking: when a reviewer opens an item, it’s assigned to them and hidden from others. Add a timeout (e.g., 10–20 minutes) so abandoned items return to the queue. Always log claim, release, and completion events.

Handle fairness: avoid “easy wins” bias

If the system rewards speed, reviewers may pick quick cases and skip hard ones. Counter this by:

  • Auto-assigning a portion of work
  • Mixing difficulty levels (smart batching)
  • Rotating high-impact queues across the team

The goal is consistent coverage, not just high throughput.

Turn your policies into enforceable rules

A moderation policy that only exists as a PDF will be interpreted differently by every reviewer. To make decisions consistent (and auditable), translate policy text into structured data and UI choices that your workflow can enforce.

Create a policy taxonomy

Start by breaking policy into a shared vocabulary reviewers can select from. A useful taxonomy usually includes:

  • Category (e.g., Harassment, Adult content, Misinformation)
  • Violation type (e.g., Hate speech vs. general insult)
  • Severity level (e.g., Low/Medium/High/Critical)
  • Required evidence (what must be present to apply the policy—specific phrases, context, user reports, links, timestamps)

This taxonomy becomes the foundation for queues, escalation, and analytics later.

Use decision templates to reduce inconsistency

Instead of asking reviewers to write a decision from scratch each time, provide decision templates tied to taxonomy items. A template can prefill:

  • The recommended action (remove, label, restrict, warn, no action)
  • The user-facing message (editable, but guided)
  • The internal checklist (what evidence must be confirmed)

Templates make the “happy path” fast, while still allowing exceptions.

Support policy versioning and effective dates

Policies change. Store policies as versioned records with effective dates, and record which version was applied for every decision. This prevents confusion when older cases are appealed and ensures you can explain outcomes months later.

Capture structured reasons (not just free text)

Free text is hard to analyze and easy to forget. Require reviewers to pick one or more structured reasons (from your taxonomy) and optionally add notes. Structured reasons improve appeals handling, QA sampling, and trend reporting—without forcing reviewers to write essays.

Design the reviewer dashboard and UX

Iterate on queue rules safely
Tune routing, scoring, and bulk-action guardrails safely with snapshots and rollback.

A reviewer dashboard succeeds when it minimizes “hunting” for information and maximizes confident, repeatable decisions. Reviewers should be able to understand what happened, why it matters, and what to do next—without opening five tabs.

Show the content with the right context

Don’t display an isolated post and expect consistent outcomes. Present a compact context panel that answers common questions at a glance:

  • Conversation/thread view: a few messages before and after the flagged item, with clear highlighting of the reported content.
  • User history: recent warnings, suspensions, prior removals, and appeal outcomes (time-boxed so it stays relevant).
  • Prior actions: who touched the item before, what decision they made, and any notes.

Keep the default view concise, with expand options for deeper dives. Reviewers should rarely need to leave the dashboard to decide.

Fast actions that map to real decisions

Your action bar should match your policy outcomes, not generic CRUD buttons. Common patterns include:

  • Approve / Reject with one click
  • Labeling (e.g., spam, harassment, self-harm, misinformation) to support reporting and training
  • Edit or redact (when policy allows partial removal)
  • Escalate to specialists or a second-level review
  • Request more info (for ambiguous cases) with templated prompts

Make actions visible and irreversible steps explicit (confirmation only when needed). Capture a short reason code plus optional notes for later audits.

Speed features: keyboard shortcuts and bulk actions

High volume work demands low friction. Add keyboard shortcuts for the top actions (approve, reject, next item, add label). Display a shortcut cheat-sheet inside the UI.

For queues with repetitive work (e.g., obvious spam), support bulk selection with guardrails: show a preview count, require a reason code, and log the batch action.

Design for reviewer safety

Moderation can expose people to harmful material. Add safety defaults:

  • Blur sensitive media by default with click-to-reveal
  • Warning banners for likely self-harm, sexual content, or graphic violence
  • A quick hide content toggle that preserves the ability to decide without prolonged exposure

These choices protect reviewers while keeping decisions accurate and consistent.

Add audit logs and traceability

Audit logs are your “source of truth” when someone asks: Why was this post removed? Who approved the appeal? Did the model or a human make the final call? Without traceability, investigations turn into guesswork, and reviewer trust drops fast.

Capture every decision (and the evidence)

For each moderation action, log who did it, what changed, when it happened, and why (policy reason + free-text notes). Just as important: store before/after snapshots of the relevant objects—content text, media hashes, detected signals, labels, and the final outcome. If the item can change (edits, deletions), snapshots prevent “the record” from drifting.

A practical pattern is an append-only event record:

{
  "event": "DECISION_APPLIED",
  "actor_id": "u_4821",
  "subject_id": "post_99102",
  "queue": "hate_speech",
  "decision": "remove",
  "policy_code": "HS.2",
  "reason": "slur used as insult",
  "before": {"status": "pending"},
  "after": {"status": "removed"},
  "created_at": "2025-12-26T10:14:22Z"
}

Log queue events for operational clarity

Beyond decisions, log the workflow mechanics: claimed, released, timed out, reassigned, escalated, and auto-routed. These events explain “why it took 6 hours” or “why this item bounced between teams,” and they’re essential for detecting abuse (e.g., reviewers cherry-picking easy items).

Make audit trails searchable for investigations

Give investigators filters by user, content ID, policy code, time range, queue, and action type. Include export to a case file, with immutable timestamps and references to related items (duplicates, re-uploads, appeals).

Define retention rules that match compliance

Set clear retention windows for audit events, snapshots, and reviewer notes. Keep the policy explicit (e.g., 90 days for routine queue logs, longer for legal holds), and document how redaction or deletion requests affect stored evidence.

Connect reports, notifications, and user actions

A moderation tool is only useful if it closes the loop: reports become review tasks, decisions reach the right people, and user-level actions are executed consistently. This is where many systems break—someone resolves the queue, but nothing else changes.

Intake: unify every kind of report

Treat user reports, automated flags (spam/CSAM/hash matches/toxicity signals), and internal escalations (support, community managers, legal) as the same core object: a report that can spawn one or more review tasks.

Use a single report router that:

  • Deduplicates (same content reported many times)
  • Links related items (same author, same thread)
  • Applies basic triage (severity, category, jurisdiction)
  • Creates/updates items in the moderation queue

If support escalations are part of the flow, link them directly (e.g., /support/tickets/1234) so reviewers don’t context-switch.

Outcomes: notify users without creating new risk

Moderation decisions should generate templated notifications: content removed, warning issued, no action, or account action taken. Keep messaging consistent and minimal—explain the outcome, reference the relevant policy, and provide appeal instructions.

Operationally, send notifications via an event like moderation.decision.finalized, so email/in-app/push can subscribe without slowing the reviewer.

User actions: connect to account controls

Decisions often require actions beyond a single piece of content:

  • Suspensions (temporary/permanent)
  • Restrictions (posting limits, DM limits, shadow bans where allowed)
  • Trust scores / risk levels updates

Make these actions explicit and reversible, with clear durations and reasons. Link every action back to the decision and the underlying report for traceability, and provide a fast path to Appeals so decisions can be revisited without manual detective work.

Choose data models and storage strategy

Generate a moderation dashboard
Create queues, reviewer views, and core actions from a chat spec in Koder.ai.

Your data model is the “source of truth” for what happened to every item: what was reviewed, by whom, under which policy, and what the result was. If you get this layer right, everything else—queues, dashboards, audits, and analytics—gets easier.

Separate content, decisions, and policy codes

Avoid storing everything in one record. A practical pattern is to keep:

  • Content references (what is being reviewed): a stable ID, content type (post/comment/image/video), author ID, creation time, and a pointer to the raw content location.
  • Moderation decisions (what reviewers did): decision ID, reviewer ID, decision outcome, timestamps, free-form notes, and structured fields (e.g., confidence, severity).
  • Policy codes (why it was decided): canonical policy identifiers like HARASSMENT.H1 or NUDITY.N3, stored as references so policies can evolve without rewriting history.

This keeps policy enforcement consistent and makes reporting clearer (e.g., “top violated policy codes this week”).

Store large media safely

Don’t put large images/videos directly in your database. Use object storage and store only object keys + metadata in your content table.

For reviewers, generate short-lived signed URLs so media is accessible without making it public. Signed URLs also let you control expiration and revoke access if needed.

Index for speed where it matters

Queues and investigations depend on fast lookups. Add indexes for:

  • Queue filters (status, priority, assigned reviewer, created time)
  • Text search (reported reason, content text where allowed)
  • Audit log queries (actor, action type, time range, content ID)

Track state transitions to prevent “stuck” items

Model moderation as explicit states (e.g., NEW → TRIAGED → IN_REVIEW → DECIDED → APPEALED). Store state transition events (with timestamps and actor) so you can detect items that haven’t progressed.

A simple safeguard: a last_state_change_at field plus alerts for items that exceed an SLA, and a repair job that re-queues items left IN_REVIEW after a timeout.

Security, privacy, and abuse resistance

Trust & Safety tools often handle the most sensitive data your product has: user-generated content, reports, account identifiers, and sometimes legal requests. Treat the moderation app as a high-risk system and design security and privacy in from day one.

Secure access for reviewers and admins

Start with strong authentication and tight session controls. For most teams, that means:

  • SSO (SAML/OIDC) so access follows your company identity policies
  • MFA for any privileged roles (admins, policy editors, exports)
  • Short session timeouts and re-auth for risky actions (bulk actions, exports, role changes)
  • IP allowlists for internal-only tooling, where it makes sense (e.g., contractor workstations or office ranges)

Pair this with role-based access control so reviewers only see what they need (for example: one queue, one region, or one content type).

Protect sensitive content and user data

Encrypt data in transit (HTTPS everywhere) and at rest (managed database/storage encryption). Then focus on exposure minimization:

  • Show redacted previews by default (blur media, mask phone/email) with a reveal action that’s logged
  • Separate viewer permissions from export permissions
  • Limit access to high-risk fields (exact addresses, payment data) to a small set of roles

If you handle consent or special categories of data, make those flags visible to reviewers and enforce them in the UI (e.g., restricted viewing or retention rules).

Abuse resistance for reports and appeals

Reporting and appeal endpoints are frequent targets for spam and harassment. Add:

  • Rate limits per user/IP/device
  • Bot protections (challenge on spikes, anomaly detection)
  • Cost controls (caps per day, escalating friction for repeat misuse)

Finally, make every sensitive action traceable with an audit trail (see /blog/audit-logs) so you can investigate reviewer mistakes, compromised accounts, or coordinated abuse.

Analytics, QA, and continuous improvement

Deploy your moderation tool
Launch with deployment, hosting, and custom domains when your tool is ready.

A content moderation workflow only gets better if you can measure it. Analytics should tell you whether your moderation queue design, escalation rules, and policy enforcement are producing consistent decisions—without burning out reviewers or letting harmful content sit too long.

Metrics that map to real operations

Start with a small set of metrics tied to outcomes:

  • Throughput: items reviewed per hour/day, split by queue, content type, and team.
  • Turnaround times: time-to-first-review and time-to-resolution (tracked per queue and per priority band).
  • Accuracy signals (proxies): appeal overturn rate, admin corrections, and “confirmed violation” rate after escalation.

Put these into an SLA dashboard so ops leads can see which queues are falling behind and whether the bottleneck is staffing, unclear rules, or a surge in reports.

Disagreement and sampling: your early warning system

Disagreement isn’t always bad—it can indicate edge cases. Track:

  • Reviewer disagreement rates on the same item (e.g., double-reviewed samples).
  • Audit sampling outcomes: pass/fail rates from QA reviewers and the most common failure reasons.

Use your audit log to connect every sampled decision to the reviewer, applied rule, and evidence. This gives you explainability when coaching reviewers and when evaluating whether your review dashboard UI is nudging people toward inconsistent choices.

Finding policy gaps and training needs

Moderation analytics should help you answer: “What are we seeing that our policy doesn’t cover well?” Look for clusters like:

  • High disagreement on a specific policy category.
  • Frequent use of “other/unclear” reasons.
  • Escalations that bounce between teams.

Turn those signals into concrete actions: rewrite policy examples, add decision trees to the reviewer dashboard, or update enforcement presets (e.g., default timeouts vs. warnings).

Close the loop without breaking trust

Treat analytics as part of a human-in-the-loop system. Share queue-level performance publicly inside the team, but handle individual metrics carefully to avoid incentivizing speed over quality. Pair quantitative KPIs with regular calibration sessions and small, frequent policy updates—so the tooling and the people improve together.

Testing, rollout, and ongoing operations

A moderation tool fails most often at the edges: the weird posts, the rare escalation paths, and the moments when multiple people touch the same case. Treat testing and rollout as part of the product, not a final checkbox.

Test with realistic scenarios (not just happy paths)

Build a small “scenario pack” that mirrors real work. Include:

  • Edge cases (mixed media, deleted accounts, edited content, language ambiguity)
  • Appeals and reversals (a decision is challenged, re-reviewed, and overturned)
  • Escalations (hand-offs to specialists, legal, or policy) and time-based SLAs
  • Concurrency (two reviewers opening the same item, race conditions on actions, duplicate reports)

Use production-like data volumes in a staging environment so you can spot queue slowdowns and pagination/search issues early.

Roll out in stages to protect throughput

A safer rollout pattern is:

  1. Pilot team: one queue, limited actions, daily feedback loop
  2. Shadow mode: run the new system alongside the old one (record decisions but don’t execute user-facing enforcement)
  3. Full migration: switch enforcement, keep rollback paths, and watch key metrics hourly for the first week

Shadow mode is especially useful for validating policy enforcement rules and automation without risking false positives.

Document playbooks and train for consistency

Write short, task-based playbooks: “How to process a report,” “When to escalate,” “How to handle appeals,” and “What to do when the system is uncertain.” Then train with the same scenario pack so reviewers practice the exact flows they’ll use.

Ongoing operations: policies change, queues grow

Plan maintenance as continuous work: new content types, updated escalation rules, periodic sampling for QA, and capacity planning when queues spike. Keep a clear release process for policy updates so reviewers can see what changed and when—and so you can correlate changes with moderation analytics.

Building this faster with Koder.ai (optional)

If you’re implementing this as a web application, a big portion of the effort is repetitive scaffolding: RBAC, queues, state transitions, audit logs, dashboards, and the event-driven glue between decisions and notifications. Koder.ai can speed up that build by letting you describe the moderation workflow in a chat interface and generate a working foundation you can iterate on—typically with a React frontend and a Go + PostgreSQL backend.

Two practical ways to use it for trust & safety tooling:

  • Planning mode first: outline your entities (Content, Report, ReviewTask, Decision, PolicyCode, AuditEvent), state machine transitions, and SLAs before generating code.
  • Snapshots and rollback: useful when you’re tuning escalation rules, queue scoring, or bulk-action guardrails and want safe, quick iteration.

Once the baseline is in place, you can export the source code, connect your existing model signals as “inputs,” and keep the reviewer’s decision as the final authority—matching the human-in-the-loop architecture described above.

FAQ

How do I define the scope of “content” for a moderation web app?

Start by listing every content type you will handle (posts, comments, DMs, profiles, listings, media), plus every source (new submissions, edits, imports, user reports, automated flags). Then define what is out of scope (e.g., internal admin notes, system-generated content) so your queue doesn’t become a dumping ground.

A practical check: if you can’t name the content type, source, and owner team, it probably shouldn’t create a moderation task yet.

What success metrics should I track for a moderation workflow?

Pick a small set of operational KPIs that reflect both speed and quality:

  • Median and p95 time-to-decision
  • Backlog size (overall and per queue)
  • SLA compliance for high-severity items
  • Appeal overturn rate (and reasons)
  • QA accuracy from sampled reviews

Set targets per queue (e.g., high-risk vs. backlog) so you don’t accidentally optimize low-urgency work while harmful content waits.

What’s a good end-to-end state machine for moderation cases?

Use a simple, explicit state model and enforce allowed transitions, for example:

  • SUBMITTED → QUEUED → IN_REVIEW → DECIDED → NOTIFIED → ARCHIVED

Make states mutually exclusive, and treat “Decided” as immutable except through an appeal/re-review flow. This prevents “mystery states,” broken notifications, and hard-to-audit edits.

How should I integrate automated classifiers without letting them “decide”?

Treat automated systems as signals, not final outcomes:

  • Models/keyword matches/reports influence priority, recommended actions, and routing.
  • The reviewer decision is the authoritative outcome.

This keeps policy enforcement explainable and makes it easier to improve models later without rewriting your decision logic.

How do I design an appeals and re-review process?

Build appeals as first-class objects linked to the original decision:

  • A user appeal creates a new review event (don’t rewrite history).
  • Route it to a different reviewer or specialized team.
  • Allow outcomes like uphold, reverse, modify, or request more info.

Always record which policy version was applied originally and which version is applied during the appeal.

What roles and permissions should a moderation tool support?

Start with a small, clear RBAC set:

  • Moderator: review/apply outcomes/notes
  • Senior reviewer: overrides + escalations
  • Policy editor: update policy content/taxonomy, no direct enforcement
  • Admin: roles, integrations, high-risk actions
  • Read-only: dashboards and audit viewing only

Then add least-privilege permissions by capability (e.g., can_export_data, can_apply_account_penalty) so new features don’t blow up your access model.

How should I structure queues and prioritization rules?

Use multiple queues with clear “home” ownership:

  • New items
  • High-risk
  • Escalations
  • Appeals
  • Backlog

Prioritize within a queue using explainable signals like severity, reach, unique reporters, and SLA timers. In the UI, show “Why am I seeing this?” so reviewers trust ordering and you can spot gaming.

How do I prevent two reviewers from working the same item?

Implement claiming/locking with timeouts:

  • When a reviewer opens an item, it becomes assigned and hidden from others.
  • If they abandon it, a timeout returns it to the queue.
  • Log claim, release, timeout, and completion events.

This reduces duplicate effort and gives you the data to diagnose bottlenecks and cherry-picking behaviors.

How do I translate moderation policies into enforceable rules in the app?

Turn your policy into a structured taxonomy and templates:

  • Category → violation type → severity → required evidence
  • Decision templates that prefill recommended action, user message, and internal checklist
  • Require structured reason codes (plus optional notes)
  • Support policy versioning with effective dates, and record the applied version per decision

This improves consistency, makes analytics meaningful, and simplifies audits and appeals.

What should be included in audit logs for a moderation system?

Log everything needed to reconstruct the story:

  • Who did what, when, and why (policy code + notes)
  • Workflow mechanics (claimed, released, reassigned, escalated)
  • Before/after snapshots for content and status when items can change

Make logs searchable by actor, content ID, policy code, queue, and time range, and define retention rules (including legal holds and how deletion requests affect stored evidence).

Related posts