Skip to main content

How to build a confidential workplace harassment and retaliation investigation tracker with AI-flagged case severity in Formaloo

Learn how to build a confidential workplace harassment and retaliation tracker in Formaloo, with AI-flagged case severity, anonymous reporting, and a locked-down audit trail.

What you'll build

A restricted-access complaint intake that lets an employee report harassment or retaliation either anonymously or with their name attached. The moment a report comes in, an AI Analysis field reads the incident description and flags the case's severity, so your HR and Legal team open every case already knowing where it stands instead of triaging by hand. From there, the case moves through a Kanban investigation pipeline with automated status emails, generates a locked-down internal case file PDF, and rolls up into an AI-generated pattern report that flags repeat respondents and complaint clusters for leadership.

When to use this

  • Your current process for harassment and retaliation complaints lives in email threads and shared spreadsheets that anyone with folder access can open.

  • You need to prove, if a case is ever challenged, exactly what was reported, when, by whom it was reviewed, and what was decided.

  • Reports vary wildly in urgency, and right now every one of them waits in the same queue until someone reads it closely enough to tell which is serious.

  • You suspect the same manager or employee has been named more than once, but there's no easy way to check across old cases.

  • Employees say they're afraid to report because they don't trust the process to stay confidential or to protect them from retaliation.

Part 1 — Build the complaint form with Magic Create

This is the intake form an employee fills out when they need to report harassment or retaliation. It captures what happened, who's involved, and what outcome they're hoping for, while giving them the choice to stay anonymous. It also feeds everything the AI severity read needs to work. The fastest way to build it is with Magic Create, Formaloo's AI form builder: describe the form in plain text and it generates the fields for you.

💡 Want a fully-built form in seconds instead of dragging fields one by one? Magic Create builds your form, fields, and field IDs from a plain-language prompt. This is the cornerstone article for every workflow that starts with "describe your form to the AI." See how to create any form with AI using Magic Create in Formaloo.

1. Open Magic Create: From your Formaloo homepage, click Magic Create.

2. Describe the form: Paste a prompt describing a confidential harassment and retaliation complaint form, covering the type of concern being reported, whether the reporter wants to stay anonymous, the reporter's name/email/department (only relevant if they're identified), who the complaint is about and that person's department and working relationship to the reporter, when the most recent incident happened and whether it's ongoing, a detailed description of the incident, any witnesses, whether the reporter has experienced retaliation, a place to describe that retaliation, an upload for supporting evidence, the outcome the reporter is hoping for, consent to be contacted for follow-up, and an acknowledgment that the report will be handled confidentially. Also describe the admin-only fields: a case status dropdown, a case severity dropdown, an assignee field for the investigator, a repeat-pattern flag, a field for related case references, investigation notes, an interview log, a final decision dropdown, corrective action taken, a case closed date, and an AI Analysis field that reads the incident and flags severity.

3. Click Create: Formaloo builds the full form for you.

4. Verify your fields: Your form should look like this. Magic Create will have generated most of it. Verify each field and field ID matches exactly.

💡 Want internal fields, like status, severity, or investigation notes, invisible to the person filling out the form? Admin-only fields are the mechanism. See what are admin-only fields and how they help. This only applies to fields the reporter never needs to see or fill, like case status and internal notes. Everything the reporter submits themselves, including their name, the incident description, and their evidence upload, stays a normal, fillable field.

Field (question form)

Field ID

Type

What type of concern are you reporting?

complaint_category

Choice

Would you like to file this report anonymously?

reporting_type

Choice

What's your full name?

reporter_name

Short text

What's your work email address?

reporter_email

Email

What department do you work in?

reporter_department

Short text

Who is this complaint about?

respondent_name

Long text

What department does this person work in?

respondent_department

Short text

What's your working relationship to this person?

relationship_to_respondent

Choice

When did the most recent incident happen?

incident_date

Date

Is this behavior ongoing?

is_ongoing

Yes/No

Describe what happened, in as much detail as you're comfortable sharing

incident_description

Long text

Were there any witnesses?

witnesses

Long text

Have you experienced retaliation for raising this or a related concern?

