A per-org defaults row plus a per-estimate overrides row, merged for the customer by one public config endpoint. It carries the trust strip, why-us cards, warranty block, FAQ list, contact footer, section order, section toggles, financing terms and the spec fallback copy. Factory defaults ship so a brand-new tenant's portal is never blank.
Also called: customise my quote copy · warranty on the estimate · FAQ for customers · why choose us
Your warranty paragraph is typed once, not per quote
The warranty block, the why-choose-us cards, the FAQ and the contact footer are set once for your company and appear on every estimate you send. Any of them can be overridden for a single unusual job without changing the house default. Factory copy ships with the account, so a brand-new builder's portal is never a blank page while they get around to writing one.
The five questions every buyer asks, answered on the quote
How long does the build take, what is included in the price, what about permits, can I make changes after approval, what warranty do you offer. They sit in an accordion at the bottom of the estimate, editable per builder and per estimate. Each one answered on the document is a call you do not take in the middle of a build week.
Years in business and buildings completed update themselves
A slow marquee under the hero carries licensed and insured, your rating, and counts that resolve live: buildings completed from your finished projects, years in business from your start year. Nobody has to remember to bump a number on a quote template every January. Hovering pauses it, and visitors who ask for reduced motion get a static layout instead.
One field controls the number on every customer surface
The phone on the estimate footer and the call button on the live dashboard both read your Business Info number and nothing else. There is no fallback chain, because fallback chains are how a quote ends up telling a customer to call their own line, or printing a personal number somebody replaced two years ago. If the field is blank, no number and no button render at all.
- 1portal_defaults holds the org-wide copy, keyed by org
- 2estimate_portal_overrides layers a per-send version on top
- 3GET /api/client-portal/config merges them and returns only branding, copy and aggregate counts
- 4The customer page falls back to FACTORY_DEFAULTS whenever a block is empty
Warranty terms, FAQ and why-us copy are the builder's to write, but the endpoint serving them fell back to one particular company's content whenever it could not work out whose portal it was rendering — so another builder's branding and copy could appear on a customer's quote, and on an unrelated settings screen. It refuses now rather than guessing. The library carries non-sensitive marketing content only, because it is served publicly with no login in front of it.
- Boilerplate sales copy retyped per quote
- One tenant's copy leaking onto another tenant's surfaces
- A blank-looking portal for a builder who has not configured anything
See it on your own jobs
Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.
or keep browsing features →