Wealth Management by Zahlenwerk is now in beta. Join the waitlist

Security

You are considering handing us your firm's numbers. This page describes what is actually built today, in plain terms, and ends with a list of what we do not claim yet. We would rather lose a deal than win one on a promise we cannot back.

Access and isolation

Row-level security in the database

Every table holding customer data is protected by Postgres row-level security. A row is readable only by the user who owns it or by members of the team it belongs to, and the policy is enforced by the database rather than by application code that could forget to check.

Roles, and access narrower than a role

Team members hold an Owner, Team Admin, Editor or Viewer role, and a member can be scoped tighter than their role: access is granted module by module, read or write, so a bookkeeper reaches the books and nothing else. A member can be marked external, and an owner can cap which parts a member's connected AI clients may reach at all. The assistant and any connected AI client run under the identity of the person who authorised them, so they inherit exactly that person's permissions and nothing more.

Passwordless sign-in

Sign-in is by Google, Microsoft, a passkey, or an emailed magic link. We never store a password, so there is no password database to breach and no password policy to get wrong. Sessions do not last forever either: one has to prove who it belongs to again at the start of each working day, rather than living on in a cookie until somebody signs out.

Two-factor, enforceable per team

A team can require TOTP two-factor for everyone in it. Once switched on, every session for every member of that team has to reach the second factor before it can be used. One deliberate exception, which we would rather write down than leave you to find: a session opened with a passkey satisfies the requirement, even though a passkey is a single factor. It cannot be phished, replayed or read out over the phone, which is the failure a team sets this flag against.

Team administration is recorded

Invitations, role changes, removals, plan and integration changes are written to a per-team audit log that members cannot edit or delete, readable by owners and Team Admins.

Who changed a record, not only who changed the team

Edits to directory records and to both loan registers are written to a change protocol on the record itself, by database triggers rather than by application code. A change made in the app, by the assistant, through a connected AI client or by a background job is therefore recorded the same way, and none of those routes can skip it. The protocol is readable by owners and Team Admins, and only for the modules they are allowed to open.

AI processing

For where this sits under the EU AI Act, our role, risk classification and the Article 50 marking, see AI and the EU AI Act.

Identifiers are replaced before anything is sent

Names of people and entities are swapped for placeholders before a document or question reaches a model, and the table mapping them back never leaves our side. Results are re-identified after the model has answered.

EU processing, and it fails closed

Model calls are pinned to an EU region, and document preprocessing runs in an EU region too. If a non-EU region is configured, the call raises an error instead of quietly sending the data somewhere else.

What still leaves in the clear

Amounts and dates go to the model unmasked, because the extraction is about them. Fund and portfolio-company names, and the raw PDF sent for text conversion, are also not pseudonymized today. We would rather write that down than let you assume otherwise.

The same statement cannot be counted twice

Two checks run before anything commits. The first matches files byte for byte, so a report that arrives both by forwarding and through a connected mailbox resolves to one record. The second is a logical key of owner, fund, period and report type, so two different scans of the same quarterly report cannot both land as portfolio events.

Below the confidence bar, a report is inert

Every extraction is scored against itself, with no second model call. A report that falls below the bar is flagged for review, and both the cashflow path and the valuation path skip flagged reports entirely. Its numbers cannot reach your portfolio until a person approves it, and the queue shows why it was held. You can approve it, re-run the extraction, or archive it.

How the assistant is allowed to write

It writes, and that is the point

An assistant that can only read leaves you doing the typing. This one can create a position, record a cashflow, add a valuation or update a fund. The question worth asking is not whether it writes, but where it can write, what it waits for, and what it leaves behind. That is the rest of this section.

A fixed set of operations, not a free hand

This is what separates it from an assistant pointed at a folder on your machine, which can rename, overwrite and delete anything it can reach and tell you afterwards. Ours reaches your portfolio through a fixed list of named operations against a database, each one scoped to what you can already see. There is no filesystem, no shell, and nothing outside that list is addressable.

Every write stops and waits for you

Reading is free. Recording a cashflow, adding a valuation or creating a position is only ever a proposal: the assistant pauses, the interface shows exactly what would change, and nothing runs until you press confirm. The assistant is also instructed never to guess a price, a date or a currency, and to ask in plain language when a field is missing.

There is no delete operation

Across every tool we expose to Claude, ChatGPT and the in-app assistant, there is no delete operation of any kind. The verbs are list, get, find, create, record, add, update, set, code and import, and archive, which reaches a bank account a team has stopped using and nothing else. It cannot remove a position, a cashflow, a valuation, a report or a document, because the capability does not exist in the interface it is given.