retaliation_experienced

Yes/No

Describe the retaliation you experienced

retaliation_description

Long text

Do you have any supporting documents, screenshots, or messages?

evidence_upload

File (multiple files allowed)

What outcome are you hoping for?

desired_outcome

Choice

Do you consent to being contacted for follow-up during the investigation?

consent_to_contact

Yes/No

I understand this report will be handled confidentially and in line with our anti-retaliation policy

acknowledgment

Yes/No

Case status

case_status

Dropdown (admin-only)

Case severity

case_severity

Dropdown (admin-only)

AI severity analysis

ai_severity_analysis

AI Analysis field (admin-only)

Assigned investigator

assigned_investigator

Assignee field (admin-only)

Repeat respondent pattern confirmed

repeat_pattern_flag

Yes/No (admin-only)

Related case references

related_case_references

Short text (admin-only)

Investigation notes

investigation_notes

Long text (admin-only)

Interview log

interview_log

Long text (admin-only)

Final decision

final_decision

Dropdown (admin-only)

Corrective action taken

corrective_action_taken

Long text (admin-only)

Case closed date

case_closed_date

Date (admin-only)

💡 Want to know exactly what the Assignee field can do? This is the atomic reference for that field type. See what is the Assignee field in Formaloo and how to use it. The Assignee field only works with workspace members and teams, so your investigators need to be added as internal users, not portal sign-ups.

5. Set up the AI severity analysis field: Open the AI Analysis field's settings and point it at the fields it should read: complaint_category, incident_description, is_ongoing, retaliation_experienced, retaliation_description, and relationship_to_respondent. Give it a prompt asking it to classify the case's severity as Low, Medium, High, or Critical, based on factors like any physical safety risk, whether the behavior is ongoing, the power difference between the reporter and respondent, and any retaliation described, and to explain its reasoning in 2 to 3 sentences. Turn on Allow AI to update records and select case_severity as the field it's allowed to write to, so the dropdown updates automatically alongside the written analysis. Set it to run when the form is submitted. The field stays admin-only by default, hidden from the reporter, and writes its output directly onto the submission row.

6. Publish your form.

Part 2 — Add the form logic

This is what keeps the form from asking every reporter the same questions regardless of their situation. Contact fields only show up if the reporter chooses to be identified, the retaliation detail only appears if they say they've experienced it, and evidence becomes required only when they're asking for formal discipline.

💡 Want your form to show, hide, skip, or require fields based on what someone just answered? This is the foundational guide to logic in Formaloo, what it is, and the difference between logic and calculation. See what is logic in Formaloo.

1. Open Advanced logic: In your form editor, open the Advanced logic panel on the right side of the screen and go to the Logic tab.

2. Open Magic Logic: Click Magic Logic in the top right corner.

3. Describe your rules: Paste a plain-text prompt describing all three rules at once: show "What's your full name?", "What's your work email address?", "What department do you work in?", and "Do you consent to being contacted for follow-up during the investigation?" only when "Would you like to file this report anonymously?" is "No, include my name and contact information," hidden by default; show "Describe the retaliation you experienced" only when "Have you experienced retaliation for raising this or a related concern?" is Yes, hidden by default; and require "Do you have any supporting documents, screenshots, or messages?" only when "What outcome are you hoping for?" is Formal disciplinary action, optional by default.

4. Generate and review: Click Generate Rules. Review each rule AI previews, and approve, redo, or cancel as needed.

5. Save your logic: Once approved, make any manual adjustments, then click Save in the top right corner.

Note: Anonymous reports simply have no value in reporter_email, since that field never shows for them. Keep that in mind in Part 4, since any notification tied to that field only ever reaches identified reporters.

Part 3 — Create your email templates

This workflow needs six emails: a confirmation to the reporter, an internal alert to the investigations team, an urgent internal alert for anything the AI flags as Critical, and three status updates as a case moves through investigation, resolution, and closure. Build all six as custom templates first, then wire up the triggers in the next Part.

💡 Want to send branded, personalized emails instead of Formaloo's plain default notification? This is the foundational guide to building and sending custom email templates. See how to create and send custom email templates.

