WordPress Plugin License Expired: What Actually Breaks

WordPress Plugin License Expired: What Actually Breaks

When a WordPress plugin license expired notice appears in your dashboard, the plugin itself almost never stops working — what stops is the supply of updates, the support channel, and in some cases a hosted service the plugin was only ever a front end for. That distinction is the whole decision. A plugin whose code does all the work can sit unrenewed for a year and keep doing its job badly; a plugin that calls a vendor’s API goes dark on a schedule the vendor chooses, and you need to know which kind you are running before the renewal invoice arrives.

The short answer, if that is all you came for

Your site keeps running. Paid WordPress plugins are licensed under the GPL or a GPL-compatible license, and the key you bought grants you updates, downloads and support for a period — not permission to execute the code. So the files stay, the features stay, and the security patches stop. The exceptions are plugins that talk to a vendor’s servers, which lose that service, and vendors who block re-downloads, which means an expired key cannot rebuild a site from scratch.

What a WordPress plugin license expired warning actually means

Two separate things get confused here, and keeping them apart saves money and panic in roughly equal measure.

The first is the software license. Everything in the WordPress.org plugin directory has to be GPL or GPL-compatible — the directory’s own guidelines put it plainly: all code, data and images must comply with the GPL or a GPL-compatible license, with GPLv2 or later strongly recommended. Most commercial plugins distributed outside the directory follow the same model, because they are derivative works of WordPress itself. Under that license you may keep running the version you have, indefinitely, on as many of your own sites as you like.

The second is the commercial agreement attached to your license key. That is a support-and-updates subscription with an expiry date, and it is enforced technically: the vendor’s update server checks your key and declines to hand over a new ZIP when it has lapsed. Nothing checks your key at runtime on a well-behaved plugin, because there would be no legal basis to switch off code you already lawfully hold.

WooCommerce states the first part about as directly as a vendor can. Its FAQ says you can still use the product on your site for as long as you like, while you can no longer access the file for download or receive support or updates. Gravity Forms says the same in its own words: the plugin will remain on your sites and continue to operate, but with limitations — no updates, including bug fixes and security updates, and no support.

One thing not to do about it

Sites that go looking for “free” repackaged copies of commercial plugins to dodge a renewal end up with modified code from an anonymous source running with full database access. That is a malware delivery route, not a licensing strategy, and the cleanup costs multiples of the renewal. If a license is not worth renewing, the honest options are to replace the plugin or to remove it — both are covered further down.

Three things that break, and only one of them is obvious

Group your paid plugins by which of these they are. The grouping predicts what expiry costs you far better than the price does.

Type of pluginWhat happens the day the key expiresWhat it costs you over six months
Code-only. Form builders, custom field frameworks, table and layout plugins, most WooCommerce extensionsNothing visible except a dashboard notice. Every feature keeps working on the version you haveCompounding risk. No security patches, and no compatibility fixes for the next WordPress or WooCommerce release
Service-backed. Anything whose work happens on the vendor’s servers: image compression, cloud CSS processing, address validation, tax rate lookups, spam scoringThe local settings survive; the remote work stops, usually on a short grace period rather than instantlyImmediate and visible. The feature you were paying for is simply absent, and a page that relied on it changes behaviour
Download-gated. Vendors who tie reinstallation to an active keyStill nothing visible — until you need to reinstall, move hosts, or register a new siteYou cannot rebuild. An expired key may be unable to activate a site even when restoring a backup of one it previously covered
Behaviour per each vendor’s published documentation; check your own vendors, because these policies differ and change.

The service-backed row deserves a concrete example, because “it keeps working” is misleading there. WP Rocket’s documentation says the plugin will continue to operate normally after expiry, then lists the cloud features — Remove Unused CSS, Load CSS Asynchronously and Rocket Insights — as stopping 15 days after the license expires. Caching carries on. The optimisations that made your Core Web Vitals numbers look good are the ones that quietly leave, two weeks later, long after anybody connects the change to a billing email. If you are weighing that kind of dependency up front, WooCommerce caching plugins: what breaks and what works goes through which parts of each option run locally.

The download-gated row is the one that ambushes agencies. Gravity Forms documents that an expired key cannot download the core plugin files or any add-ons, and cannot register a new site even when you are restoring a backup of a site the key previously covered. Read that again if you maintain client sites: your disaster recovery plan assumes you can reinstall what you already own, and for some vendors that assumption expires with the key.

Why “it still works” is the dangerous part

An expired plugin does not just stop receiving updates. It usually stops appearing in the places you look for updates, which is a different and worse problem.

Commercial plugins are not in the WordPress.org directory, so core has no way to check them. Each one ships its own updater, typically a filter on pre_set_site_transient_update_plugins that calls the vendor’s license server while WordPress is building the update list. Feed that server an expired key and it returns nothing available. Your Plugins screen then shows exactly what it shows for a plugin that is fully up to date: no notice, no row, nothing to click.

