Back office — the numbers and the books

The room where the money gets counted

Every sale, tip, tax, expense and owner’s draw has already landed somewhere else in Structa. This is where they are added up: the month on a screen, any period you pick, a file your bookkeeper opens — and, underneath all of it, a double-entry general ledger most owners will never need to open.

Free software. Reports and Accounting are on for every business, with no card. You pay for AI credits — and neither of these screens spends one.
The numbers

What an owner actually reads

Reports is computed live from the modules you already run. There is no second database and nothing to import — and a panel whose module you do not have is never queried and never appears.

This month, and what it averages

Revenue so far, the number of sales behind it, and the average ticket. On day one it is an honest wall of zeros with one line saying so, rather than a screen that looks broken.

ReportsPayments & POS

The week as seven bars

Monday to Sunday, with the best day raised. Over a longer range a second chart totals each weekday across the whole period and names the strongest one — a Tuesday problem is a pattern, not a bad week.

ReportsPayments & POS

Any two dates you like

Pick a from and a to. Revenue, sales and average ticket each arrive beside the equal-length period immediately before them. No prior period, no comparison — never an arrow invented out of a zero.

ReportsPayments & POS

Sales tax, totalled for the filing

What you collected over the period, on its own tile, so a quarter is one date range instead of an afternoon. It appears only for a business that charges tax.

ReportsPayments & POS

Hours, wage cost and the percentage

Labour for the week, what it cost, and what share of that week’s revenue it is — measured over exactly the same window as the revenue it is divided into. A punch nobody closed is capped at sixteen hours, so one forgotten clock-out cannot inflate a week.

ReportsTime clock

Who is coming back

Repeat clients as a share of everyone who has ever visited, who has lapsed, who is active, and your five most valuable clients by lifetime spend with their visit counts. A gym reads those three numbers differently from a dental practice; both read the same three.

ReportsClients

What sells, and what walked out

Items ranked by quantity and revenue for the period, with everything past the top fifty rolled into one row so the total still ties. Beside it: orders that closed without being paid, and what they were worth.

ReportsOrders

Who took the money

Sales, net revenue and tips per person for the period, with a not-attributed row so the table reconciles to the till. Commission day without a spreadsheet — and manager-only, because the names are.

ReportsPayments & POSStaff

All of it is a live read of the same rows the till wrote. Reports stores nothing of its own, which is why there is no saved version of last year’s number to disagree with this year’s.

Whose day

Today means today where you are

Every boundary — a day, a week, a month — is worked out on the server in your business’s timezone, and every screen that counts money uses the same one. A tablet with a wandering clock cannot move a total.

  • You set the timezone, and you set the hour the day rolls over. A bar that closes at two picks 04:00, and a 01:30 tab counts toward last night in revenue, in the day’s history and on the Z-report.
  • The month a screen opens on is your month, not the device’s. Reports and Accounting both render immediately on the device’s guess and correct themselves the moment the business day comes back — a clock an hour behind used to default to the wrong calendar month near a boundary.
  • Labour and revenue are totalled over the identical window, so labour as a percentage is a real ratio rather than two different periods divided by each other.
  • The payments export stamps every row’s date and time in the business timezone, whichever timezone the person pressing the button is standing in.
  • Change the timezone or the cutoff and the day-scoped screens recompute against the new boundary instead of finishing a request dispatched under the old one.

One surface does not follow it. The general ledger dates a posting from the payment’s own timestamp without applying your timezone or your cutoff, so a late-evening sale can sit a day later in the journal than it does in Reports — and, at the end of a month, in the next month’s trial balance. Reports, the day’s history and the Z-report are the surfaces that honour your day.

Getting it out

Every panel exports itself

A number you can only look at is a number you cannot hand to anybody. Each panel writes its own file, named for what it holds and the dates it covers, and it opens in a spreadsheet with no import wizard in between.