1. Open Custom Email Templates: Click your profile icon, go to Apps and Integrations, and find Custom Email Templates.

2. Add a new template: Click Add New Template, name it "Report received confirmation," and set the subject to We've received your report (CASE-@rowid).

3. Generate the body with AI: Clear the body field, add an AI block, and paste this prompt: "Write a calm, reassuring confirmation email to @reporter_name letting them know their report has been received and will be reviewed by a member of the HR and Legal investigations team. Reference the case number CASE-@rowid. Reassure them that retaliation for making a good-faith report is prohibited under company policy, and let them know they'll receive updates as the case progresses. Keep it to 3 to 4 short sentences, calm and factual, no promises on timelines. Design it with a white background, a single centered column at max-width 560px, an Inter or system-ui font, a small status badge reading 'Received,' and a muted footer in #999."

4. Repeat for the remaining five templates, using the same steps with these names, subjects, and prompts:

  • New complaint alert (internal). Subject: New complaint needs review (CASE-@rowid). Prompt: "Write a brief, factual internal notification telling the HR and Legal investigations team a new complaint has come in, category @complaint_category, involving @respondent_name. Include the case number and prompt them to assign an investigator and begin the initial review. Under 3 sentences, no fluff. White background, single centered column max-width 560px, Inter or system-ui font, a compact data table showing case number, category, and respondent, muted footer in #999."

  • Critical severity escalation alert (internal). Subject: Critical severity case flagged (CASE-@rowid). Prompt: "Write an urgent, factual internal alert telling the HR Director and Legal lead that a case has been flagged Critical severity on AI review. Include the case number and the AI's severity analysis @ai_severity_analysis, and ask them to review it immediately. Keep it under 4 sentences, direct and serious, no dramatization. White background, single centered column max-width 560px, Inter or system-ui font, a red-toned 'Critical' status badge, muted footer in #999."

  • Investigation update. Subject: An update on your report (CASE-@rowid). Prompt: "Write a clear, respectful email to @reporter_name letting them know their report is now under active investigation. Keep it general, 3 to 4 sentences, reassuring but without revealing investigation detail. White background, single centered column max-width 560px, Inter or system-ui font, status badge 'Investigation in progress,' muted footer in #999."

  • Case resolved. Subject: Your report has been resolved (CASE-@rowid). Prompt: "Write a respectful, brief closing email to @reporter_name letting them know their report has reached a resolution. Do not disclose any specific disciplinary outcome taken against another employee. Invite them to reach out to HR directly with questions. 3 to 4 sentences, calm and professional. White background, single centered column max-width 560px, Inter or system-ui font, a 'Resolved' status badge, muted footer in #999."

  • Case closed (internal). Subject: Case file closed (CASE-@rowid). Prompt: "Write a short internal note confirming case CASE-@rowid is now closed and archived, final decision @final_decision, and reminding the team the full case file PDF is attached to this record for audit purposes. 2 to 3 sentences. White background, single centered column max-width 560px, Inter or system-ui font, a neutral 'Closed' badge, muted footer in #999."

5. Save each template.

Part 4 — Set up automated email notifications

With the templates built, the next step is telling Formaloo when each one fires, so a case moves through review, investigation, and closure without anyone manually sending updates.

1. Turn on respondent notifications: In your form editor, open Notify in the right sidebar, then Send email to respondent. Turn on the toggle and select the "Report received confirmation" template. This fires on submission for identified reporters, since @reporter_email is the form's Email field. Anonymous reports leave that field blank, so no confirmation email goes out for them, which is expected.

2. Turn on admin notifications: Go back and turn on Receive email notification, then route it to the "New complaint alert" template so your investigations team's inbox gets notified the moment a report comes in.

Beyond submission, the remaining four emails only need to fire when an admin-only field changes, which calls for conditional logic rather than a static notification.

3. Open the On Update logic tab: In Advanced logic, switch to the rule set that runs when an existing record is updated.

