Confirming your admin permissions.
Edit checklist sections and items, manage settings, and reset to defaults. Changes are saved automatically to this browser and applied immediately to the checklist tool.
Drag & drop or select your CSV file. Jobs will be upserted by Project#.
Choose a badge color for each salesperson. Colors appear on cards in the Kanban board and rows in the List view.
Choose which stages appear in the Pipeline widget on the homepage and in what order. Drag rows to reorder. Toggle the eye to show/hide a stage. These settings are independent from the Kanban board.
Select which status columns to show in this view. Uncheck to hide a column.
Shared by Manufacturing & Ship-In. Add one checklist per municipality.
Upload your customer review QR code here. It will appear at the bottom of every printed checklist. The image is stored in this browser — upload it once and it's always ready.
Accepts PNG, JPG, GIF, or SVG. Recommended size: 300×300px or larger for best print quality.
How it works: Select your QR image and click Save. The image is stored in this browser and will automatically appear on all printed checklists going forward. If you clear your browser data you'll need to re-upload it.
Download the Excel export from the ABQ permit portal, then import it here. Permits are merged — existing records updated, new ones added. Job numbers are matched to Open Jobs by address.
Drop .xlsx file here or click to browse
Accepts the standard ABQ permit portal export format
Import a CSV of closed/completed jobs so the Permits page can link permits to past work. This list is internal — it does not appear on the Open Jobs board or anywhere else.
Same format as Open Jobs CSV
Requires a Project# column. Optional: Name, Salesperson, Status. All other columns are stored and used for address matching.
Drop .csv file here or click to browse
Same column format as your Open Jobs export
Closed Jobs Stored
— jobsImport a CSV of jobs turned in for billing. Used by the Permits page for candidate matching only — not visible on any other page.
Same format as Open Jobs CSV
Requires a Project# column. Optional: Name, Salesperson, Status. All other columns are stored and used for address matching.
Drop .csv file here or click to browse
Same column format as your Open Jobs export
Billing Jobs Stored
— jobsImport a CSV of pending jobs. Used by the Permits page for candidate matching only — not visible on any other page.
Same format as Open Jobs CSV
Requires a Project# column. Optional: Name, Salesperson, Status. All other columns are stored and used for address matching.
Drop .csv file here or click to browse
Same column format as your Open Jobs export
Pending Jobs Stored
— jobsA daily automated check runs on your Netlify server. It emails the people below when any issued permit is expiring within your threshold window.
Each PM will only receive alerts for their own permits. Pulled automatically from your Open Jobs list.
Receives a summary of all expiring permits regardless of salesperson.
Each owner listed here will also receive the full summary of all expiring permits.
Emails are sent once per day. Only permits with status "Issued" are included.
One-time Setup Required
onboarding@resend.dev address for testing)RESEND_API_KEY = your keySUPABASE_URL and SUPABASE_KEY as env vars (same values from this admin page)netlify/functions/check-expiring-permits.js to your repo (provided separately)Connect a free Supabase database so the job board is shared across all browsers and devices. Once configured, uploading a CSV here will automatically push the jobs to the cloud — everyone will see the updated board instantly.
create table hub_data ( key text primary key, value jsonb not null, updated_at timestamptz default now() ); alter table hub_data enable row level security; create policy "Public access" on hub_data for all using (true) with check (true);
This is the public anon key — safe to use in a browser for an internal tool.
Use this to verify that settings are being saved to the cloud and to force-push everything if something seems out of sync. If you see "Write blocked" below, follow the fix instructions.
hub_data → RLS Policies → make sure a policy exists that allows INSERT/UPDATE for the anon role. Run this SQL in the SQL Editor if not:
create policy "Allow anon writes" on hub_data
for all using (true) with check (true);
Copy data between production and beta databases. Safe to run at any time — it overwrites the target with a fresh copy of the source.
Admin access is now controlled by your Team Hub account's roles, not a shared password. To change your own sign-in password, go to My Account. To grant someone else admin access, use the Manage Users page (admins only).
This will remove all customizations you've made to every checklist and restore the original items. This cannot be undone.
Upload a SquareCoil inventory export (.csv) to populate the Inventory page. All items are stored in Supabase and are immediately visible to the team.
Expected columns (from SquareCoil export):
ID, Description, Size, Category, Vendor, Purchase Cost, Purchase UOM, QOH, Cost UOM, Cost, Last updated
Drop CSV here or click to browse
SquareCoil Inventory export (.csv)
Edit subcategory names and keyword rules inline. Drag ⠿ to reorder items, subcategories, or whole categories. Click Save Changes when done.
Upload a QR code image that links to your inventory request/correction form. It will appear at the top of the Inventory page when staff tap the "QR Code" button.
Drop image here or click to browse
PNG, JPG, or GIF — recommended square
The link the QR code points to. Shown as a clickable "Open Form" link on the Inventory page itself — the QR code image only appears on the printed version.
Upload a QR code image that links to the service inventory request/correction form. It will appear on the Service Inventory page when staff tap the "QR Code" button.
Drop image here or click to browse
PNG, JPG, or GIF — recommended square
The link the QR code points to. Shown as a clickable "Open Form" link on the Service Inventory page itself — the QR code image only appears on the printed version.
Used by Zone Lookup and the Survey Estimate Calculator to geocode addresses and calculate drive time. Set it once here and it applies for every Team Hub user automatically — no one else needs to get or paste in their own key.
Needs the Distance Matrix API, Maps JavaScript API, and Places API (New) (for address suggestions — note the "(New)" name specifically, the older "Places API" is a separate product our address suggestions don't use) enabled on the key in Google Cloud Console → APIs & Services → Library.
Drives every price the Survey Estimate Calculator shows — the crew-size cards, the labor-rates reference table, and the printed rate sheet all update from what's saved here.
| Rate | 1 Man | 2 Men |
|---|---|---|
| Survey ($/hr) | ||
| Travel ($/hr) | ||
| Per Diem ($/day) |
The standard/baseline package the Survey Estimate Calculator assumes — these three should stay consistent with each other and with the rates above (1 Man Travel rate × Standard Travel Hours + 1 Man Survey rate × Standard Survey Hours should equal the Minimum Job Price).
Edit service categories and standard inventory items in one place. Three category types: standard (pulls from master inventory), custom (manually entered items), tiered (price tier lists).
Only categories assigned to the service inventory are shown. Add or remove them below — changes are saved with Save All.
Each day the Closed Order Queue is uploaded (Admin → SquareCoil Uploads → Closed Jobs). Any new job gets a personalized feedback email to its project contact — except addresses whose domain is on the Blocked Email Domains list below, and jobs with no contact email. Customers answer on the Hub (no login). Salespeople and PMs see their own results under My Account → Customer Feedback; admins and managers see everything.
While OFF, every closed-jobs upload is a dry run: it only reports who would be emailed, and saves and sends nothing. The first time it is turned ON, every job already in the closed queue is recorded as already handled and no one is emailed; only jobs that show up in later uploads get an email.
The Raspberry Pi pulls the Closed Order Queue from SquareCoil automatically every day at 12:00 PM. These buttons ask it to do it right now (it picks the request up within about 30 seconds). While sending is OFF nothing is emailed or saved, so running it is safe.
Jobs are split into tabs. Queue is what is waiting to send or failed and will retry. Sent is everything that has gone out. Not emailed is anything skipped, removed, or recorded only. Use View form to open the exact form a customer would see (nothing you enter is saved).
| Job # | Job | Would email | Salesperson / PM | Result | |
|---|---|---|---|---|---|
| No upload recorded yet. | |||||
Cancel waiting emails stops every email that is queued or failed and has not been sent. They are marked cancelled, not deleted, so they cannot come back on the next upload.
Delete the entire queue erases every job record and every customer answer, and starts over as if this had never run. The next upload counts as a first run. It cannot be undone.
A general form for anyone, not tied to a job, salesperson or PM. They enter their name, email and job, then give the same star rating and company questions (no questions about individual people). Use this link to make your own QR code. Answers appear in Customer Feedback for admins and managers only.
Jobs whose contact email is on one of these domains are never emailed. For example, adding zeonsigns.com blocks anyone@zeonsigns.com and anyone@mail.zeonsigns.com. Use it for your own company, partners, or any customer who shouldn't be surveyed. Changes save automatically and apply to the next upload.
Import accepts a CSV or text file with one domain per line (or separated by commas). Domains are added to the list; nothing on it is removed.
Which design customers receive. Plain is a short, personal note signed by the salesperson / PM — it looks like a message from a person, so it is less likely to be sorted into “Other” or promotions. Branded is the original design with the logo header and a red button. Use Plain while the sending domain is new, then consider switching to Branded once emails are landing in inboxes reliably. Use the test email below to preview either one first.
Sends one real, branded email to any address you choose (not the customer), using a recent closed job from your uploaded list as the example. Test sends never count as a customer's feedback request and work even while sending is OFF.
Leave the names blank to use the job's own. Add a project manager here to preview the questions about both people (they are asked on every rating).
Each box is titled with the column header from your SquareCoil closed queue CSV. Leave a box empty to use that default header, or type a different header to override it. Run a Test pull to see the headers SquareCoil actually returns.
| Job # | Job | Sent to | Salesperson / PM | Status | Detail | |
|---|---|---|---|---|---|---|
| Loading… | ||||||
The Raspberry Pi downloads the Labor Analysis Report from SquareCoil and uploads it here automatically every day at 5:00 AM. Use the button to run it right now. The Pi picks the request up within about 30 seconds.
Upload the daily Labor Analysis Report. Each upload is saved to history — the dashboard shows trends over time.