Platform · Accounting
The books are not a report. They are the system.
Every spa we have met keeps its accounts somewhere else — a second package, a bookkeeper, a spreadsheet that arrives on the ninth of the month. Sensa has a double-entry general ledger inside it, and the spa posts to it as it trades.
Posted as it happens
Nothing is re-keyed, because nothing left.
A treatment completed, a receipt taken, a discount given, a refund made, thirty millilitres of oil consumed — each is a ledger entry at the moment it occurs, with the document that caused it attached.
- Journals must balance before they post. An unbalanced entry is refused, not saved as a draft that somebody fixes later.
- Every entry names a person and a date, so "when did this start happening" has an answer rather than a theory.
- A journal opens in a side panel, not a modal, because an accountant needs to read the account list while composing the entry against it.
- Amounts are held in minor units end to end, so three-decimal currencies are exact instead of nearly right.
| Account | Debit | Credit |
|---|---|---|
| Receivables 1200 | 52.500 | — |
| Treatment revenue — Mariam 4110 | — | 36.000 |
| Treatment revenue — Layla 4111 | — | 12.000 |
| Retail revenue 4500 | — | 4.500 |
| Total | 52.500 | 52.500 |
Closing
One date, not a grid of months.
The period lock is a single line: closed through the twenty-eighth of February. Every dated write on or before it is refused, everywhere — a journal, an invoice, a receipt, a stock adjustment, a payroll entry.
Systems that lock per module produce the worst possible outcome: a closed ledger and an open till. The figure you reported in March quietly stops matching the system in June, and nobody can say which is right.
- Last quarter stops changing under the report you already sent.
- Reopening is deliberate, recorded and answerable, rather than a setting somebody flips.
- It governs every module, which is only possible because there is one system rather than four.
One date governs the whole platform, so last quarter stops changing under the report you sent.
Reading the year
A year in one column tells you almost nothing.
Four hundred and seventy-one thousand of gross profit. Earned evenly, earned in a strong winter and a collapsed summer, or earned almost entirely in December — three completely different businesses, and one column cannot tell them apart.
So the profit and loss splits into period columns. It is the report owners open first, because seasonality in a spa is not a detail; it is the thing that decides hiring, pricing and whether a quiet month is a problem or a Tuesday in August.
- Any grouping — month, quarter, season, or your own trading periods.
- Comparatives against last year in the same shape, so growth is read against the same month rather than the average.
- Drill from a figure to the entries behind it, because a number nobody can open is a number nobody trusts.
| Account | Q1 | Q2 | Q3 | Year |
|---|---|---|---|---|
| Treatment revenue | 212k | 198k | 141k | 551k |
| Retail revenue | 31k | 28k | 19k | 78k |
| Gross profit | 189k | 174k | 108k | 471k |
A year in one column says 471k. It does not say the summer nearly halved.
Budgets
A ceiling and a floor are not the same number.
Expense accounts carry a budget. Income accounts carry a target. They are stored and labelled apart, and the screen never blends them into one variance column — because a hundred and ten percent of a target is a good month and a hundred and ten percent of a budget is a problem.
It is a small distinction and almost no system makes it, which is why budget reports get read wrong at exactly the speed an owner reads them: quickly, on a phone, looking for red.
- Set per account, per period, per property.
- Actuals come from the ledger, not from a parallel figure somebody maintains.
- Variance is shown with its direction meant, so red always means bad and never means "above".
| Account | Set | Actual |
|---|---|---|
| Treatment revenue | Target 80,000 | 84,320 · 105% |
| Back-bar consumed | Budget 7,500 | 6,910 · 92% |
| Marketing | Budget 4,000 | 4,410 · 110% |
110% of a target is good news. 110% of a budget is not. Two kinds of number, never blended.
Suppliers
The question an ageing cannot answer.
"How much have we bought from this supplier this year, and how much of it have we settled?" A ledger holds a balance — what is owed today. It does not hold a purchase history, so the standard ageing report simply cannot answer that.
- Purchased, settled and owing, by supplier, which is the shape of a negotiation rather than a chase.
- Goods received without an invoice are visible, which is where suppliers are most often paid twice.
- Receivables run the same way — corporate accounts, hotel charge-backs and group bookings, each with its own settlement history.
| Supplier | Purchased | Settled | Owing |
|---|---|---|---|
| Aromatics Co | 8,420 | 6,100 | 2,320 |
| Levant Supply | 3,960 | 3,960 | — |
| Linen & Co | 2,180 | 1,000 | 1,180 |
The ledger holds a balance, not a purchase history. This is what an ageing cannot answer.
Statements
Trial balance, P&L, balance sheet — from the same entries.
Not assembled from a separate reporting table. The statements read the ledger, which is why they agree with each other and with the till without anybody reconciling them.
- The trial balance proves the books, and it is there to be run rather than requested.
- Revenue per therapist is an account, not an apportionment, so what a therapist earned the business is the same number in her review and in the accounts.
- Stock value flows in from inventory, so the balance sheet stops waiting on a count.
- The permission that opens the guest ledger does not open the general ledger. Separation of duty is a role, not a policy on a wall.
| Line | March | Feb |
|---|---|---|
| Treatment revenue | 84,320 | 79,110 |
| Retail revenue | 11,640 | 9,870 |
| Discounts given | −4,180 | −6,020 |
| Back-bar consumed | −6,910 | −6,640 |
| Gross profit | 84,870 | 76,320 |
What it makes answerable
Questions that used to take a fortnight.
Not because the reports are cleverer, but because the operational data and the financial data are the same data. There is nothing to join and nothing to argue about.
- Which treatments are actually profitable, revenue against what each one consumed.
- What each therapist earned the business, from her own account rather than a spreadsheet.
- What discounting cost this quarter, with the reason and the person attached to every one.
- Whether a quiet month was demand or capacity, because the bookings and the books are one record.
Posted from the ledger, not apportioned in a spreadsheet.
Why it matters commercially
Nobody buys spa software for the ledger. They leave the old one because of it.
This is the module an owner does not ask about in a demo and cannot stop thinking about afterwards. Every spa we have met runs its accounts somewhere else — a second package, a bookkeeper, a spreadsheet that arrives on the ninth. So the numbers that decide the business are always at least a month old and always slightly contested.
Putting the ledger inside the spa system is not a feature. It removes an entire monthly process, a category of dispute, and the gap between what the floor did and what the accounts say it did. That gap is where every unpleasant surprise in a spa comes from.
Questions
The accounting, answered.
Is this a real general ledger, or reports that look like one?
A real one. Double-entry, a chart of accounts you own, journals that must balance before they post, a trial balance that proves it, and a period lock. Every treatment, receipt, discount, refund and back-bar consumption posts into it as it happens — the accounts are the system of record, not a monthly export of one.
Do we still need our accountant?
Yes, and they will spend their time differently. What disappears is the fortnight of re-keying a spa system’s summary into an accounting package, and the reconciliation that follows it. What remains is the judgement you actually pay an accountant for.
What stops last quarter changing after we have reported it?
One date. The period lock closes the books across the whole platform at once, and every dated write on or before it is refused — a journal, a receipt, an invoice, a stock adjustment. Not a grid of months per module, which is how a spa ends up with a closed ledger and an open till.
Why are budgets and targets shown differently?
Because exceeding them means opposite things. An expense account carries a budget, which is a ceiling. An income account carries a target, which is a floor. 110% of a target is good news and 110% of a budget is not, so they are labelled apart rather than blended into one "variance" column that has to be read twice.
Can we see the year broken into periods?
Yes, and it is the report owners use most. A year in a single column says four hundred and seventy-one thousand. It does not say whether that was earned evenly or whether the summer nearly halved — and those are three different businesses with the same annual total.
Does it handle more than one property and more than one currency?
Yes. Each property runs its own way and posts to its own accounts; the group reads one consolidated set of numbers. Amounts are held in minor units throughout, so a three-decimal currency like the dinar is exact rather than nearly right.
Start
Ask your accountant to look at this.
A guided pilot at one property, with your treatments, your therapists and your price bands — not a demo dataset.