Nothing it does is anonymous

Positions carry their own event history, so a cashflow or valuation the assistant recorded appears as a dated entry alongside every other change, with the document it came from where there is one. You can see what happened, when, and on what basis, rather than having to trust that it went well.

Connecting Claude and ChatGPT

OAuth 2.1, not a pasted key

Assistants connect through a full authorization server with dynamic client registration. There is no long-lived API key to copy into a config file and forget about.

PKCE is required

Authorization codes are bound to the client that requested them using PKCE with S256. The weaker plain method is rejected outright, and a code cannot be exchanged twice.

Tokens are short-lived, hashed and revocable

Access tokens last an hour, refresh tokens rotate on use, and only a hash of each token is stored, never the token itself. You can revoke a connected assistant from your settings at any time.

Connections inherit your permissions

A connected assistant queries through the same row-level policies as the person who authorised it, and can be limited to specific features.

Transport and application hardening

HTTPS only

Every response carries HTTP Strict Transport Security with a two-year max-age covering subdomains, so browsers refuse to talk to us unencrypted.

Framing and sniffing blocked

Responses set X-Frame-Options DENY and a frame-ancestors content security policy so the app cannot be embedded, plus nosniff, a strict referrer policy, and a permissions policy denying camera, microphone and geolocation.

Stored credentials are envelope encrypted

Third-party credentials, such as a Slack token or a connected drive's refresh token, are encrypted with a key held in a key vault, with every decrypt recorded and a revocation switch that makes them unreadable.

Your data

Your data is stored in the EU

The database, authentication and document storage run in Supabase's West EU region in Ireland, and the application's own server functions are pinned to Dublin, in the same AWS region, so a request is not answered from another continent on its way to an Irish database. Model calls and PDF preprocessing are separately pinned to EU regions, as described above.

Every figure keeps a route back to its source

Extracted values reference the document they came from and the kind of source it was, so any number in the system can be traced to the page it was read from.

Self-service account deletion

You can delete your account from settings without asking us. Records owned by the account are removed with it.

Document storage is private

The buckets holding investor reports, directory documents and bookkeeping documents are private, with no public read access.

Keep your own copy of every document

A team can connect its own SharePoint or Google Drive and receive a live mirror of every uploaded PDF, filed by fund, year and period. The documents your numbers are derived from then sit in storage you control, and stay there whatever happens to us. If the connection breaks it stops and says so in settings, rather than failing quietly.

Who processes data

Every third-party service that can touch customer data. Ask us for the current list before signing anything, since this changes as the product does.

ServiceWhat it does
SupabaseDatabase, authentication and document storage
VercelApplication hosting
Google Cloud Vertex AIModel calls for extraction and the assistant, pinned to an EU region
ModalConverting uploaded PDFs to text, pinned to an EU region
PostmarkTransactional email and inbound forwarded reports
Azure Key VaultKey custody for stored third-party credentials
Slack, Microsoft TeamsNotifications, only if your team connects them
Google Drive, SharePointDocument mirroring, only if your team connects it
Anthropic, OpenAIOnly for teams that supply their own API key
sevDeskOur invoicing and accounting. Your firm's billing details and the invoices we issue it; nothing from the product
Odoo S.A.CRM for prospect, waitlist and account contact data. Your firm's name and your members' names and email addresses are mirrored from the app; no documents, portfolio records or figures are sent

What we do not claim

The product is in beta. These are the things people in this market reasonably ask about that we cannot honestly tick yet.

  • We are not SOC 2 or ISO 27001 certified, and we have not commissioned an external penetration test.
  • We do not offer SAML single sign-on or SCIM provisioning. Sign-in is Google, Microsoft, or a magic link.
  • Your data is not end-to-end encrypted, and we are not a zero-knowledge system. Our servers process your records in the clear in order to render and extract them, and our staff can in principle reach the database.
  • Beyond the platform's own encryption at rest, we do not apply field-level encryption to portfolio records.
  • We do not have a published backup, recovery-time or retention commitment. The cloud-drive mirror covers uploaded documents, not your structured records, and there is no one-click export of a whole account yet.
  • Our audit log covers team administration, and the per-record change protocol covers directory records and the loan registers. Neither covers reads: we cannot show you who viewed a given document.
  • We cannot yet make a contractual statement about model providers retaining or training on data. Ask us and we will show you the current agreements rather than guess.

Questions your IT team would ask

We will answer specifics, share our data processing agreement, and tell you plainly where a control does not exist yet. Security questions reach the two of us directly.

Get in touch
EN
EnglishDeutschEspañol