Skip to main content

How to build a branch-to-HQ operational request portal that routes requests with AI in Formaloo

Learn how to build a branch-to-HQ operational request portal in Formaloo, with an AI field that triages and routes every request, custom emails, a PDF record, and role-based tracking pages.

What you'll build

A single portal where every branch, clinic, or store submits supplies, IT, and facilities requests instead of emailing or calling HQ directly. An AI field reads each request the moment it lands, writes a short triage summary, and sets who owns it, IT, Facilities, Procurement, or HQ operations, without a human sorting it first. The branch gets a confirmation and status updates automatically, and HQ gets a Kanban queue per team plus a location-level trend report so recurring problems at one branch don't get lost in the noise.

When to use this

  • Your ops team is fielding the same kinds of requests from dozens of locations by email, Slack DM, or phone, and nobody has a single place to see what's outstanding

  • A branch has asked "did anyone see my request?" more than once because there was no way for them to check status themselves

  • Requests keep landing with the wrong team because whoever submits them doesn't always pick the right category

  • You want a record of who requested what, when, and how it was resolved, without building a spreadsheet by hand

  • You're already tracking incidents or maintenance faults location by location and want operational requests handled the same way

Part 1 — Build the request form with Magic Create

This is the form every branch will use, so it needs to work for three very different request types, supplies, IT, and facilities, without turning into three separate forms. The fastest way to get there is Magic Create: describe the form once and it builds the fields, then you drop in the two fields that need to be added by hand afterward.

💡 Want a fully-built form in seconds instead of dragging fields one by one? How to create any form with AI using Magic Create in Formaloo is the cornerstone article for every workflow that starts with "describe your form to the AI."

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

2. Describe the form: Paste this prompt: "Create a form for branch and store staff to submit operational requests to HQ. Include a dropdown for their branch or location; a dropdown for request type with options IT support, Facilities & maintenance, Supplies, and Other; a dropdown for urgency with options Low, Medium, High, and Urgent (blocking operations); a long text field for describing the request; a short text field for what device or system is affected; a short text field for which area or equipment needs attention; a long text field for what item(s) they need and how many; a file upload field for a photo of the issue; an admin-only status dropdown with options New, Triaged, In progress, Waiting on branch, Resolved, and Closed; an admin-only Assignee field; and an admin-only long text field for internal notes."

3. Click Create.

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 your branch or location?

location

Dropdown

What type of request is this?

request_type

Dropdown

How urgent is this?

urgency

Dropdown

Describe the request

request_description

Long text

What device or system is affected?

affected_system

Short text

Which area or equipment needs attention?

facility_area

Short text

What item(s) do you need, and how many?

supply_items

Long text

Add a photo if it helps explain the issue

photo_attachment

File upload

Status

status (admin-only)

Dropdown

Assignee

assignee (admin-only)

Assignee field

Internal notes

internal_notes (admin-only)

Long text

💡 Want internal fields, like status, assignee, or scores, invisible to the person filling out the form? What are admin-only fields and how they help is the mechanism behind Status, Assignee, and Internal notes above.

4. Add the User Profile field by hand: Magic Create won't add this one. Open Add field, add a User Profile field, and title it "Who's submitting this request?" with field ID requester_profile. This links each submission to your portal's user directory, which is what makes the "My requests" page in Part 6 possible.

Note: The User Profile field only fully connects once your portal and user directory exist. If you haven't built your portal yet, come back and confirm this field after Part 6.

Part 2 — Add the AI field that triages and routes every request

This is what makes the routing AI-based instead of a fixed rule per category. An AI Analysis field reads the whole submission the moment it's submitted, writes a short internal summary, and can update other fields on that same row, so it sets the Assignee directly instead of you writing a separate IF/THEN rule for every request type.

1. Open the Add field panel and add an AI Analysis field: It arrives admin-only by default. There's no setting anywhere that exposes it to the branch that submitted the request.

2. Title it clearly: Name it "AI triage analysis" with field ID ai_triage_analysis. This title becomes the column header in your Responses table.

