Security

How Planning Ops keeps your data safe

The full security posture — tenant isolation, encryption, MFA, audit logs, strict CSP. Written for a technical reader; non-technical summary at the bottom.

Your pour schedule, your customer list, your crew assignments, your billing records — every piece of operating data your business runs on lives in our database. Trust is the table stakes for that. This page describes the specific controls in place. We update it as the posture evolves.

Tenant isolation: row-level security in the database

Every customer (tenant) on Planning Ops has a unique tenant_id. Every row in every operating-data table carries that tenant_id as a required column. PostgreSQL row-level security (RLS) policies are enforced at the database layer: a query for "all pours" returns only the pours for the authenticated user's tenant — regardless of what the application code asks for.

This is stronger than application-layer filtering. Even if a bug in our code tried to fetch another tenant's data, the database refuses. The same protection applies to writes, updates, and deletes.

Authentication and Session Management

Password hashing — bcrypt

Primary password hashes use bcrypt (industry standard) via Supabase Auth. Plaintext passwords are never stored.

Password reuse history — PBKDF2-SHA256

Recent password hashes kept in a history table so we can enforce reuse prevention. Hashed with PBKDF2-SHA256, not plaintext.

Two-factor authentication (2FA)

TOTP-based 2FA available for admin accounts. Recovery codes are stored only as one-way SHA-256 hashes — plaintext never leaves your screen at enrollment.

Session tokens (JWT)

Short-lived JWT-based sessions with automatic refresh. Tokens are scoped to the tenant; no cross-tenant token replay.

Encryption

Browser-side defense: strict Content Security Policy

Every page Planning Ops serves ships with a strict Content Security Policy (CSP) that whitelists exactly which domains can load scripts, styles, fonts, images, and network requests. Plus:

Any XSS bug we'd ship would fail to load the attacker's payload because the CSP doesn't trust the source.

Audit Logging

Every meaningful action — pour created, pour canceled, employee added/removed, crew assigned, role changed, branding updated, user invited or removed — writes a row to the audit log with the actor, timestamp, and changed values. Administrators of each tenant can see their own audit log; we cannot read into another tenant's log.

Platform-administrator access (support sessions)

Planning Ops staff may sign in to a workspace as one of your users for the limited purpose of support, investigation, or legal/security response. Every such sign-in is:

We do not maintain standing background access. Routine operations (backups, monitoring) use service-level credentials that read only metadata, not your operating data.

Backups and Disaster Recovery

Vendor Sub-Processors

Documented in the Privacy Policy. The short list:

Vulnerability Reporting

Found a security issue? Email admin@planningops.com with the subject "Security report". We respond within one business day. We do not have a paid bounty program yet but we credit reporters publicly (with permission) when reports lead to fixes.

What we don't claim

Honesty over marketing:

Non-Technical Summary

If you're not a security person and just want the takeaway:

Run your own evaluation

14-day free trial. Card, Apple Pay, Google Pay, or Link accepted. Not charged for 14 days.

Start free trial →