Roles
Owner, admin, dispatcher and viewer, and the permission level each one gets.
Every member of a workspace has exactly one role. The table below is rendered from the same definitions the app uses, so it can't drift from what the app enforces.
| Role | Default level | What it means |
|---|---|---|
| Owner | approve | Everything, including members and the plan. One per workspace. |
| Admin | approve | Everything except the owner. Verifies documents and manages members. |
| Dispatcher | edit | Runs daily operations: dock appointments, check-ins, messages, uploads. |
| Viewer | view | Reads everything the plan includes. Changes nothing. |
Three levels
Roles map to a permission level, and every action in Portline needs one of them:
- View reads. Every role has it for every area the plan includes.
- Edit covers daily operations: move a dock appointment, check a driver in or out, upload a document (it lands as Submitted), send a message. Dispatchers and up.
- Approve covers decisions: verify or reject a document, change a member's role. Admins and the owner.
The area pages list exactly what each role can do in that area. For example, in Shipments a dispatcher can upload a bill of lading but can't mark it verified.
The owner
There's one owner per workspace. Admins can manage every other member, but they can't change the owner's row or hand out the owner role. Nobody can change their own role, so nobody can promote themself. Postgres enforces this with a trigger on pl_members, so it holds even outside the app.
Plan on top of role
A role only applies to areas the workspace's plan includes. A dispatcher on Starter can't open Docks, because Starter doesn't include the docks feature, and the database returns no dock rows for that workspace at all. See Plans and access.