Month at a glance
Unit economics
Profit this month
Team performance
12-month trend
Revenue mix by line
A buyer pays more for a business with several working revenue lines than one that
lives or dies on a single offer. This is the chart that shows whether that's true of yours.
Money still owed
What this business is worth
Who's on the clock right now
Hours & activity this month
Portal tracking: clock-in and clock-out are stamped by the server, not typed by the worker. While the
portal tab is open it reports how many mouse moves and keystrokes happened each minute; a minute counts as
active if it clears a small threshold. Twelve minutes of silence caps the shift at the last activity.
A browser only sees its own tab, and a mouse-jiggler defeats it.
Time Doctor: connect it on the Setup tab for OS-wide tracking with screenshots. Its hours land here as TD shifts and override portal and typed hours for the same person and day, so the two can never double-count.
Tell your team they're being timed — several states and most countries require that disclosure.
Time Doctor: connect it on the Setup tab for OS-wide tracking with screenshots. Its hours land here as TD shifts and override portal and typed hours for the same person and day, so the two can never double-count.
Tell your team they're being timed — several states and most countries require that disclosure.
Every shift this month
Add a team member
Each person gets an access code for the team portal. Pay computes from what they actually submit.
Roster
Positions you hire for
Add whatever you hire — closers, setters, processors, a bookkeeper.
Renaming a position moves everyone on it and keeps their targets. You can't delete one that still has people on it.
What you measure people on
These are the numbers your team submits daily, and anything here can
also be a pay basis — so "$50 per sale closed" or "$3 per appointment set" works the same way as hourly.
Tick average for things like response time, and lower is better when the target is a ceiling.
Weekly targets by position
Blank or 0 means that metric doesn't apply to the position and is left
out of their score entirely — so a closer isn't marked down for sending no dispute rounds.
Start a pay run
Nothing here moves money. A pay run works out what each person earned over the period
and freezes it. When you approve it, the app exports a batch file and fires your payroll webhook — whatever
you've wired that to (Wise, PayPal, Gusto via Zapier) is what actually pays. You are always the one who says go.
Monthly salaries are prorated by the length of the period.
Pay run history
Payout details per person
Where each person actually gets paid. These travel with the batch
export and the webhook, so your payout rail knows where to send it.
Payroll webhook
Fires once, when you hit Approve, with every line and its payout details. Wire it to a Zapier
"Catch Hook" and then to Wise/PayPal/your bank. Leave it blank and the export file is your path instead.
What to set aside
Reserve rates
These are your numbers to set, not tax advice. The defaults are rough US self-employed
placeholders — 15% federal income plus 15.3% self-employment. Your actual rate depends on your entity, state,
deductions and income level. Get them from your accountant and put the real figures here.
Move money to reserve
Record it here each time you actually move money into a separate account. The gap above is
what you still owe yourself.
Estimated tax by quarter
Contractor paperwork
Anyone you pay $600+ in a calendar year
needs a 1099-NEC filed by Jan 31, and you need a W-9 on file to file it. Year-to-date totals below come from
pay runs you've marked paid.
Deadlines & renewals
Credit repair is a regulated business. CROA, state registration
and surety bonding rules vary and change. This tracks dates you enter — it does not tell you what applies to
you. That comes from your attorney.
Log work on someone's behalf
Submissions this month
Enroll a client
Tick each payment as it actually clears — that stamps the date so the cash lands in the right month.
"Came from" is what makes cost-per-acquisition real on the Marketing tab.
Import from a spreadsheet
Clients: a CRM export with names, emails and a tag naming the package. Anything without a
recognisable package is reported and skipped — never guessed, because a guessed package invents a contract value
and a receivable that never existed.
Payments: an export from wherever you actually take money — Stripe, Commas, Fanbasis, PayPal, or your bank. Matched to clients by email, then applied to their unpaid instalments oldest-first. Both show you a preview before anything is written.
Payments: an export from wherever you actually take money — Stripe, Commas, Fanbasis, PayPal, or your bank. Matched to clients by email, then applied to their unpaid instalments oldest-first. Both show you a preview before anything is written.
Clients & payment plans
Sales commissions
Setters and closers paid per sale go here, not on payroll — keeps cost-per-acquisition honest.
Digital products — ebooks, courses, templates
One row per product per sales period — units × price, less whatever Stripe/Gumroad/Skool took.
Near-pure margin, so it's tracked separately rather than lumped into "other".
Other revenue
Funding commission: put the approval amount in Amount and 10 in Rate. Flat items: leave Rate blank.
Funding at a glance
Log a funding deal
Your commission is earned on approval but only counts as cash in the month you tick
paid — everything approved and unpaid shows as pipeline, so you never book money you haven't received.
Funding pipeline
By lender
Ad spend & leads
One row per channel per month — saving the same channel twice updates it rather than duplicating.
Ad spend is a real expense and hits the P&L.
Where your clients came from
Auto-count leads from GHL
Point a GHL workflow's Custom Webhook at your inbound hook (Setup tab) with this body and leads count themselves:
{"event":"lead","channel":"Meta Ads","date":"{{contact.date_created}}"}
Money already sold, not yet collected
Expected by month
Every payment due
Log a tradeline sale
Profit calculates itself. Price paid feeds expenses, sold-for feeds revenue — so margin is real, not a guess.
Tradeline ledger
Recurring monthly costs
These post themselves every month — enter once.
Platform usage — SMS, email, AI, voice
The costs that move every month. Enter the volume and let it
price itself off your unit rate, or type the dollar amount straight in if you already have the invoice.
Your GoHighLevel and Skool subscriptions are fixed, so they live in the recurring list above.
Unit rates
What one unit costs you. Defaults are HighLevel's published US rebilling
rates — check yours, they differ by country, by agency markup, and they change.
One-off expenses
Owner draws & tax reserve
A draw isn't an expense — it's you taking profit out, so it doesn't touch the P&L. It's tracked
here so you can see what's actually left after tax reserve and draws.
Time Doctor
…or let me mint one. Your password is used for that single call and never stored.
If the API gives you trouble, use the CSV. In Time Doctor export a timesheet
(Reports → Hours Tracked → Export), then drop the file in. Names are matched against your roster, so a
person's Time Doctor name or email must match what you typed on the Team tab.
GoHighLevel
In GHL: Settings → Private Integrations → Create, tick the Opportunities, Contacts and
Locations read scopes, then paste the token here. Won opportunities become clients, and the package is
matched to the closest price you've set.
Embed this app inside GHL
In GHL: Settings → Custom Menu Links → Add. Paste the URL below, choose
"Open in iframe", and restrict it to admins only. The app already sends the header that permits GHL to
frame it. You'll sign in once inside the frame.
This must be an https:// address, not localhost — GHL runs
over https and browsers refuse to frame an insecure page inside a secure one.
Zapier — pull data out
In Zapier use a Webhooks → GET step against these URLs.
Zapier / GHL — push data in
POST JSON here.
client_enrolled creates a client,
lead increments that channel's lead count.Backup & export
Data lives in
data/db.json on the server. Back it up before any move.Owner key
This is the only thing between anyone who reaches this address and every number in the business.
Change it off the default before you host it anywhere.
Valuation multiple
Small service businesses with owner involvement typically trade at 2–3.5× seller's discretionary
earnings. Recurring revenue and a team that runs without you push it higher.
Your subscription
Your packages
Name them whatever you sell. Total is calculated —
deposit plus however many payments you set, so it can never drift out of sync. Set payments to 0 for a
pay-in-full offer. Renaming a package moves every client on it automatically.