Skip to main content

How to build a cross-location equipment maintenance log that flags recurring breakdowns before they become downtime in Formaloo

Learn how to build a cross-location equipment maintenance log in Formaloo that links every fault report to its asset, auto-escalates recurring breakdowns, and uses AI to flag patterns and suggest fixes.

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?

asset_name

Short text

Which location is this asset at?

location

Dropdown

What type of equipment is this?

equipment_type

Dropdown

When was this asset installed or put into service?

install_date

Date

Who's the vendor or service provider for this asset?

vendor_name

Short text

Status

status (admin-only)

Dropdown

Assignee

assignee (admin-only)

Assignee

Internal notes

internal_notes (admin-only)

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?

location

Dropdown

What's happening with the equipment?

issue_description

Long text

How severe is this?

severity

Choice

Upload a photo of the issue

issue_photo

File

Your name

reporter_name

Short text

Your email

reporter_email

Email

Status

status (admin-only)

Dropdown

Assignee

assignee (admin-only)

Assignee

Internal notes

internal_notes (admin-only)

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.

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

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

Did this answer your question?