Sales Reports
The nine ways Kassly slices your sales — by period, product, category, cashier, terminal and branch — which are free, and where each one under-counts.
10 min read · Updated 26 Sep 2026
On this page
Everything under Reports in the sidebar is a slice of the same thing: completed sales. This page explains what each slice counts, so a number that looks wrong can be checked rather than argued about.
Owners and Managers only. Cashiers get a permission error on every report below. See Users and roles.
Most of this needs the Business Reports add-on (₱400 per branch each month), or any bundle that includes it. The split is not "old data costs money" — it is per report, and it surprises people. The table below is the honest version.
Which reports are free
The report pages all open on the Free plan. What differs is whether the figures load.
| Report | Free? |
|---|---|
| Daily Sales Breakdown | Free, any date range |
| Sales Summary | Free for today only |
| Top Products | Free for today only |
| Order Type Breakdown | Free for today only |
| Peak Hours | Free for today only |
| Payment Method Mix | Free for today only |
| Cashier Performance | Free for today only |
| Terminal Performance | Free for today only |
| Branch Comparison | Free for today only |
| Sales by Hour / Sales by Day chart on a report page | Free for today only |
| Monthly Comparison | Needs Business Reports |
| Discount Impact | Needs Business Reports |
On the Free plan these pages open on today and the date picker is replaced by a fixed Today with a locked Other dates button that opens the upgrade dialog. A link to another date range opens on today instead. Comparisons with the prior period or last year, and the filters (cashier, terminal, category, payment, order type, hour, weekday), need Business Reports on every report.
"Today" is your store's today. It is the date in the Philippines, or your current business day if you set Business Day Start after midnight in Settings → Store Settings, so a bar that closes at 4am still sees the night's sales at 2am.
What counts as a sale
Every figure on every report below shares these rules.
| Rule | Detail |
|---|---|
| Status | Only completed sales. Held, pending and voided sales are excluded entirely |
| Date | The moment the sale completed, not when the cart was started |
| Day boundary | Your business-day cutover, not midnight — a 1:30am sale under a 2am cutover belongs to the previous trading day |
| Timezone | Philippine time, whatever timezone the device was in |
| Branch | Whatever the branch selector at the top of the page is set to |
Voided sales are worth restating: they are not netted off, they are simply not there. If you void yesterday's sale this morning, yesterday's total drops. See Profit reports for how the Profit & Loss statement handles that case differently.
Sales Summary
The main sales page. Six tiles, then a trend chart, then a breakdown by category.
| Figure | What it is |
|---|---|
| Total Sales | Sum of the sale totals — VAT included, service charge included |
| Transactions | Number of completed sales |
| Average Transaction | Total Sales ÷ Transactions |
| Total Discount | Sum of discounts given |
| Total Tax | Output VAT collected. Always ₱0 for a non-VAT store |
| Gross Profit / COGS | Owners and Managers only — see Profit reports |
Below the tiles, the payment breakdown splits into two totals that people routinely confuse:
- Collected is money that actually changed hands — cash, card, GCash, Maya, bank transfer, cheque.
- On account is the part charged to a customer's tab. That is a receivable, not revenue collected. It is inside Total Sales but it is not in your drawer.
The category breakdown lists units, revenue and transaction count per category, and adds cost and gross profit for Owners and Managers. A product with no category lands under Uncategorized.
Date ranges and comparisons
Every deep report page carries the same toolbar.
The date picker offers Today, Yesterday, This Week, This Month, Last Month and Custom. Whatever you pick goes into the page's web address, so you can bookmark a range or send someone a link to exactly the slice you are looking at.
The compare selector next to it has three settings.
| Setting | Compares against |
|---|---|
| vs Prior Period | The same number of days immediately before your range |
| vs Last Year | The same dates one year earlier |
| No Comparison | Nothing — the tiles show a bare figure |
Prior Period is labelled for you where Kassly can name it: a one-day range compares against Previous day, seven days against Last week, and 28 to 31 days against Last month. Anything else gets the dates spelled out.
Underneath the chart, a What drove the change? card lists up to five movers — the products, cashiers, terminals or branches whose change accounts for most of the difference, ranked by the size of the swing rather than the percentage. A ₱50 item that doubled will not outrank a ₱5,000 item that fell 10%.
Comparisons are computed with your filters applied to both windows, so the comparison is like-for-like.
Filters
The filter bar sits under the toolbar on the sales, product, cashier, terminal and branch reports. Filters stack.
| Filter | What to know |
|---|---|
| Cashier | The staff member on the sale |
| Terminal | Only sales that carry a terminal. Read the warning below |
| Category | Resolved through the product's current category, so recategorising a product changes past reports |
| Payment method | Any sale that used that tender. A split sale appears under every tender it used, so per-tender counts add up to more than your transaction count |
| Order type | Walk-in, dine-in, takeout, delivery or appointment |
| Hour from / to | The real wall clock, never shifted by your cutover. "6pm to 10pm" means 6pm to 10pm |
| Day of week | Bucketed by the day the business day opened, so it agrees with the weekday report |
You can save a filter and date-range combination under a name from the Views menu, and recall it in one click. Fifty saved views per person, and you can pin the ones you use daily. Views are yours alone — they are not shared with the rest of your staff. This needs Business Reports.
Top Products
Ranked by revenue by default, or by units sold if you switch Sort by. Pick a Top N, or All to get every product sold in the range with no ceiling.
Revenue here is the line total as it was rung up. For a VAT-registered store that figure has the 12% VAT inside it.
Items typed in at the counter rather than picked from the catalogue have no product record, so they group by the name that was typed. Two cashiers who spell a custom item differently produce two rows.
The card title follows your business type, so a salon sees Top Services.
Peak Hours and Monthly Comparison
Peak Hours buckets one day into hours and shows transactions and sales per hour. Because it takes a single day, this is the report to use for "when should I put a second person on the till".
Monthly Comparison puts three rankings side by side against the previous period:
- Which days drove the change? — sales and foot traffic per weekday.
- Hourly ranking — the same by hour of day.
- Product ranking — the same by product.
Foot traffic is not the same as transaction count. Where a sale records covers (a dine-in headcount), Kassly counts the covers; where it does not, it counts the sale as one. So a table of six on one receipt is six in foot traffic and one in transactions.
Cashier Performance
Transactions, total sales and average basket for each person who rang up a sale in the range.
This report can total less than Sales Summary. It only lists sales that have a staff member attached. A sale with nobody on it drops out of this report completely rather than appearing as "unknown", so the column will not add up to your Sales Summary total when that happens.
Orders that come in through your online store are credited to whichever staff member accepted them in the POS inbox, and dated by when the order was completed — not by when the shopper placed it. See Online orders.
Terminal Performance
Sales split by till. Same three columns as Cashier Performance, plus the branch and whether the terminal is still active. Retired terminals stay in the report so their history survives.
This report under-counts, sometimes badly. Kassly does not force a sale to record which till rang it up. Sales that carry no till roll up into one Unattributed row. Treat that row as real revenue with a missing label, not as a rounding error.
Here is exactly when a sale does and does not get a terminal:
| How the sale was made | Terminal recorded? |
|---|---|
| Rung up offline, then synced | Yes — recovered from the receipt number's prefix |
| Rung up offline on a device that was never paired | No — those receipts start OFL- and carry no terminal name |
| Rung up online, device sent its terminal | Yes |
| Rung up online, device did not send one | No. Kassly does not refuse the sale |
| Rung up online at a BIR-accredited store | Yes — the sale is refused without a paired terminal |
| Placed through your online store | Never. There is no till involved |
There is one more trap. Recovery from the receipt number works by matching the terminal name, and names only have to be unique within a branch. If two branches both run a Main Counter, Kassly will not guess between them, and those sales stay Unattributed. Give every till a distinct name across the whole store and this problem disappears — see Terminal management.
Finally: filtering by terminal drops the Unattributed sales, because they have no terminal to match. A filtered total is therefore lower than the unfiltered one by exactly the Unattributed amount.
Branch Comparison
One row per branch: sales, transactions, average transaction and current stock value, with the same comparison block as the other reports. It defaults to month-to-date rather than today, because comparing branches over a single day is mostly noise.
Deactivated branches are left out. With only one branch there is nothing to compare, so use Sales Summary instead.
Daily Sales Breakdown
Free on every plan, over any range. One row per business day with gross sales, discounts, service charge, VAT and net sales, plus a total row, and a Export CSV button.
This is the report to reach for when you want the daily shape of a month and you do not have Business Reports. It uses your current cutover for every day in the range, including days that predate the per-till daily sealing, so a venue that trades past midnight sees each trading day whole.
It is not a substitute for a Z-reading. A Z-reading is a sealed, numbered document; this is a live calculation. See X and Z readings.
Where the money reports live instead
Three things people look for under Sales Reports are elsewhere:
- The sealed end-of-day figures, the drawer count and cash over or short live in Closing a shift and Cash over and short.
- Margin, cost of goods and the profit and loss statement are in Profit reports.
- The books the BIR requires — journals, ledger, trial balance — are in Books of accounts, and they are free on every plan.