There is a second way to miss it. Because the check lives in the plugin’s own code, it only runs when the plugin is loaded — so an automated update job that runs WP-CLI with --skip-plugins never registers those filters and never sees those updates. Sites with disciplined automation can therefore be the ones most confident about patch levels they do not actually have.

Put those together and the failure mode is a plugin sitting at a version from fourteen months ago, with a vulnerability disclosed nine months ago, on a site whose owner reasonably believes everything is current because nothing is asking to be updated. Compare that with how a core problem behaves: when WordPress 7.1.2 shipped a fix for a critical CVE, the update appeared on every site within hours and automatic updates handled most of them. Commercial plugins have no equivalent, and WordPress 7.1 does nothing to change that.

Site Health will not catch this for you

The Site Health screen reports plugins that are inactive or that core knows to be out of date. A premium plugin whose updater has gone silent is neither, as far as core can tell. Useful as the screen is — and WordPress Site Health: how to find and fix common problems covers what it does catch — a green panel is not evidence that your paid plugins are patched.

Audit what you are actually paying for, from the shell

Most sites cannot answer two basic questions: which installed plugins are commercial, and which of those keys are still live. Both are a couple of commands with WP-CLI.

1. Separate the paid plugins from the free ones

# Plugins WordPress.org has no record of are your commercial ones
wp plugin list --fields=name,version,update,update_version,wporg_status,auto_update

The wporg_status column is the useful one: anything blank or unrecognised there is a plugin core cannot check against the directory, which is your shortlist. Note that update saying none for those rows means “the plugin’s own updater reported nothing”, which includes the expired-key case — so treat none on a commercial plugin as unknown rather than reassuring.

2. Find the license keys and their stored state

# Almost every commercial plugin stores its key and status in wp_options
wp option list --search='*license*' --fields=option_name,autoload,size_bytes
wp option list --search='*_lic*'    --fields=option_name,autoload,size_bytes

# Read one back, unserialised, to see the expiry date the plugin cached
wp option get edd_sample_license_status --unserialize

Option names vary by vendor — *license*, *_lic* and the plugin’s own prefix catch most of them. What you are looking for is the cached status payload, which usually contains the literal expiry date. That is faster and more honest than logging into five vendor dashboards, and it tells you about keys belonging to plugins somebody deactivated but never deleted.

While you are in there, check the autoload column. Licence status payloads are frequently autoloaded, which means they are read on every single request including every uncached front-end page view, and dead keys from removed plugins keep being loaded for years. On a site with a long plugin history that is measurable — auditing and trimming WordPress autoloaded options covers how to find and clear them without breaking anything.

3. Check the plugin headers for an Update URI

