Skip to content

Just-in-Time Provisioning and Group Sync

  • Self-hosted

Just-in-time (JIT) provisioning creates a Qualytics account the first time someone signs in through your Identity Provider (IdP). When group sync is enabled, that sign-in can also place the account on the Qualytics Teams that match the IdP groups the person belongs to. Nothing needs to be created in Qualytics ahead of time, and no separate synchronization service needs to run.

This page is written for administrators who want Qualytics Team membership to follow the directory groups they already maintain, such as Active Directory or Microsoft Entra ID security groups, Okta groups, Keycloak groups, or the equivalent group construct in another IdP.

Availability

Just-in-time group sync applies to deployments that authenticate with OIDC, which today means self-hosted deployments. Managed deployments keep Team membership aligned with your directory using Directory Sync.

What Happens at Sign-In

Every OIDC sign-in produces the following outcome. The first four rows always apply. The last row applies only when group sync is turned on.

What Behavior
Account Created on the person's first sign-in. There is no manual account creation in Qualytics.
Role New accounts receive the Member role. The very first account created in a brand new deployment receives Admin so that someone can administer the platform.
Public team Every account joins the Public team, which cannot be removed.
Group listing The group names your IdP presents are recorded on the account and refreshed whenever they change. This happens whether or not group sync is enabled, so you can see exactly what your IdP sends before you turn anything on.
Team membership With group sync enabled, each presented group name is matched against existing Team names and the person is added to every Team that matches.

Group sync deliberately does not do the following:

  • It does not create Teams. A group with no matching Team is ignored.
  • It does not remove anyone from a Team. See Keeping Membership Accurate Over Time.
  • It does not set the platform role. Groups map to Team membership only, never to Member, Manager, or Admin.
  • It does not assign datastores to Teams or set team permissions. Those stay under your control in Qualytics.
  • It does not deactivate accounts when someone leaves a group.

Group Sync Compared With Directory Sync

Qualytics offers two ways to align Team membership with your directory. They solve the same problem with very different trade-offs.

Aspect Group sync at sign-in Directory Sync
Trigger The person signs in Your IdP pushes changes
Direction Add-only Full lifecycle, including removals
Creates Teams
Removes Team membership
Creates accounts before first sign-in
Network path from your IdP to Qualytics Not required Required
Extra setup in Qualytics Create the Teams you want matched Service User, restricted token, IdP provisioning app
Best for Private-network deployments and low-friction onboarding Environments that need automatic revocation

Choose one source of Team membership

Do not run both methods against the same Teams. Group sync can add a membership back at the next sign-in after Directory Sync removed it, so the two methods will fight over the same Team. Pick one as authoritative. See Team Best Practices.

How Group Matching Works

  1. Your IdP presents a group listing in the claim you configured.
  2. Qualytics trims surrounding spaces from each name and drops empty entries.
  3. The resulting listing is recorded on the account, replacing whatever was recorded before.
  4. Each name is compared against existing Team names, ignoring letter case. Data-Engineering, data-engineering, and DATA-ENGINEERING all match the same Team.
  5. The person is added to every matching Team they are not already on. Nothing else changes.
flowchart TD
    A[User signs in via IdP] --> B{Group claim present?}
    B -- No --> C[Keep the previously recorded listing]
    B -- Yes --> D[Record the presented group names]
    D --> E{Group sync enabled?}
    E -- No --> F[Listing recorded for review only]
    E -- Yes --> G{Group name matches an existing Team?}
    G -- No --> H[Ignore the group]
    G -- Yes --> I{Already a member?}
    I -- Yes --> J[No change]
    I -- No --> K[Add the user to the Team]

When a Group Claim Is Missing or Empty

The difference between a missing claim and an empty one matters, because a misconfigured claim should not look like a directory that reports no memberships.

Situation Recorded listing Team membership
The claim is absent from the IdP response The previously recorded listing is kept Unchanged
The claim is present and empty Cleared Unchanged, because sync never removes membership
The claim holds a single group as plain text instead of a list Recorded as a one-item listing Matched normally
The claim holds an unexpected value, such as a number or an object Recorded as empty Unchanged

