Skip to content

Customer Portal

Doug edited this page Jul 2, 2026 · 2 revisions

Customer Portal

A white-label, customer-facing surface: your customers see their jobs, estimates, and invoices, and pay online — without needing an account password.

What customers can do

  • View jobs — status and upcoming visit dates.
  • Estimates — view, then accept or decline.
  • Invoices — view history and pay online (Stripe Checkout; saved payment methods and ACH with micro-deposit verification are supported in the portal).
  • Book service — the public booking form captures name, phone, service, and a preferred date/slot; availability is checked so approved slots don't double-book. Approving a request creates the job.
  • Messages / contact — request a callback or send a message.

How customers sign in

Magic links — a customer enters their email, receives a one-hour login link, and clicking it starts a portal session (httpOnly cookie; short-lived JWTs). There are no customer passwords to manage.

Individual estimates and invoices can also be shared by public link (a long unguessable token, expiring after a configurable window — default 90 days) with no login at all.

Operator setup

  • Enable the customer_portal module; portal users are tied to customer records.
  • Set CUSTOMER_PORTAL_BASE_URL so magic-link emails point at the right host, and make sure email sending is configured — login links arrive by email.
  • Online payment needs Stripe configured.

Related public intake

  • Landing leads — marketing-site form submissions (with UTM tracking) land in a triage list (see Sales & Estimating).
  • Instant estimate — a public "describe your job, get a ballpark" endpoint that parses the description and prices it from your catalogs (AI-assisted when a local LLM is configured).

See also

Clone this wiki locally