3. Write the prompt: Open the field's prompt box and use the @ menu to pipe in the submitted answers: "Based on @location, @request_type, @urgency, and @request_description, along with @affected_system, @facility_area, or @supply_items if answered, write a two to three sentence triage summary of this request. Then decide which team should own it, IT team, Facilities team, Procurement team, or HQ ops generalist, based on everything submitted, not just the Request type dropdown. A request marked Other that clearly describes a broken device should still go to IT."

4. Turn on "Allow AI to update records": In the field's settings, enable this option and select only the Assignee field. This is the same mechanism Formaloo uses for healthcare intake, where an AI reads a patient's symptoms and updates a Department field so the case routes itself. Here it reads the request and sets Assignee to the right internal team the moment the request lands.

5. Save your form.

💡 Want incoming submissions to land on the right person's desk automatically, and only theirs? How to automatically assign submissions to the right team member or team, and control what each assignee sees covers the Assignee field this AI field is writing to.

Note: The AI Analysis field is available on the Business and Enterprise plans.

Part 3 — Set up field visibility with logic

The branch shouldn't see all three category-specific fields at once, only the one that matches what they picked. Use Magic Logic to generate all of these rules from one plain-language prompt instead of building each one by hand.

💡 Want your form to show, hide, skip, or require fields based on what someone just answered? What is logic in Formaloo is the foundational guide behind everything in this Part.

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

2. Click Magic Logic in the top right corner of the Logic panel.

3. Paste this prompt: "Hide 'What device or system is affected?', 'Which area or equipment needs attention?', and 'What item(s) do you need, and how many?' by default. Show 'What device or system is affected?' and require it only when Request type equals IT support. Show 'Which area or equipment needs attention?' and require it only when Request type equals Facilities & maintenance. Show 'What item(s) do you need, and how many?' and require it only when Request type equals Supplies. Hide 'Add a photo if it helps explain the issue' by default, and show it when Request type equals IT support or Facilities & maintenance."

4. Click Generate Rules and review the preview.

5. Approve each rule, or redo any that don't match the prompt above.

6. Save your logic.

Part 4 — Create the email templates

Four emails run this workflow: a confirmation to the branch, an internal notification once AI has routed the request, an urgent escalation for blocking issues, and a status update when things change. Each one needs its own template.

💡 Want to send branded, personalized emails instead of Formaloo's plain default notification? How to create and send custom email templates is the foundational guide for every template built in this Part.

1. Create the confirmation email: Title it "Request received." Subject: "We've got your request for @location." Body: a short, warm confirmation thanking the branch, restating @request_type and @request_description in one line, and reassuring them it's been automatically routed, without promising a specific response time.

2. Set its trigger: When the branch submits the form, send this immediately to @requester_profile.

3. Create the internal notification email: Title it "New request routed." Subject: "New @request_type request from @location (@urgency priority)." Body: a factual internal note showing @location, @request_type, @urgency, the submitted answers via @answered, and the reference BR-@rowid.

4. Set its trigger: When the AI triage analysis field finishes and sets the Assignee field, send this to whoever the request was just assigned to.

💡 Need the full list of variables you can pipe into a template? How to dynamically pull form data into custom emails, PDFs, and AI prompts covers @answered, @rowid, and every other variable used across this article.

5. Create the urgent escalation email: Title it "Urgent request." Subject: "🚨 Urgent: @request_type request from @location." Body: composed but direct, stating the request was flagged Urgent (blocking operations), showing the same @answered and BR-@rowid details, and asking the recipient to review now.

6. Set its trigger: In addition to the internal notification, only when Urgency equals "Urgent (blocking operations)," send this as well to the routed team's lead.

📖 See how to send and receive conditional email notifications for more on triggering an email off a specific answer like Urgency.

7. Create the status update email: Title it "Status update." Subject: "Update on your request for @location." Body: a brief, warm note referencing BR-@rowid, stating the new @status, and explaining in one plain sentence what that means for the branch.

8. Set its trigger: When an internal team member changes the Status field, send this to @requester_profile.

9. Save each template.

Part 5 — Build the PDF record

Every request gets an internal PDF record, useful for audits, recurring-issue reviews, or just a clean file per request. It pulls in the AI triage read alongside the raw submission, so a reviewer never has to open the form and the Responses table side by side.

