Documentation: Buyers and Attendees List - Understand how to set up and use our excellent plugin.
This guide covers installation, configuration, and everyday use of Buyers and Attendees List.
You can display the list in two ways:
- Shortcode: add the list anywhere (page/post/product description)
- Auto-insert: optionally show the list automatically on matching product pages
To avoid slow product pages, the default render mode is async, which loads the attendee table via AJAX after the page is visible.

Requirements
- WordPress 5.8+
- WooCommerce 6.0+
- PHP 7.4+
- A valid license key (licensed builds)
1) Installation
- In WordPress Admin, go to Plugins → Add New → Upload Plugin.
- Upload the plugin ZIP and click Install Now.
- Click Activate.
- Configure plugin settings under WooCommerce → Settings → Attendees List.

4. Quick start
- Edit an event product page (or create a dedicated page).
- Add the shortcode:
[buyers_attendees_list]- View the page on the front end. The list will:
- show a loading message, then
- render the attendee table once it loads via AJAX (default behavior)
5. Using the shortcode
Basic shortcode
[buyers_attendees_list]The shortcode will automatically use the current product context if placed on a single product page.
Backwards-compatible alias shortcode
This plugin also registers:
[event_attendees_table]This is an alias for [buyers_attendees_list] to preserve compatibility with older installs/content.
Optional shortcode attributes
Specify a product ID
Use this if you’re placing the shortcode on a non-product page:
[buyers_attendees_list id="123"]Render mode: async (default) or sync
async= outputs a loader and fetches the table via AJAX (fast initial page load)sync= renders the table immediately as part of the page HTML (use cautiously for large events)
[buyers_attendees_list mode="async"]
[buyers_attendees_list mode="sync"]Enable/disable DataTables formatting
If enabled, the table uses DataTables for improved table handling.
[buyers_attendees_list datatable="1"]
[buyers_attendees_list datatable="0"]DataTables are only initialized once per table to prevent “Cannot reinitialise DataTable” errors.
Require login on a per-shortcode basis
You can require users to be logged in to view the list:
[buyers_attendees_list require_login="1"]6. Auto-insert on product pages
Auto-insert lets you show the attendee list automatically below the single product summary, without editing product descriptions.
- Go to WooCommerce → Settings → Attendees List → General
- Enable Auto-insert on product pages
- (Optional) Restrict auto-insert to specific product categories
- Set the heading text (default: “Who’s Coming:”)
The list will display on matching products at:
woocommerce_after_single_product_summary(priority 25)

7. Settings reference
Settings are located here:
WooCommerce → Settings → Attendees List
This plugin uses a dedicated WooCommerce settings tab with sub-tabs:
- General
- Behavior
- Display
- Styling
- Maintenance
- Licensing (only shown when not built for WooCommerce.com)

General
Auto-insert on product pages
Automatically displays the attendees list on single product pages.
Auto-insert categories
Only auto-insert for products in the selected categories.
If empty, auto-insert applies to all products.
Auto-insert heading
Heading displayed above the list when auto-insert is used.

Behavior
Render mode
- Async (recommended): loads attendees after page render via AJAX
- Sync: renders the table immediately in the page HTML
Enable DataTables
Enables the DataTables initialization for the attendee table.
Require login
If enabled, visitors must be logged in to view the attendee list (site-wide default; can be overridden per shortcode).
Cache TTL (seconds)
How long attendee results are cached before refresh.
Fallback days
Limits how far back order history is searched when building attendee results (useful on older stores).
Order statuses
Which order statuses count as “attending.” Defaults include:
wc-processingwc-completed

Display
Control which columns appear and how they are labeled.
Options include:
- Show avatar (with configurable avatar size)
- Show profile link (links attendee name to an author/profile URL)
- Show full name column (on/off for privacy)
- Optional columns: first name, last name, username, email, purchase date
- Customize column labels
- Customize front-end messages (loading/empty/error text)

Styling
These settings map to CSS variables used in the front-end output.
Options include:
- Title color
- Text color
- Muted text color
- Border color
- Background color
- Alternate row background color
- Link color
- Font size

