Rivlo.FriendlyMembers 13.0.0

dotnet add package Rivlo.FriendlyMembers --version 13.0.0
                    
NuGet\Install-Package Rivlo.FriendlyMembers -Version 13.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Rivlo.FriendlyMembers" Version="13.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Rivlo.FriendlyMembers" Version="13.0.0" />
                    
Directory.Packages.props
<PackageReference Include="Rivlo.FriendlyMembers" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Rivlo.FriendlyMembers --version 13.0.0
                    
#r "nuget: Rivlo.FriendlyMembers, 13.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Rivlo.FriendlyMembers@13.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Rivlo.FriendlyMembers&version=13.0.0
                    
Install as a Cake Addin
#tool nuget:?package=Rivlo.FriendlyMembers&version=13.0.0
                    
Install as a Cake Tool

Friendly Members (RivloTools)

A free utility for Umbraco 13 that adds some missing member functionality:

  • Member Group Viewer (see members in a group, with paging/search/sort)
  • Bulk Actions (delete all unapproved, approve all pending — with preview & safeguards)
  • Member Statistics (totals, approved/unapproved, top groups)

Requirements

  • Umbraco: 13.x
  • .NET: 8.0
  • Backoffice uses AngularJS (standard Umbraco 13 backoffice stack)

Install

# Package Manager
Install-Package RivloTools.FriendlyMembers

# or dotnet CLI (from your web project)
dotnet add package RivloTools.FriendlyMembers

Configure (optional)

Add minimal settings to your site’s appsettings.json:

{
  "RivloTools": {
    "FriendlyMembers": {
      "Enabled": true,
      "ManagerUserGroupAliases": [ "admin" ],
      "BulkOperationHardCap": 5000,
      "StatsCacheSeconds": 60
    }
  }
}

Permissions:

Anyone with access to the Members section can view the dashboard.

Only users in ManagerUserGroupAliases can run bulk actions.

Where to find it

Backoffice → MembersFriendly Members dashboard (appears in the Members section).

Features

1) Member Group Viewer

  • Pick a group and view all members in it
  • Colour-coded badges show approved status and locked out users at a glance.
  • Search by username/email, sort columns, paged results
  • Quick link to open the member in the Umbraco editor

2) Bulk Actions (with preview)

  • Delete all unapproved members (optionally by member group)
  • Approve all unapproved members (optionally by member group)
  • Preview shows the number of affected members and enforces a hard cap
  • Double-confirm flow (type the expected count) to reduce mistakes

3) Member Statistics

  • Tiles: total, approved, unapproved
  • “Top groups” table (by member count)

Custom actions

Friendly Members lets you add bespoke bulk actions (e.g., resend verification emails) via DI. Actions appear in the Bulk tab under “Custom actions”, each with its own group selector and the right confirm flow.

How it works

  • SupportsPreview = true → we call PreviewAsync(...) to get a count, show a typed-number confirm modal, then call ExecuteAsync(...) with the expected count.
  • SupportsPreview = false, RequiresConfirm = true → we show a “type CONFIRM” modal, then execute.
  • Neither → the action runs immediately.
  • Result toasts show: Processed {{Succeeded}} of {{Attempted}}.

Only users allowed to run Friendly Members bulk actions can see/run custom actions.

Create an action

Implement IFriendlyMembersBulkAction in your site. For example:

public class ResendVerificationEmailsAction : IFriendlyMembersBulkAction
{
    private readonly IMemberService _members;
    private readonly IEmailSender _email; // your service

    public string Alias => "resend-verification";
    public string Name => "Resend verification emails";
    public string Description => "Emails unapproved members with a fresh link.";
    public bool SupportsPreview => true;
    public bool RequiresConfirm => true;

    public ResendVerificationEmailsAction(IMemberService members, IEmailSender email)
    { _members = members; _email = email; }

    public Task<int> PreviewAsync(string? groupName, CancellationToken ct)
    {
        var set = string.IsNullOrWhiteSpace(groupName)
            ? _members.GetAll(0, int.MaxValue, out _)
            : _members.GetMembersInRole(groupName);
        return Task.FromResult(set.Count(m => !m.IsApproved));
    }

    public async Task<(int Attempted, int Succeeded)> ExecuteAsync(string? groupName, int expectingCount, CancellationToken ct)
    {
        var set = string.IsNullOrWhiteSpace(groupName)
            ? _members.GetAll(0, int.MaxValue, out _)
            : _members.GetMembersInRole(groupName);
        var targets = set.Where(m => !m.IsApproved).Select(m => m.Email).Where(e => !string.IsNullOrWhiteSpace(e)).ToList();

        if (targets.Count != expectingCount) throw new InvalidOperationException("Set changed");

        int ok = 0;
        foreach (var email in targets)
        {
            try { await _email.SendVerificationAsync(email!); ok++; } catch { /* log & continue */ }
        }
        return (targets.Count, ok);
    }
}

Register the Action

Once you've written your custom action you'll need to register it in a composer:

public class SiteComposer : IComposer
{
    public void Compose(IUmbracoBuilder builder)
    {
        builder.Services.AddSingleton<IFriendlyMembersBulkAction, ResendVerificationEmailsAction>();
        // Add more custom actions here…
    }
}

That’s it — the action will appear in the Bulk tab with its own “Limit to group” selector and appropriate Review & Confirm flow.

Notes

• groupName is null for “All groups”.

• Throw InvalidOperationException in ExecuteAsync if the set changed since preview; the UI will prompt the user to retry.

• For long-running work, consider queuing inside your action (e.g., background service) and returning immediately with a toast like “Queued…”.

Safety & Notes

Back up your database before bulk operations.

A hard cap limits how many items a single run can touch (configurable).

For very large sites, initial queries are simple; future versions will add more efficient paged queries and background processing.

Versioning

Semantic versioning aligned to Umbraco major: 13.x.y for Umbraco 13.

License

This package is distributed under a proprietary licence. You may use it freely in commercial or private projects, but redistribution is not permitted.

For the full End User Licence Agreement (EULA), see: https://www.rivlotools.com/products/friendly-members/eula

Learn More

Explore the full RivloTools suite at

www.rivlotools.com

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
13.0.0 239 10/23/2025
10.0.0 190 10/23/2025

Initial release with member group dashboard, bulk processing tools and member statistics panel