structa-payments-<from>_<to>.csv
Every payment in the period: date, time, client, description, method, channel, amount, refunded, tip, tax and status. Voided sales are in it and marked as voided, because a file that hides them cannot be reconciled against anything.
structa-staff-<from>_<to>.csv
Sales, net revenue and tips per person, with the unattributed remainder as the last row so the columns add up to the period.
structa-dishes-<from>_<to>.csv
What sold and for how much, including the rolled-up row for everything past the top fifty.
accounting-<month>.csv
The month’s expenses and owner draws, oldest first, each amount signed negative — both are money leaving the business.
trial-balance-<month>.csv
Every account with its debit and credit totals for the month, and a TOTAL row underneath.
ledger-journal-<month>.csv
One row per debit and per credit line, carrying the entry’s date, memo, source and account code.
clients · inventory · timesheet .csv
The client list, the stock count and the week’s timesheet each export from their own screen, the same way.
  • Column headers are English in every language, because that is what a bookkeeper’s software expects to read.
  • A byte-order mark is written first, so Excel opens accented and Cyrillic names as names instead of as mojibake.
  • A cell starting with an equals, plus, minus or at sign is prefixed with an apostrophe. Client names and notes are typed by guests and by staff, and a spreadsheet would otherwise run one as a formula the moment the owner opened the file.
  • The channel is on every payment row: online, gift-card sale, gift redemption, membership. Without it, money you have not earned yet reads as ordinary card revenue and the file will not tie out.
  • The staff column exists only when the person exporting can resolve the names. For anyone else the column is absent rather than present and blank on every row — a report that attributes nothing is worse than a smaller report.
  • The whole business leaves as one JSON file from the Console: bookings, clients, orders, payments, staff and the audit log. A module you have switched off keeps its history out of that file until you switch it back on.

There is no PDF and no direct connection into accounting software. What leaves this room is CSV and JSON — and the income statement and the balance sheet are read on screen rather than exported, unlike the trial balance and the journal beneath them.

Underneath

There is a real double-entry ledger down here

Most owners will never open it, and nothing makes them: it stays empty until a manager presses Set up ledger. Press it and Structa lays out a chart of accounts, then mirrors what already happened into balanced journal entries.

01

A chart of accounts, seeded once

A standard set of assets, liabilities, equity, revenue and expense accounts, laid out identically under either reporting framework — the frameworks diverge at presentation and valuation, not at bookkeeping. They belong to your business alone.

Accounting (beta)
02

Balanced, or not written at all

Debits must equal credits. The check is a database constraint that runs at commit over the whole entry, so a half-written entry cannot exist even for an instant — and it holds whether the entry came from the screen, from the auto-poster, or from anywhere else.

Accounting (beta)
03

Sales and expenses post themselves

One pass reads your payments and your expense log and writes whatever is not in the journal yet. It is safe to run again, because it matches on the originating record, and the first run backfills your whole history. Two tabs pressing it at once cannot double-post: the run is serialized per business.

Accounting (beta)Payments & POS
04

Refunds and voids are reversed, not erased

The sale is posted at full value and the reversal is a second entry, dated on the day of the refund rather than the day of the sale, split across the same legs in proportion. Refund a second slice and only the difference posts; un-void a sale and a reinstatement posts. The tax unwinds cumulatively rather than per refund, so after three partial refunds Sales Tax Payable still agrees, to the cent, with what you will remit.

Accounting (beta)Payments & POS
05

Corrections leave a mark

There is no edit for an expense: you delete it and re-enter it, and that is the correction. The deleted one’s posting gets its own reversing entry, dated to the original day — or to today, when that month is already closed.

Accounting (beta)
06

A trial balance, and a form for the adjusting entry

The month’s debits and credits per account with totals underneath, a line that says in so many words whether it is in balance, and the plain one-debit-one-credit form an accountant will ask you for.

Accounting (beta)

The accounts it keeps

  • 1000CashPosted for you
  • 1100Accounts ReceivableBy hand only
  • 1200InventoryBy hand only
  • 2000Accounts PayableBy hand only
  • 2100Sales Tax PayablePosted for you
  • 2200Deferred RevenuePosted for you
  • 3000Owner’s EquityPosted for you
  • 4000Sales RevenuePosted for you
  • 4100Service RevenuePosted for you
  • 5000Cost of Goods SoldBy hand only
  • 6000Operating ExpensesPosted for you
  • 6100Payroll ExpenseBy hand only

