Dashboard
Accepted appointments, last 14 days
Money this week
What needs attention
Agent output this week
Client delivery vs weekly target
Appointments by area this week
Acceptance rate, last 8 weeks
Weekly target
Accepted per day, last 14 days
Pay
Hours breakdown
Weekly Entry
Each agent's hours for the week: add them once, typically Friday after the shift ends. Booked, accepted and rejected come from their appointments automatically.
| Agent | Hours | Booked | Accepted | Rejected | Score |
|---|
Agents
Everyone on the floor, at a glance. Click one for the full picture.
Agent Reports
A live dashboard for one agent at a time, plus black-and-white PNG scorecards to send straight to them.
Agent dashboard
Accepted per day, last 14 days
Pay
Hours breakdown
Scorecard to send
Payroll
Weekly pay built from the hours and accepted appointments you've already entered.
| Agent | Hours | Rate | Base | Accepted | Bonus ea. | Bonus | Total |
|---|
Rates save against the agent, so you only set them once. Bonus is paid per accepted appointment, rejected ones earn nothing. Mark someone terminated in Weekly Entry and they drop out of payroll and the dashboard's payroll and profit figures.
Payroll reports
Everything finance needs to cut checks: one row per agent, this week.
| Agent | Days | Hours | Ready | Break | Meeting | Calls | Booked | Accepted | Appt/day | Accept rate | Cost/appt | Revenue | Base pay | Bonus | Total pay |
|---|
Appointments
Everything pulled from your sheet. What you set here decides whether it reaches the client and how the agent's day counts.
| # | Booked | Appointment | Time | Homeowner | Area | Agent | Client | Status | Outcome | Sent |
|---|
Calendar
Leaderboard
| # | Agent | Hours | Calls | Booked | Accepted | Rate | Pace | Score |
|---|
Team insights
Accepted appointments
Score
Dashboard
Coming up, next 7 days
Delivered per week, last 8 weeks
Outcome breakdown
Appointments by city
Where your appointments land
What we have on file for you
This is what we book against. If any of it is wrong, leave a note on any appointment and we'll update it.
Download your appointments
Clients
Who you deliver to, how to reach them, and how the work is landing. Open a client for their full page.
This week
Profile
Working hours
Sent to them, by month
What came of it
Where their appointments land
Latest appointments
Finance
Client accounts
Orders
Payments received
Revenue by month
Revenue by client
Client Reports
The appointment list you send the client. No pricing and nothing about agents.
Appointments this week
| # | Booked | Appointment | Time | Homeowner | Address | City | Zip | Status |
|---|
People
Who can sign in, and what each of them can see. Everyone shares the same data, the difference is how much of it reaches them.
Who's in
| Role | Signs in as | Joined |
|---|
Codes not used yet
| Code | Role | For | Expires |
|---|
What each role can see
| Owner | Manager | Agent | Client | |
|---|---|---|---|---|
| Their own daily numbers | Yes | Yes | Yes | No |
| Their own pay | Yes | No | Yes | No |
| Everyone's daily numbers | Yes | Yes | No | No |
| Their own appointments | Yes | Yes | Yes | No |
| Their own accepted appointments, and who booked them | Yes | Yes | No | Own only, agent hidden |
| Everyone's appointments and homeowner details | Yes | Yes | No | No |
| Set an appointment's outcome | Yes | Yes | No | Own only |
| Clients and client reports | Yes | Yes | No | No |
| Pay rates and payroll | Yes | No | No | No |
| Operating costs and profit | Yes | No | No | No |
These aren't hidden screens. The database refuses the data outright, so it holds even for someone poking at the page.
Operating Costs
Everything you pay for that isn't wages. Enter it once at its natural rhythm and the app keeps the weekly and monthly views in step.
| Cost | Category | How often | Last paid | Next due | Amount | Per week |
|---|
Where the money goes
Cost of running a week
Settings
Targets, branding, and your data.
Scoring targets
Appearance
Branding
Appointment source
Point this at a Google Sheet and the app reads it on its own. In Sheets: File → Share → Publish to web, pick the sheet holding your requests, choose Comma-separated values (.csv), publish, and paste the link here.
Your sheet is the record. A pull makes the app match it exactly: rows still there are updated, rows that have gone are removed from here too. Anything you've edited by hand, a status, a client, a note, is kept on the rows that remain. Appointments you logged inside the app are never touched.
Repair appointment IDs
Appointments imported before the sheet reader was fixed were identified by Who did you speak to? rather than by the submission, so rows sharing a name became one appointment — bookings went missing and notes appeared on the wrong card. This re-keys them to the sheet's own Submission Id in place: every status, client, outcome, note and conversation stays exactly where it is. It then pulls the sheet so the appointments that were swallowed come back. Nothing changes until you confirm, and it is safe to run more than once.
Your data
Everything is stored in this browser. Export a backup regularly, and always before clearing browser data.
Erasing appointments clears the reviewed list and the raw import cache, so a re-pull starts clean, but pulling your sheet again brings back whatever is in it now.
Sync
Sign out from the menu next to your name, top right.
Give the app to your team
By default the first thing a new person sees is a screen asking for the project URL and key, which you don't want to be handing out. This makes a copy of the app with those already filled in, so everyone else lands straight on the sign-in screen.
Database setup code
This is the code that has to be run once in Supabase before people can share the data. Press Copy, paste it into the Supabase SQL editor, and run it. Running it more than once does no harm.
Show the code