A newer version was saved from another device since you last synced. Choose how to resolve it so you don't lose data.
Bright Cleaners — Ledger
Loading saved records…
WhatsApp import
Import a WhatsApp chat export (.txt) — drag & drop it below, or click to browse. Already-added day-records are skipped automatically, so it's safe to drop the whole, latest full export every time rather than trimming it down.
Drop WhatsApp .txt file(s) here, or
App import
Import an app export — .csv or .xlsx — drag & drop it below, or click to browse. Same dedupe rule applies: rows already saved are skipped.
Drop app export file(s) here, or
Include the header row: Date, Category, Amount, Note, Account.
Bank import
Import a bank statement export (Santander's .xls download, a .csv with Date / Description / Money in / Money Out columns, or a Barclays .pdf statement). A .pdf is parsed locally and shown in a preview table for you to check before anything is added — nothing is imported until you confirm. Incoming card-processor payouts (PayPal, Zettle…) are ignored — that money is already counted via the till and app. SumUp and WorldPay are the exceptions: their settlement amounts (already net of the processor's own fees — the same figure that lands in the bank) are added as Card income at face value. SumUp only counts from 1 June 2026 onwards (earlier SumUp dates are skipped — already entered by hand). WorldPay has no date cutoff, but every month up to and including June 2025 already has WorldPay income/fees entered by hand in App Records, so those months are always sent to the Flags tab for review instead of being added automatically; from July 2025 onwards WorldPay payouts are added automatically (a WorldPay-labelled App row found in a later month is still flagged too, as a safety net). Named client payments up to £2000 are added as income; anything over £2000, or with no identifiable payer, goes to the Flags tab for review. Outgoing payments already recorded in WhatsApp or the app on the same date for the same amount are marked "matched" and not double-counted; everything else is added as a Bank expense. Safe to re-drop the same statement — already-imported rows are skipped.
Drop bank statement file(s) here, or
Any incoming bank transaction whose description contains one of these terms is skipped entirely — card-machine settlements and utility refunds, not client payments. Add a term if your statement wording changes or you start using another processor. (SumUp and WorldPay are handled separately — their payouts are recorded as Card income, so they're intentionally not on this list. SumUp counts from 1 June 2026 onwards; WorldPay counts from July 2025 onwards — months up to and including June 2025 already have WorldPay entered by hand in App Records, so those are always flagged for review instead.)
Quick add
Quick-add a single app record — no CSV formatting needed. Use a negative amount for an expense, positive for income.
Backup & reset
This ledger works on this device from the browser's local storage. If Cloud sync is set up, an encrypted copy is also stored on your server. "Download backup" saves a plain, unencrypted JSON copy of everything to this device — keep it somewhere safe; it is your only recovery path if you forget your sync password. "Clear all saved data" is permanent.
Cloud sync (end-to-end encrypted)
Sync this ledger across your devices through your own website. Your data is encrypted in this browser with your password before it ever leaves the device — the server only ever holds unreadable ciphertext and never sees your password. Enter the endpoint URL and access token from your server setup, then reload and set a password. The password is required each time you open the page and is never saved anywhere.
Prune old history
Permanently prune old history you no longer need. Everything dated on or after the cutoff date is kept; every WhatsApp day-record and app row dated strictly before it is deleted from both sources. Export a backup first if unsure — this cannot be undone.
Same as Quick add on Add data — negative amount for an expense, positive for income.
Enters the same bank pipeline as statement import. Positive amount = income, negative = expense.
Compares each month's App raw total — the unconditional sum of every negative row in your imported app data, exactly what your own spending app shows as its Expense figure — against this ledger's already-computed Ledger total (the same Expenses Total shown on Monthly summary). Sorted worst mismatch first. Click a month to see exactly which lines are causing the gap — not every expense, just what's unmatched on either side.
Read a staff timesheet
Upload a photo of a handwritten timesheet.
Drop a timesheet photo here
A clear, straight photo of the whole timesheet works best.
or
JPG, PNG, HEIC, WebP and other common image formats
This sends the photo (not your ledger) to Anthropic's API for reading — usually much more accurate on handwriting. Read offline keeps everything on this device.
Staff & hourly rates
Add or remove staff here. Rates are used only for the suggested pay figure on this tab — changing a rate never changes a timesheet you already saved (each one keeps the rate it was saved with). Removing a name does not delete their saved timesheets.
Saved timesheets
Compare with recorded wage payments
Read-only. Puts the suggested pay from the timesheets above next to what your ledger already holds under that name over the same dates — a plain name-and-date filter, so you can eyeball the two. It changes nothing: no record is matched, linked, tagged, excluded or edited, and no total anywhere else in the app moves.
Type a plain instruction to change how records are categorized — for example
include Worldpay as income, don't include PayPal,
exclude Petra's bank transfers from expenses, or
always categorize Northgate Leather as Supplies. Rules are matched locally by keyword — nothing is sent anywhere.
You'll see a plain-English confirmation before anything is applied, and rules re-run across all imported history.
Active & custom rules
Applied top-to-bottom; a later rule overrides an earlier one where they touch the same record.
Built-in safeguards (locked)
These protect known calculations. They can't be broken by a typed rule — unlock to change, with a second confirmation.
Records you deleted with any × in the app — global search, Till log, Expense detail, App records, Bank, Reconciliation, Flags, or a Monthly-summary breakdown. A deleted record is removed from every total — Monthly summary, breakdowns, Reconciliation, search and the Excel export — but is kept in storage so you can restore it here at any time. Restoring brings it back into all totals immediately.
Read-only coverage of what has been imported so far — so you can spot gaps without changing any totals. Pulled directly from the existing raw stores; nothing here is editable.