Customer Portal Setup
Enable and configure the Customer Portal so your customers can view their jobs, estimates, invoices, and inspection information.
Overview
Setting up the Customer Portal involves verifying your company subdomain, ensuring your customer contacts have email addresses, and sharing the portal URL. The portal is available on a dedicated domain (cp.forz.io) and uses your existing customer and contact data βthere is no separate portal configuration to enable.
Before You Begin
Prerequisites:
You have the Admin role.
Your Forz account has a subdomain configured (set during onboarding).
At least one customer record exists with a linked contact that has an email address.
Verifying Your Portal URL
Your portal URL is determined by your company subdomain. Every Forz account has a subdomain set during onboarding.
Navigate to Settings > Company.


Locate your company subdomain value.
Your portal URL is: https://cp.forz.io/[your-subdomain
Expected result: Visiting that URL in a browser displays the Customer Portal login page with your company branding.
Note: The subdomain is typically set during onboarding. If you need to change it, contact Forz support. Changing the subdomain changes all portal URLs, so update any shared links afterward.
Preparing Customer Data for Portal Access
For a customer to access the portal, three things must be in place:
A Customer record exists in Forz.
The customer has at least one Contact with a valid email address.
The contact is linked to the customer via a contact linkage.
Adding a contact to a customer
Navigate to Customers and open the customer record.
Add or verify a contact with a valid email address.
Confirm the contact is linked to this customer.
Expected result: The contact's email address is now associated with the customer. When the contact enters this email on the portal login page, Forz sends a verification code and grants access to this customer's data.
Tip: If a contact person manages multiple customer accounts (e.g., a property manager), link the same contact to each customer record. The portal presents a customer selection page when that contact logs in.
Sharing the Portal URL
Share the portal URL with your customers through any channel:
Email: Include the URL in your email footer, estimate emails, or invoice emails.
Website: Add a "Customer Portal" link to your company website.
Print materials: Add the URL to invoices, business cards, or service agreements.
Text message: Send the URL via SMS after completing a job.
Example email text
You can check the status of your jobs, estimates, and invoices at any time. Visit our Customer Portal at https://cp.forz.io/acme-plumbing and log in with your email address.
What Data Is Exposed
The portal shows customers a filtered, read-only view of their records. Understanding what is visible helps you control what customers see before sharing the URL.
Visible data
Dashboard summary
The portal dashboard also shows aggregate counts:
Open Estimates count (status "Sent" or "Viewed").
Outstanding Invoices count and total balance (excluding "Void" and "Paid").
Open Jobs count (excluding "Completed").
Latest Inspections count (created in the last 30 days).
Account information
The dashboard displays the customer's organization name, the logged-in contact's full name, email address, and phone number (if present on the customer record).
Warning: All non-draft estimates, invoices, and non-unscheduled jobs are visible to the customer as soon as you share the portal URL. Review your records before sharing access if you have sensitive pricing or internal notes that should not be exposed.
Controlling When Records Appear
Use status values to control when customers can see records in the portal:
To hide a job: Keep its status as "Unscheduled" until you are ready for the customer to see it.
To hide an estimate: Keep it in "Draft" status until you are ready to share it.
To hide an invoice: Keep it in "Draft" status until you are ready to bill.
To hide an inspection: Inspections follow their parent job's visibility β if the job is "Unscheduled," the inspection is hidden.
Tip: This gives you full control over timing. Create records in draft or unscheduled status while you prepare them, then update the status when you want the customer to see them.
Branding
The Customer Portal uses your company branding automatically. The portal layout displays your company name and uses the Forz branding associated with your account. No additional branding configuration is required for the portal.
Security and Access Control
Email-based verification
The portal uses one-time verification codes instead of passwords:
Codes are 6 characters (hexadecimal).
Each code expires after 15 minutes.
A new code invalidates any previous code.
The Resend Code button has a 60-second cooldown to prevent abuse.
Data isolation
Customers only see records belonging to their customer account.
Contact-to-customer linkages are verified on every request.
If a contact's linkage is removed, they lose access immediately.
The portal verifies the contact belongs to the correct Forz account (app account) on every page load.
Session management
Customer sessions are stored server-side.
Logging out clears the session completely.
If a contact is linked to multiple customers, switching requires a new login.
Common Scenarios
Setting up portal access for a commercial HVAC customer
Metro Climate Services creates a customer record for "Downtown Office Tower" and adds the building manager, Patricia, as a contact with her email (patricia@downtowntower.com). They send Patricia an email: "View your HVAC service history and upcoming work at https://cp.forz.io/metro-climate." Patricia visits the URL, enters her email, receives a verification code, and sees the dashboard with her building's open jobs and inspection reports.
Preparing an estimate for portal viewing
Sparks Electrical creates a draft estimate for rewiring a restaurant kitchen. While the estimate is in "Draft" status, the customer cannot see it in the portal. Once Sparks updates the status to "Sent," the estimate appears under the customer's Estimates tab and on the dashboard as an open estimate.