Skip to content
PLUGIN · PLUGINLEDGER v1.0.0 May 2026
// Agency

PluginLedger

A clean ledger of every plugin running on your site.

Track who installed and owns every plugin on your site. Auto-captures the installer’s name, email, and date on activation. You fill in the license owner once. Pro adds renewal tracking, expiry alerts, a stats dashboard, and CSV export. Built for agencies and freelancers maintaining multiple WordPress sites.

Version 1.0.0
Requires WP 6.0+
Tested up to 6.9.4
License GPL-2.0+

Every WordPress site eventually accumulates plugins whose origin nobody remembers. The agency installed Yoast in 2019. The freelancer added a custom forms plugin in 2021. The previous developer dropped a license-locked SEO tool into the directory and never wrote it down. Three years later, something stops working, and the team spends two hours figuring out who owns what.

PluginLedger fixes that. Every plugin on your site gets a small ledger entry: who installed it, when, who holds the license, when it renews, and any notes you want to keep. The information lives next to the plugin in the standard WordPress plugins list, so the next person who looks at the site has the answers immediately.

The free version on WordPress.org auto-captures the installer and lets you add ownership and notes. Pro adds renewal date tracking with color-coded expiry alerts, a stats dashboard, and CSV export for client handovers and audits.

// What it looks like

A look at the admin.

A representative view of the admin interface. Real screenshots coming soon.
// What's included

What you get, free or Pro.

Feature Free Pro
Auto-capture installer name and email on activation
Owner column on the WordPress plugins list
Auto-sync existing plugins on first activation
Manual "Sync now" button
Admin notice after activation prompting for owner
License owner name + email + notes per plugin
Color-coded status dots (documented / not)
Developer hooks (filters)
Renewal date tracking per plugin
Expiry alerts: "Expiring soon" (within 30 days)
Expiry alerts: "Expired" (past renewal date)
Stats dashboard (Total / Documented / Expiring / etc)
CSV export (UTF-8 BOM, opens cleanly in Excel)
Renewal column in the plugins list
License-managed updates and site transfer
// Documentation

Everything you need, written by hand.

Read top to bottom, or jump to the section you're after.

Quick start

Install the plugin from the WordPress directory and activate it. PluginLedger immediately auto-syncs every plugin already active on the site and creates a ledger entry for each. Visit Settings → PluginLedger to see the full ledger.

A new "Owner" column also appears on the standard Plugins page next to each plugin. Click "+ Add" or "Edit" in that column to record the license owner, and (Pro) the renewal date.

That's the entire setup. There's no onboarding wizard, no account creation, no API key.

What gets captured automatically

When any plugin is activated on your site (whether you activate it or another admin does), PluginLedger captures three things:

  • The display name and email of the WordPress user who activated it
  • The date and time of activation
  • The plugin's display name and file path

That information is recorded in the ledger immediately. A dismissable admin notice appears at the top of the screen prompting you to fill in the license owner. The notice persists across page loads until either you save the record or click the dismiss button.

If a plugin is already in the ledger from the initial sync but has no installer recorded yet (a common case for plugins that were active before PluginLedger was installed), the next activation refreshes the installer info silently.

What you fill in once

Per-plugin, you fill in:

License Owner Name — who holds the license. Could be the client's company, a specific person, or your agency name if it's something you license on behalf of all your clients.

License Owner Email — the email address the license is registered under. Useful for password resets and renewal coordination later.

License Renewal Date (Pro only) — the date the license expires or needs renewal. Leave blank for lifetime licenses or free plugins. Drives the color-coded expiry alerts.

Notes — free-form text. Common notes: "Client's personal card — do not cancel," "Dev license covers 5 sites," "Renewal handled by the client directly."

Save and the record is locked in. The dismissable notice for that plugin disappears. The Owner column updates immediately on the plugins list page.

The Owner column on the plugins list

PluginLedger adds an "Owner" column to the standard WordPress plugins list page. For each plugin you'll see one of three states:

No record yet — a dash with an "+ Add" link. Click to start recording ownership.

Installer captured but no owner — a yellow status dot, the installer's name in italic gray, and an Edit link. The installer is not the same as the license owner; this state means PluginLedger knows who activated the plugin but you haven't filled in the actual license-holder yet.

Owner documented — a green status dot, the license owner's name in bold, and an Edit link.

(Pro) Renewal expiring — a yellow status dot with a "Renews: [date]" line in gray, when the renewal is within 30 days.

(Pro) Renewal expired — a red status dot with a "Renews: [date]" line in red, when the renewal date is in the past.