💡 Want every form submission to generate a polished, branded document automatically? How to create PDF templates to turn responses into documents is the foundational guide for this Part.

1. Open your project's PDF templates and create a new one. Title it "Operational request record."

2. Paste in the HTML below as the template's code:

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <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, sans-serif;     background: #ffffff;     color: #1a1a1a;     max-width: 760px;     margin: 0 auto;     padding: 60px 72px;   }    .header {     display: flex;     justify-content: space-between;     align-items: flex-start;     padding-bottom: 28px;     border-bottom: 1px solid #eee;     margin-bottom: 36px;   }    .header h1 {     font-size: 22px;     font-weight: 700;     letter-spacing: -0.01em;   }    .header .meta {     text-align: right;     font-size: 12px;     color: #999;     line-height: 1.6;   }    .header .ref {     font-size: 13px;     font-weight: 600;     color: #444;   }    .section {     margin-bottom: 32px;   }    .section-title {     font-size: 10px;     font-weight: 700;     letter-spacing: 0.12em;     text-transform: uppercase;     color: #aaa;     margin-bottom: 14px;   }    .grid {     display: grid;     grid-template-columns: 1fr 1fr;     gap: 20px 32px;   }    .field {     padding-bottom: 10px;     border-bottom: 1px solid #f0f0f0;   }    .field.full {     grid-column: 1 / -1;   }    .field .label {     font-size: 11px;     color: #999;     margin-bottom: 4px;   }    .field .value {     font-size: 14px;     color: #1a1a1a;     line-height: 1.5;   }    .badge {     display: inline-block;     padding: 4px 12px;     border-radius: 100px;     font-size: 11px;     font-weight: 600;     background: #f2f2f2;     color: #444;   }    .ai-block {     background: #f7f8fc;     border-left: 3px solid #6366f1;     padding: 16px 20px;     border-radius: 4px;   }    .ai-block .label {     font-size: 11px;     color: #6366f1;     font-weight: 600;     margin-bottom: 6px;   }    .ai-block .value {     font-size: 13px;     color: #333;     line-height: 1.6;   }    .internal-note {     background: #f9f9f9;     border-left: 3px solid #ddd;     padding: 14px 18px;     border-radius: 4px;     font-size: 13px;     color: #555;     line-height: 1.6;   }    .footer {     display: flex;     justify-content: space-between;     padding-top: 24px;     margin-top: 44px;     border-top: 1px solid #eee;     font-size: 11px;     color: #999;   } </style> </head> <body>    <div class="header">     <div>       <h1>Operational request record</h1>     </div>     <div class="meta">       <div class="ref">BR-@rowid</div>       <div>Submitted @created_at</div>     </div>   </div>    <div class="section">     <div class="section-title">Request details</div>     <div class="grid">       <div class="field">         <div class="label">Branch or location</div>         <div class="value">@location</div>       </div>       <div class="field">         <div class="label">Request type</div>         <div class="value">@request_type</div>       </div>       <div class="field">         <div class="label">Urgency</div>         <div class="value"><span class="badge">@urgency</span></div>       </div>       <div class="field">         <div class="label">Submitted by</div>         <div class="value">@requester_profile</div>       </div>     </div>   </div>    <div class="section">     <div class="section-title">Request description</div>     <div class="grid">       <div class="field full">         <div class="label">What was requested</div>         <div class="value">@request_description</div>       </div>       <div class="field full">         <div class="label">Submitted answers</div>         <div class="value">@answered</div>       </div>       <div class="field full">         <div class="label">Attached photo</div>         <div class="value">@photo_attachment</div>       </div>     </div>   </div>    <div class="section">     <div class="section-title">AI triage read</div>     <div class="ai-block">       <div class="label">AI triage analysis</div>       <div class="value">@ai_triage_analysis</div>     </div>   </div>    <div class="section">     <div class="section-title">Internal handling</div>     <div class="grid">       <div class="field">         <div class="label">Status</div>         <div class="value"><span class="badge">@status</span></div>       </div>       <div class="field">         <div class="label">Assigned to</div>         <div class="value">@assignee</div>       </div>       <div class="field full">         <div class="label">Internal notes</div>         <div class="internal-note">@internal_notes</div>       </div>     </div>   </div>    <div class="footer">     <div>Internal record, not for external distribution</div>     <div>@form_title</div>   </div>  </body> </html>

