Trust is table stakes.
No cinematic security theater. Every guardrail below is enforced in code and reviewable in migrations — written like a spec.
- 00:00.001[TENANT]row.read organization_id=? policy=is_org_member → allow
- 00:00.012[WEBHOOK]hmac.verify sha256 timing-safe · ts.age=3s < 300s → accept
- 00:00.018[IDEMPO]webhook_events UNIQUE(provider,event_id) → dedupe ok
- 00:00.024[SECRET]process.env.PROVIDER_KEY read inside handler → never bundled
- 00:00.031[AUDIT]audit_logs append actor=owner action=role.grant → immutable
- 00:00.037[AUDIT]admin.audit append-only · logAudit throws on write failure
Written like a spec.
Each item maps to an actual policy, migration, or handler you could review.
- Tenant isolation
Every row carries organization_id (and where relevant, location_id). RLS enforces membership and role checks on every read and write, on top of role-scoped GRANTs.
- Order integrity
Order writes are tenant-scoped and idempotent. Provider webhooks are deduplicated by (provider, event_id) with a UNIQUE constraint. State transitions are immutable events.
- Secrets isolation
Voice, POS, payments, SMS, and email adapter interfaces live behind server-only boundaries. Secrets are read inside handlers — never at module scope — and never bundled into the client.
- Signed webhooks
Every inbound webhook is HMAC-verified with a timing-safe compare, rejected on missing or expired timestamps, and stored raw before processing so redelivery is a no-op.
- Audit trail
All privileged actions — org creation, role grants, order overrides, sales-agent drafts and approvals — land in an append-only audit log accessible to owners and platform admins.
- Emergency pause
Once your voice line is live with Fire It, owners and platform admins can pause it from the dashboard; incoming calls roll to voicemail or a transfer number until pause is lifted.
The honest list.
- ✗We do not claim perfect accuracy. When voice ordering is live for you, every confirmed order goes through authoritative acknowledgment before the caller hears “you're all set.”
- ✗We do not fabricate POS or provider live connectivity. Integrations show awaiting configuration, planned, or pilot until proven end-to-end.
- ✗We do not cache authenticated data in the browser service worker. Anything behind sign-in is always network-fresh.
- ✗We do not use one privileged database key for public reads. Anonymous requests hit a narrow publishable path with RLS as anon.
Have a security question?
DPAs, subprocessor lists, penetration test summaries — reach out.