4. Add a rule for AI-flagged severity: When case_severity changes to Critical, send the "Critical severity escalation alert" template to your HR Director's or Legal Counsel's email address. Because this update runs through the same path as a manual edit, the rule fires whether a person or the AI Analysis field set the value, so a Critical case escalates the moment the AI flags it, before anyone has manually opened the case.

5. Add a rule per case status: Add three more rules, one per status: when case_status changes to Investigation in progress, send "Investigation update" to @reporter_email; when it changes to Resolved, send "Case resolved" to @reporter_email; when it changes to Closed, send "Case closed (internal)" to your assigned investigator or a static investigations team address.

6. Save your logic.

Part 5 — Build the confidential case file PDF template

Every case needs an internal record that a reviewer can print, archive, or hand to legal counsel, one that includes the AI's severity read alongside the reporter's own submission and everything the investigation adds afterward. This is a self-contained HTML template Formaloo turns into a PDF for every row.

💡 Want every form submission to generate a polished, branded document automatically? This is the foundational guide to building a PDF template from a submission. See how to create PDF templates to turn responses into documents.

1. Open Custom PDF Template: Click your profile icon, go to Apps and Integrations, and click Custom PDF Template, then Add New Template.

2. Switch to HTML view: Toggle the editor to HTML and paste the code below.

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Confidential Case File</title> <style>   @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');    * { box-sizing: border-box; margin: 0; padding: 0; }    body {     font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;     background: #ffffff;     color: #1a1a1a;     max-width: 760px;     margin: 0 auto;     padding: 60px 72px;   }    .confidential-banner {     background: #1a1a1a;     color: #ffffff;     text-align: center;     font-size: 11px;     font-weight: 600;     letter-spacing: 0.08em;     text-transform: uppercase;     padding: 8px;     margin-bottom: 32px;     border-radius: 4px;   }    .header {     display: flex;     justify-content: space-between;     align-items: flex-start;     border-bottom: 2px solid #1a1a1a;     padding-bottom: 24px;     margin-bottom: 40px;   }    .header h1 {     font-size: 22px;     font-weight: 700;     letter-spacing: -0.02em;   }    .header .meta {     text-align: right;     font-size: 13px;     color: #666;     line-height: 1.6;   }    .header .meta .ref {     font-size: 15px;     font-weight: 600;     color: #1a1a1a;   }    .section {     margin-bottom: 32px;   }    .section-title {     font-size: 10px;     font-weight: 600;     text-transform: uppercase;     letter-spacing: 0.1em;     color: #aaaaaa;     margin-bottom: 14px;   }    .field-grid {     display: grid;     grid-template-columns: 1fr 1fr;     gap: 0 32px;   }    .field {     padding: 10px 0;     border-bottom: 1px solid #eeeeee;   }    .field.full {     grid-column: 1 / -1;   }    .field-label {     font-size: 12px;     color: #888888;     margin-bottom: 4px;   }    .field-value {     font-size: 14px;     color: #1a1a1a;     line-height: 1.5;   }    .inset {     background: #f9f9f9;     border-left: 3px solid #cccccc;     padding: 16px 20px;     border-radius: 4px;     font-size: 13px;     color: #555555;     line-height: 1.6;   }    .ai-block {     background: #f6f5ff;     border-left: 3px solid #6c5ce7;     padding: 20px 24px;     border-radius: 4px;   }    .ai-block .field-label {     color: #6c5ce7;     font-weight: 600;     text-transform: uppercase;     font-size: 11px;     letter-spacing: 0.06em;   }    .ai-block .field-value {     margin-top: 6px;     font-size: 14px;   }    .severity-badge {     display: inline-block;     font-size: 11px;     font-weight: 600;     text-transform: uppercase;     letter-spacing: 0.05em;     padding: 4px 10px;     border-radius: 100px;     background: #fbeaea;     color: #b23b3b;   }    .footer {     margin-top: 48px;     padding-top: 20px;     border-top: 1px solid #eeeeee;     display: flex;     justify-content: space-between;     font-size: 11px;     color: #999999;   } </style> </head> <body>    <div class="confidential-banner">Confidential: internal case record, not for external distribution</div>    <div class="header">     <h1>Confidential Case File</h1>     <div class="meta">       <div class="ref">CASE-@rowid</div>       <div>Submitted @created_at</div>     </div>   </div>    <div class="section">     <div class="section-title">Reporter</div>     <div class="field-grid">       <div class="field">         <div class="field-label">Reporting type</div>         <div class="field-value">@reporting_type</div>       </div>       <div class="field">         <div class="field-label">Reporter's department</div>         <div class="field-value">@reporter_department</div>       </div>       <div class="field">         <div class="field-label">Name</div>         <div class="field-value">@reporter_name</div>       </div>       <div class="field">         <div class="field-label">Email address</div>         <div class="field-value">@reporter_email</div>       </div>     </div>     <br>     <div class="inset">       Name and email are left blank above for anonymous reports by design. This case file never pipes identity fields into an anonymous submission.     </div>   </div>    <div class="section">     <div class="section-title">Complaint &amp; respondent</div>     <div class="field-grid">       <div class="field">         <div class="field-label">Type of concern</div>         <div class="field-value">@complaint_category</div>       </div>       <div class="field">         <div class="field-label">Most recent incident date</div>         <div class="field-value">@incident_date</div>       </div>       <div class="field">         <div class="field-label">Respondent</div>         <div class="field-value">@respondent_name</div>       </div>       <div class="field">         <div class="field-label">Respondent's department</div>         <div class="field-value">@respondent_department</div>       </div>       <div class="field">         <div class="field-label">Relationship to respondent</div>         <div class="field-value">@relationship_to_respondent</div>       </div>       <div class="field">         <div class="field-label">Ongoing behavior</div>         <div class="field-value">@is_ongoing</div>       </div>     </div>   </div>    <div class="section">     <div class="section-title">Incident &amp; retaliation</div>     <div class="field-grid">       <div class="field full">         <div class="field-label">Description of what happened</div>         <div class="field-value">@incident_description</div>       </div>       <div class="field full">         <div class="field-label">Witnesses</div>         <div class="field-value">@witnesses</div>       </div>       <div class="field">         <div class="field-label">Retaliation experienced</div>         <div class="field-value">@retaliation_experienced</div>       </div>       <div class="field">         <div class="field-label">Requested outcome</div>         <div class="field-value">@desired_outcome</div>       </div>       <div class="field full">         <div class="field-label">Retaliation described</div>         <div class="field-value">@retaliation_description</div>       </div>       <div class="field full">         <div class="field-label">Evidence attached</div>         <div class="field-value">Supporting files are attached to this submission in the dashboard.</div>       </div>     </div>   </div>    <div class="section">     <div class="section-title">Internal case management</div>     <div class="ai-block">       <div class="field-label">AI severity analysis</div>       <div class="field-value">@ai_severity_analysis</div>     </div>     <br>     <div class="field-grid">       <div class="field">         <div class="field-label">Case status</div>         <div class="field-value">@case_status</div>       </div>       <div class="field">         <div class="field-label">Case severity</div>         <div class="field-value"><span class="severity-badge">@case_severity</span></div>       </div>       <div class="field">         <div class="field-label">Assigned investigator</div>         <div class="field-value">@assigned_investigator</div>       </div>       <div class="field">         <div class="field-label">Repeat pattern confirmed</div>         <div class="field-value">@repeat_pattern_flag</div>       </div>       <div class="field full">         <div class="field-label">Related case references</div>         <div class="field-value">@related_case_references</div>       </div>       <div class="field full">         <div class="field-label">Investigation notes</div>         <div class="field-value">@investigation_notes</div>       </div>       <div class="field full">         <div class="field-label">Interview log</div>         <div class="field-value">@interview_log</div>       </div>       <div class="field">         <div class="field-label">Final decision</div>         <div class="field-value">@final_decision</div>       </div>       <div class="field">         <div class="field-label">Case closed date</div>         <div class="field-value">@case_closed_date</div>       </div>       <div class="field full">         <div class="field-label">Corrective action taken</div>         <div class="field-value">@corrective_action_taken</div>       </div>     </div>   </div>    <div class="footer">     <div>Confidential: internal case record, not for external distribution</div>     <div>Your company name</div>   </div>  </body> </html>

