What you'll build
By the end of this guide, you'll have a client portal where customers register once, store their equipment and location details in a linked database, and submit service requests choosing from 13 service types. Each request shows a live fee breakdown — admin fee, travel fee, and interchange fee stacked and totalled automatically — so clients know exactly what they'll be charged before anything is confirmed. Technicians get their own filtered queue of assigned jobs. Admins get a Kanban pipeline, an unassigned triage view, and a reporting dashboard showing demand by service type and revenue by month.
When to use this
You run a field-service business (RV, HVAC, plumbing, electrical, landscaping) and clients currently call or email to request work with no standard process
Your team manually calculates fees per job type before quoting, and the math varies every time depending on who does it
Clients re-enter their address and equipment details on every service request, creating data errors and extra back-and-forth
You have multiple technicians and no clean way to see who is assigned to what, what is scheduled, and what is sitting on hold
You want clients to self-serve requests at any hour and track job status without emailing for updates
Step-by-step
This workflow uses two forms: an equipment profile form (registered once per piece of equipment) and a service request form (submitted each time a client needs work). A Reference field links every service request back to the client's equipment profile — so they never re-enter their address or equipment details.
Part 1 — Build the equipment profile form
In this part, you'll create the form that stores each client's equipment and location. Clients fill this out once. Every service request they submit later pulls from this record automatically.
1. Open Magic Create from your Formaloo homepage: Click Magic Create on your Formaloo homepage. Paste the prompt below into the text field and click Create.
Build a client equipment registration form for a field-service business. Fields: full name (short text, field ID: full_name), email address (email, field ID: email), phone number (short text, field ID: phone_number), equipment type (dropdown: RV, Trailer, Motorhome, Fifth Wheel, Toy Hauler, Other — field ID: equipment_type), equipment type description shown when Other is selected (short text, field ID: equipment_type_other), make and model (short text, field ID: equipment_make_model), year (short text, field ID: equipment_year), serial or VIN number (short text, field ID: equipment_serial), service location address (long text, field ID: service_address), location access notes (long text, field ID: location_access_notes). Admin-only fields: profile status dropdown with options Active and Inactive (field ID: profile_status), internal notes (long text, field ID: internal_notes_profile).
💡 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. See How to create any form with AI using Magic Create in Formaloo.
2. Verify the field table: Your form should look like this — Magic Create will have generated most of it. Verify each field and field ID matches exactly before moving on.
Field | Field ID | Type |
What's your full name? | full_name | Short text |
What's your email address? | ||
What's your phone number? | phone_number | Short text |
What type of equipment do you have? | equipment_type | Dropdown |
Please describe your equipment type | equipment_type_other | Short text |
What's the make and model? | equipment_make_model | Short text |
What year is it? | equipment_year | Short text |
What's the serial or VIN number? | equipment_serial | Short text |
Where is the equipment located? | service_address | Long text |
Any access notes for the service location? | location_access_notes | Long text |
Profile status | profile_status | Dropdown (admin only) |
Internal notes | internal_notes_profile | Long text (admin only) |
Note: Profile status and internal notes should be marked admin-only — visible and editable only by workspace admins, never visible to clients. To learn how admin-only fields work, see What are admin-only fields and how they help.
3. Publish the form: Click Publish in the island bar at the top of the editor. This makes the equipment profile form live and ready to receive registrations.
Part 2 — Build the service request form
This form is where clients submit each new job. It references their equipment profile via a Reference field, lets them choose from 13 service types, and displays a live fee breakdown before they submit. The stacked-fee logic (admin + travel + interchange = total) runs inside Variable fields that update in real time as the client makes their selection.
1. Open Magic Create from your Formaloo homepage: Click Magic Create on your Formaloo homepage. Paste the prompt below and click Create.
Build a service request form for a field-service RV business. Fields: equipment reference linking to the equipment registration form (reference field, field ID: equipment_ref), service type (dropdown with options: Electrical repair, Plumbing repair, Appliance repair, Roof and sealant repair, A/C service, Heating service, Slide-out service, Leveling system service, Annual inspection, Pre-purchase inspection, Winterization, De-winterization, Generator service, Information request — pricing, Information request — general — field ID: service_type), issue or request description (long text, field ID: service_description), information request question (long text, field ID: info_request), preferred service date (date, field ID: preferred_date), secondary date preference (date, field ID: secondary_date), additional notes for technician (long text, field ID: additional_notes), admin fee (variable number read-only, field ID: admin_fee), travel fee (variable number read-only, field ID: travel_fee), interchange fee (variable number read-only, field ID: interchange_fee), estimated total (variable number read-only, field ID: estimated_total), authorization checkbox (field ID: authorization). Admin-only fields: request status dropdown with options Submitted, Scheduled, In Progress, Completed, Cancelled, On Hold (field ID: request_status), assigned technician (assignee field, field ID: assigned_technician), actual total charged (number, field ID: actual_total), internal notes (long text, field ID: internal_notes_request).
2. Verify the field table: Check that every field and field ID matches exactly.
Field | Field ID | Type |
Which equipment are you requesting service for? | equipment_ref | Reference |
What type of service do you need? | service_type | Dropdown |
Please describe the issue or request | service_description | Long text |
What's your question? | info_request | Long text |
What's your preferred service date? | preferred_date | Date |
Do you have a secondary date preference? | secondary_date | Date |
Any additional notes for the technician? | additional_notes | Long text |
Admin fee | admin_fee | Variable |
Travel fee | travel_fee | Variable |
Interchange fee | interchange_fee | Variable |
Estimated total | estimated_total | Variable |
I authorize the work and agree to the estimated fee | authorization | Checkbox |
Request status | request_status | Dropdown (admin only) |
Assigned technician | assigned_technician | Assignee (admin only) |
Actual total charged | actual_total | Number (admin only) |
Internal notes | internal_notes_request | Long text (admin only) |
Note: The Assignee field routes each request to the right technician and powers the technician portal views. For a full walkthrough, see What is the Assignee field in Formaloo and how to use it.
3. Publish the form: Click Publish in the island bar at the top of the editor.
Part 3 — Set up conditional logic and fee calculation
This is where the two signature capabilities of the portal come together: fields that show or hide based on service type, and Variable fields that calculate the correct fee stack live as the client selects their service. Both sets of rules live inside the service request form's Advanced logic panel.
💡 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 field logic and calculation: What is logic in Formaloo.
1. Open Advanced logic: Open the service request form in the editor. In the form settings panel on the right side, click Advanced logic, then navigate to the Logic tab. Click Magic Logic in the top-right corner of the Logic panel.
2. Set up field visibility rules: Paste the following prompt and click Generate Rules. Approve each rule, then click Save.
Set these fields as hidden by default: service_description, info_request, preferred_date, secondary_date, authorization.
When "What type of service do you need?" equals any of: Electrical repair, Plumbing repair, Appliance repair, Roof and sealant repair, A/C service, Heating service, Slide-out service, Leveling system service, Annual inspection, Pre-purchase inspection, Winterization, De-winterization, Generator service — show "Please describe the issue or request", show "What's your preferred service date?", and show "I authorize the work and agree to the estimated fee".
When "What type of service do you need?" equals "Information request — pricing" or "Information request — general" — show "What's your question?".
When "What's your preferred service date?" is answered — show "Do you have a secondary date preference?".
3. Set up fee calculation rules: Open Magic Logic again. Paste the prompt below and click Generate Rules. This assigns the correct admin fee and interchange fee for each service type, keeps the travel fee fixed, and calculates the estimated total. Approve each rule, then click Save.
When "What type of service do you need?" is answered, assign the following values:
Electrical repair: admin_fee = 85, interchange_fee = 65. Plumbing repair: admin_fee = 85, interchange_fee = 60. Appliance repair: admin_fee = 75, interchange_fee = 55. Roof and sealant repair: admin_fee = 75, interchange_fee = 50. A/C service: admin_fee = 80, interchange_fee = 60. Heating service: admin_fee = 80, interchange_fee = 60. Slide-out service: admin_fee = 90, interchange_fee = 70. Leveling system service: admin_fee = 90, interchange_fee = 70. Annual inspection: admin_fee = 55, interchange_fee = 40. Pre-purchase inspection: admin_fee = 65, interchange_fee = 45. Winterization: admin_fee = 45, interchange_fee = 35. De-winterization: admin_fee = 45, interchange_fee = 35. Generator service: admin_fee = 80, interchange_fee = 55. Information request — pricing: admin_fee = 0, interchange_fee = 0. Information request — general: admin_fee = 0, interchange_fee = 0.
Always set travel_fee = 35, regardless of service type.
Calculate estimated_total = admin_fee + travel_fee + interchange_fee.
Note: Adjust these fee amounts to match your actual pricing before publishing the portal. The travel fee is a fixed value in its Variable expression — edit it there anytime.
4. Set up On Submit logic: Navigate to the On Submit tab in the Advanced logic panel. Click Add Rule and set up the following four rules:
When submitted → Send email using the "Service request confirmation" template to the email address in
@email(pulled from the linked equipment profile).When submitted → Send email using the "New request — admin notification" template to your internal service team address (type a fixed admin email directly in the rule).
When submitted → Assign
assigned_technicianto your Service Team. (Create your Service Team in Workspace Members settings first so it appears in the Assign action dropdown.)When submitted → Generate PDF using the "Service request" template.
💡 Want a rule to fire the moment a form is first submitted, like sending a confirmation or routing to a team? What is On Submit logic and how it works.
5. Set up On Update logic: Navigate to the On Update tab. Click Add Rule and set up the following two rules:
When "Request status" is changed to "Scheduled" → Send email using the "Appointment confirmation" template to the client's email address.
When "Request status" is changed to "Completed" → Send email using the "Service completion summary" template to the client's email address.
💡 Want a rule to fire whenever an existing record changes, like a status flipping to Scheduled or Completed? What is On Update logic and how it works.
Click Save in the top-right corner after adding all rules.
Part 4 — Create email templates
Four emails keep clients and your team informed at every stage. Create all four before the portal goes live — the On Submit and On Update rules in Part 3 reference them by name.
💡 Want to send branded, personalized emails instead of Formaloo's plain default notification? This is the foundational guide to building and triggering custom email templates: How to create and send custom email templates.
Each template uses @field_id answer piping to pull live data from the form into the email — service type, fee amounts, technician name, and more.
📖 For the full list of variables you can pipe into a template, see How to dynamically pull form data into custom emails, PDFs, and AI prompts.
1. Open the email template editor: Click your profile icon in the top-right corner → Apps & integrations → Email templates → Add new template.
2. Create the service request confirmation email: Name it "Service request confirmation." Set the subject to Your @service_type request has been received — ref #@id. In the body, click Add AI block and paste this prompt:
Write a warm confirmation email to a field-service client who just submitted a service request. Tone: personal and professional, like a trusted local operator. Include: a thank-you for submitting, the service type (@service_type), the estimated total ($@estimated_total broken down as admin $@admin_fee + travel $@travel_fee + interchange $@interchange_fee), their preferred date (@preferred_date) if provided, and a note that the team will be in touch to confirm scheduling. 4–5 short paragraphs. No legal disclaimers. HTML: white background, single centered column max 560px, Inter font, fee breakdown as a 3-row table with muted borders and #f9f9f9 background, estimated total row in bold, CTA button "View your request status" in dark background with white text and rounded corners, footer in muted #999.
Click Save.
3. Create the appointment confirmation email: Name it "Appointment confirmation." Subject: Your @service_type appointment is confirmed — @preferred_date. AI body prompt:
Write a clear, friendly appointment confirmation email to a field-service client whose job has just been scheduled. Tone: warm and practical, like a trusted local operator confirming a time. Include: the service type (@service_type), confirmed date (@preferred_date), service location (@service_address), assigned technician (@assigned_technician), and estimated total ($@estimated_total). One short paragraph on what to expect on the day. 4 paragraphs. HTML: white background, single centered column max 560px, Inter font, appointment date in a prominent pill badge in dark background with white text, key details in a block with #f9f9f9 background and a subtle left accent border, CTA "View your request" in dark background rounded, footer in muted #999.
Click Save.
4. Create the service completion summary email: Name it "Service completion summary." Subject: Your @service_type is complete — here's your summary. AI body prompt:
Write a warm service completion email that also serves as a receipt for a field-service client whose job just finished. Tone: satisfied and clear, like a handshake at the end of a good job. Include: confirmation of completion, service type (@service_type), actual total charged ($@actual_total), and a warm thank-you. Invite them to reach out if they notice anything afterward. 4–5 paragraphs. HTML: white background, single centered column max 560px, Inter font, header with a checkmark icon in a soft green circle, summary table showing service type and actual total with muted borders, CTA "Submit another service request" in dark background with white text rounded, footer in #999 noting to keep this for their records.
Click Save.
5. Create the admin notification email: Name it "New request — admin notification." Subject: New service request: @service_type — @full_name (@equipment_make_model). AI body prompt:
Write a concise internal notification for a service team admin. Tone: functional and direct, no pleasantries. Include: client name (@full_name), equipment make and model (@equipment_make_model), service type (@service_type), preferred date (@preferred_date), service location (@service_address), and estimated total ($@estimated_total). 2–3 short paragraphs. HTML: white background, single centered column max 560px, Inter font, header with "New request" in a dark muted background with white text, all key fields in a two-column table with labels in #999 on the left and values in dark on the right, CTA "Open in portal" in dark background with white text rounded, footer line "Internal notification — do not reply to client" in #999.
Click Save.
Part 5 — Build the PDF template
Each service request generates a branded service order PDF on submission. It captures the client's equipment details, the service type, the full fee breakdown, and the authorization statement — ready to email or archive.
💡 Want every form submission to generate a polished, branded document automatically? This is the foundational guide to PDF templates in Formaloo: How to create PDF templates to turn responses into documents.
1. Open the PDF template editor: Click your profile icon → Apps & integrations → PDF templates → Add new template.
2. Switch to HTML view and paste the template: Click the HTML toggle in the editor. Paste the HTML code from the rv-service-request-pdf.html file included with this template. The file uses @field_id variables throughout — each one pulls live data from the submitted record automatically.
3. Name and save: Give the template the name "Service request" and click Save.
4. Attach PDF generation to the On Submit rule: Return to the service request form editor. Open Advanced logic in the form settings panel on the right side, navigate to the On Submit tab, and confirm the Generate PDF rule is in place pointing to the "Service request" template. If it is not there yet, add it now.
📖 To attach the generated PDF to the client's confirmation email, see How to send custom PDFs with email notifications.
Part 6 — Activate the portal and configure roles
The portal turns both forms and all the data views into a password-protected, role-based surface. Clients see their own equipment and request records only. Technicians see their assigned jobs only. Admins see everything.
💡 Want to give clients, technicians, and your team their own space to submit and track requests? This is the foundational guide to building a portal and controlling who sees what: How to create a portal and manage users' access.
1. Open project settings: Open your project. Click the gear icon in the top-right corner.
2. Activate the portal: In the Project settings panel, click Activate client portal. Then click Manage users, then Setup wizard.
3. Connect a user directory: In Step 1 of the wizard, select New user directory to create a fresh user database. Every client, technician, and admin who logs in is stored here.
4. Configure portal settings: In Step 2, enable user login and sign-up. Set your preferred login method (email, Google, or passwordless login code). Optionally set a custom domain.
Tip: Custom domains are available on the Business plan or via the Brand removal add-on. See How to set up an app or portal custom domain.
5. Enable user profiles on both forms: In Step 3, connect the user directory to both Form A (equipment profile) and Form B (service request). This ensures that when a logged-in client views a data block, they see only their own records.
6. Set up user roles: Navigate to the User directory in your portal. Click Edit profile fields, scroll to the User roles field, and add three roles: Client, Technician, Admin.
💡 Want clients, technicians, and admins to each see a different set of pages in the same portal? This guide covers setting up roles so each person only sees what is relevant to them: How to create and assign user roles in your portal.
7. Set page-level access: For each portal page, click the three-dot menu next to the page name → Access. Set Client pages to the Client role only, Technician pages to the Technician role only, and Admin and Reports pages to the Admin role only.
📖 To restrict entire pages to a specific role, see How to restrict users' access to pages in your portal.
Part 7 — Set up portal pages
Organize the portal into four groups: Client, Technician, Admin, and Reports. Switch to Edit mode in your project to add each page group and page.
1. Add the client group pages: Create a page group named "Client." Add the following pages:
Submit a service request — add a Form block connected to Form B (service request).
My equipment profiles — add a Table block connected to Form A (equipment profile). In the block's Options, scroll to Manage access, select the profile field, and enable Allow users to view only their data.
My service requests — add a Table block connected to Form B. Enable Allow users to view only their data the same way. Sort newest first.
Scheduled — duplicate "My service requests." Add a filter: Request status = Scheduled. Sort by preferred date ascending.
Completed — duplicate again. Filter: Request status = Completed. Sort newest first.
💡 Want each logged-in client to see only their own submissions, never anyone else's? This is the foundational guide to the "view only their data" access restriction: How to let users view and edit their own data in your portal.
2. Add the technician group pages: Create a page group named "Technician." Add these pages:
My assigned jobs — Table block connected to Form B. In Options → Manage access, select
assigned_technician, enable Allow assignees to view only their data. Sort by preferred date ascending.Scheduled jobs — duplicate and add filter: Request status = Scheduled. Sort by preferred date ascending.
In progress — duplicate and add filter: Request status = In Progress.
📖 For assignee-scoped data access, see How to automatically assign submissions to the right team member or team, and control what each assignee sees.
3. Add the admin group pages: Create a page group named "Admin." Add these pages:
All requests — Kanban block connected to Form B, grouped by
request_status. No filter. Dragging a card between columns updates the status field and triggers the matching On Update email automatically.Unassigned — Table block connected to Form B. Filter:
assigned_technicianis empty. Newest first. This is your daily triage view — every job that has landed but not yet been dispatched.Scheduled — Table block. Filter: Request status = Scheduled. Sort by preferred date ascending.
In progress — Table block. Filter: Request status = In Progress.
On hold — Table block. Filter: Request status = On Hold. Newest first. Jobs in this view are candidates for a re-engagement email campaign.
Equipment database — Table block connected to Form A. No filter. Full visibility of every registered piece of equipment across all clients.
Add equipment profile — Form block connected to Form A. For admins registering a client's equipment on their behalf.
📖 To learn how the Kanban board works and how dragging cards triggers logic rules, see How to create a Kanban board.
4. Add the reports group pages: Create a page group named "Reports." Add these pages:
Requests by service type — Chart block (bar) connected to Form B, grouped by
service_type. Shows which service types generate the most demand.Revenue summary — Chart block (bar) connected to Form B, grouped by submission month, value summed by
actual_total. Only reflects records where Actual total is filled in — keep this field updated at job completion.Technician workload — Chart block (bar) connected to Form B, grouped by
assigned_technician. Use this before scheduling new jobs to balance the team's load.
📖 To adjust filters, grouping, or sort order on any table or chart view, see How to sort and filter your submissions data.
What you now have
You have a complete field-service client portal with a linked equipment database, 13 configurable service types, and automatic stacked-fee calculation that shows clients their full cost breakdown before submission. Every request kicks off a notification to your admin team, routes to an assigned technician, and generates a branded PDF service order. Clients track their own request history. Technicians see only their queue. Admins have a Kanban pipeline, an unassigned triage view, on-hold visibility, and three reporting charts covering demand, revenue, and technician workload. No spreadsheet, no phone tag, no manual quote math.
What's next
Let returning clients skip re-entering their details Once a client is registered in the portal, a Memory Form can auto-fill their profile fields on any future request form — so they never type the same address or equipment details twice. → How to create a Memory Form that auto-fills user details
Re-engage clients with jobs sitting on hold Your "On hold" admin page already surfaces these requests in one view. Pair it with an AI email campaign to send a personalized follow-up to every on-hold client in one step, without touching each record manually. → How to send an email campaign and collect data with AI agents in Formaloo
Add payment collection to the service request Connect Stripe and add a payment field to the service request form so clients pay the estimated fee at submission or when the appointment is confirmed. → How to connect Stripe to Formaloo
Learn more how-tos
Build a fee estimator that emails clients a price breakdown If you want a standalone quote tool that calculates and emails a detailed cost breakdown before any service request is logged, this guide walks through the full workflow. → How to build a service cost estimator that emails clients a price breakdown in Formaloo
Route requests to the right technician automatically Set up the Assignee field with logic rules that distribute incoming service requests to the right technician based on service type, location, or any field on the form — no manual routing required. → How to automatically assign submissions to the right team member or team, and control what each assignee sees
Add a second approval step for high-value jobs For requests above a certain fee threshold, build a manager sign-off step before the technician is dispatched — so expensive or unusual jobs get reviewed before they are scheduled. → How to build a dual-approval request workflow in Formaloo
