Practice authorgs, SSO & MFA

Invite surveyors, control project access, and secure QS data with organization membership, SSO, and multi-factor authentication — built into QSNAPP.

Everything you need
for practice access

SSO, email/password, magic links, MFA, and organization membership — so the right surveyors see the right BoE, BoQ, and valuations.

SSO & social providers

Connect Microsoft, Google, Okta, Azure AD, and SAML so practices sign in the way they already work.

Orgs & roles

Invite partners, seniors, and juniors into workspaces with project-level membership — no bolt-on IAM.

Your practice data

User and membership data stays in QSNAPP with Postgres Row Level Security — not a third-party auth silo.

QSNAPP makes it simple to bring a practice online — invitations, roles, and project access just work out of the box for QS teams.

QS
Practice principalQuantity surveying firm

Practice-ready
security at every level

Multi-Factor Authentication

  • Time-based one-time passwords (TOTP)
  • Works with any authenticator app
  • Enforce MFA for partners and admins
  • Built-in enrollment and challenge flows

Enterprise SSO

  • SAML 2.0 for identity providers
  • Connect Azure AD, Okta, and more
  • Automatic user provisioning on sign-in
  • Manage SSO from the dashboard or API

Organization membership

  • Invite surveyors into practice workspaces
  • Role-based access to projects and bills
  • Separate personal and firm workspaces
  • Audit-friendly session management

Simple APIs
for practice auth

Client and server helpers for sign-up, SSO, sessions, and membership — without wiring a separate identity stack.

// Invite or register a practice user
const { user, error } = await qsnapp.auth.signUp({
  email: 'qs@practice.co.za',
  password: 'secure-password',
  metadata: { role: 'senior_qs' },
})
Documentation

Project permissions
without custom middleware

Use Postgres Row Level Security to control who can create, edit, and delete BoE/BoQ rows — tied to QSNAPP auth and organization membership.

-- Enable RLS on project bills
alter table bill_items enable row level security;

create policy "Members can read project bills"
on bill_items for select
using (
  project_id in (
    select project_id from project_members
    where user_id = auth.uid()
  )
);
Documentation

Estimate this week, scale the practice