Wealth Management by Zahlenwerk is now in closed beta. Request access

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, not all-or-nothing access

Team members hold an owner, manager, editor or viewer role. 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, 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.

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.

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 managers and owners.

AI processing

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 and update. 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. 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
InngestBackground jobs such as document extraction
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

What we do not claim

The product is in closed 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, not every read of a record. 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