Security
Paperhuman is multi-tenant: every company runs on shared infrastructure, but no company can ever see another's data. That isolation is enforced automatically at the data-access layer, not by convention.
Every database query is automatically scoped to the caller's company by the application's data-access layer, before it ever reaches Postgres.
Stored credentials, including SMTP/IMAP passwords, provider API keys, and OAuth tokens, are encrypted with AES-256-GCM before they touch the database.
Viewer, agent, supervisor, admin. Assignment-scoped access is enforced server-side and visualized in a permission matrix, not just hidden UI.
A full activity log records every action by actor. Deactivating a team member kills their session on the next request; password hashes never leave the API.
Enforced in code, not by convention
Every query is scoped before it ever reaches the database.
Every request resolves to exactly one company before any data is read or written. From that point on, every query (reads, writes, updates, deletes, across every part of the product) passes through a single data-access layer that automatically attaches that company's id, with no route or feature able to opt out. That scoping is backed by a real foreign-key constraint at the database level, so a row can't exist without a valid company behind it. It's not an application-level filter you have to trust in isolation, it's enforced twice, at two different layers.
Connect your first channel or system in a few minutes, and only get pulled in when it matters.
Request a demo