1. Your export and your assumptions
Needs a start date, a price and a duration (minutes, hours, 1h 30m or 1:30) or an end time. Service, staff and status columns are used when present. Column names are matched by alias and unverified against real exports.
Price-change what-if (your assumptions)
Choose the export file or paste it, then click Analyze bookings.
Result
Price-change what-if
Capacity
By service
| Service | Bookings | Hours | Revenue | Per hour | vs overall | Avg. length | Avg. price | Share of hours |
|---|
By staff
| Staff | Bookings | Hours | Revenue | Per hour | vs overall | Avg. length | Avg. price | Share of hours |
|---|
By weekday
| Weekday | Bookings | Hours | Revenue | Per hour | vs overall | Avg. length | Avg. price | Share of hours |
|---|
By hour of day
| Starts at | Bookings | Hours | Revenue | Per hour | vs overall | Avg. length | Avg. price | Share of hours |
|---|
The model, and what it leaves out
- Counted bookings: completed bookings with both a readable price and a readable duration (or end time). No-shows with a known length are shown as empty chair time. Client and business cancellations and bookings still open are left out. With no status column, every row counts as completed.
- Revenue per booked hour is the summed price divided by the summed hours of the same bookings, not an average of per-booking rates, so long bookings weigh in proportion to their time.
- Missing values are never guessed. A row with no price or no duration is left out of the yield and counted, so the hours in every denominator are the hours the dollars came from.
- Low-yield flag: a service with at least 5 bookings earning under the percentage you type of your overall figure. A group under 5 bookings is marked as a small sample and never named best or worst.
- Price-change what-if: the flagged services' revenue times (1 + your increase) times (1 − your expected volume loss). Both are your assumptions, not a forecast; freed hours are not assumed to be refilled, and demand, competitors and clients who leave are not modelled.
- Capacity: booked hours (attended plus no-shows) per week over the span of the file against the open hours you type. Breaks, admin time, walk-ins and part-time staff are not modelled.
- Reconciles. The service rows add up to the total revenue and hours at the top; weekday rows do too; hour-of-day rows add up over bookings that carry a start time.
- Not modelled: product sales, tips, processing fees, commissions and wages, supply costs, prep and clean-up time between bookings, and anything not in the file. Revenue per hour is not profit per hour.
- Unverified: column names and status words are matched by alias and no real Square Appointments, Acuity, Vagaro, Fresha, Booksy, Mindbody or Jobber export was available when this was written.
Common questions
How do I find my revenue per hour by service from a Square Appointments, Acuity, Vagaro, Fresha or Booksy export?
Export your appointments or sales list as a CSV with the service, start date, duration (or end time) and price, drop it here and click Analyze. The tool divides the price of each completed booking by its length, adds up the dollars and the hours for each service, and reports dollars per booked hour. A service that takes three times as long has to earn three times as much just to break even with a quick one.
Why is revenue per hour more useful than revenue per appointment?
A $150 colour that holds the chair for 150 minutes earns $60 an hour, and a $45 haircut that takes 30 minutes earns $90 an hour. Ranking services by ticket size hides that. Dollars per booked hour shows which services use your limited hours best and which ones quietly cost you money.
Which bookings are counted?
Completed bookings that have both a readable price and a readable duration or end time. No-shows are shown separately as empty chair time. Bookings cancelled by the client or the business and bookings still open are left out. If the file has no status column, every row is treated as completed.
What does the price-change what-if assume?
You type a price increase percentage and the share of bookings you expect to lose on the flagged low-yield services. The tool applies both to those services' revenue in the file and reports the change. Both numbers are your assumptions, not a forecast, and the freed hours are not assumed to be refilled.
What is the capacity figure?
If you type the hours you are open for bookings each week, the tool compares them with the hours booked per week in the file (attended plus no-shows) and shows idle hours and what one more filled hour a week is worth at your average yield. It ignores breaks, admin time, walk-ins and staff who work part-time, so treat it as a rough gauge.
Is my client and sales data uploaded?
No. The file is read in this browser tab and never leaves your device. There are no accounts, cookies or analytics vendors.
Which file formats and column names does it read?
Comma, semicolon, tab or pipe separated text, including UTF-8 with a byte order mark and UTF-16, with quoted fields. Durations can be minutes, hours, 1h 30m or 1:30, or you can supply an end time instead. Column names and status words are matched by alias and no real Square Appointments, Acuity, Vagaro, Fresha, Booksy, Mindbody or Jobber export was available when this was written; if your file is not read, the message names what was missing.