The visual states are designed to make a glance at the plugins list answer two questions: who owns this plugin, and is anything about to expire?

The ledger dashboard

At Settings → PluginLedger you'll find the full ledger view. Free and Pro share the same page, but Pro adds a stats dashboard, a Renewal column, and CSV export.

Free version

A simple table with columns for Plugin, Installed By, License Owner, and Notes. A status dot on each row (green for documented, yellow for not). A "Sync now" button to manually re-scan active plugins. An Edit button on each row to update ownership.

Pro version

The page has two tabs: Ledger and License.

Ledger tab opens with five stat cards:

  • Total Plugins — every plugin in the ledger
  • Documented (green) — plugins with an owner recorded
  • Undocumented (yellow) — plugins without an owner
  • Expiring Soon (yellow) — renewal date within 30 days
  • Expired (red) — renewal date in the past

Below the stats is the ledger table with an additional Renewal column. Rows for expired plugins are highlighted, and rows for expiring-soon plugins are subtly tinted. The same Sync and Edit buttons are present, plus an Export CSV button.

License tab shows a single license-key field. Paste the key from your Lemon Squeezy purchase receipt and click Activate. Activation registers the site with Lemon Squeezy and unlocks Pro features. Click Deactivate to free the seat and use the license on another site.

The CSV export (Pro)

On the Pro Ledger tab, click Export CSV. You'll get a download named plugin-ledger-export-YYYY-MM-DD.csv with one row per plugin. Columns:

  • Plugin (display name)
  • Plugin File (the path WordPress identifies the plugin by)
  • Installed By (name)
  • Installer Email
  • Installed At (date and time)
  • License Owner
  • Owner Email
  • Renewal Date
  • Notes

Files are written with a UTF-8 BOM so Excel reads accented characters and currency symbols correctly without import gymnastics.

Common uses: client handovers (give the client a complete record of every plugin and its license state), agency audits, due-diligence documentation, and migrations to new hosting where you want a paper trail.

The export columns and individual row data can be modified by developers via the pl_csv_columns and pl_csv_row filters — see the Developer Hooks section.

Common workflows

Inheriting a client site

Install PluginLedger and activate it. The plugin auto-syncs every existing plugin into the ledger with empty owner fields. Walk through the plugins list and fill in what you know. For plugins where you don't know the owner yet, leave them blank with a note like "ask client" — the yellow status dot will remind you next time you visit the page.

Documenting at a steady pace

You don't have to fill out the entire ledger in one sitting. Each time you activate a new plugin, the admin notice prompts you to add the owner right then, while the install is fresh. Existing plugins can be filled in opportunistically — whenever you're already on the plugins page for another reason.

Tracking renewals (Pro)

When you record a license, add the renewal date in YYYY-MM-DD format using the date picker. Once the date is within 30 days, the plugin row highlights yellow on both the plugins list and the ledger dashboard. Once the date passes, the row turns red. You'll see the change at a glance the next time you visit the plugins page — no separate inbox to monitor, no email reminders to set up.

Client handover (Pro)

Click Export CSV on the ledger tab. Hand the file to the client (or to the next developer taking over the site) along with normal handover documentation. The client gets a complete record of every plugin: who licensed it, who installed it, when it renews, what notes apply.

Re-syncing after bulk plugin operations

If you bulk-install plugins via WP-CLI, a host control panel, or any path that doesn't go through WordPress's normal activation hook, those plugins won't auto-capture an installer. Click Sync now on the ledger page to add them to the ledger as plain entries. The owner fields stay blank for you to fill in.

Troubleshooting

The Owner column doesn't appear on the plugins list

The column is added on every page load via WordPress's manage_plugins_columns filter. If it doesn't appear, deactivate and reactivate PluginLedger. If you have a plugin or theme that aggressively customizes the plugins list view, it may be removing custom columns — check those for compatibility.

Auto-capture didn't record an installer

The capture only fires on the activated_plugin hook, which means the plugin must be activated through the normal WordPress admin path. Plugins activated via WP-CLI, mu-plugins (must-use plugins), or direct database manipulation don't trigger the hook. Use Sync now to add those plugins to the ledger; the installer field will be blank and you can fill it in manually.

The dismissable notice keeps reappearing

Dismissing the notice is per-plugin: each plugin file path is tracked separately. If you dismiss the notice for one plugin and another notice appears, that's a different plugin's reminder. Save the record (or dismiss again) for each one to clear them all.

I see the same plugin twice in the ledger