Five of them are never posted to automatically: receivables, inventory, payables, cost of goods sold and payroll. A booking carries no price in Structa, so nothing accrues into receivables; the other four are yours to post by hand or to leave at zero. You cannot add an account of your own — the chart is the one the setup creates.

What each event books

A sale
Dr Cash · Cr Sales Tax Payable · Cr Sales Revenue
A gift card sold
Dr Cash · Cr Deferred Revenue
A gift card redeemed
Dr Deferred Revenue · Cr Sales Tax Payable · Cr Sales Revenue
A membership sold
Dr Cash · Cr Deferred Revenue
A membership visit used
Dr Deferred Revenue · Cr Service Revenue
An expense
Dr Operating Expenses · Cr Cash
An owner’s draw
Dr Owner’s Equity · Cr Cash
A refund or a void
The same legs, mirrored, in proportion to what came back
The distinction that pays for all of it

Money received is not money earned

A gift card and a prepaid membership are cash today and a service you still owe. Counting them as revenue on the day the card is bought makes a good month out of a debt — and makes the month it is finally used look empty.

  • A gift card sold is cash in and a liability, not revenue. It becomes revenue when it is redeemed, and the sales tax is carved out of the redemption at that point, so gift-tender sales reach your tax filing instead of disappearing from it.
  • A prepaid membership is the same: cash in, deferred. It is earned as it is used — the prepaid amount scaled by visits taken against visits bought. A time-based plan with no visit count earns straight-line across its window.
  • When a plan expires or is cancelled, whatever is left is recognised at once. That is breakage, and it belongs to the period the plan ran out in.
  • A refund pulls recognised revenue back into deferred. A voided sale earned nothing at all, so the recognised slice goes back and every account involved nets to zero — a cancelled sale that leaves revenue behind is a bug, and it was one.
  • Sales tax is not revenue at all. It is collected on behalf of a state and sits in a liability account until you remit it, so it never reaches your profit line and never inflates a month that was really somebody else’s money passing through.
  • An owner taking money out is not an expense. It reduces equity and it reduces cash, and that is all it does.

Membership deferral is forward-only. Memberships sold before it shipped were booked as ordinary revenue on the day of the sale and stay that way — re-linking old sales after the fact is exactly the sort of retrospective fix that quietly changes a number somebody has already filed. A business that has never sold a membership sees none of this.

The statements

US GAAP or IFRS, on an accrual or a cash view

An income statement for the month and a balance sheet as of month end, both derived from the trial balance rather than stored. Revenue and expenses close into retained earnings, and the sheet tells you whether it balances.

  • The reporting framework is one business-wide setting a manager chooses. It changes what the statements are called and what three accounts are called on their face. It does not move a single posting: the ledger underneath is identical either way.
  • The ledger is posted on the accrual basis. The cash view is derived on screen by folding the period’s deferred-revenue movement back into income and the cumulative balance back into equity, so the sheet still balances under either.
  • Basis is a view, not a stored fact, and it is not gated — anyone who may read the statements may read them either way. The framework is stored, so changing it is a manager’s job.
  • If your role cannot change the framework, the switch returns to where it was and says so. A statement that asserts a standard the books are not prepared under is the one thing this screen must never print, and it did until that was fixed.

What changes when you switch to IFRS

Balance sheet
Statement of financial position
Income statement
Statement of profit or loss
Net income
Profit for the period
Accounts receivable
Trade receivables
Accounts payable
Trade payables
Deferred revenue
Contract liabilities
Closing

Closing a month actually closes it

