Exporting a month of attendance without opening a laptop

Payroll happens on the last day of the month, usually in the afternoon, usually while something else is on the stove. The question that comes with it is always the same: can I have the hours?

DailyBrew has been able to answer that from the console for a while. What it could not do was answer it from the phone — and the phone is what most owners actually have on them. An owner running a whole restaurant from an Android device asked how to get a month of attendance out, and the honest answer involved going home and opening a laptop.

It doesn't any more. There's a download button on the attendance screen, and the month you're looking at comes out as a file.

Where it is

Top of the Attendance screen, next to + Add. Tap it and a sheet comes up naming the month currently on screen — "March 2026 — every employee, every day, the same grid as the Monthly view."

Pick a format and the file is built, downloaded and handed to your phone's share sheet. From there it goes wherever you were going to send it anyway: email, WhatsApp, Drive, Files, your accountant.

It does not land in the app. There is nowhere in DailyBrew that a spreadsheet is useful, and an app that collects files you then have to go and find has invented a second problem.

Three formats, three jobs

Excel (.xlsx) is the one payroll wants. A real spreadsheet — tinted cells, per-employee totals, and the names column frozen so it's still beside you when you've scrolled out to the 31st.

PDF is the print-ready copy. The version that goes on the office wall or onto a month-end email, where nobody is going to edit anything and the layout should not move.

CSV is for another system to read. Plain text, no formatting, the shape a payroll package or a bookkeeper's import tool expects.

All three are rendered from the same grid on the server. Not three exporters, one — so the CSV and the Excel of the same month cannot quietly disagree about column order, status codes, or how a leave day was counted.

What's in the file

Employees down the side, every calendar day across the top, one cell each.

A cell with a check-in shows the code and the times: Pre 09:00–17:30. A late arrival reads Lt, an early departure LfE, and both tint amber. Abs is an absence against a real shift, Lv a leave day, Off a day the shift isn't scheduled, C a closure, Vd a record that was voided. An employee with no shift assigned gets an em dash rather than a red Abs — nobody is absent from a schedule they don't have.

Then five columns of totals per employee: Present, Scheduled, Absent, Late, Leave. That block is identical across all three formats, in the same order, because one function produces it.

Two lines sit above the grid: the workspace name with the date range, then the timezone and the moment the file was generated. Both are there for the same reason. A spreadsheet gets forwarded, renamed and opened three weeks later by somebody who wasn't in the conversation, and a table of clock times with no timezone on it is a table of guesses.

The month on screen, not the filter

One thing worth knowing before you send a file to your accountant: the export takes the date range, not the status filter.

If you've narrowed the Monthly view to "Late" to look at something, the export still contains everybody. The filter is applied on the phone, to rows that have already been fetched; it never reaches the server, and the server is what builds the file. The sheet says as much in its own subtitle — every employee, every day — but it is the kind of thing better read twice than discovered later.

Nights that end tomorrow

A bar shift from 18:00 to 02:00 would look, in a spreadsheet cell, like a day that ran backwards.

So the cell carries the marker the rest of DailyBrew uses: 18:00–02:00 +1. The same +1 as the attendance log, the monthly grid and the check-out entry sheet — one night, one row, filed under the day the shift started, which is the day the work belongs to and the day every total already counts on.

Small things that were not small

The file arrives named. attendance-corner-cafe-2026-03-01-to-2026-03-31.xlsx — workspace, range, format. Six months of exports in one Downloads folder stay six distinct files instead of export(3).xlsx.

The CSV carries a byte-order mark. Excel on Windows otherwise guesses the local codepage, and a Khmer or French employee name comes out as mojibake in the one format specifically meant to be read by something else.

And the download goes through the app's own authenticated client rather than a plain file fetch. That's why an export started on an hour-old session refreshes the token and carries on, instead of signing you out at the worst possible moment.

Who can export what

The file never shows you more than the screen does. An owner, or a manager with attendance permission, exports the whole roster. Anyone else exports their own row.

Export is an Espresso feature. On Free the button is still there and the sheet still opens — it says what the export does and what it costs, rather than making the feature invisible and letting you assume it doesn't exist.

And on the console

Nothing changed there. The same three formats have been on the attendance page all along, and they produce the same files, because both clients call the same endpoints.

What's new is that you no longer have to be sitting in front of one.