grep -rn --include="*.php" -m1 \
  -e "Update URI:" -e "^ \* License:" \
  wp-content/plugins/*/ | sort

The Update URI header, available since WordPress 5.8, exists so a plugin hosted outside the directory is not accidentally overwritten by a similarly named plugin on WordPress.org. Its presence is a reliable signal that a plugin is self-updating, and the value tells you which vendor’s server it is asking. The License header on the same pass confirms the GPL point above for each plugin you are running.

Renew, replace, or remove: how to decide

These are the criteria I weigh on client sites, in roughly this order. They are deliberately about exposure rather than about features, because features are what you compared when you bought the thing and exposure is what you are deciding about now.

Does it handle untrusted input? Anything that accepts a form submission, a file upload, a webhook or a URL parameter from the public is the first renewal on the list, every time. An unpatched form builder or payment extension is a different category of risk from an unpatched admin-side table styler.
Is it service-backed? If the value lives on the vendor’s servers, there is no “run it unrenewed” option to consider. You are choosing between paying and losing the feature, so decide on that basis rather than discovering it two weeks after expiry.
How much content is locked inside it? A plugin that stores its data as its own shortcodes or proprietary block markup across 400 posts is expensive to leave, whatever the renewal costs. A plugin that writes ordinary post meta is cheap to leave. This is the single biggest factor in the real cost and the one people never price in at purchase.
Can you still download it? Before you let a key lapse deliberately, pull the current ZIP and store it with your backups. If the vendor gates downloads behind an active key, that archive is the difference between a recoverable site and a rebuild.
Is the vendor still shipping? A plugin with no release in two years is already effectively expired, renewed or not. You are paying for a maintenance promise; check the changelog to see whether it is being kept before you renew out of habit.
Does core now do it? Several things people still pay for shipped into WordPress over the last few releases. Reusable layout blocks are the clearest case. Audit before renewing, not after.

If replacing is the answer, forms are the most common case, and the migration is more work than it looks: entries live in the old plugin’s tables, and notification routing, conditional logic and payment feeds all have to be rebuilt rather than imported. Contact Form 7 and Fluent Forms are the usual free destinations, and BeautyForms Form Builder is another — disclosure: I build and maintain that one, so judge it against the same criteria as the others, starting with whether its field types cover the forms you already have. Export your existing entries to CSV before you deactivate anything, because that export usually needs the old plugin active.

Whichever direction you go, do the swap on a staging copy and rehearse the deploy. Pushing staging to live in WordPress without losing orders covers getting the change onto production without clobbering data that arrived while you were working, which is exactly the risk when the plugin you are replacing collects submissions or orders.

If you decide to run a plugin unrenewed anyway

Sometimes that is the right call: a small admin-side utility, a site with no public input, a plugin you are removing next quarter anyway. Make it a deliberate, documented position rather than a drift.

  1. Archive the exact ZIP you are running, with its version number in the filename, alongside your database backups.
  2. Write the plugin name, version and the date the key expired into whatever document a future maintainer will actually read.
  3. Subscribe to a vulnerability feed that covers plugins by slug and version, since your dashboard has stopped being that early-warning system.
  4. Re-test the plugin after every WordPress and PHP upgrade, in the editor as well as the front end. Abandoned code breaks on your upgrades, not on its own.
  5. Set a review date. “Indefinitely” is how a deliberate decision becomes an eight-year-old attack surface.

Point four is where most of the eventual pain lives. When an unmaintained plugin does break after a core upgrade, you have no vendor to ask, so you are isolating it yourself — troubleshooting a WordPress plugin conflict step by step is the method, and updating WordPress plugins safely covers the ordering that keeps the cause identifiable.

So should you renew?

  • A form, checkout, upload or payment plugin on a public site: renew. This is the clearest yes on the page, and it is a security decision rather than a feature one.
  • Anything service-backed: renew or replace now, on your schedule. Letting it lapse means the feature disappears on the vendor’s timetable, typically after a short grace period you will not remember.
  • An agency or freelancer maintaining client sites: renew, and treat it as insurance on your own recovery ability rather than as a feature purchase. A key you cannot use to reinstall is a gap in every restore plan you have.
  • Deep content lock-in and a working install: renew this cycle, then spend the year reducing the lock-in. Deciding under pressure after something breaks is how sites end up paying for both the renewal and the migration.
  • An admin-only utility, no public input, stable site: reasonable to let it lapse. Archive the ZIP, document it, set a review date.
  • A plugin whose job core or an existing plugin now does: do not renew, and do not keep it either. Removing it is the only option on this list that reduces your maintenance load — the plugins most sites genuinely need is a useful filter for that pass.

One practice is worth more than any of these individually: keep a plain list of every commercial plugin on the site, its vendor, its renewal date and who holds the account. The most common version of this problem I see is not an expensive renewal. It is a site running three paid plugins whose keys were bought on a former employee’s credit card, where nobody can renew anything because nobody can log in.

Frequently asked questions

Will my site break if a WordPress plugin license expires?

Not on the day it expires. The plugin files stay on your server and keep running the version you have. What you lose is updates, support and the ability to download the plugin again from most vendors. The exception is a plugin whose features run on the vendor’s servers — those stop, sometimes after a short grace period.

Is it legal to keep using a plugin after the license expires?

For GPL-licensed plugins, continuing to run the version you already have is normal and expected — vendors such as WooCommerce and Gravity Forms say so in their own documentation. Your subscription bought updates and support for a period, not permission to execute the code. Check your specific vendor’s terms, and note that this is general information rather than legal advice.

Why does my Plugins screen show no update available when the license is expired?

Because the plugin checks for its own updates by calling the vendor’s license server, usually through the pre_set_site_transient_update_plugins filter. An expired key gets an empty answer, and an empty answer looks identical to “you are up to date”. That is why an expired commercial plugin is more dangerous than an obviously outdated free one: nothing nags you.

Can I reinstall a premium plugin after the license expires?

Often not from the vendor. WooCommerce says an expired subscription can no longer access the file for download, and Gravity Forms says an expired key cannot download core files or add-ons, nor register a new site even when restoring a backup. Keep your own copy of the ZIP you are running before a key lapses, stored with your backups.

How do I find which plugins on my site are premium?

Run wp plugin list --fields=name,version,update,wporg_status,auto_update and look at the wporg_status column — plugins the directory has no record of are the commercial ones. Then wp option list --search='*license*' to find the stored keys and their cached expiry dates. A grep for the Update URI header across wp-content/plugins confirms which ones self-update.

Does an expired license affect WordPress automatic updates?

Core and directory plugins are unaffected and keep updating normally. The expired plugin simply drops out of the update system, so automatic plugin updates have nothing to apply to it. Be aware too that an automation running WP-CLI with --skip-plugins never loads those self-updaters, so it cannot see premium updates even when a key is valid.

How many sites can one plugin license cover?

That is set by the vendor’s plan, not by the GPL, and it is enforced through activation counts on their license server. Check the site limit before buying for client work, and check whether deactivating a site frees the slot — some vendors release it immediately, others require a support request.

Sources

Leave a Reply to This Post