Filed numbers stay filed numbers. Once a month is closed the database itself refuses to let anything dated inside it change.

  • No journal entry dated in a closed month can be inserted, changed or deleted. That is a trigger on the tables rather than a hidden button, so it holds for the screen, for the auto-poster, and for anything else holding a token.
  • Reopening is a deliberate act, and a manager’s.
  • Post an entry dated into a closed month and the screen refuses it before it is sent, naming the month it would have landed in — not the month you happen to be looking at. Back-dating an adjusting entry into an open month stays allowed, because that is ordinary bookkeeping.
  • The auto-poster skips closed months and posts everything else, rather than failing on one and stopping.
  • A correction whose original month is already closed is dated today instead, which is how a correction into a closed period is booked anywhere.

Closing the day and closing the month are two different things. The Z-report ends a shift’s cash and locks nothing. This locks the books.

Who can see what

  • Recording an expense is shift work: anyone whose role carries Accounting can enter one. Deleting a row the month’s totals are computed from needs a manager, and the database says so — the button only follows.
  • Setting up the ledger, posting an entry, running the sync, closing or reopening a month and choosing the reporting framework all need a manager, and all of them need the business to actually run Accounting. Both checks are restated inside each function, so calling the API directly does not get around a screen that was never rendered.
  • The ledger tables refuse direct writes outright. An employee holding their own token cannot post to the journal or delete it.
  • Wages are manager-only with no self-read: a person cannot see even their own hourly rate. Labour reaches Reports as a server-computed total, and no individual wage is ever sent to a browser.
  • Per-person sales are manager-only too, because the names are — and rather than list every colleague as a dash, the whole block stays hidden.
  • Reports shows the panels your own role can reach, not everything the business has switched on. A manager whose role does not carry Clients gets the money panels and not the retention ones.
The status, plainly

Accounting is labelled beta, inside the product too

The module list an owner picks from calls it Accounting (beta), and that is the same word as the one on this page. Here is what it covers and what it does not.

What beta does not mean here

  • The double-entry invariant is enforced by the database at commit, not by the screen.
  • A closed month is closed in the database, from every door into it.
  • Every write goes through a manager-checked function, and the auto-poster is idempotent: run it twice and nothing doubles.
  • Reversals are entries, never edits. Nothing in the product rewrites a posting that has already happened.
  • Beta here is about how much of accounting is covered. It is not about the numbers moving under you.

What beta does mean here

  • The scope is narrow. Structa keeps books; it files nothing. There is no tax return, no payroll run, no bank feed and no reconciliation against a bank statement — what your accountant gets is the files.
  • Five of its accounts are never posted to automatically, and you cannot add one of your own.
  • The entry form posts one debit against one credit. A three-legged entry is not something the screen offers, even though the ledger holds it.
  • The statements are derived from the trial balance rather than stored, with exactly one accrual adjustment — deferred revenue — because nothing in Structa accrues into receivables.
  • Membership deferral applies only to memberships sold since it shipped.
  • The journal’s day is the payment’s own date, not your business day.
  • One business, one currency, one set of books. There is no per-department or per-class reporting.
The limits

Where a number stops

A buyer who finds a limit himself stops believing the rest of the page. So here they are, and each one is a rule in the code rather than a caveat.

  • Nothing here is a forecast. Every figure on these screens is something that already happened.
  • A period comparison needs a prior period with money in it. Without one there is no percentage at all rather than a made-up one — and a change that rounds to zero shows as flat, with no arrow and no colour.
  • Accounting compares a month to the one before it only between complete months. A half-finished month is never pitted against a full one, which would read as a collapse for most of every month.
  • Top items rank; they do not reconcile. An order-level discount or service charge lands in the payment and is deliberately not spread across the lines, so on a day with either, the items will not sum to the period’s revenue.
  • Item sales count only orders that were closed and paid with a live payment. A comped or walked-out check is counted as unpaid, on its own tile, not as a sale.
  • Labour cost is zero until hourly wages are entered, and the tile says so rather than implying free staff. Labour as a percentage is blank for a week with no revenue.
  • Retention counts a client as lapsed against a fixed window, computed in your timezone by the same query that produces the list of who they are — so the count and the list cannot disagree.
  • The Accounting screen’s own totals are money OUT: expenses and owner draws. Sales revenue lives in Payments and Reports, and the ledger is where the two meet.