Maintenance
Remove data on uninstall
If enabled, plugin settings (and licensing status where applicable) are removed when the plugin is uninstalled.
Licensing
If your build uses the included licensing/updater system, a Licensing tab will appear.
- Enter your license key to activate updates.
- Some builds may restrict front-end rendering until a license is active.
WooCommerce.com build mode
If distributing via WooCommerce.com, set the constant below to disable the custom licensing system:
define( 'SA_BAL_WCCOM', true );8. How attendee data is determined
The attendee list is built from WooCommerce orders containing the selected product.
Key behaviors:
- If the product is a variation, the plugin can include relevant IDs so attendees are counted properly for variable products.
- The list is primarily based on purchaser user IDs, meaning it will show registered users who purchased the product.
- The list is ordered alphabetically by display name.
Guest checkouts (no associated user account) generally won’t appear in the list, because there is no user ID to display. If your workflow relies heavily on guest purchases, consider requiring account creation at checkout or extending the plugin.
Optional “Purchase date” column:
- When enabled, the plugin looks up and formats the most relevant purchase date per user for the product(s).
9. Performance, caching, and render modes
This plugin is built specifically to avoid slowing down product pages.
Async mode (recommended)
- The shortcode outputs a lightweight wrapper + loading text.
- The attendee table is fetched via AJAX (
admin-ajax.php) and injected into the page. - Results are cached for the configured TTL to reduce repeated order queries.
Sync mode
- The attendee table is generated server-side during page render.
- Use sync mode only when you’re confident the attendee set is small or the page is not performance-sensitive.
Cache invalidation
When orders change, caches are purged for products contained in the order, including events like:
- checkout order processed
- order status changed
- order updated
10. Access control and privacy
Require login
You can require login either:
- globally in Behavior → Require login, or
- per-shortcode via
require_login="1".
Privacy controls
You can limit exposed data by toggling display columns:
- Turn off full names and show only avatars
- Disable email display
- Disable purchase dates
This is useful for member directories where attendees should be visible but personal details should be limited.
11. Developer hooks and filters
Filter: Auto-insert categories
add_filter( 'sa_bal_auto_insert_categories', function( $cats, $product_id ) {
return $cats;
}, 10, 2 );Filter: Order statuses used for attendee lookup
add_filter( 'sa_bal_attendees_statuses', function( $statuses, $product_id ) {
// Example: include on-hold
$statuses[] = 'wc-on-hold';
return $statuses;
}, 10, 2 );Filter: Cache TTL (seconds)
add_filter( 'sa_bal_attendees_cache_ttl', function( $ttl, $product_id ) {
return 600;
}, 10, 2 );Filter: Fallback days (how far back to search)
add_filter( 'sa_bal_attendees_fallback_days', function( $days, $product_id ) {
return 365;
}, 10, 2 );Filter: Purchase date format
add_filter( 'sa_bal_attendees_purchase_date_format', function( $format ) {
return 'M j, Y';
});12. Troubleshooting
The list shows “No product context found.”
- Add
id="123"to the shortcode, or - Place the shortcode on a single product page.
The list is stuck on “Loading attendees…”
- Confirm your site isn’t blocking
wp-admin/admin-ajax.php. - Check the browser console for JavaScript errors.
- Temporarily disable caching/minification plugins to test.
The list is empty but I know people purchased
- Confirm the purchasers are registered users (not guest checkout).
- Confirm the order statuses you count are included in Behavior → Order statuses.
- If your event is older, increase Fallback days.
I’m seeing performance issues on large events
- Use Async mode (Behavior → Render mode).
- Increase cache TTL so repeated loads don’t query orders constantly.
- Limit auto-insert to specific categories (so the plugin doesn’t run everywhere).
- Consider disabling “Purchase date” if it adds overhead on very large lists.
DataTables warning: “Cannot reinitialise DataTable”
- This plugin prevents re-init by checking whether the table is already a DataTable before initializing.
- If you have custom theme scripts also initializing DataTables globally, exclude
.sa-bal-attendees__tablefrom your custom initializer.
