Built tenant-safe from day one
Anchor holds real business and customer data for many businesses in one system. Here is specifically how we keep it separated and how we keep AI from becoming a way around that separation.
Tenant isolation, enforced twice
Every business-owned table carries a business_id, protected by both row-level security policies at the database layer and independent authorization checks in the API layer before any query runs. A request can't read or write another business's data by guessing an ID — every lookup verifies the caller's real membership first, and returns a plain 404 rather than confirming a resource exists at all.
AI that can't grant itself access
The AI never chooses which business's data to read, and never generates its own database queries. Every tool the owner AI can call — sales summaries, low-stock lists, customer lookups — takes the caller's already-authenticated business_id as a plain argument, supplied by our backend, never by the model. Customer-facing answers are generated only from product facts retrieved by code beforehand; if the catalog has no answer, the AI says so and offers a human handoff instead of guessing.
Real authentication, verified server-side
Every request identifies its caller through Supabase-issued, cryptographically verified tokens. Business membership and role (owner/admin/staff) are checked on every write; role escalation is blocked at the API layer — no member can grant themselves or anyone else ownership.
Upload validation that checks the actual bytes
Product photos, business logos, and voice messages are validated on file size, declared MIME type, and the file's real magic bytes — not just its filename or claimed content type — before being stored under a tenant-scoped, unguessable path.
Verified webhooks, approval-gated automation
Inbound Messenger and Stripe webhooks are only processed after their cryptographic signature is verified; anything else is rejected before it touches your data. Any AI-proposed action with a real-world consequence — a restock order, an outbound message — is written as a pending action and waits for an owner or admin to explicitly approve it. Nothing consequential executes automatically.
No secrets in the frontend, ever
Service credentials, database connections, and provider API keys live only in backend environment configuration and are never bundled into frontend code or exposed through any API response.
Where we are today
Anchor is an early-stage product. We do not currently hold SOC 2 or ISO 27001 certification, and we won't claim otherwise. What we can say honestly: tenant isolation, authorization, and AI-tool scoping described above are exercised by an automated test suite that runs on every code change, including tests that specifically attempt cross-tenant access and confirm it fails.
Found a security issue? We want to know before anyone else does — email security@anchor.example.