Security
We take data protection seriously because our customers' cash and inventory records run through this product. Here's how the stack works.
Encryption
- All traffic over TLS 1.2+.
- Database at rest encrypted by Supabase (AES-256).
- Backups encrypted.
- Passwords hashed with bcrypt via Supabase Auth — we never see plaintext.
Tenant isolation
- Every data row carries a
business_id. Row-Level Security policies on Postgres enforce that no user can read or write data outside their business — verified at the database, not just the application layer. - Service-role keys are only used in server-side code that has already authenticated and authorized the caller.
Transaction integrity
- Every sale, payment, inventory move is recorded as an immutable event in an append-only log. Projections (inventory, credit) are derived from events via database triggers.
- Every event carries an idempotency key — duplicate submissions are deduplicated server-side. A flaky network can't create double sales.
Offline-resilient sync
- The agent PWA writes transactions to a local IndexedDB outbox before attempting to sync — your data is durable from the moment of capture.
- Background sync resumes automatically when connectivity returns. No user action required. No data loss on a flat-tyre cell-tower day.
Payments
Subscription payments are processed by Dodo Payments. We never see your card number — only a Dodo customer ID. Webhook events are verified via signed standardwebhooks signatures before we update your subscription state.
Access control
- Three roles: owner, admin, agent.
- Owners can promote/demote admins. Admins can invite agents. Agents cannot see admin-only data even if they guess the URL — the database enforces it.
Responsible disclosure
Found a vulnerability? Email security@traxales.app. We acknowledge within 48 hours and never threaten legitimate researchers.