Row-level security per store
Every tenant-aware table carries a stable store identity and has row-level security enabled. Isolation is enforced in the database, never by filtering in a screen.
Security and trust
Via is built so the database refuses what a store, a role or a browser should not see or do. These are the rules the platform enforces today, stated the way we state them internally.
Every tenant-aware table carries a stable store identity and has row-level security enabled. Isolation is enforced in the database, never by filtering in a screen.
Browsers and storefronts have no direct table grants. Data is read and written only through reviewed database functions that resolve the caller's store and permission server-side.
Card numbers and security codes are entered on the payment provider's hosted page. Via never receives or stores them; it records the outcome and a masked reference.
Integration credentials live in the server's secret store and are referred to by name, for example VIA_NOTIFICATION_EMAIL_API_KEY, GEIDEA_ODX_MAIN_MERCHANT_PUBLIC_KEY, VIA_META_APP_SECRET, VIA_MESSAGES_<STORE>_WHATSAPP_TOKEN. Admin shows whether a name is set, never its value. Nothing secret is in the code repository.
Every staff, system and AI change is recorded with actor, action, entity, before and after, and time. Audit rows cannot be updated or deleted through the application.
Roles grant exactly what a job needs. Customer PII, supplier costs, margins, payout data and integration secrets are separate permissions. A media buyer never sees customer details, costs or another store.
Guest carts, checkouts and quote requests use opaque tokens stored as SHA-256 hashes with expiry and revocation. A record id alone is never authorisation.
Provider callbacks are verified by signature, bound to the payment attempt they claim, processed once, and safe to retry. An unverified event cannot change payment or order state.
The storefront gateway, the payment gateway and this site's own form accept requests only from configured origins, never from a wildcard. Rate limits and idempotency are enforced server-side.
Test orders are flagged at the source and excluded from revenue, attribution and reports, so rehearsals never inflate your numbers.
Each staff member signs in to Via Admin with their own account, invited by the owner. The browser holds only the public project key, never a service key.
Marketing events leave Via only after the visitor's consent is recorded, and what was sent is recorded too.
PostgreSQL 17 on Supabase in the EU (Frankfurt region). Schema changes ship only as reviewed migrations; every change is verified against production and re-checked with the security advisor.
Edge Functions hold service credentials and provider secrets; the browser talks to them over HTTPS from allowed origins only.
Static bundles behind a content security policy: no inline script, no third-party script, no analytics on this site.
Questions from your security or finance team are welcome before you start. We would rather show you the rule than describe it.
Bring your security checklist to the call. Every answer above is something we can show you in the database.