A missing claim never blocks sign-in. It shows up as an account with no recorded groups, which is the first thing to check when someone reports that they were not added to a Team.

When Changes Take Effect

The group listing is captured at sign-in and stays fixed for the life of that session. Adding someone to a directory group takes effect the next time they sign in, not while they are already signed in. To pick up a directory change immediately, have the person sign out and sign back in.

Step 1: Confirm What Your IdP Sends

Before you enable anything, confirm the exact claim name and the exact values your IdP puts in it. Many IdPs need an extra scope before they include groups at all, and several send group identifiers rather than group names.

Identity Provider What to check
Microsoft Entra ID (Azure AD) Add the optional groups claim under Token configuration. Entra sends group object IDs by default. To send names instead, select the sAMAccountName source, which is available for groups synchronized from on-premises Active Directory. Cloud-only groups are sent as object IDs.
Okta Add a groups claim to the authorization server with a filter that selects the groups you want to send. Okta sends group names.
Keycloak Add a Group Membership mapper to the client and turn off Full group path so names are sent without a leading slash.
Google Workspace Google does not include a groups claim by default.
PingFederate, ADFS, OneLogin Add a group attribute to the token or user information response, then confirm whether it carries names or identifiers.

Identifiers cannot be matched to Team names

If your IdP can only send group object IDs or other opaque identifiers, group sync has nothing readable to match against Team names. Either configure the IdP to send names, or use Directory Sync instead.

You do not have to guess. Because the presented listing is recorded even while group sync is off, you can turn on the claim in your IdP first, have a test user sign in, and read back exactly what arrived. See Step 4.

Step 2: Create Matching Teams

Group sync never creates Teams, so every group you want honored needs a Team whose name matches it, ignoring letter case.

  1. List the directory groups that should govern access in Qualytics.
  2. Add a Team for each one, using the group name exactly as your IdP presents it.
  3. Assign datastores and set the team permission for each Team. Group sync controls who is on a Team, never what that Team can reach.

Keep the naming boring

A directory group and its Qualytics Team should share one literal name. Resist prefixes such as AD- or suffixes such as Team on the Qualytics side, because they break the match and the failure is silent. When your directory names are unsuitable as Team names, create a purpose-built group in the directory rather than renaming on the Qualytics side.

Groups that have no matching Team are ignored, so an over-broad claim is harmless. Sending your entire directory group list is not a security problem by itself, but it does make the recorded listing noisy to review, and a Team created later with a colliding name will start receiving members at the next sign-in. Prefer a claim filtered to the groups that are relevant to Qualytics.

Step 3: Enable Group Sync

Group sync is off by default because Team membership can grant access to data, so an upgrade must never start adding people to Teams on its own. Enable it only after Step 1 and Step 2 are complete.

Self-Hosted

Set the following under secrets.oidc in your Helm values.yaml, then apply the change with the helm upgrade command from the OIDC Configuration Guide.

secrets:
  oidc:
    # Add any scope your IdP requires before it will send groups.
    oidc_scopes: "openid,email,profile,groups"
    # The claim name confirmed in Step 1. Defaults to "groups".
    oidc_user_groups_key: "groups"
    # Off by default. Turn on only after you have reviewed a real listing.
    oidc_group_team_sync_enabled: true
Helm Value Default Description
secrets.oidc.oidc_user_groups_key groups The claim that holds the group listing
secrets.oidc.oidc_group_team_sync_enabled false Whether matching group names add Team membership
secrets.oidc.oidc_scopes openid,email,profile Comma-separated scopes requested from your IdP

Setting the claim name alone does not grant any membership. It only starts recording what your IdP sends, which is the recommended way to trial this before the sync itself is enabled.

Step 4: Review What Your IdP Presented

The group listing recorded for each account is available through the Personal Account API in the oidc_groups field. Use it to confirm that the claim arrived, that the values are names rather than identifiers, and that they match your Team names.

