The settings are the product
The difference between two shops is data
A plumbing shop in Lancaster and a commercial electrical contractor working thirty states need different zones, different job codes, different statuses, different fields on a site and a different idea of what “done” means.
In most software that difference is a support ticket, a custom build or a column somebody was told to use for something else. Here it is configuration — and the rule that keeps it honest is that no platform behavior is allowed to depend on what you called anything.
Code branches on a flag, never on a name. So you can rename “Parts Ordered” to “Waiting on Supply” on a Tuesday afternoon and every report still works.
This is not a module you buy. It is the configuration underneath whichever ones you do take — and it is why two shops running the same modules do not run the same product.
A zone is a profit center
Not a map color. A zone owns a team — a dispatcher, a billing clerk, a fleet of techs — and a timezone, and it is the unit the business measures profit in.
Departments cut across zones. Everybody has plumbing; not everybody is in Austin. Neither dimension nests inside the other, and software that makes one a child of the other cannot describe a real company for long.
Geography in, correct queue out
A job arriving over the API from a national broker — a site in South Carolina, nobody on the phone — lands in the right team’s unassigned column on its own, resolved from postal geography. No human triage, no morning pile.
The zone is stamped, not joined
On the site and on the job, as a value. A territory realignment next year must not rewrite which team did last year’s work.
And the timezone travels with it
Every instant is stored UTC, and anything promised also keeps its local wall clock — because “Tuesday 8 AM” has to survive a daylight-saving rule change.
Zones, each with its own team and its own clock.
A queue is a person
The dispatch board has two kinds of column — technicians, and buckets like Unassigned, Parts Ordered, Estimating, Subcontractor, Long Lead Time.
They are the same kind of row. A bucket is an employee record carrying a flag. One table, one assignment, one foreign key, one history — and an admin can create a new queue without anybody shipping a release.
Technicians and queues in one list, because to the board they are one kind of thing.
Boards themselves are saved filter sets, and there are as many as you want: North West Team, Service and Install, Inspections. Same data, different lenses, each with its own columns in its own order.
Every list the rest of the product chooses from
One screen, and it is longer than most products’ entire settings area.
The vocabularies this company runs on.
Visit statuses — and you can add your own
Pending, Traveling, Arrived, Working, Complete ship in the box. Add Waiting on Access if that is a real state in your business. Each one declares what it stamps, so adding one is a row, not a rewrite.
Work codes, and duration in minutes
Always minutes, never a number that might be hours. That ambiguity is a real defect in real systems and it quietly wrecks every capacity estimate built on top of it.
Numbering you control
Prefix, width and reset period are columns, not the length of a string somebody typed. Import your existing numbers verbatim — staff say them aloud daily and you can never renumber.
Tax, split the way it actually works
Jurisdiction and rate belong to the place. Exemption, certificate and expiry belong to who pays. Most systems put both on the site and then cannot explain the exemption.
Note templates, in sections
Parts, billing, dispatchers, CSRs — role-scoped sections instead of one memo field everybody fights over and smashes structure into.
Rate cards and price books
Per customer relationship, not per site — because a credit hold and a negotiated rate belong to the account, and 142 shared addresses in one real dataset had a restricted customer next to a good one.
Custom fields on anything
A plumber needs Backflow Device Serial on a site. An HVAC shop has never heard of it and needs refrigerant charge on a rooftop unit. A courier needs neither.
That is the difference between a plumber, an HVAC shop and a courier — and it is a field you add on a Tuesday, not a release we ship in March.
Declared on the thing, not floating
A field is declared against a real record — a site, a unit, a customer, a job. It can extend the product; it can never replace it. That boundary is the whole reason this does not turn into a spreadsheet with a login.
For equipment, it hangs off the TYPE
Every rooftop unit shares one set of attributes; a backflow device shares another. Declare it per unit and the four-hundredth one at a site quietly disagrees with the first 399, and no report ever recovers.
Real columns, so you can actually use them
A number is stored as a number. So you can sort it, filter a range, trend it across four years of visits and pull it into your own reporting. A field you cannot reach is a field we are hiding from you.
And a checklist writes into them
A step asks for the refrigerant charge and the answer lands on the unit — so next year’s technician opens it already knowing what normal looked like.
Custom fields, grouped, declared against a real record.
Who may actually do what
Roles are bits, not a job title, so one person can be a dispatcher and a
buyer without anybody inventing a hybrid role. And the check happens in
the one place every door passes through — a rule enforced only in a
screen is bypassed by one curl.
Every role, and exactly what it opens.
And an irreversible act asks for authority rather than courage. Hold the role and it just happens. Do not, and somebody who does can approve that single act with a code — one code, one delete. So you can stop handing out permanent destructive access to five people and hope.
The prompt names the thing and its blast radius, because an approval code proves somebody was present, not that they understood. “Delete CBRE Facilities Management. 14 sites and 212 jobs reference it.”