Security & permissions
Your clients trust you with their business. Here is exactly how PortalTable keeps one client's work away from another's — and what it does not do yet.
Per-client data scoping
A client's portal is bound to one access grant, and that grant names one client in one workspace. Every read the portal makes is filtered by it in the query itself — the browser is never sent rows it then hides, because there is no client-side filtering to bypass.
The database enforces the same ownership independently: a project's workspace must match its client's, and a task's must match its project's, as foreign keys. So a bug in the application cannot produce a row that belongs to the wrong client — the write would be rejected.
Your tables aren't reachable from a browser at all. Every read and write goes through the server with a key that never leaves it, so there is no public database endpoint for anyone to probe.
Roles and permissions
Two separate questions: what a *client* can do in their portal, and what a *teammate* can do in your console.
- Client — view
- Signs in to one portal and reads their own projects, approvals, invoices, and shared files. Cannot act on anything.
- Client — approve
- The same, plus approving or requesting changes on their own reviews. Never sees the console.
- Owner
- Full control: workspace, billing, team, branding. Usually the agency principal.
- Admin
- Everything except billing and minting other admins.
- Member
- Works on client delivery — clients, projects, tasks, invoices, approvals — but cannot touch the team, billing, branding, or the subdomain.
Authentication
Clients sign in with a magic link sent to the exact address you invited — no password to set or reuse, and a link addressed to someone else won't open their portal. You sign in to the console with Google or with a password of your own.
Pre-launch checklist
Before flipping a portal to Live, run through these:
- 1Scope verifiedPreview as client shows only that client's records — nothing from another account.
- 2Nothing internal exposedNo internal details (margins, rates, private notes) appear anywhere client-visible. Check tasks and files in particular.
- 3Access level setThe client has view or approve, whichever you meant. Approve lets them sign work off.
- 4Invite goes to the right addressThe magic link only works for the address on the grant, so a typo means they can't get in — check it before you send.