curl -H "Authorization: Bearer $QUALYTICS_TOKEN" \
  "https://your-qualytics-domain/api/users?name=Jane"

Each user in the paginated results carries both what the IdP presented and the Teams the account currently belongs to:

{
  "id": 42,
  "name": "Jane Doe",
  "email": "jane.doe@example.com",
  "role": "Member",
  "oidc_groups": ["Data-Engineering", "Finance-Analysts", "All-Employees"],
  "teams": [
    { "name": "Public", "permission": "Reporter" },
    { "name": "Data-Engineering", "permission": "Editor" }
  ]
}

Reading this example: Finance-Analysts was presented but produced no membership, which means no Team of that name exists yet. All-Employees was presented and ignored for the same reason. Listing users requires the Manager or Admin role. See the Personal Account API.

Keeping Membership Accurate Over Time

Group sync is add-only. This is the single most important thing to plan around, because it means a directory change that grants access is applied automatically while a directory change that revokes access is not.

Removing someone from a directory group has no effect on the Team they were already added to. They keep that Team membership, and the access it carries, until an administrator removes it in Qualytics.

Plan for two separate paths:

  • Granting access is automatic. Add the person to the directory group and their next sign-in puts them on the matching Team.
  • Revoking access is manual. Remove the person from the directory group, then remove their Team membership in Qualytics.

A Reconciliation Routine

Because the recorded group listing is refreshed at every sign-in, it is a live picture of the directory that you can compare against actual Team membership. Run this review on the cadence your access policy requires.

  1. List users through the API and read oidc_groups alongside teams for each account.
  2. Flag any Team membership that has no matching entry in oidc_groups. That is a membership the directory no longer justifies.
  3. Confirm the exceptions. A membership granted deliberately in Qualytics, or one predating group sync, will also show up here and is legitimate.
  4. Remove the memberships that remain by editing the user.
  5. Deactivate the account for anyone who has left the organization. Removing a Team membership limits reach, but only deactivation ends access.

Do not treat sign-in as an access review

A successful sign-in confirms that your IdP still authenticates the person. It does not confirm that their Qualytics Team memberships still reflect their directory groups. Only the reconciliation above does that.

When to Use Directory Sync Instead

If your access policy requires that revoking a directory group revokes Qualytics access without an administrator acting, group sync is not sufficient on its own. Use Directory Sync, which manages the full lifecycle including removals, and leave group sync off.

Limitations

Limitation Consequence
Membership is add-only Removing a directory group does not revoke Team membership
Teams are never created A group with no matching Team is silently ignored
Matching is by name only Group identifiers, such as object IDs, cannot be matched to Team names
Roles are not mapped Platform roles stay under administrator control in Qualytics
Changes apply at sign-in A directory change is picked up at the person's next sign-in
Public team is always present Every account is on the Public team regardless of group membership
Nested groups depend on your IdP Only the groups your IdP actually includes in the claim are considered

Troubleshooting

Symptom Likely Cause Solution
The recorded listing is empty for everyone The claim is not being sent Confirm the claim name and add any scope your IdP requires, then have a user sign in again
The recorded listing is populated but no Team was joined Group sync is off, or no Team name matches Confirm group sync is enabled, then compare the listed names against your Team names
Only some groups produce Team membership Teams exist for some group names only Create the missing Teams, or accept that the extra groups are meant to be ignored
The listing holds long identifiers instead of names The IdP sends group object IDs Configure the IdP to send names, or use Directory Sync
A user was added to the wrong Team A directory group name collides with an unrelated Team name Rename the Qualytics Team, or filter that group out of the claim
A directory change has not appeared The person is still on an older session Have them sign out and sign back in
Someone kept access after leaving a group Expected behavior, because sync is add-only Remove the Team membership in Qualytics and adopt the reconciliation routine above
Membership reappears after being removed Both group sync and Directory Sync are managing the same Team Choose one authoritative method and disable the other