3. Name and save: Give it the name "Confidential case file" and click Save.

The case reference and submission date come straight from Formaloo's own variables, @rowid and @created_at, piped directly into the template text, no extra field required.

📖 For the full list of variables you can pipe into a template like this, see how to dynamically pull form data into custom emails, PDFs, and AI prompts.

4. Attach it to a notification: Since this is an internal record rather than something sent to the reporter, attach it to the "New complaint alert" email so the investigations team receives the case file the moment a report comes in.

Part 6 — Set up the reporter portal

Employees need a way to submit a report and, if they chose to be identified, check on it later, without a public sign-up page open to anyone who finds the link.

💡 Want to give clients, applicants, or teammates their own space to submit and track requests? This is the foundational guide to building a portal and controlling who can see it. See how to create a portal and manage users' access.

Here's how the reporter group of pages is laid out:

Group

Page

Access level

Data block

Filter

Sort

Form?

Reporter

Submit a confidential complaint

External portal user, no restriction

Form

None

N/A

Yes

Reporter

My report status

External, view own records only, identified reporters only

Table (case status and submitted date only)

None (scoped to own)

Newest first

No

1. Start your project: Start from Form so your complaint form is already attached, then open the project's Settings (gear icon) and select Activate Portal.

2. Set up the user directory: Click Manage User, open the Setup Wizard, and create a new user directory (this is what lets identified reporters sign up and log in). Configure login, sign-up, and any bot protection you want, then connect the profile to your complaint form. Since this is a workplace-only workflow, limit sign-up to your company's email domain so only employees can create an account.

