# Access Groups

SA5's new **Access Groups** feature adds access group information into the User Info object, and makes it available to you in the callback.&#x20;

From there, you write any custom code you like to hide elements, show elements, redirect users away from pages you do not want them on, and so on.&#x20;

As a best practice, you can use the `user.user_data_loaded.access_groups` to determine if access group loading has completed. It will be true once that portion of the user object is loaded, and then you can check the `user.access_groups` array to see which groups they are a member of.

Later, depending on the use cases shared in the forum, we plan to add attributes-based features like access-group-based conditional visibility, and possibly access-group-based routing. &#x20;

In a similar fashion to the Custom User Fields, **SA5'S Access Groups** feature requires a specific setup approach in order to work. Make certain to follow the setup precisely.&#x20;

## How SA5's Access Groups Feature Works

Webflow does not provide Access Groups information in the `/user-account` page so we use a different approach to discern the Access Groups that the current user is a member of.

The underlying strategy is to setup and query a set of *known pages* that each have specific paths and access rights settings. If the user has access, we know they are a member of that Access Group.

By default these *known pages* are setup under a special subdirectory named `/sa5-ag`. You will need one ( empty ) page for each of your Access Groups, and each of those pages;&#x20;

* MUST have the same exact slug as the Access Group's slug, e.g. `premium`
* MUST be configured for access ONLY by members of that Access Group

## Setting Up Access Groups

For example, if you have 4 access groups, and their **slugs** are `free`, `basic`, `pro` and `premium`, then you would;

### STEP 1 - Setup the SA5 Access Group Folder & Pages

* Create your Access Groups in Webflow, and write down an exact list of the slugs for each. Keep them short and sweet, and life will be simpler. &#x20;
* Create a folder at the root of your site with the slug `sa5-ag`.&#x20;
* Inside the folder, create 4 pages, with the following **slugs**.
  * `free`, which you restrict only to the Free access group members
  * `basic`, which you restrict only to the Basic access group members
  * `pro`, which you restrict only to the Pro access group members
  * `premium`, which you restrict only to the Premium access group members

{% hint style="info" %}
In these pages, the **name** of the folder and the names and contents of the pages do not matter. Leave the pages blank. However the **slugs** MUST be precisely set according to the instructions above.&#x20;
{% endhint %}

### STEP 2 - Configure SA5 Memberships

In your SITE-wide before-HEAD custom code, where you load the library, configure **SA5 Memberships** with the list of Access Groups it should check for. This is done with the new `getMembershipConfig` Memberships configuration block.

In your script, it will look something like this;

{% code overflow="wrap" %}

```html
<script>
window.sa5 = window.sa5 || [];
window.sa5.push(['getMembershipConfig', 
  (config) => {
    config.accessGroupsFolder = '/sa5-ag';
    config.accessGroups = [
      'free', 'basic', 'pro', 'premium'
    ];
    return config;
  }]); 
</script>
```

{% endcode %}

{% hint style="info" %}
Make certain you have only one `getMembershipConfig` block to avoid confusing your configuration.&#x20;
{% endhint %}

Note that this is not the same configuration block as we use for [Advanced Membership Routing](/sa5-user-accounts/advanced-log-in-and-sign-up-flow.md). This callback handler is keyed `getMembershipConfig`, while routing uses `getMembershipRoutingConfig`. They are unrelated and have different configuration options. You can use both, if you are using both features concurrently.&#x20;

There are two options you can configure;

* `config.accessGroupsFolder` defaults to `/sa5-ag`. If you want a different folder slug, you can override that. Make certain the folder you create matches that path.&#x20;
* `config.accessGroups` is an array of your Access Group slugs. You can have 1 or 20, it doesn't matter. Make sure it's a valid JavaScript string array, with comma delimiters. &#x20;

### STEP 3 - Update the Library to BETA & Check Your Work

{% hint style="warning" %}
**IMPORTANT BETA LIBRARY VERSION** \
You will need to update your Webflow Memberships library version overall to use this. Do *not* install multiple copies or versions of the library on the same site. The entire BETA-library plus sample config and custom code would look like this;&#x20;
{% endhint %}

{% code overflow="wrap" %}

```html
<!-- Sygnal Attributes 5 | Memberships BETA -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/sygnaltech/webflow-util@5.3.4/dist/css/webflow-membership.css"> 
<script defer src="https://cdn.jsdelivr.net/gh/sygnaltech/webflow-util@5.3.4/dist/nocode/webflow-membership.js"></script>
<script>
window.sa5 = window.sa5 || [];
window.sa5.push(['getMembershipConfig', 
  (config) => {
    config.accessGroupsFolder = '/sa5-ag';
    config.accessGroups = [
      'free', 'basic', 'pro', 'premium'
    ];
    return config;
  }]); 
window.sa5.push(['userInfoChanged', 
  (user) => {
    console.log("USER INFO CHANGED", user); 
  }]);   
</script>
```

{% endcode %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://attr.sygnal.com/sa5-user-accounts/get-logged-in-user-info/access-groups.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
