Security & guardrails

Where data lives, how it's protected, and what the agent is allowed to do.

Three pillars a security or finance lead can scan top to bottom: where your rows live, how they're encrypted in transit and at rest, and the read-only-by-default guardrails on the autonomous agent. Every claim is grounded in a control the platform actually operates — and the closing CTA routes to /contact for the full security packet.

Three pillars

One scan a security or finance lead can read top to bottom.

The page covers the three questions a procurement review always opens with — where rows live, how they're protected, and what the autonomous agent is and is not allowed to do. No blanket claims; every sentence ties to a control the platform operates.

Where rows live

One typed datastore, one managed region, no second home.
Every customer row lives in a managed Postgres instance reached through the Prisma singleton. There is no secondary datastore, no raw SQL written by application code, and no event-stream export of customer data — the database is the only system of record behind WealthBuilt.
  • Managed Postgres + Prisma

    A single managed Postgres instance is reached through the Prisma client singleton. No raw SQL reaches the database from app code, no second datastore sees customer rows, no shadow backup pipeline synchronizes data outside the platform.

  • Region chosen at provisioning

    Region is selected at provisioning on the Render-managed provider. EU and UK data residency are available alongside the US default — the choice is recorded against the environment and held for the lifetime of the account.

  • No event-stream export of customer rows

    Customer rows are never mirrored into an analytics warehouse, an event-stream topic, or a third-party data lake. The audit log on Enterprise is generated from the same Postgres — not a separate datastore.

  • No background jobs touching live data

    Cron jobs are declared in polsia.toml and run with environment-injected credentials, not stored secrets. No job reads customer rows outside the same Prisma singleton used by the application.

Encryption in transit + at rest

TLS at the edge, encryption at rest, no plaintext in code.
Every signed-in request terminates TLS at the edge, every byte of storage is encrypted by the managed database provider, and secrets are read from environment — never hard-coded. Sessions are issued by better-auth as HttpOnly cookies with the same per-request origin policy.
  • TLS terminates at the edge

    Render-managed HTTPS fronts every request; nothing between a signed-in browser and the application speaks cleartext. The same TLS posture covers /api, /app, and the public marketing surfaces.

  • Encryption at rest, managed

    Postgres storage is encrypted at rest by the managed database provider. Volume snapshots and point-in-time backups inherit the same key-set — the application never sees an encryption key or a plaintext table.

  • No plaintext credentials in code

    All secrets — database URL, session signing, email proxy, Stripe — are read from validated env on the server. The deploy platform injects values at boot; no secret is committed to the repo or read at build time.

  • Session lifecycle

    Sessions are HttpOnly cookies issued by better-auth, scoped to the production origin. There is no custom admin cookie, no shared-password fallback, and no token stored in localStorage — the session shape is the same shape the auth module publishes.

AI-agent guardrails

Read-only by default. Writes need a signed sign-off row.
The autonomous agent runs on a three-phase loop — Audit, Reclaim, Renegotiate — but every write action is gated behind explicit per-action approval. Nothing reaches the vendor counterparty, the spend source, or the inbox without a sign-off row written back to Postgres. The agent is auditable end to end; the human is always in the loop.
  • Read-only by default

    The agent reads spend, vendor catalogs, and counterparty responses from the same Postgres the rest of the app uses. Reads do not require approval — but no write action is taken without an explicit human sign-off.

  • Renegotiation needs an approval

    Counter-offers, vendor outreach, and discount requests all route through the /app/approvals queue. Finance approves, amends, or rejects each draft from one queue before a single message is sent.

  • The three-phase loop, documented

    The three-phase loop — Audit, Reclaim, Renegotiate — is documented on /how-it-works. Each phase is logged with timestamps, request payloads, and the named human who signed off the write action.

  • No autonomous vendor outreach

    Nothing reaches a vendor counterparty without a signed sign-off row. Even an AI-written counter-offer sits in the approvals queue until a name on the team approves it — there is no automatic send path.

Security packet

Read like a pre-vetted answer.

The three pillars above hold for every account, every region, every tier. The full security packet — architecture diagram, subprocessor list, and the SOC 2 Type II roadmap timeline — lands in your inbox within one business day of a procurement inquiry.

  • Architecture & data-flow diagram
  • Subprocessor list & regional posture
  • Encryption + session lifecycle notes
  • AI-agent guardrail audit trail

Or email the team at wealthbuilt@polsia.app

Send the brief

One form to your security desk.
We tag this as a security-packet inquiry so the team can pull it ahead of the general inbox.

Your note goes to wealthbuilt@polsia.app and stays in the team's inquiry record.

Operated by Polsia · Replies within one business day · Source: security-packet