3. Add the "My report status" page: Add a table page and point it at your complaint form's data, showing only the case status and submission date columns, nothing else. Switch to Edit Mode, click Options, scroll to Manage Access, select the profile field in the dropdown, and toggle on Allow users to view only their data.

💡 Want each logged-in user to see only their own submissions, not everyone else's? This is the foundational guide to the "view only their data" access restriction. See how to let users view and edit their own data in your portal.

Note: Anonymous reporters never sign up to this portal, since there's no email tied to their submission to match a profile against. "My report status" only ever surfaces for identified reporters, and it never shows internal fields like severity, investigator notes, or the AI's analysis, only the status and date they submitted.

Part 7 — Set up the internal investigations workspace

Your HR and Legal investigators need their own pipeline, completely separate from what a reporter sees, with a way to spot a respondent who's been named more than once.

💡 Want a whole page in your portal visible only to a specific role, not just specific data within a page? This covers page-level access restriction. See how to restrict users' access to pages in your portal.

Here's how the investigations team group of pages is laid out:

Group

Page

Access level

Data block

Filter

Sort

Form?

HR & Legal investigators

All cases

Internal users, Investigations team

Kanban

None

Grouped by Case status

No

HR & Legal investigators

My assigned cases

Internal, Investigations team

Table

Assigned investigator = logged-in user

Newest first

No

HR & Legal investigators

New & under review

Internal, Investigations team

Table

Case status = New or Under review

Newest first

No

HR & Legal investigators

Investigation in progress

Internal, Investigations team

Table

Case status = Investigation in progress or Interviews scheduled

Oldest first

No

HR & Legal investigators

Repeat respondent check

Internal, Investigations team

Table

None

Grouped by Respondent name

No

HR & Legal investigators

Resolved & closed

Internal, Investigations team

Table

Case status = Resolved or Closed

Newest first

No

1. Make investigators workspace members: Add your HR and Legal investigators as workspace members, and group them into an "Investigations team" if you use teams.

💡 Want to assign work to a group instead of naming one person every time? Teams let you route submissions to everyone in a group you define. See what is a team in Formaloo and how to manage it.

2. Add the "All cases" Kanban: Add a Kanban page grouped by Case status. Open the page's three-dot menu, click Access, and restrict it to Internal users → Specific teams, selecting your Investigations team.

💡 Want a visual, drag-and-drop way to move records through stages, like a pipeline? This is the foundational guide to the Kanban Data Block. See how to create a Kanban board. Dragging a card to a new column updates Case status and fires the matching logic and email from Part 4 automatically.