Plugin files have a unique constraint on plugin_file, so duplicates shouldn't happen at the database level. If you see what looks like a duplicate, it's usually two different plugin files (e.g. a plugin and its add-on are listed separately). Check the file path under each row.

(Pro) Status dot stays yellow even though I added the owner

The dot turns green only when the License Owner Name OR Email is filled in. If both fields are empty, the dot is yellow. If you've filled in only the renewal date but no owner, the dot is still yellow because the owner is missing. Add at least one of the owner fields to see the green status.

(Pro) CSV export is empty

The export only includes records currently in the ledger. If you've never synced and never activated any plugins after installing PluginLedger, the table will be empty. Click Sync now first, then export.

Frequently asked questions

Does this slow down my site?

No. PluginLedger only does work in the admin, and only on specific events: a plugin activation (one database write), a page load on the plugins list (one read per row), or a page load on the settings page. Front-end visitors are completely unaffected. The plugin doesn't run a single line of code on a public page request.

Where is the data stored?

In a single custom database table on your own site: wp_pl_ledger. Nothing is sent externally except the Pro license activation, which contacts Lemon Squeezy once to register the site.

Does it work on multisite?

The ledger is per-site, not network-wide. Each site in a multisite installation has its own ledger. Network-activated plugins are captured on the site where activation actually occurs.

What happens if I uninstall a plugin?

The ledger record stays. WordPress's activated_plugin hook captures activations, but PluginLedger doesn't listen for deactivation or deletion. The intent is to keep the record as a paper trail even after the plugin is gone — useful for audit logs and historical reference. If you want to remove a stale record manually, you can do that from the ledger table by editing the database row directly, or just edit the record's notes field to mark it as deleted.

Can I edit a ledger record from the plugins list page?

Yes. Click the small "Edit" link below the owner info in the Owner column. It opens the edit form on the PluginLedger settings page with that plugin pre-selected.

How do I uninstall completely?

Deactivate the plugin and delete it from the Plugins screen. The ledger table and options are removed automatically by the uninstaller. If you want to keep the ledger data for historical reference, export it to CSV first.

Developer hooks

PluginLedger exposes filters for integrations.

Filter: pl_should_capture_installer

Return false to skip ledger capture for a specific plugin activation. Useful for skipping internal-only plugins, mu-plugins that don't need tracking, or plugins activated by automated scripts that shouldn't write the script-runner's identity into the ledger.

add_filter( 'pl_should_capture_installer', function( $should, $plugin_file ) {
    if ( strpos( $plugin_file, 'internal-' ) === 0 ) {
        return false;
    }
    return $should;
}, 10, 2 );

Filter: pl_csv_columns (Pro only)

Modify the column headers in the CSV export. Useful for renaming columns to match your agency's standard handover template, or removing columns you don't want in the export.

add_filter( 'pl_csv_columns', function( $columns ) {
    // Rename "License Owner" to "Account Holder"
    $columns[5] = 'Account Holder';
    return $columns;
} );

Filter: pl_csv_row (Pro only)

Modify a single CSV row before it's written. Useful for adding computed fields, formatting dates, or sanitizing notes for external sharing.

add_filter( 'pl_csv_row', function( $line, $row ) {
    // Format the install date as YYYY-MM-DD only
    $line[4] = substr( $row['installed_at'], 0, 10 );
    return $line;
}, 10, 2 );

Upgrading from free to Pro

Pro is a complete replacement for the free plugin, not an add-on. When you upload and activate Pro:

  1. The free version is automatically deactivated
  2. Pro reads the existing wp_pl_ledger table — your records are preserved
  3. The schema is upgraded: a renewal_date column is added, and email columns are widened from VARCHAR(100) to VARCHAR(255) to accommodate longer addresses
  4. The Pro UI replaces the free UI: tabs appear, stats dashboard renders, the Owner column on the plugins list adds renewal info

There's no manual migration step. Existing records continue to display correctly; the renewal date is simply blank until you fill it in. When you do add a renewal date, the row picks up the new color-coded status automatically.

Support

Questions, bug reports, and feature suggestions go to info@aurumane.com. Pro license holders get a faster reply. Free users get the same answer, just sometimes a day later. Either way, the reply comes from the developer who wrote the plugin.

// Coming soon

PluginLedger is on the way.

Drop a note and I'll let you know the day it ships.

Aurumane
A WordPress Plugin Studio
Manila, Philippines · UTC+8
Mail
info@aurumane.com
Web
aurumane.com
Reply
Within 24 hours, written by hand