Check it yourself

We say we cannot read your data. You don't have to take our word for it: here is how to check it yourself, in five minutes, without knowing how to code. Most of these checks run in your own browser, not in our code, so we cannot fake the result.

What our servers receive

Do this on a computer: phone browsers don't have this tool.

With Chrome (or Edge, Brave, Opera):

  1. Open app.neatly.money and sign in.
  2. Press F12 (Windows) or Cmd + Option + I (Mac). The developer tools panel opens.
  3. Click the "Network" tab.
  4. Add an expense, for example "Carrefour, €42".
  5. In the "Filter" box at the top, type transaction, then click the line that starts with transaction.create.
  6. A panel opens on the right, on the "Headers" tab. Switch to the "Payload" tab next to it.
  7. Unfold the details: click the small triangle next to 0, then next to json, then next to tx.
Using Safari? See the steps for Safari
  1. Turn the tool on once: Safari → Settings → Advanced → tick "Show features for web developers".
  2. Open app.neatly.money and sign in.
  3. Press Cmd + Option + I (or Develop → "Show Web Inspector"), then click the "Network" tab.
  4. Add an expense, for example "Carrefour, €42".
  5. In the filter box at the top left, type transaction, then click the line transaction.create.
  6. On the right, the "Preview" tab opens. In the menu at the top right, choose "Request (Object Tree)".
  7. Unfold the details: click the small triangle next to 0, then next to json, then next to tx.
What you will see once everything is unfolded (shortened)
▼ 0: {json: {tx: {…}}}
  ▼ json
      expectedOwnerId: "0a2c…"
      expectedVaultEpoch: 0
    ▼ tx
        accountId: "59fe…"
        categoryId: "8324…"
        cryptoVersion: 1
        id: "f277…"
        isActual: true
        payloadEnc: "eyJ2IjoxLCJhbGciOiJBMjU2R0NNIiwiaXYiOiJrM1ZxOFRuWHcwYVo1Y0xwIiwiY3QiOiJacjdXMWVRMnhOOWJUNG1LZkg2…"
        recurringOccurrenceDate: null
        recurringRuleId: null
        rev: 1
        source: "manual"
        transferDirection: null
        transferGroupId: null
        transferToAccountId: null

What you will see: no "Carrefour" and no "42" anywhere. The amount, the description and the date sit in one block of unreadable characters (payloadEnc): your expense, encrypted on your device before it left. Only technical identifiers stay readable (see the list below).

Other requests go out at the same time (sync, sign-in). You can open them too: none of them contains your expense in clear text.

Why this is real proof: this tool belongs to your browser (Google, Apple, Mozilla), not to us. We cannot change what it shows.

Your backup, seen from the inside

  1. In Neatly Money, open Settings → Data, then "Create a backup". A file is downloaded. (You need to have created your recovery key first.)
  2. Open that file with a text editor (Notepad on Windows, TextEdit on Mac).

What you will see: the version number, the creation date, a few technical identifiers, and for everything else long strings of unreadable characters. No amounts, no descriptions, no account or category names in clear text.

What we can see in clear text, and why

Encrypted: your amounts and the currency of each one, balances, descriptions, comments, account, bank and category names, budget amounts. Some information stays readable because the service needs it to work:

  • your account: email address, profile name and picture if any, settings (language, theme, formats, main display currency, whether you use automatic exchange rates or your own) and notification preferences;
  • how your data is organised: which account and category each transaction belongs to, which two accounts a transfer connects, the type of each account (current, savings…), the category tree with its icons and colours, the icons and colours of your accounts and banks, and which of our default categories you use;
  • the schedule of your budgets and recurring transactions: period, frequency, next date, budget start and end dates and alert threshold, and the date of each transaction a recurring rule creates. For other transactions the date is encrypted, but we see when each record was created, and, when the app fetches exchange rates, the list of currencies you use (not which transaction is in which) and the dates the rates are needed for;
  • technical information: identifiers, creation and update times, number and size of records, your devices and the names of your passkeys, security events, and, as on any website, your IP address and browser in our logs.

One more point: in four account-security steps (resetting your vault, deleting your account, finishing an interrupted password change, and choosing a new password after a reset email), your password passes through our servers. It is never stored.

In other words, we can see that you have a current account and use our default "Groceries" category, but not how much you spend there or where. The names of categories you create yourself stay encrypted.

Where the app connects

In the "Network" tab you will see only three destinations: app.neatly.money (the app), Supabase (signing in to your account) and Cloudflare (the anti-bot check, at sign-in and for a few sensitive actions). A security rule enforced by your browser blocks every other destination. No ads, no trackers.

What about notifications?

How can we warn you about a budget if we cannot see your amounts? Our server only sends a short generic signal, with no amount, no name and no text. It travels through Apple's, Google's or Mozilla's notification service, which learns no more than we do. Your device decrypts your data and writes the notification text itself.

Your data stays yours

At any time, export your transactions to CSV or all your data to JSON, from Settings → Data. These files are in clear text so you can open them anywhere: keep them somewhere safe.

What encryption protects, and its limits

We write "we cannot read your data", not "a breach is mathematically impossible". Here is why, plainly.

Your data is protected if:

  • someone steals our database;
  • a curious employee or administrator looks at our servers;
  • a court demands the data we store;
  • one of our hosting providers is hacked.

It is not protected if:

  • your computer or phone is infected;
  • a malicious extension is installed in your browser;
  • someone knows your password or your recovery key;
  • the program our site delivers is replaced with a malicious version*.

* This point applies to any app that runs in a browser: the program that encrypts your data is downloaded from our site every time you open it. On our side, publishing is locked down: only a few tightly secured accounts can release a new version, and none goes live until automated checks confirm it was built from our own code.

Going further