Plain-English summary
The End of Day report is the one-page close-of-business summary for a day (or any date range): how many receipts and customers you served, what you sold after discounts and refunds, how it split by menu category, what came in by payment method, who bought on credit, and what each register session opened with, expected, counted and was out by. It lives in the back-office Reports list under Daily Operations → End of Day, and the same report also renders inside the counter app so a supervisor can read the day off the till without going to a computer. Confusingly but harmlessly, the rail calls it End of Day while the page it opens is headed Day Summary — same report.
When you'd use this
- Closing the day: reconciling what the tills took against what the system says.
- A morning "how did yesterday go?" read — sales, covers, payment mix, category mix.
- Chasing a cash difference back to the register session that caused it.
- Producing a daily figure for the owner, an accountant, or a head office (it exports to PDF and Excel).
Where to find it
| Where | Path |
|---|---|
Back-office (admin.foodops.io, app.salesmade.io) |
Reports → Daily Operations → End of Day → opens /reports/day-summary |
Counter app (counter.foodops.io, counter.salesmade.io) |
/reports/day-summary — the same report, rendered on the till |
The rail entry is literally titled "End of Day", described as "Close-of-business summary with sales, payments, and key totals", and sits in the Daily Operations group — which is shown on both the foodops and salesmade brands. [code: foodops-admin-app/apps/admin/src/config/reportsConfig.ts:154-166 — category 'daily' / 'Daily Operations', availableBrands ['foodops','salesmade'], item title 'End of Day' → href '/reports/day-summary' @ main] The page it routes to is headed "Day Summary — Consolidated view of daily sales, payments, and register activity". [code: apps/admin/src/pages/reports/DaySummaryReportPage.tsx:154-155; App.tsx:1732 route @ main] The counter app carries its own copy of the same report at the same path. [code: foodops.counter.app/src/App.tsx:337 route → src/pages/DaySummaryReportPage.tsx:299 "Day Summary" heading @ main]
Walkthrough — running it
- Open Reports in the back-office and pick End of Day under Daily Operations (or go straight to
/reports/day-summary). - Set From and To. It opens on today (start-of-day to end-of-day), so for a normal close you don't change anything.
[code: DaySummaryReportPage.tsx:56-57 @ main] - Optionally narrow by Outlet and then Register. Changing the outlet clears the register selection, because a register belongs to exactly one outlet.
[code: DaySummaryReportPage.tsx:191-205 @ main] - Choose the Dates basis — Business Date (default) or Transaction Date.
[code: apps/admin/src/components/reports/DateTypeToggle.tsx — ReportDateType = 'business' | 'transaction' @ main] - Hit Apply. The meta strip above the report stamps the range, the organisation and the time the report was generated (not "now").
[code: DaySummaryReportPage.tsx:64-67, 214-218 @ main] - Export with the Export control — PDF or Excel (xlsx).
[code: DaySummaryReportPage.tsx:157-172 exportFormats={['pdf','xlsx']} @ main]The counter app's copy has the same two options behind its Export dropdown.[code: foodops.counter.app/src/pages/DaySummaryReportPage.tsx:319-330 "Export as PDF" / "Export as Excel" @ main]
What the report shows
Read top to bottom: [code: foodops-admin-app/apps/admin/src/components/reports/DaySummaryReportBody.tsx @ main]
| Block | What's in it |
|---|---|
| KPI strip | The headline figures for the range, across the top. |
| Receipt Summary | Counts and averages — number of customers, payments and receipts, sales per customer, sales per receipt, void receipts. |
| Sales Summary | The money — discounts, FOC (comps), refunds, tax, service charge, delivery charge, total sales, total amount, outstanding and received. |
| Category Summary | Per menu category: sales count and total, with a grand-total row. Clicking a category opens an invoice breakdown of the orders behind it. [code: DaySummaryReportBody.tsx:169-209; DaySummaryReportPage.tsx InvoiceBreakdownModal @ main] |
| Cash Summary | Totals by payment method — cash, card, transfer and any other tenders you take. [code: DaySummaryReportBody.tsx:216-240 @ main] |
| Credit Sales | Per customer: what went out on credit in the period. [code: DaySummaryReportBody.tsx:246-280 @ main] |
| Register Sessions | One block per session with, per payment method, Opening / Expected / Counted / Difference — this is where a drawer variance shows up and which session caused it. [code: DaySummaryReportBody.tsx:291,334-338 @ main] |
Key concepts
- End of Day = Day Summary. One report, two labels: "End of Day" in the Reports rail, "Day Summary" as the page heading and in the URL (
/reports/day-summary). If someone says either, they mean this. - Business Date vs Transaction Date. Business Date buckets a trading day the way the business thinks about it (a session that runs past midnight stays on its own day); Transaction Date buckets strictly by when each transaction was recorded. A late-night venue will see different day boundaries between the two.
- Difference (in Register Sessions) — Counted minus Expected for that payment method. Non-zero means the drawer didn't reconcile; that's your starting point for a variance investigation.
- FOC — "Free of charge", i.e. comped. Reported separately from discounts because it's a different thing commercially and for tax.
End of Day vs the Z-report vs Daily Cash-Up
These get mixed up constantly, so:
- End of Day (Day Summary) — a report you run over a date range. Whole-business view: receipts, sales, categories, payment mix, credit sales, plus a per-session cash block. Nothing has to be closed for you to run it.
- Z-report — the artefact a register produces when its session is closed. It belongs to one session, and it's the cashier's signed-off close-of-shift document.
- Daily Cash-Up — a separate rail entry (
/restaurant/cash-up, restaurant feature only) described in the product as "Z-report — closed register sessions, tenders by method, withdrawals and variance".[code: foodops-admin-app/apps/admin/src/config/reportsConfig.ts:167-173 @ main]Use this when you want the Z view across registers rather than one session's printout.
Rule of thumb: cashier closing a till → Z-report. Manager closing the day → End of Day.
Common questions
Q: What is the End of Day report? A: The close-of-business summary for a day (or any date range you pick): receipts and customer counts, sales after discounts/FOC/refunds, a per-category breakdown, payment-method totals, credit sales, and per-register-session Opening / Expected / Counted / Difference. It's in the back-office Reports list under Daily Operations → End of Day.
Q: Where is the End of Day report?
A: admin.foodops.io (or app.salesmade.io) → Reports → Daily Operations → End of Day, which opens /reports/day-summary. The same report also runs inside the counter app at /reports/day-summary if you'd rather read it on the till.
Q: I can't find "End of Day" — I only see "Day Summary".
A: They're the same report. The Reports rail lists it as End of Day; the page you land on is headed Day Summary, and the URL is /reports/day-summary.
Q: What does the End of Day report show? A: Six blocks under a KPI strip — Receipt Summary (counts and averages), Sales Summary (discounts, FOC, refunds, tax, service and delivery charges, totals, outstanding, received), Category Summary (per menu category, clickable through to the invoices behind it), Cash Summary (totals by payment method), Credit Sales (per customer), and Register Sessions (Opening / Expected / Counted / Difference per payment method).
Q: How do I export or print the End of Day report? A: Use the Export control on the report — it offers PDF and Excel. The counter app's copy has the same two options.
Q: Can I run End of Day for a whole week or month? A: Yes. It defaults to today, but From/To take any range — the blocks then aggregate over that range, and Register Sessions lists every session inside it.
Q: Is the End of Day report the same as the Z-report? A: No. The Z-report is what a single register produces when its session is closed — one shift, one till, the cashier's sign-off document. End of Day is a report you run over a date range across the business. They should agree on the cash for a given session; if they don't, look at that session's Difference row.
Q: The End of Day totals don't match what the till took — where do I look? A: The Register Sessions block. Each session lists, per payment method, what the drawer opened with, what the system expected, what was actually counted, and the difference. A non-zero Difference points you at the session (and tender) to investigate.
Q: My night sales land on the wrong day. A: Switch the Dates toggle. Business Date (the default) keeps a trading day together even when a session runs past midnight; Transaction Date buckets strictly by when each transaction happened, which splits an after-midnight session across two calendar days.
Q: One of my registers isn't showing up at all — its sales aren't reflected in the End of Day report.
A: The report is session-scoped: a register only appears because it had a session opened inside the dates you picked, and that session's sales count on the day it was opened — for the whole session. [code: hubits-api-sales/Hubits.Sales.Api/Services/Counter/Reports/DaySummaryWindow.cs:9-16,74-80 @ main] So, in order of how often it's the answer:
- The session was opened on a different day. A shift opened at 5pm that runs to 5am is one business day — all of it, including the 2am sales, sits on the day it opened. Check the day before.
- No session was opened on that register for those dates, so it has nothing to contribute — even though the range looks right.
- An Outlet filter is hiding it. A register belongs to exactly one outlet, so picking a different outlet makes it unreachable (changing Outlet also clears the Register box).
- You're on Transaction Date. That mode additionally narrows to when each transaction happened, which splits an after-midnight session across two days.
Worth knowing what is not the cause: a session that is still open does not drop off the report. The report selects sessions by when they were opened and never checks whether they've been closed. [code: DaySummaryWindow.cs:74-80 — no closed/status predicate @ main] So "the cashier hasn't closed the till yet" doesn't explain a missing register — keep looking at the four above.
Q: Can I have the End of Day report emailed to me automatically every night?
A: Not on the Foodops/Salesmade back-office — report scheduling is a finance-brand feature (/reports/scheduled sits in the finance-only "Planning & Tools" group). [code: foodops-admin-app/apps/admin/src/config/reportsConfig.ts:526-551 — availableBrands: ['finance'] @ main] Run it and export to PDF/Excel instead.
Edge cases and known issues
"End of Day" isn't in my Reports list
- Symptom: The Daily Operations group or the End of Day entry isn't visible.
- Cause: The Daily Operations group is shown for the foodops and salesmade brands. Some neighbouring entries in that group (Daily Cash-Up, Outlet Performance, Recipe Variance, Supplier Price Alerts) additionally require the restaurant feature, and a few (Sales by Daypart, Sales by Service Type, Covers) are foodops-only — so a retail login sees a shorter list.
[code: reportsConfig.ts:154-214 @ main] - Workaround: Go directly to
/reports/day-summary, or check with support which brand/feature set your org is on.
One register's data is missing from the report
- Symptom: Every other till is there, but one register — the juice bar, the coffee counter, a second outlet's till — contributes nothing to the day, and its sales aren't reflected in the totals or the Register Sessions block.
- Cause: The report is session-scoped, and a session belongs to the day it was opened, for its whole run. Sessions are selected purely on opened-time inside the range, plus any Outlet/Register filter.
[code: hubits-api-sales/Hubits.Sales.Api/Services/Counter/Reports/DaySummaryWindow.cs:74-80 @ main]So a register goes missing when its session opened on a different day (an overnight shift lands entirely on the day it started), when no session was opened on it in the range at all, or when the Outlet filter points at a different outlet. - Not the cause: an unclosed session. The query filters on opened-time only and never inspects closed status, so a till the cashier hasn't cashed up still appears.
[code: DaySummaryWindow.cs:74-80 @ main] - Workaround: Clear the Outlet/Register filters and widen the range by a day either side. If the register appears on the previous day, it's the overnight-shift rule and the data is fine — it's filed under the day the shift began. If it appears nowhere, no session was ever opened on it for those dates.
Totals shift when I change the Dates toggle
- Symptom: The same date range gives different numbers on Business Date vs Transaction Date.
- Cause: Working as designed — the two bucket sessions that cross midnight differently.
- Workaround: Pick one basis and stay on it for comparisons; Business Date is the default and the one most closes use.
Related
Foodops Reports Catalogue — the full report set and their routes
Z-Report — the per-session close artefact this report is often confused with
Session Reconciliation and Till Reconciliation — chasing a Difference down
Sales Sessions — how register sessions open and close
2026-08-09 — haafai/hubits-api-sales (commits 4f94ad6..cdb3b32) fixed a bug in DaySummaryReportService.BuildReportAsync's register-session shaping that directly affects this entry's Register Sessions block. Previously, the base-currency cash session's Expected figure had cashWithdrawalTotal subtracted from it — but cashWithdrawalTotal summed withdrawals across EVERY session in the report's date range, not just that session's own. So on any day with more than one cash session, each session's Expected Cash in this report was under-stated by other sessions' withdrawals too, and disagreed with the session-details screen (which correctly nets only its own withdrawals). The fix (ADR-0011, 'single-source Expected Cash') removes the subtraction and reads the stored ExpectedAmount as-is, since it already nets that session's withdrawals. Nothing in the entry's documented column list or 'Difference = Counted minus Expected' definition is contradicted — the bug was in the number behind 'Expected', not in the report's documented structure or workflow. But it's directly relevant to the entry's variance-investigation Q&A ('The End of Day totals don't match what the till took'): before this fix, multi-session cash days could show an Expected Cash that looked wrong compared to the session-details screen for reasons unrelated to an actual drawer variance; after this fix that class of false-positive discrepancy goes away. Worth a one-line mention under 'Edge cases and known issues' if support previously saw tickets about Expected Cash mismatches on multi-session days — those should stop after this ships to prod. (auto-applied by the truth pipeline; adversarially gated)
2026-08-06 — foodops-admin-app (commits 47ff627..2473817, culminating in 'feat(reports): add the quick date-range chip row') lands the ReportDatePresets/useReportDatePresets change on the Day Summary report page as a materialized diff rather than a design doc. Confirmed: defaultPreset is still 'today' (entry's 'It opens on today' claim holds), the Business Date/Transaction Date toggle is unchanged in labels and values (just re-implemented on a shared ChipToggleGroup), and the 'filters take effect on Apply, not on change' behavior is preserved for the existing From/To/Outlet/Register/Dates controls — the new page keeps an explicit commit() gate. New behavior not yet in the entry: picking a quick-range chip now auto-commits immediately (onCommit fires commit(fromYmd, toYmd) as soon as a preset is selected), i.e. the forthcoming chip row is an auto-apply shortcut that bypasses the Apply button, layered on top of the existing manual-Apply flow rather than replacing it. The diff is once again truncated right before the chip row's own JSX/options list (cuts off mid-line at 'new Dat...'), so the actual preset set (Today/Yesterday/This Week/etc.) and whether it also landed on the counter app's copy remain unconfirmed — same open question as the 2026-08-03 and 2026-08-04 notes, now one layer closer to resolved. Pull the full PR diff for the chip-row commit against admin-app@main before adding a documented 'quick date-range chips' step to the Walkthrough. (auto-applied by the truth pipeline; adversarially gated) (auto-applied by the truth pipeline; adversarially gated)
2026-08-04 — foodops-admin-app (commits 47ff627..755ef86, culminating in 'feat(reports): add the quick date-range chip row') shipped a new ReportDatePresets component backed by a useReportDatePresets hook on the Day Summary report page, replacing the old local fromDate/toDate useState pair. The default preset is still 'today' (defaultPreset: 'today'), so the entry's Walkthrough claim 'It opens on today' remains accurate, and the 'Filters take effect on Apply, not on change' comment is unchanged. However, the diff hunk is truncated again at the exact point the new chip-row JSX would appear ('<ReportFilterBar onA...'), so the actual preset set (e.g. Yesterday / This Week / This Month) and whether it also landed on the counter app's copy of this report are still unconfirmed. This supersedes the 2026-08-03 note's open question but does not close it — pull the full PR diff for the chip-row commit against admin-app@main before adding a documented 'quick date-range chips' step to the Walkthrough. (auto-applied by the truth pipeline; adversarially gated)
2026-08-03 — foodops-admin-app (commits 47ff627..76df568, 'feat(reports): add shared org-timezone-aware date presets' + 'feat(reports): add the quick date-range chip row') adds a new ReportDatePresets/useReportDatePresets component to the Day Summary report page, replacing the old local startOfDay/endOfDay useState defaults with a shared, org-timezone-aware preset system (defaultPreset: 'today', exposing activePreset/selectPreset alongside fromDate/toDate). The default still appears to be 'today', so the entry's 'It opens on today' claim in the Walkthrough is not contradicted, but the diff hunk was truncated before the actual chip-row JSX, so the specific preset options (e.g. Yesterday/This Week/This Month) and whether they also landed on the counter app's copy are unconfirmed. Worth a follow-up pull of the full PR diff to add a documented 'quick date-range chips' step to the Walkthrough section once the exact chip set is verified against admin-app@main. (auto-applied by the truth pipeline; adversarially gated)
2026-07-27 — Authored to close a real support_bot coverage gap ("the end-of-day report: what is it / where / what does it show"), which previously retrieved the Z-report entry — a different artefact. Codebase-only, no live walk. Grounded against
foodops-admin-app@main:config/reportsConfig.ts:154-166(the rail item is titled "End of Day", categorydaily/ "Daily Operations",availableBrands: ['foodops','salesmade'], href/reports/day-summary),:167-173(Daily Cash-Up is the entry described as the Z-report),:526-551(report scheduling is finance-brand only);pages/reports/DaySummaryReportPage.tsx:56-57,154-172,175-212(defaults, title/subtitle, PDF+xlsx export, From/To/Outlet/Register/Dates filters);components/reports/DateTypeToggle.tsx(Business Date / Transaction Date);components/reports/DaySummaryReportBody.tsx(Receipt Summary / Sales Summary / Category Summary + invoice breakdown / Cash Summary by payment method / Credit Sales / Register Sessions with Opening-Expected-Counted-Difference);App.tsx:1732route. Counter-side copy confirmed atfoodops.counter.app@mainsrc/App.tsx:337→src/pages/DaySummaryReportPage.tsx:299,319-330. The rail-label ("End of Day") vs page-heading ("Day Summary") mismatch is documented rather than smoothed over, since customers ask using the rail label. No screenshots captured for this entry — the existing Day Summary screenshot lives in reports.md.