For two years, OTR labor tracking lived in a spreadsheet outside MoveRight. Every month, someone exported data out of the system, pasted it into a workbook, and hoped the formulas held. If a row got shifted, a crew member’s name got misspelled, or the export format changed, the totals were wrong and nobody noticed until payroll hit.
OTR stands for Operations Tracking & Revenue. It is the part of the system that tells you what you actually made on each job, what you actually paid each crew member, and what is still owed. It is not a forecasting tool. It is the ledger. When it lives in a spreadsheet outside the system, the ledger and the source of truth are two different files. That gap is where money gets lost.
What the Dashboard Actually Shows
The OTR System Revenue dashboard, now inside MoveRight, shows three things in one place:
- System Revenue — revenue per job, per zone, per franchise, rolled up to the network
- Labor Tracking — paid vs unpaid labor at the job × crew member level
- Drill-down into the underlying reports — click a number, see the jobs behind it
Each row is scoped to a zone. A multi-location operator sees every franchise in one view. A location lead sees only their own zone. The data is live — not pasted in from last week’s export.
Why It Was an External Spreadsheet Before
The honest answer: the old reporting layer could not do it. The reports were static. You could see a total, but you could not click into the jobs behind it. You could not edit a paid amount inline. You could not group by payout period. You could not filter by job area.
So operations teams built a workaround. They exported the job-level data, pasted it into a spreadsheet, added a column for “Paid” and a column for “Paid In Full”, and maintained it by hand. Every month. For two years.
This worked, in the sense that it produced a number. It did not work in any of these senses:
| External Spreadsheet | OTR Dashboard | |
|---|---|---|
| Data freshness | Stale at best — updated on export cadence | Live — refreshes on save |
| Error rate | Unknown — one shifted row breaks the total | Zero manual entry — totals are server-calculated |
| Labor tracking | Manual “Paid” column, maintained by hand | Inline edit, bulk “Pay all jobs in this group”, paid-in-full flags |
| Drill-down | None — you see a number, not the jobs | Click any total, underlying report opens in a new tab |
| Multi-location rollup | Five spreadsheets, one per franchise, combined by hand | Zone-scoped, rolls up to the network automatically |
How the Internal Dashboard Works
This is the first dashboard built on MoveRight’s new dynamic-reports engine. What that means in practice:
Zone-scoped reports. The dashboard respects role-based access. A franchisee sees their zone. A network manager sees every zone side by side. No combining five exports into one.
Job-count column. Every revenue total is paired with a count of the jobs behind it. If revenue is up 14% but job count is flat, average ticket size is up. If revenue is up 14% and job count is up 20%, you’re discounting. The two numbers together tell a story that one number alone cannot.
Drill-down links. Click a revenue figure. The underlying report opens in a new tab, filtered to the same scope. The headers in the drill-down match the calculator labels — what you clicked is what you see. CSV and clipboard exports preserve the readable cell text, so when you paste into a Slack thread or an email, it does not arrive as raw IDs.
Job area filter. Dynamic reports now support a job-area filter, so you can scope a report to “Downtown” or “Northside” without leaving the dashboard.
Calculator columns. The dynamic-reports engine exposes calculator columns — fields that are computed server-side, not pasted in. When you save a change, the server recalculates the totals. The number you see is the number that is true.
OTR Labor Tracking
The labor side is where the spreadsheet hurt the most. Crew members are paid per job. Some jobs are paid in full on completion. Some carry a balance. Some are overdue. Tracking that in a spreadsheet means someone is manually updating a “Paid” column every time a payout goes out, and someone else is manually highlighting overdue rows.
The OTR Labor Tracking dashboard (!2146, closing the old spreadsheet ticket #6281) does this instead:
- Paid vs unpaid labor, per job, per crew member. One row per job × crew member. You see the paid amount, the unpaid amount, and the balance.
- Inline edit. Click a paid amount, type the new number, save. The server recalculates. No spreadsheet, no formula, no “did I shift the row?”
- “Paid in full” flag. Mark a row paid in full. The row stops showing up in the unpaid view.
- Bulk “Pay all jobs in this group.” Scoped to a payout period. If you are closing out the July 15 pay period, you select the group, click “Pay all jobs in this group”, and every unpaid balance in that period is marked paid. One action instead of forty.
- Payout period grouping. Rows group by payout period. You see “Week of July 7”, “Week of July 14”, and so on, with the unpaid total for each.
- Unpaid-overdue highlighting. Rows that are past due are flagged. You do not have to scan the column — the system tells you which crew members are still owed money from two weeks ago.
When you save a change, the server runs the calculator and refreshes the totals. The dashboard you are looking at is not a cached snapshot. It is the current state of the ledger.
What This Means for Multi-Location Operators
Two rituals change.
The morning standup. The network manager opens the OTR dashboard, not five spreadsheets. Each franchise’s system revenue and job count are on one screen. If Franchise A is up 18% on revenue but flat on job count, the manager asks about pricing. If Franchise B is down 12% on revenue and down 20% on job count, the manager asks about lead flow. The drill-down tells them which jobs are behind the number before they get on the call.
The payout period close. The location lead opens OTR Labor Tracking, filters to the current payout period, and clicks “Pay all jobs in this group”. The period closes. Overdue rows are still highlighted, so anything unpaid from the prior period is visible immediately. No reconciliation by hand. No “did we miss anyone?” — the system shows you the unpaid balances, flagged and grouped.
A Note on the Drill-Down Fix
The drill-down had a bug. When a linked report was sorted by saleAgent but did not include that column, the drill-down crashed (!2190, closing #6521). That is the kind of bug that does not show up in testing — it only shows up when a real user clicks a real number and lands on a report that someone else configured. It is fixed. The drill-down no longer assumes the sort column is present. This matters because drill-down is the feature that makes the dashboard usable. If clicking a number does not work, the dashboard is just a prettier spreadsheet.
MoveRight is the moving company CRM that tracks operations and revenue in one system — no external spreadsheet, no monthly export, no manual reconciliation.
If your OTR numbers live in a workbook that someone updates by hand, that is an answerable problem. Talk to us.
References: