GroupsIO Group Manager

A WordPress plugin built for BITS, a blindness-focused nonprofit and professional affiliate of the American Council of the Blind. It keeps BITS’s Groups.io mailing lists in sync with actual paid membership, automatically, so no one has to manage list access by hand.

The problem

BITS runs its member communication over Groups.io mailing lists and manages paid membership through Paid Memberships Pro (PMPro) on WordPress. Before this plugin existed, keeping the two in sync was a manual job — someone had to notice when a membership lapsed or a new member joined, and update Groups.io by hand. Miss it, and either a lapsed member keeps member-only access, or a new member goes unreached.

What it does

How it’s built

Membership-change events are picked up via PMPro’s pmpro_after_all_membership_level_changes hook and handed off to a background job queue (Action Scheduler), so a member checking out or an admin making a change is never blocked waiting on a Groups.io API round trip. Every add and remove call is logged to a dedicated audit table, with its own retention policy. The Groups.io API client handles rate limiting (HTTP 429, honoring Retry-After with jitter) and retries transient failures with exponential backoff, and hard-stops all sync activity with an admin alert if the API credential itself becomes invalid.

Because a single member can be registered under different email addresses for different mailing lists, sync and removal logic operates on (list, email) pairs rather than assuming one address covers a member’s entire subscription. The plugin also honors Groups.io’s own unsubscribe, bounce, and spam signals — once flagged, a member is permanently excluded from future automatic adds, in keeping with CAN-SPAM — and handles GDPR/CCPA right-to-be-forgotten erasure with an immediate, no-grace-period removal from every list.

Admin controls

Administrators work through a “GroupsIO Management” admin menu with three pages: feature controls (mandatory lists, grace period before removal, log retention, and an emergency kill switch), subgroup management (creating, editing, and inspecting the Groups.io subgroups themselves), and user assignment (a searchable member list with per-member details and manual override tools for when automation needs a human to step in).

View the source on GitHub (opens in a new tab)

Back to projects