What you'll build
A shared equipment fault log that replaces the spreadsheet or clipboard each location uses on its own. Every location reports faults into one form, and every fault links back to one master record per physical asset, so the same oven, HVAC unit, or conveyor failing at three different locations shows up as one asset with three faults, not three unrelated tickets. Each new report also gets a private AI read on whether this looks like a developing pattern and what to do about it, and once an asset crosses a fault threshold you set, it escalates to facilities automatically, no one has to notice the pattern by eye.
When to use this
A retail chain, clinic network, or restaurant group wants one place to see which piece of equipment keeps failing across every location, not just the one that reported it last.
Facilities or ops teams are finding out about a third failed unit only when it finally breaks down completely, instead of after the second report.
Location managers currently text, email, or write down equipment issues with no shared record, so nobody at HQ can see the pattern forming.
A regional or central ops team needs a single dashboard to spot which locations are having the roughest week, without opening every location's own tracker.
You want AI to flag "this is the third report on this exact fryer in two weeks" before a technician has to piece that together from memory.
Part 1 — Build the asset register
Start with the register, the master list of physical equipment across every location, because the fault report form in Part 2 depends on it. Each asset gets one row here, created once, regardless of how many faults get reported against it later.
1. Create a new form: From your Formaloo homepage, click Magic Create.
2. Describe the form: Paste this prompt: "Create an equipment asset register with fields for asset name or ID (short text), location (dropdown with a few example locations), equipment type (dropdown, e.g. HVAC, refrigeration, kitchen equipment, conveyor, generator, other), install date (date), and vendor or service provider name (short text). Add three admin-only fields: status (dropdown: Active, Under repair, Retired), assignee (assignee field), and internal notes (long text)."
3. Verify the fields: Your form should look like this, Magic Create will have generated most of it. Verify each field and field ID matches exactly.
Field (question form) | Field ID | Type |
What's the asset name or ID? |
| Short text |
Which location is this asset at? |
| Dropdown |
What type of equipment is this? |
| Dropdown |
When was this asset installed or put into service? |
| Date |
Who's the vendor or service provider for this asset? |
| Short text |
Status |
| Dropdown |
Assignee |
| Assignee |
Internal notes |
| Long text |
📖 See what are admin-only fields and how they help if you want to change what's hidden here.
4. Add two fields Magic Create can't generate: In the field list, click Add field and add "Open fault count" as a Variable field (sub-type integer, default 0), admin-only. Add "Last fault reported on" as a Date field, admin-only.
5. Add the escalation field: Add one more admin-only field, "Escalation status," as a Dropdown with three options: Normal, Watch, Escalated. Set the default answer to Normal.
6. Publish the form: Click Publish in the island bar at the top of the editor.
Note: None of these last three fields get filled in by hand, ever. They're only ever written to by the logic you'll build in Part 5, from the fault report form. Don't be surprised that they start blank.
Part 2 — Build the fault report form
This is the form location staff use every time something breaks. It stays deliberately separate from the register in Part 1, because one asset accumulates many fault reports over its lifetime, and you want those reports to pile up against one record, not create a new asset each time.
1. Create a new form: From your Formaloo homepage, click Magic Create.
2. Describe the form: Paste this prompt: "Create an equipment fault report form with fields for location (dropdown), what's happening with the equipment (long text), severity (single choice: Minor, still usable / Moderate, limited use / Safety hazard, stop use immediately), a photo upload of the issue, reporter name (short text), and reporter email (email). Add three admin-only fields: status (dropdown: New, Assigned, In progress, Resolved), assignee (assignee field), and internal notes (long text)."
3. Verify the fields: Your form should look like this, Magic Create will have generated most of it. Verify each field and field ID matches exactly.
Field (question form) | Field ID | Type |
Which location are you reporting from? |
| Dropdown |
What's happening with the equipment? |
| Long text |
How severe is this? |
| Choice |
Upload a photo of the issue |
| File |
Your name |
| Short text |
Your email |
| |
Status |
| Dropdown |
Assignee |
| Assignee |
Internal notes |
| Long text |
4. Require the photo above Minor: Open Advanced logic in the form settings panel on the right side, go to the Logic tab, and click Magic Logic. Paste: "If severity is not Minor, still usable, require the photo upload field." Click Generate Rules, review the preview, and approve it.
📖 See what is logic in Formaloo if this is your first time opening the logic panel.
5. Publish the form: Click Publish in the island bar at the top of the editor.
Part 3 — Connect every fault to its asset
This is the field the whole build depends on. Once a fault report links to a specific row in the asset register, Formaloo can pull that asset's history into the report, and later push updates back the other way.
1. Add the asset link: In the fault report form's field list, click Add field, choose Linked rows, and title it "Which asset is having the issue?" (asset). Set the related form to your asset register form. This lets whoever reports a fault pick the exact asset from a searchable list instead of typing a name that might not match.
💡 Want the full mechanics of connecting two forms this way? See what are linked rows and how to use them.
2. Pull in the asset's open fault count: Add another field, type Lookup, title it "Open faults on this asset" (asset_open_fault_count), admin-only. Set it to read through the "Which asset is having the issue?" linked rows field, and pull the "Open fault count" field from the asset register.
3. Pull in the asset's last fault date: Add one more Lookup field, title it "Last fault on this asset" (asset_last_fault_date), admin-only, reading through the same linked rows field, pulling "Last fault reported on."
📖 See how to lookup the submitted data of another form for the full lookup field setup.
4. Save the form.
These two lookups exist for one reason: they hand the AI Analysis fields in Part 4 the asset's actual history instead of judging each fault report in isolation.
Part 4 — Add the AI recurrence read
This is the part that makes the log more than a counter with a label on it. Every fault report gets a private, AI-written read on whether it looks like a one-off or the start of a pattern, plus a suggested next step, both invisible to the person reporting the issue.
1. Open the Add field panel: In your fault report form's editor, click Add field and look for AI Analysis.
2. Add the recurrence risk field: Title it "Recurrence risk read" (ai_recurrence_risk). Confirm it's locked to admin-only (AI Analysis fields are always admin-only, the person filling out the form never sees this). In the field's prompt, write: "Based on the issue description, severity, how many other open faults this asset currently has (asset_open_fault_count), and when this asset last had a fault (asset_last_fault_date), write two or three sentences on whether this looks like an isolated incident or a developing pattern on this specific asset."
3. Add the suggested action field: Add a second AI Analysis field, title it "Suggested maintenance action" (ai_suggested_maintenance), admin-only. Prompt: "Based on the issue description, severity, and the asset's open fault count, recommend one concrete next step: routine inspection, scheduled preventive service, or full replacement, in one or two sentences."
4. Save the form.
💡 Want the full setup and plan requirements for this field type? See how to generate AI analysis in a field without showing it to form respondents.
Part 5 — Set up the escalation logic
This is where the cross-location visibility actually happens. Three things need to fire automatically: a safety hazard needs to bypass everything and alert facilities immediately, every new fault needs to update its asset's running count, and an asset needs to escalate itself once that count crosses your threshold.
1. Open the fault report form's logic: In the form settings panel on the right side, open Advanced logic, go to the Logic tab, and click Magic Logic.
2. Set the safety hazard bypass: Paste: "If severity is Safety hazard, stop use immediately, jump to a dedicated Stop use success page instead of the standard confirmation." Generate, review, and approve.
3. Set the photo-evidence rule if you haven't already: Skip this if you completed it in Part 2.
4. Save the logic.
📖 See what is On Submit logic and how it works for how the timing on these rules works.
5. Add the on-submit asset update: Still on the fault report form's logic tab, add an On Submit rule using update record logic: through the "Which asset is having the issue?" linked rows field, add 1 to that asset's "Open fault count," and set that asset's "Last fault reported on" to today. This runs for every fault report, regardless of severity.
6. Add the on-update release: Add an On Update rule: when "Status" changes to "Resolved," through the same linked rows field, subtract 1 from that asset's "Open fault count." This only fires on the transition into Resolved, so an asset's count decrements exactly once per fault.
📖 See how to update records across forms using logic and what is On Update logic and how it works for the full mechanics behind both rules.
7. Switch to the asset register form's logic: Open the asset register form's Advanced logic.
8. Add the auto-escalation rule: Add an On Update rule: when "Open fault count" changes and its new value is greater than or equal to 3, set "Escalation status" to "Escalated." (3 is the example from the brief, adjust to whatever threshold facilities wants.)
9. Add the step-down and reset rules: Add a second On Update rule: when "Open fault count" changes and its new value is 1 or 2, and "Escalation status" is currently "Escalated," set "Escalation status" to "Watch." Add a third: when "Open fault count" changes to 0, set "Escalation status" to "Normal."
10. Save the logic.
Note: Formaloo's logic and lookup fields don't do time-windowed counting, so this build tracks unresolved fault count rather than a strict rolling 30-day window. In practice they land in the same place: an asset with three genuinely open, unfixed faults is exactly the pattern you want flagged, and the count self-corrects as faults get resolved.
Part 6 — Build the email templates
Four emails cover the workflow: an immediate alert for safety hazards, an escalation notice once an asset crosses the threshold, a confirmation for whoever reported the fault, and a resolution notice once it's fixed.
1. Open the email template builder: Click your profile icon, go to Apps and Integrations, find Custom Email Templates, and click Add New Template.
2. Build the safety hazard alert: Name it "Safety hazard alert." Subject: "Safety hazard reported at @location, @asset." Clear the body, add an AI block, and use this prompt: "Write a short, urgent, factual alert to the facilities and ops team. State plainly that a safety hazard was just reported, name the asset and location, and quote the issue description. Tell them the equipment should not be used until inspected. Do not soften the urgency with pleasantries. 3 to 4 sentences. Design: white background, single centered column max 560px wide, Inter or system-ui font, a bold red-bordered callout box around the do-not-use line, muted footer in #999." Save.
3. Build the recurring breakdown escalation: Name it "Recurring breakdown escalation." Subject: "@asset at @location has crossed the fault threshold." AI prompt: "Write a calm, factual email to facilities and ops explaining that an asset has repeated to the point of automatic escalation. Reference the asset, location, current open fault count, and the date of its most recent fault. Recommend reviewing the AI recurrence read on the latest report before deciding between inspection, preventive service, or replacement. 4 to 5 sentences. Design: white background, single centered column max 560px wide, Inter or system-ui font, a status badge showing Escalated, muted footer in #999." Save.
4. Build the fault report confirmation: Name it "Fault report confirmation." Subject: "We've logged your equipment issue at @location." AI prompt: "Write a brief, reassuring confirmation to the reporter. Thank them for flagging it, restate the issue in one sentence, and tell them facilities has been notified and will follow up. Warm but not overly casual. 2 to 3 sentences. Design: white background, single centered column max 560px wide, Inter or system-ui font, a simple data table showing Asset, Location, Severity, muted footer in #999." Save.
5. Build the resolution notice: Name it "Resolution notice." Subject: "Update on your reported issue at @location." AI prompt: "Write a short, friendly note letting the reporter know their reported issue has been resolved. Reference the asset and thank them for reporting it. 2 sentences. Design: white background, single centered column max 560px wide, Inter or system-ui font, a green Resolved status badge, muted footer in #999." Save.
6. Wire up the triggers: Back in the fault report form's logic, on the safety hazard rule from Part 5, add the action "send email" using the Safety hazard alert template, to your facilities distribution address. On the resolution logic rule from Part 5, add "send email" using the Resolution notice template, to @reporter_email. Add a plain On Submit rule sending the Fault report confirmation template to @reporter_email on every submission.
7. Wire up the escalation email: On the asset register form's auto-escalation rule from Part 5, add the action "send email" using the Recurring breakdown escalation template, to your facilities distribution address.
📖 See how to use answer piping in Formaloo for how the @field variables in these subject lines and prompts work.
Part 7 — Build the PDF template
Every fault report can generate a maintenance record PDF, useful for facilities' own files or for handing to an outside vendor doing the repair.
1. Open the PDF template builder: Click your profile icon, go to Apps and Integrations, click Custom PDF Template, and click Add New Template.
2. Switch to HTML view: In the template editor, switch to the HTML view.
3. Paste this code:
<div style="max-width:760px;margin:0 auto;padding:60px 72px;font-family:'Inter',system-ui,-apple-system,sans-serif;color:#1a1a1a;background:#ffffff;"> <div style="margin-bottom:40px;"> <div style="font-size:11px;letter-spacing:1.5px;text-transform:uppercase;color:#aaaaaa;margin-bottom:8px;">Equipment fault report</div> <div style="font-size:26px;font-weight:600;color:#1a1a1a;margin-bottom:6px;">EQ-@rowid</div> <div style="font-size:13px;color:#999999;">Submitted @created_at</div> </div> <div style="border-top:1px solid #eeeeee;margin-bottom:32px;"></div> <div style="margin-bottom:32px;"> <div style="font-size:10px;letter-spacing:1.2px;text-transform:uppercase;color:#aaaaaa;margin-bottom:14px;">Asset and location</div> <table style="width:100%;border-collapse:collapse;"> <tr> <td style="width:50%;padding:10px 0;border-bottom:1px solid #f2f2f2;vertical-align:top;"> <div style="font-size:12px;color:#999999;margin-bottom:4px;">Location</div> <div style="font-size:14px;color:#1a1a1a;">@location</div> </td> <td style="width:50%;padding:10px 0;border-bottom:1px solid #f2f2f2;vertical-align:top;"> <div style="font-size:12px;color:#999999;margin-bottom:4px;">Asset</div> <div style="font-size:14px;color:#1a1a1a;">@asset</div> </td> </tr> <tr> <td style="width:50%;padding:10px 0;border-bottom:1px solid #f2f2f2;vertical-align:top;"> <div style="font-size:12px;color:#999999;margin-bottom:4px;">Severity</div> <div style="font-size:14px;color:#1a1a1a;">@severity</div> </td> <td style="width:50%;padding:10px 0;border-bottom:1px solid #f2f2f2;vertical-align:top;"> <div style="font-size:12px;color:#999999;margin-bottom:4px;">Open faults on this asset</div> <div style="font-size:14px;color:#1a1a1a;">@asset_open_fault_count</div> </td> </tr> </table> </div> <div style="margin-bottom:32px;"> <div style="font-size:10px;letter-spacing:1.2px;text-transform:uppercase;color:#aaaaaa;margin-bottom:14px;">Reported by</div> <table style="width:100%;border-collapse:collapse;"> <tr> <td style="width:50%;padding:10px 0;border-bottom:1px solid #f2f2f2;vertical-align:top;"> <div style="font-size:12px;color:#999999;margin-bottom:4px;">Name</div> <div style="font-size:14px;color:#1a1a1a;">@reporter_name</div> </td> <td style="width:50%;padding:10px 0;border-bottom:1px solid #f2f2f2;vertical-align:top;"> <div style="font-size:12px;color:#999999;margin-bottom:4px;">Email</div> <div style="font-size:14px;color:#1a1a1a;">@reporter_email</div> </td> </tr> </table> </div> <div style="margin-bottom:32px;"> <div style="font-size:10px;letter-spacing:1.2px;text-transform:uppercase;color:#aaaaaa;margin-bottom:14px;">What's happening</div> <div style="padding:16px 0;border-bottom:1px solid #f2f2f2;"> <div style="font-size:14px;color:#1a1a1a;line-height:1.6;">@issue_description</div> </div> <div style="font-size:12px;color:#bbbbbb;margin-top:10px;font-style:italic;">Any photo evidence attached to this report appears automatically as a file link at the end of this document.</div> </div> <div style="margin-bottom:32px;"> <div style="font-size:10px;letter-spacing:1.2px;text-transform:uppercase;color:#aaaaaa;margin-bottom:14px;">AI recurrence read (internal only)</div> <div style="background:#f9f9f9;border-left:3px solid #dddddd;padding:16px 20px;margin-bottom:16px;"> <div style="font-size:12px;color:#999999;margin-bottom:6px;">Recurrence risk read</div> <div style="font-size:14px;color:#1a1a1a;line-height:1.6;">@ai_recurrence_risk</div> </div> <div style="background:#f9f9f9;border-left:3px solid #dddddd;padding:16px 20px;"> <div style="font-size:12px;color:#999999;margin-bottom:6px;">Suggested maintenance action</div> <div style="font-size:14px;color:#1a1a1a;line-height:1.6;">@ai_suggested_maintenance</div> </div> </div> <div style="margin-bottom:32px;"> <div style="font-size:10px;letter-spacing:1.2px;text-transform:uppercase;color:#aaaaaa;margin-bottom:14px;">Handling</div> <table style="width:100%;border-collapse:collapse;"> <tr> <td style="width:50%;padding:10px 0;border-bottom:1px solid #f2f2f2;vertical-align:top;"> <div style="font-size:12px;color:#999999;margin-bottom:4px;">Status</div> <div style="font-size:14px;color:#1a1a1a;">@status</div> </td> <td style="width:50%;padding:10px 0;border-bottom:1px solid #f2f2f2;vertical-align:top;"> <div style="font-size:12px;color:#999999;margin-bottom:4px;">Assignee</div> <div style="font-size:14px;color:#1a1a1a;">@assignee</div> </td> </tr> </table> </div> <div style="border-top:1px solid #eeeeee;padding-top:20px;margin-top:40px;display:flex;justify-content:space-between;"> <div style="font-size:11px;color:#999999;">Internal maintenance record. Not for external distribution.</div> <div style="font-size:11px;color:#999999;">[Organization name]</div> </div> </div>
4. Name the template "Equipment fault report" and click Save.
5. Attach it to the confirmation email: Back in the Fault report confirmation email template from Part 6, open its settings and attach the "Equipment fault report" PDF template, so the reporter gets a copy of the record for their own files.
📖 See how to send custom PDFs with email notifications and how uploaded files appear in generated PDFs for how the photo evidence shows up automatically.
Part 8 — Set up the portal pages
Four groups cover the four distinct roles in this workflow: location staff reporting faults, facilities and ops handling them, whoever manages the asset register, and HQ or regional leadership who just need visibility.
Group | Page | Access level | Data block | Filter | Sort | Form? |
Location team | Report a fault | Location staff, internal, submit only | Form | None | — | Yes |
Location team | My reports | Location staff, internal, view own reports only (matched on reporter email) | Table | Reporter email = logged-in user | Newest first | No |
Location team | Open issues | Location staff, internal, view own reports only | Table | Reporter email = logged-in user and Status is not Resolved | Newest first | No |
Facilities & ops | All fault reports | Facilities/ops, internal team, full visibility across all locations | Kanban | None, grouped by Status | Newest first | No |
Facilities & ops | My assigned faults | Facilities/ops, internal team, assignee-filtered | Kanban | Assignee = logged-in user | Newest first | No |
Facilities & ops | Safety hazards | Facilities/ops, internal team, full visibility | Table | Severity = Safety hazard and Status is not Resolved | Newest first | No |
Facilities & ops | Escalated assets | Facilities/ops, internal team, full visibility | Table (on asset register) | Escalation status = Escalated | Open fault count, highest first | No |
Asset management | Add an asset | Facilities admin, internal, submit only | Form | None | — | Yes |
Asset management | All assets | Facilities admin, internal, full visibility | Table | None | Location, then asset name | No |
Asset management | Assets on watch | Facilities admin, internal, full visibility | Table | Escalation status = Watch | Open fault count, highest first | No |
Reports | Fault volume by location | HQ/regional leadership, internal, read-only | Chart (bar, grouped by location) | Status is not Resolved | — | No |
Reports | Escalated assets by location | HQ/regional leadership, internal, read-only | Chart (bar, grouped by location) | Escalation status = Escalated | — | No |
Reports | Recurring breakdown summary | HQ/regional leadership, internal, read-only | Table (on asset register) | Open fault count is greater than or equal to 1 | Open fault count, highest first | No |
1. Create your project: From your Formaloo homepage, start with Form or Dashboard, then connect both the asset register and fault report forms to it.
What you now have
One shared fault log instead of a per-location spreadsheet, with every report tied to a single master asset record no matter which site filed it. Facilities gets a private AI read on every new fault, weighing it against that asset's own recent history, plus a suggested next step, before anyone has to dig through old reports by hand. Assets escalate themselves once faults start recurring, and HQ has one page that shows exactly which piece of equipment, at which location, needs attention first.
What's next
Route each fault to the right person automatically Once you have an assignee field in place, you can have Formaloo route new faults straight to the correct facilities lead based on location or equipment type, instead of one person triaging everything by hand. → How to automatically assign submissions to the right team member or team, and control what each assignee sees
Formalize the escalation into a full approval step If facilities wants a documented sign-off before an escalated asset gets replaced rather than repaired, an approval workflow gives you that review-and-decide layer on top of what you've built here. → How to build an approval workflow in Formaloo
Give leadership a public-facing view If a regional director wants to check equipment health without a Formaloo login, a public dashboard can surface a read-only version of the Reports group from Part 8. → How to create a public dashboard to display form submissions
Ready-to-use templates
Don't build this from scratch, we've already put it together for you.
Employee request workflow — Internal request management for HR and ops teams that routes by request type and tracks approvals. The same "route by category, track status until resolved" pattern underlies how fault reports move from New to Resolved in this build.
AI lead qualification & scoring form — Scores incoming leads with AI and routes hot versus cold leads with conditional logic. It's the closest existing template to the AI-plus-threshold-escalation pattern this maintenance log uses to flag recurring breakdowns.
AI-powered job application pipeline with candidate screening — Uses an AI read on every submission to help a team triage faster. Same idea as the recurrence risk read on every fault report here, applied to a different intake.
Learn more how-tos
See the sibling pattern with a scored checklist instead of a fault log If your team also runs periodic safety walkthroughs alongside reactive fault reporting, this article uses the same AI Analysis and automatic-routing pattern on a scored inspection checklist. → How to build a safety inspection and walkthrough checklist with photo evidence and automatic exception routing
See the same AI-plus-threshold pattern applied to risk scoring This article pairs a weighted numeric score with a private AI-written read the same way this build pairs an open fault count with an AI recurrence read. → How to build an AI governance register that tracks AI system risk assessments and human-review sign-off
See the recurring-program version of automatic escalation If your organization needs this same automatic escalation pattern running on a recurring cadence rather than triggered by incoming reports, this article covers that structure. → How to build an AI-powered control self-assessment (CSA) program

