User Management
The SCF Controls Platform uses role-based access control to manage what users can do within the application. This guide covers user roles, permissions, and management tasks.
Prerequisites
Section titled “Prerequisites”Before managing users:
- A sign-in method must be enabled — OIDC single sign-on, the bundled Keycloak, or Google Sign-In (see Authentication)
- You must have Admin role to manage users
- Users must sign in at least once to appear in the system
Roles and Permissions
Section titled “Roles and Permissions”The platform supports three roles with different permission levels:
Full access to all features
| Permission | Description |
|---|---|
| Manage users and roles | Invite users, assign roles, remove access |
| Invite new users | Add users to the organisation |
| Remove users | Remove users from the organisation |
| Create, edit, delete controls | Full control management |
| Create, edit, delete evidence | Full evidence management |
| Manage tasks and assignments | Task and assignment management |
| Create, edit, archive teams | Define the organisation’s teams and their functions |
| Manage team membership | Add and remove members, set primary and delegate |
| Set member type | Record a member as internal or an external contractor |
| View all data and reports | Access all dashboards and exports |
| Configure organisation settings | System configuration |
Editor
Section titled “Editor”Can edit content but not manage users
| Permission | Description |
|---|---|
| Create, edit, delete controls | Full control management |
| Create, edit, delete evidence | Full evidence management |
| Manage tasks and assignments | Task and assignment management |
| Add comments and mentions | Participate in discussions |
| View teams and membership | See who owns what — read-only |
| View member type | See which members are external contractors — read-only |
| View all data and reports | Access dashboards and exports |
Editors are ideal for GRC analysts who need to manage compliance content but should not administer users.
Viewer
Section titled “Viewer”Read-only access
| Permission | Description |
|---|---|
| View controls and evidence | Browse all content |
| View tasks and assignments | See task status |
| View teams and membership | See who owns what — read-only |
| View member type | See which members are external contractors — read-only |
| View reports and dashboards | Access reports |
| Add comments | Participate in discussions |
Viewers can see everything but cannot modify content. Suitable for stakeholders who need visibility without editing capabilities.
Managing Users
Section titled “Managing Users”Accessing User Management
Section titled “Accessing User Management”- Sign in with an Admin account
- Click the Users icon in the sidebar (person icon)
- The User Management page displays all organisation members
User List
Section titled “User List”The user list shows:
| Column | Description |
|---|---|
| User | Avatar, name, and email from the sign-in profile (Google or your identity provider) |
| Role | Current assigned role (dropdown selector) |
| Type | Internal or Contractor — a dropdown for admins, plain text for everyone else. See Internal Members and External Contractors |
| Joined | Date the user joined the organisation |
| Actions | Remove button |
Inviting Users
Section titled “Inviting Users”People join an organisation by invitation. An admin sends the invite; the invitee accepts by opening the invitation link and signing in.
Sending an invite
Section titled “Sending an invite”- Click the Invite User button
- Enter the user’s email address
- Select a role for the new user
- Set Employment Type — Internal - permanent staff or Contractor - works for you under a contract. It defaults to internal, travels with the invitation, and is applied to their membership when they accept
- Click Send Invite
- The invitee receives an email invitation to join. You can also copy the invitation link from the modal and send it yourself
What the invite does to their sign-in account
Section titled “What the invite does to their sign-in account”This is the part that differs by deployment.
On the bundled Keycloak — the platform running docker compose --profile idp, with
KC_ADMIN_USER, KC_ADMIN_PASSWORD and OIDC_DISCOVERY_URL / OIDC_ISSUER configured for the
backend — the invite also creates the Keycloak account. The backend looks the email up in the realm:
if it is absent it creates the user (username = the email address, enabled, email marked verified,
required action Update Password) and sets a generated temporary password; if the user already
exists in Keycloak nothing is changed and no password is set.
On a bring-your-own OIDC install, or a Google-only install — nothing changes. The platform does not create accounts in an external identity provider. Create the account in your IdP (or confirm the person has a Google account, on Google installs) and invite them here; the invite links that identity to the organisation when they first sign in.
Invite badges
Section titled “Invite badges”Each outstanding invitation shows a badge saying which of the above applied:
| Badge | Meaning |
|---|---|
| IdP account | An account exists in the bundled Keycloak — created by the invite, or already there before it |
| No IdP account | The bundled Keycloak is enabled, but no account exists for this email |
| External IdP | Provisioning is disabled — a bring-your-own OIDC or Google install, where the IdP owns accounts |
Accepting an invite
Section titled “Accepting an invite”The invitee opens the invitation link — from the email, or the one you copied from the modal — and signs in. On OIDC deployments the invite page offers the identity provider’s Sign in button rather than Google; on Google deployments it offers Sign in with Google. They join with the role and employment type the invitation carried, and an admin can change both afterwards.
Cancelling an invite
Section titled “Cancelling an invite”Cancelling an outstanding invitation removes the platform-side record. On the bundled Keycloak it also deletes the Keycloak account, but only when the invite created that account and the person has never signed in to the platform. In every other case — an identity that already existed, or somebody who has signed in at least once — the IdP account is left alone.
Keycloak accounts the platform creates or deletes are recorded in the audit log under entity type
idp_user.
Changing User Roles
Section titled “Changing User Roles”- Find the user in the list
- Click the role dropdown next to their name
- Select the new role (Admin, Editor, or Viewer)
- The change is saved automatically
The role change takes effect immediately on the user’s next action.
Internal Members and External Contractors
Section titled “Internal Members and External Contractors”Every membership carries a type alongside its role: the person is either internal to your organisation or an external contractor. It exists to answer a question auditors ask directly and most control registers cannot — is any of this owned by somebody who does not work here?
Setting a Member’s Type
Section titled “Setting a Member’s Type”- Open User Management from the sidebar (Operations group)
- Find the person in the user list
- Choose Internal or Contractor from the dropdown in the Type column on their row
- The change saves immediately
Only Admins can change a member’s type, the same as changing a role. Editors and Viewers still see the value — it renders as plain text in the same column rather than disappearing, so the badges elsewhere in the platform do not look as though they came from nowhere. They simply cannot change it.
Type and role are independent. Changing one leaves the other exactly as it was — setting somebody to external contractor does not touch their role, and changing their role does not touch their type. They are two separate decisions about the same membership, and the platform treats them that way.
That independence matters most when two admins are working at once. Changing somebody’s type sends only the type, so it cannot overwrite a role another admin changed a moment earlier — your screen being slightly out of date does not silently undo their work.
Every change is written to the Audit Log (Admin group in the sidebar): who was changed, from which type to which, by whom, and when. Each field is logged separately, so changing somebody’s role and type together produces two entries rather than one. Contractor involvement is exactly the kind of fact an auditor asks to see the history of rather than the current state of, and the log is what answers “was this control owned by a contractor in March?” after the engagement has ended and the record has been tidied.
Setting It When You Invite Somebody
Section titled “Setting It When You Invite Somebody”You do not have to wait until somebody has accepted. The Invite User dialog carries the type alongside the role, so an admin decides both in the same breath — and the type is applied to the membership at the moment the person accepts. A contractor is recorded as one from their first sign-in rather than after somebody notices and goes back to fix it.
An invitation that says nothing means internal, in exactly the way an invitation that says nothing about a role means Viewer. The default is a default, not a statement — it is what the platform assumes in the absence of a decision, and it is why every membership that predates this feature is internal too.
Admins can see what a pending invitation will produce — the list of outstanding invitations shows the type alongside the role, so an invitation sent last week does not have to be taken on trust. The invitee does not see it before accepting; the page they land on names the role they are being offered and nothing about employment type.
Nothing about it is permanent. Any admin can change a member’s type from their row at any time after they have joined, so getting it wrong at invite time costs nothing: somebody invited as internal who turns out to be a contractor is one dropdown away from correct, and the correction is written to the audit log like any other change. Invite on your best understanding and adjust when you know better — that is cheaper, and more honest, than leaving the field blank in your head until somebody asks.
What Your Existing Members Were Set To
Section titled “What Your Existing Members Were Set To”Every membership that already existed when this feature was installed became internal.
Nothing was inferred. Not from email domains, not from the free-text owner labels on controls, not from any other field — no rule anywhere on the platform reads a value and decides somebody is a contractor. That is deliberate: an email domain is a lousy proxy for an employment relationship in both directions, and an organisation guessing wrongly at scale would produce a contractor report that looks authoritative and is not.
Organisations state their own contractors, one membership at a time. So the first thing to do after upgrading is a pass down the user list marking the people who actually are external. Until you do, the report below is accurate about what you have recorded, and silent about what you have not.
Where the Contractor Badge Appears
Section titled “Where the Contractor Badge Appears”The badge reads Contractor, and it renders wherever that person appears as an owner, an assignee, or a team member — the user list, team membership tables, the pending-invitation list, and the assignment surfaces on controls and evidence items. Anyone in the organisation can see it; it is not an admin-only view. Hovering it repeats what it means and what it does not: a label only — it grants and restricts nothing.
Internal members get no badge at all. The absence of one is the ordinary case, not a claim that somebody is on the payroll — an “Internal” badge on every row would be noise that makes the one row that matters harder to find.
In dropdown menus, where a badge cannot be drawn, the person’s name carries the same word as a suffix instead — Ana Ruiz (Contractor). Same word, same meaning, so the two surfaces cannot drift into looking like two different claims about the same person.
The point is that contractor involvement is visible at the moment it matters rather than only in a report somebody has to think to run. Naming an external contractor as a team’s primary is allowed, and plenty of organisations do it deliberately — but the badge is on screen while that choice is being made, so it is a decision rather than an oversight.
The Contractor Report
Section titled “The Contractor Report”Controls and evidence can be filtered to those whose accountable team’s primary owner is an external contractor.
That sentence is precise, and each qualifier is doing work:
- The accountable team — not merely an assigned one. A control may be owned by several teams (see Owning teams), but exactly one of them can be accountable, and that is the team whose name is on the control when it fails. A contractor team consulted on a control is not the same finding as a contractor team answerable for it.
- That team’s primary — not any member of it. The primary is the single named owner; contractors elsewhere in the team are contributing, not accountable.
It is deliberately not “any member of any assigned team is a contractor”. A contractor sitting in a team that was consulted on a control is not answerable for that control, and counting them would overstate contractor exposure in the exact report somebody reaches for in order to size it.
So an item is not returned when it has no team assignment at all, when its owning teams include none marked accountable, or when the accountable team has no primary. All three hops are required.
The filter offers three choices — All Owner Types, Contractor-owned and Internally owned — so it answers the opposite question just as readily: what are our own staff accountable for? On the controls list it sits inside the ⚙ Filters dropdown with the team and function filters and counts towards the badge on the button; on the evidence list it sits on the filter bar beside them.
It is a lens, not a restriction. Appearing in this report changes nothing about what anybody can see or do — it is there so that “is any of this owned by a contractor?” has an answer you can produce in the meeting rather than reconstruct afterwards.
Removing Users
Section titled “Removing Users”To remove a user from the organisation:
- Find the user in the list
- Click the Remove button (trash icon)
- Confirm the deletion when prompted
Role Selection Guide
Section titled “Role Selection Guide”Choose roles based on user responsibilities:
| User Type | Recommended Role | Rationale |
|---|---|---|
| GRC Program Manager | Admin | Needs to manage team and all features |
| GRC Analyst | Editor | Day-to-day compliance work |
| IT Security Staff | Editor | Implements and updates controls |
| Department Manager | Viewer | Reviews compliance status |
| Auditor (internal) | Viewer | Reviews evidence and reports |
| Executive Stakeholder | Viewer | Dashboard access only |
Role Permissions Reference
Section titled “Role Permissions Reference”The User Management page includes an expandable Role Permissions Reference panel:
- Click Role Permissions Reference to expand
- View detailed permissions for each role
- Use this as a quick reference when assigning roles
Teams answer a question every audit eventually asks and most control registers cannot: who owns this, and who covers for them? An organisation defines its own teams, maps each one to a business function, and names the people on it. The team is a durable record — it outlives the individuals on it, so ownership history survives staff changes.
Functions
Section titled “Functions”A function is a business capability that compliance work can belong to — Security Operations, Legal, Finance, and so on. The platform ships a fixed list of fourteen, identical in every organisation and every deployment:
| Key | Name |
|---|---|
governance_risk_compliance | Governance, Risk & Compliance |
security_operations | Security Operations |
security_engineering | Security Engineering |
it_operations | IT Operations |
software_engineering | Software Engineering / DevSecOps |
identity_access_management | Identity & Access Management |
data_privacy | Data Protection & Privacy |
human_resources | Human Resources |
legal | Legal |
finance | Finance |
procurement_vendor_management | Procurement & Vendor Management |
facilities_physical_security | Facilities & Physical Security |
business_continuity | Business Continuity & Resilience |
executive_leadership | Executive Leadership |
Functions are read-only. You cannot add, rename or remove them from the application — the list is seeded by the platform, and extending it is a platform release decision rather than an organisation setting. That is deliberate: because the list is shared, “Security Operations” means the same thing in every organisation and in every environment, so anything built on top of it stays portable.
Your own vocabulary lives in team names, not function names. If your organisation calls it “Blue Team”, create a team called Blue Team and map it to Security Operations. A team that spans responsibilities can serve more than one function.
Creating a Team
Section titled “Creating a Team”- Open User Management from the sidebar (Operations group)
- Find the Team Management card, alongside the user list
- Click New Team
- Enter a name — it must be unique within your organisation
- Add one or more functions the team delivers. Pick each one from the Add a business function… list; it appears as a chip below, with an × to take it off again. The first function added is the team’s primary grouping. Functions that are no longer active are listed but cannot be added.
- Add an optional description — what this team is actually responsible for
- Click Create
Creating, editing and archiving teams requires the Admin role. Any organisation member can view teams and their membership.
Mapping Teams to Functions
Section titled “Mapping Teams to Functions”Each team serves one or more functions, and a function may be delivered by several teams. This lets both cross-functional and federated organisations describe themselves honestly without inventing functions or duplicate teams:
| Team | Function |
|---|---|
| EMEA Security Operations | Security Operations |
| APAC Security Operations | Security Operations |
| Group Privacy Office | Data Protection & Privacy |
| Platform Engineering | Software Engineering / DevSecOps; Security Engineering |
Both security operations teams map to the same function, so a report grouped by function still sees one Security Operations capability, while day-to-day ownership stays with the right regional team.
A team’s functions can be changed later if you reorganise. Expand the team and use the same chips: add from the list, remove with the ×. Nothing is sent while you edit — Save functions applies the change and Cancel puts it back — so a mis-click costs nothing. At least one function must remain, so the × on the last chip is disabled; to swap a team’s only function, add the replacement first, then remove the old one. If a team still holds a function that has since been retired, that chip stays visible, marked (inactive), and can still be removed. The team, its members and its history stay intact.
Membership Roles: Primary, Delegate, Member
Section titled “Membership Roles: Primary, Delegate, Member”Every membership carries exactly one role:
| Role | Limit per team | Meaning |
|---|---|---|
| Primary | At most one | The single named owner. The person answerable for the team’s work. |
| Delegate | At most one | The deputy. Covers when the primary is unavailable. |
| Member | No limit | Contributes to the team’s work; not individually accountable for it. |
Why a primary and a delegate? Accountability that names one person is clear but fragile — that person takes leave, changes role, or leaves the company, and the ownership record quietly becomes wrong at exactly the moment it matters. The delegate is the documented answer to “and if they are not available?”. Without it, coverage lives in somebody’s head and cannot be shown to an auditor, who will ask both questions: who owns this, and who covers for them.
These roles are properties of the membership, not of the person. The same user can be the primary of one team and an ordinary member of another. Nothing about the primary role follows a person around the platform, and nothing about it changes what they are permitted to do — see the note at the top of this section.
Adding and Managing Members
Section titled “Adding and Managing Members”- Open the team from the Team Management card
- Click Add Member
- Choose a user from your organisation’s existing members
- Choose their role — primary, delegate or member
- Save
To change a role, edit the membership and pick a different role. To remove someone from a team, remove the membership — this affects that team only and does not touch their organisation account or any other team.
Only users who are already members of your organisation can be added to a team. If someone is missing from the picker, add them to the organisation first (see Inviting Users).
Because a team can have at most one primary and at most one delegate, assigning a second one is rejected. Change or remove the existing holder first, then assign the new one.
Members who are external contractors carry a contractor badge on their row here, primary and delegate included. The badge changes nothing about the membership — the role means exactly what it means for anyone else — but it puts the fact on screen while you are deciding who is answerable for the team, rather than in a report somebody runs later.
Team Health
Section titled “Team Health”A team with no members, or with members but no primary, is perfectly legal. The platform shows a warning badge rather than blocking you.
That is intentional. Half-formed teams are a normal step in setting the structure up — you sketch the shape of the organisation first and fill in the names as you confirm them. Blocking on a complete team would only push people into inventing placeholder owners, which is worse than an honest gap. Treat the badges as a to-do list: a team without a primary has nobody answerable for it, and that is worth resolving before an audit rather than during one.
When Someone Leaves
Section titled “When Someone Leaves”Remove the person from the organisation as normal, from the user list. Their team memberships go with them — all of them, across every team, automatically. This is enforced in the database itself rather than by application cleanup, so there is no path by which a departed user is left sitting in a team.
What survives is everything that should: the teams themselves, their names, their functions, their remaining members, and the audit record of who was on them and when.
If the person was a team’s primary, that team is now without one and shows its warning badge — a visible prompt to name a successor rather than a silent gap.
Archiving a Team
Section titled “Archiving a Team”Deleting a team archives it. The team is marked inactive; it is never destroyed.
- Open the team from the Team Management card
- Click Delete
- Confirm
Archived teams drop out of the default team list and can be shown again with the include-inactive option. Their name stays reserved, so recreating a team with the same name is not possible while the archived one exists — rename or reactivate instead.
Archiving rather than deleting exists so that history keeps resolving. A team named in March’s audit trail must still resolve to a real team in December, long after the reorganisation that retired it.
Teams That Own Controls and Evidence
Section titled “Teams That Own Controls and Evidence”Teams can be assigned to individual controls and evidence items, with one team marked accountable for each. That is described in Control Management — the part that concerns administrators is what those assignments do when the team structure changes underneath them.
Archiving a team does not release its work. Archiving marks the team inactive; it does not delete it, and every control and evidence item that named it still names it afterwards. That is the point — a control does not silently become unowned because somebody tidied the team list. Before archiving a team that owns work, reassign that work to the team taking it over. Otherwise the ownership record is intact but points at a team nobody is staffing, which is worse than an obvious gap because it does not look like one.
Removing a user does not change any assignment. Assignments name teams, not people, so a departure removes that person’s memberships and leaves every control and evidence item owned exactly as before. The team is now short a person — and short a primary, if it was theirs — but nothing became unowned.
Assignments cannot cross organisations. A control can only be assigned a team from its own organisation, and that is enforced by the database rather than by the application, so there is no sequence of API calls that produces a cross-tenant assignment.
Audit Trail
Section titled “Audit Trail”Every team and membership change is recorded in the Audit Log (Admin group in the sidebar): team created, renamed, remapped to a different function or archived; member added, role changed or removed — each with the user who did it and when.
Team assignments are recorded there too: a team given ownership of a control or evidence item, made accountable, stood down, or removed. When accountability moves from one team to another, both halves are logged — the promotion and the demotion it caused — so “who was accountable for this in March?” has an answer even after several handovers.
This is what makes the ownership record defensible rather than merely current. “Who owned this in March?” has an answer, and it is not somebody’s memory.
Assignments and Ownership
Section titled “Assignments and Ownership”Control Assignments
Section titled “Control Assignments”Admins and Editors can assign controls to users:
- Navigate to Control Scoping
- Select a control
- Click Assign in the detail panel
- Select a user from the dropdown
- Click Save
Assigned users receive visibility into their responsibilities but assignments don’t restrict editing.
Evidence Assignments
Section titled “Evidence Assignments”Similar to controls, evidence items can be assigned:
- Navigate to the Evidence Workspace
- Select an evidence item
- Set the Owner field
- Click Save
Task Assignments
Section titled “Task Assignments”Tasks support explicit assignment:
- Create or edit a task
- Set Assigned To field
- User sees task in My Tasks view
Best Practices
Section titled “Best Practices”Role Assignment
Section titled “Role Assignment”- Start with Viewer — Assign Viewer initially, upgrade as needed
- Limit Admins — Keep Admin count minimal (2-3 per organisation)
- Match responsibilities — Align roles with job functions
- Review periodically — Audit user roles quarterly
User Lifecycle
Section titled “User Lifecycle”- Onboarding — Provide new users with role-appropriate training
- Role changes — Document when and why roles change
- Offboarding — Remove users promptly when they leave
Security
Section titled “Security”- Assign appropriate roles — Roles are enforced, so the role you assign is the access you grant
- Audit trail — All actions are logged with user attribution
- Least privilege — Give users minimum access they’ll need
Troubleshooting
Section titled “Troubleshooting”User Cannot Sign In
Section titled “User Cannot Sign In”- Check the badge on their pending invite. No IdP account on a bundled-Keycloak install means
KC_ADMIN_USER/KC_ADMIN_PASSWORDwere not configured for the backend when they were invited — cancel the invite and re-invite, or create the user in the Keycloak admin console. External IdP means the account has to exist in your own IdP - Verify the sign-in method itself is working — see Authentication and, for SSO deployments, Identity Provider
- Have the user clear their browser cache and try again
- Check they are signing in with the correct account for that identity provider
User Has Wrong Role
Section titled “User Has Wrong Role”- Navigate to User Management
- Find the user in the list
- Use the role dropdown to change their role
- Change takes effect immediately
User Not Appearing in List
Section titled “User Not Appearing in List”Users must sign in at least once to appear in User Management. If a user has signed in but doesn’t appear:
- Check browser console for authentication errors
- Have the user sign out and sign in again
- Ensure the user signed into the correct organisation
Invite Email Not Received
Section titled “Invite Email Not Received”- Check spam/junk folder
- Verify email address was entered correctly
- Try re-sending the invitation
- Contact support if issues persist
Multi-User Collaboration
Section titled “Multi-User Collaboration”The platform supports multiple users working simultaneously with automatic data synchronisation.
How Synchronisation Works
Section titled “How Synchronisation Works”Three mechanisms:
| Mechanism | Behaviour |
|---|---|
| Change polling | Every 20 seconds, asks the server whether anything changed. Does not refetch data — it only raises the “Updates available” flag |
| Focus refetch | Switching back to the tab refetches the queries currently on screen |
| Manual refresh | The refresh button in the header, or the R key. This is the only thing that reloads everything |
Header indicator
Section titled “Header indicator”- “Updated 3m ago” — time since your last refresh
- “Updates available”, with a dot — the poll found a change
Collaboration Best Practices
Section titled “Collaboration Best Practices”For Real-Time Collaboration:
- Switch away and back to the tab to refetch what is on screen
- Refresh before making critical changes — the button, or
R - Watch for “Updates available”: it means someone else has changed something you may be looking at a stale copy of
For Team Workflows:
- Coordinate with team — Use Slack/Teams to communicate who’s editing what
- Work in different domains — Multiple users can edit different control domains simultaneously
- Refresh before bulk operations — Click refresh, then select all/deselect all
Conflict Resolution
Section titled “Conflict Resolution”The platform uses last-write-wins strategy:
- Simple and works well for most GRC workflows
- If two users edit the same control simultaneously, the last save wins
- The 20-second change poll surfaces a conflict quickly, though it is up to you to act on it
For a compliance tool, this approach is typically sufficient since:
- Controls are usually edited by different teams
- Changes are incremental rather than wholesale replacements
- Users can coordinate through comments and assignments
Related Guides
Section titled “Related Guides”- Configuration — Platform settings
- Authentication — Sign-in methods and account setup
- Identity Provider — OIDC SSO and the bundled Keycloak
- Quick Reference — Feature overview