3. Add "My assigned cases": Add a table page, restrict its page Access to Internal users → Specific teams the same way, then switch to Edit Mode, open Options → Manage Access, select the Assigned investigator field, and toggle on Allow assignees to view only their data. Each investigator now sees only their own assigned cases.

4. Add "New & under review" and "Investigation in progress": Duplicate the pipeline table, filter one by Case status = New or Under review (newest first) and the other by Case status = Investigation in progress or Interviews scheduled (oldest first), same page access restriction as the rest of this group.

5. Add "Repeat respondent check": Add one more table with no filter, grouped and sorted by Respondent name instead of by date, same page access restriction. Since an AI Analysis field only ever reads the submission it's attached to, it can't tell you on its own that a respondent has been named before. This page is how your investigators catch that manually: before opening a new case, they scan this view for the respondent's name, and if a pattern turns up, record it in repeat_pattern_flag and related_case_references on the new case.

6. Add "Resolved & closed": One more table, filtered to Case status = Resolved or Closed, for a historical record of finished cases.

Part 8 — Add the AI-powered pattern report for leadership

Leadership doesn't need to read every case individually, and they're in a better position than any single investigator to notice patterns across the whole case history. This is where the AI severity read you set up in Part 1 rolls up into something they can actually use.

Here's how the reports group of pages is laid out:

Group

Page

Access level

Data block

Filter

Sort

Form?

Leadership (Reports)

Case overview

Internal, Leadership, full visibility

Table

None

Newest first

No

Leadership (Reports)

AI case pattern report

Internal, Leadership

Reference page (AI Analyze block)

None

N/A

No

1. Add the "Case overview" page: Add one more table page with no filter, showing every case regardless of status, and restrict its Access to Internal users → Specific teams, selecting your leadership group.

2. Add the "AI case pattern report" page: Add a new reference page and insert an AI Analyze block, pointing it at your complaint form's data.

3. Prompt the report: Ask it to break down cases by severity level and category, flag any respondent named in more than one case description, identify departments with clusters of complaints, and summarize the average time from submission to case closure. Formaloo generates charts and a written summary from your live data, reading across every case on file rather than just the one in front of you, which is what makes it able to surface a pattern a single investigator working case by case might not connect.

What you now have

A single confidential intake that lets an employee report harassment or retaliation on their own terms, anonymously or not, and gets an AI severity read the moment it's submitted instead of waiting in a queue to be triaged by hand. Investigators work from a Kanban pipeline that emails reporters automatically as a case status changes, a dedicated page to catch a respondent who's been named before, and a locked-down internal PDF for every case that leaves behind a proper audit trail. Leadership gets a live, AI-generated view of severity trends and repeat-respondent clusters across your entire case history, all without anyone building a tracking spreadsheet by hand or exposing a case to more people than it needs to reach.

What's next

  • Route Critical cases straight to your most senior investigator Once case severity is being set automatically, you can add a rule that reassigns anything flagged Critical away from the general queue the moment it's set. → How to add advanced logic to your form

  • Keep a mirrored record in your existing compliance tracking If Legal or Compliance already tracks cases in a spreadsheet, sync every case into Google Sheets automatically so this workflow doesn't become a second, conflicting source of truth. → How to connect and sync your forms to Google Sheets (one-way)

  • Put the reporter portal on your own domain For something this sensitive, a portal at your own company URL reads as far more trustworthy to an employee than a generic Formaloo link. → How to set up an app or portal custom domain

Ready-to-use templates

Don't build this from scratch, we've already put it together for you.

  • Employee request workflow — Internal request routing by type with approval tracking. The same status-and-routing pattern powers this workflow's admin-only fields and investigation pipeline.

  • Job applicant tracking workflow — Tracks records across pipeline stages with reviewer assignments. It's the same shape as moving a case through New, Investigation in progress, and Resolved.

  • Patient intake & consent workflow for healthcare — Conditional intake logic, AI-powered emails, and a PDF document, the same combination this confidential case workflow relies on to handle sensitive information carefully.

Learn more how-tos

Did this answer your question?