What you need before any of this works

  • The Reports module on your role, for the numbers. The Accounting module, for the expense log and the ledger. Either without the other is a coherent setup.
  • Payments, for anything about revenue. Without it Reports shows what it can and queries nothing it cannot.
  • Orders for what sells and for unpaid checks, Clients for retention, Time plus hourly wages in Staff for labour cost, Inventory for the reorder count. Each panel needs its own source and says nothing without it.
  • A manager, for the ledger: setting it up, posting, syncing, closing a month and choosing the framework.
  • Your timezone and your day-cutoff hour, set in the Console. They start at UTC and midnight, and a business that never sets them is counting somebody else’s day.
  • Your sales-tax rate, if you charge one. Leave it at zero and no tile, no bill and no journal line ever mentions tax.
  • Nothing else. There is no import step, no chart to design and no opening balances to key in before the numbers work.

What’s actually true today

  • Every day, week and month boundary is computed on the server in your business’s timezone, with the cutoff hour you chose.
  • Each panel exports its own CSV, named for what it covers, with a guard so a spreadsheet cannot execute a cell somebody typed into your product.
  • The general ledger is real double-entry: debits must equal credits, checked by the database at commit.
  • Sales, gift cards, memberships, expenses and owner draws post themselves, and running the sync a second time posts nothing.
  • Gift cards and prepaid memberships are a liability until they are used, not revenue on the day they are sold.
  • Statements come out under US GAAP or IFRS, on an accrual or a cash view, from the same postings.
  • Closing a month makes it read-only in the database until a manager reopens it.
  • No wage ever leaves the server. Labour reaches the screen as a total.
  • Accounting is beta, and the product’s own module list says so before you turn it on.
  • Your data is yours: a full export any time, and permanent deletion on request.
Straight answers

Questions owners ask

Do I still need an accountant?

Yes. Structa keeps the books and hands them over; it files nothing — no tax return, no payroll run, no bank feed. What your accountant gets is a trial balance, a journal down to the line, and a payments file that opens in whatever they already use.

Do I have to set the ledger up?

No, and nothing nags you to. It stays empty until a manager presses Set up ledger. Until then Accounting is an expense and payout log with a monthly export, and Reports works entirely on its own — which is all most salons and cafés ever want from it.

Whose timezone is a day counted in?

Yours, with the cutoff hour you set. Pick 04:00 and a 01:30 sale counts toward the night before, in revenue, in the day’s history and on the Z-report. It is computed on the server, so a tablet with a wrong clock cannot shift a total. The one exception is the general ledger, which dates a posting from the payment’s own timestamp.

Can somebody change last month’s numbers?

Close the month and no. After that the database refuses any entry dated inside it, from the screen or from anywhere else, until a manager deliberately reopens it. Before you close it, a manager can post a back-dated adjusting entry, which is ordinary bookkeeping rather than a hole.

What happens to a gift card I sold?

It is cash in and a liability, not revenue. It becomes revenue when it is redeemed, with the sales tax carved out of the redemption at that moment. A prepaid membership works the same way, earned as the visits are used, with whatever is left recognised when the plan expires.

Can my staff see what I pay people?

No. Wages are manager-only and there is no self-read, so a person cannot see even their own rate. The labour figures in Reports are totals computed on the server; no individual wage is ever sent to a browser, and the per-person sales table does not render at all for anyone who could not resolve the names anyway.

Can I get this into QuickBooks or Xero?

As files. The trial balance, the journal and the payments list all export as CSV that those tools import, and the whole business exports as JSON. There is no direct connection into accounting software, and this page will not pretend otherwise.

What does beta mean on Accounting?

Scope, not stability. The bookkeeping rules are enforced by the database — balanced entries, closed months, reversals instead of edits — and none of that is provisional. What is narrow is the coverage: five of its accounts never post automatically, you cannot add an account, the statements carry one accrual adjustment, and nothing files anything for you.