3. Save the template.

4. Attach it to the internal notification email: Open the "New request routed" email template from Part 4, turn on the Attach PDF toggle, and select "Operational request record." This way the assigned team gets the full record the moment the request is routed to them.

💡 Want the generated PDF to actually reach the right person, not just sit on the record? How to send custom PDFs with email notifications covers attaching a PDF template to an email like this.

Part 6 — Set up the portal and pages

Turn the form into a portal so branches, IT, Facilities, Procurement, and HQ operations each get their own space, without anyone seeing more than they should.

💡 Want to give clients, applicants, or teammates their own space to submit and track requests? How to create a portal and manage users' access is the foundational guide for everything in this Part.

1. Activate your portal from the project settings.

2. Create five groups, one per role: Branch requesters, IT team, Facilities team, Procurement team, and HQ operations.

💡 Want reviewers, approvers, and applicants to each see a different view of the same portal? How to create and assign user roles in your portal covers setting these groups up.

Branch requesters (external users, since branch staff don't need a Formaloo account):

  • Submit a request, the form itself.

  • My requests, a table showing only the logged-in branch's own submissions.

  • Open requests, the same table filtered to Status of New, Triaged, In progress, or Waiting on branch.

  • Resolved requests, filtered to Status of Resolved or Closed.

3. Filter "My requests" to each branch's own data: Hover over the table, click Options → Manage Access, and under Profile Field Access, choose the requester_profile field. Enable Allow users to view user data.

💡 Want each logged-in user to see only their own submissions, not everyone else's? How to let users view and edit their own data in your portal is the foundational guide behind this step.

4. Build the internal team groups. For each of IT team, Facilities team, and Procurement team, add:

  • My [team] queue, a Kanban board grouped by Status, filtered to that team's assignments.

  • Urgent [team] requests, a table filtered to that team's assignments where Urgency is Urgent.

💡 Want a visual, drag-and-drop way to move records through stages, like a pipeline? How to create a Kanban board is the foundational guide behind each team's queue.

5. Restrict each team's queue to that team: On the page's Access menu, choose Internal users → Specific teams, and select the matching workspace team. Internal staff don't sign up to the portal the way branches do, so this is the right mechanism instead of the external Manage User flow.

📖 See what is a team in Formaloo and how to manage it if you haven't created your IT, Facilities, and Procurement teams yet.

6. Build the HQ operations group, with full visibility across every branch and team:

  • All requests, a Kanban board of everything, grouped by Status.

  • Requests by location, a table grouped by Location.

  • Aging requests, a table filtered to anything not Resolved or Closed, sorted oldest first.

  • Request trends, an AI Analyze report built on top of every submission.

7. Build the trend report: On the Request trends page, add an AI Analyze block pointed at this form's data.

💡 Meet the AI Analyze, Formaloo's report maker that turns form submissions into a full AI-generated report with charts and insights. See Formaloo AI Analyze: the report maker that turns your data into charts and insights.

8. Publish your portal and share the link with your branches and internal teams.

📖 See how to share your portal with your audience for setting a custom domain on the Business plan or Brand removal add-on.

What you now have

A single intake point for every branch's supplies, IT, and facilities needs, instead of scattered emails and calls landing on whoever happens to pick up. Every request gets an AI-written triage read and is routed to the correct internal team the moment it's submitted, not after someone gets around to sorting the inbox. Branches can check their own status without asking anyone, each internal team works from a queue that only shows their own work, and HQ can see request volume by location well enough to catch a branch with a recurring problem before it becomes a pattern nobody noticed.

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. Swap in an AI Analysis field for the routing logic and you have the same pattern this article builds.

  • AI lead qualification & scoring form — Scores incoming leads with AI and routes hot and cold leads differently. The closest existing template to an AI Analysis field driving routing decisions.

  • Job applicant tracking workflow — Tracks records across stages with status updates and reviewer assignments, the same Kanban-by-status pattern used for each internal team's queue here.

Learn more how-tos

Did this answer your question?