Skip to main content
Plugins Docs About Support Pricing My Account Browse Plugins
Licensing

Bodholdt Licensing

Self-hosted software licensing for WordPress

v10.52.8 · Oct 21, 2026
PHP 8.0+
WP 6.0+
GPL-licensed
14-day money-back
Documentation

Get Bodholdt Licensing

Keep 100% of your revenue. No per-sale cut or platform tax from us, though normal payment-processor fees still apply. Choose monthly, annual, or lifetime billing.

Hobby

$49.00 /yr

Paying annually saves 32% against twelve monthly payments.

Self-hosted plugin licensing.

  • 1 product, 1 site
  • License keys + auto-updater
  • Stripe-powered checkout
  • Customer portal + Stripe billing portal
  • Generator for a ready-made client library (SDK) for the plugins you sell
  • Email support from the developer, for as long as your license is active
Buy Hobby →

14-day money-back guarantee. Monthly and annual plans cancel anytime from your customer portal, and you keep access to the end of the period you paid for.

Studio

$99.00 /yr

Paying annually saves 31% against twelve monthly payments.

Everything in Hobby, plus:

  • Unlimited products (Hobby covers 1)
  • Up to 5 sites
  • Reports & analytics for revenue, monthly recurring revenue (MRR), license health, and seat utilization
Buy Studio →

14-day money-back guarantee. Monthly and annual plans cancel anytime from your customer portal, and you keep access to the end of the period you paid for.

Foundry

$199.00 /yr

Paying annually saves 17% against twelve monthly payments.

Everything in Studio, plus:

  • Up to 127 sites
Buy Foundry →

14-day money-back guarantee. Monthly and annual plans cancel anytime from your customer portal, and you keep access to the end of the period you paid for.

If your license ends, your existing customers keep their licenses, downloads and portal, and your store stops issuing new licenses and taking new orders until you renew. Once your license is active, your store keeps working if it cannot reach bodholdtlabs.com. Prices are in US dollars and do not include tax. Any sales tax, VAT or GST that applies is added at checkout.

See full feature comparison →
Feature HobbyStudioFoundry
Sites 15127
Products you can sell 1∞∞
License keys + auto-updater IncludedIncludedIncluded
Stripe checkout + customer portal IncludedIncludedIncluded
SDK generator IncludedIncludedIncluded
Reports & analytics Not includedIncludedIncluded
Lifetime license option IncludedIncludedIncluded
Support Email while activeEmail while activeEmail while active

Every paid license includes email support from the developer while the license is active. A one-time (Lifetime) license has no renewal date, so its support does not stop at one. Bug reports, pre-sales and billing questions are always free.

Real screens from Bodholdt Licensing

These are real admin screens, not mockups. Click any one to view it full size.

The licenses table: status chips for all, active, expired and revoked, and rows with a license key, a copy button, the customer email, the product and its expiry date.
Issue a license, search, filter, export, revoke it, and manage domain activations. Paid or order-backed licenses are retained; only non-purchase test or manually issued licenses can be permanently deleted.
The catalog status column: three plugins marked no purchase plan and a bundle marked component ZIP missing, so nothing reads as ready to sell when it is not.
Your catalog at a glance: plugin or bundle, the version each product is serving, and a status column that says plainly when something is not ready to sell yet, whether that is a missing purchase plan or a component ZIP that is not in the vault.
The License settings tab: the evaluation-active notice with days remaining, the license key field, and the line that the saved key is never rendered back into the page.
The License tab distinguishes the built-in seven-day evaluation from a paid key, and never renders a saved key back into the page.
Step one of the Stripe checklist: where the secret key and webhook endpoint come from, and the nine webhook events to select, listed exactly.
A guided checklist for Stripe, including the exact webhook events to select, then products, store pages, the client SDK, email delivery and the customer portal.

A complete self-hosted software licensing system for WordPress. Manage license keys, handle activations, process Stripe payments, and deliver updates, all from your own server. Optional Stripe Managed Payments support for new checkouts, with Stripe as merchant of record.

License key generation and management

Stripe checkout for subscriptions, one-time payments, and configurable customer-product trials

Generator for a drop-in client library (SDK) with an auto-updater and license-status gating

Reports and analytics for monthly and annual recurring revenue (MRR and ARR), license health, and seat utilization (Studio and Foundry)

Automatic, license-authenticated updates

Customer portal plus the Stripe billing portal

Product bundles and tier-aware license issuance

License check, activation, and deactivation endpoints, Stripe webhooks, and branded emails

The Sovereign Mint, an optional game layer that is off until you switch it on, with ranks, trophies, and points that grow with your recurring revenue

  • License key generation and management
  • Stripe checkout for subscriptions, one-time payments, and configurable customer-product trials
  • Generator for a drop-in client library (SDK) with an auto-updater and license-status gating
  • Reports and analytics for monthly and annual recurring revenue (MRR and ARR), license health, and seat utilization (Studio and Foundry)
  • Automatic, license-authenticated updates
  • Customer portal plus the Stripe billing portal
  • Product bundles and tier-aware license issuance
  • License check, activation, and deactivation endpoints, Stripe webhooks, and branded emails
  • The Sovereign Mint, an optional game layer that is off until you switch it on, with ranks, trophies, and points that grow with your recurring revenue
Version
10.52.8
PHP Required
8.0+
WordPress
6.0+
Setup
About an hour, once
License
Commercial GPL
v10.52.8 · Oct 21, 2026
  • In the plugin you run, this release changes the version number, this changelog, the translation template (three of its strings, its version line and the line numbers it cites) and the order confirmation page. If your store uses a translation, those three show in English until your translation adds them.
  • While a payment is still being confirmed, the order confirmation page no longer says "Payment went through" or that this normally takes a few seconds. Some payment methods can take longer to clear, and a buyer who paid that way would land on this page before the payment has cleared. The page now says it is waiting for confirmation that the payment has cleared, that this takes a few seconds for a card or a wallet, and that when a payment takes longer, the keys arrive by email once it clears, so there is no need to keep the page open. After its tenth check, it no longer says how long this takes, and it shows its note about the order still being worked on.
  • An order confirmation link opened more than a day after its order was delivered now reads like any other old link: it points the buyer to their email and to Manage Licenses for the keys, instead of saying that the order is still being confirmed and checking again.
v10.52.7 · Oct 21, 2026
  • In the plugin you run, this release changes the version number, this changelog, the translation template (its version line and the line numbers it cites) and the order confirmation page.
  • The order confirmation page no longer keeps anything in the browser's session storage. While a payment is still being confirmed, the page still checks again every three seconds, up to ten times, and now carries the count of those checks in its own address instead. After the tenth check it shows its note about the order still being worked on, as before, and it no longer says that it will check again.
  • On bodholdtlabs.com, the three reassurances under the buying page's plans now read "Secure payment", "Delivery when payment clears" and "14-day guarantee". The middle one said "Instant delivery", but keys and downloads go out when the payment clears, which is at once for a card or a wallet and later for a few local payment methods.
v10.52.6 · Oct 15, 2026
  • In the plugin you run, this release changes the version number, this changelog, the translation template, the Reports screen and the Numbers card for each app under Software. On the Reports screen, the Software section changes its wording, the order of its apps under By app and the days a range reads, and the This month button at the top of that screen now starts on your site's month. On the Numbers card the wording changes. Nothing about how the counts are kept changes, and nothing new is recorded. The change to the buying page is in a file that runs only on bodholdtlabs.com and is not part of the plugin you receive, so it is here for the record.
  • On bodholdtlabs.com, a link from another page to a section of the buying page now puts the section's heading below the menu, as a link within the page already did. The page's content slides up a little as it appears, and the browser placed the section before the slide had finished, so the heading came to rest partly under the menu. When the page opens at one of its sections, its content now appears in place and only fades in.
  • The Software section of the Reports screen and the Numbers card for each app no longer say how often an app checks for updates. They said an app does it many times a day, or several times a day, and nothing supports either figure: how often an app asks is up to the app and its user. They now say that an update check is counted each time your site sends out an app's update feed, and that downloads and update checks your location rules turn away are counted under Refused instead. One install can make many checks or none, so checks are not an install count.
  • Under By app in the Software section, the apps are now listed by downloads, most first, then by update checks, so the longest bar comes first. Since 10.52.4 the bars have measured downloads, while the apps were still listed by update checks.
  • The Software section's counts are kept per UTC day, while the Reports screen picks its dates by your site's own day. A range that ends today now always includes the current UTC day, so the newest counts are never left out. Before, on a site west of UTC, a download made late in your day, after midnight UTC, was already counted under the next UTC day, so a range ending today left it out, and on a site east of UTC, until midnight UTC, a range of just today read a UTC day that had not started yet and showed nothing. The line under the four counts names the UTC days the section read and says those days start and end at midnight UTC, which may not be midnight at your site. A range that ends on any other day reads the dates you chose, as UTC days. How the counts are stored does not change.
  • On the Reports screen, the This month button now starts on the first day of your site's month. It used the UTC month, so at the turn of each month, between midnight UTC and midnight at your site, it chose the wrong days. The screen's range, its date buttons and its Software section now use one reading of your site's date, so they always agree.
  • The translation template gains three strings and drops three, all on the Reports and Software screens: the Software section's description, the line that names the days it read, and the Numbers card's description each replace the old one. If your store uses a translation, those three show in English until your translation adds them.
  • 10.52.5 was released only on bodholdtlabs.com and was never offered as an update, so its changes reach you with this release. In the plugin you run it changed only the version number, the changelog and the version line of the translation template.
  • The changelog entries for 10.52.5 and 10.52.4 are corrected. The 10.52.5 entry was dated 2026-10-15, its release day in UTC, and is now dated 2026-10-14, the day it was released in Pacific time, as the 10.52.4 entry is. It said that following a link to a section of the buying page puts its heading just below the menu again, which was true of links within the page but not of links from other pages, and it now says so. It said the 10.52.4 entry's item on the Reports screen did not say what changed there, when that item had named some of the changes in shorthand, and it now says that, and that the item did not say the bars for each app now measure downloads. Its phrases about the theme update ("will set", "has not shipped yet", "is not true yet") now say how things stood when 10.52.5 was released, so they stay true once that update ships. The 10.52.4 entry said an app checks for updates many times a day, which nothing supports, and it no longer says so. It said the bars for each app list downloads first, which was true of the figures beside each bar, while the apps stayed in order of update checks until 10.52.6, and it now says that.
v10.52.5 · Oct 14, 2026
  • In the plugin you run, nothing changes in this release except the version number, this changelog and the version line of the translation template. The change to the buying page is in a file that runs only on bodholdtlabs.com and is not part of the plugin you receive, so it is here for the record.
  • On bodholdtlabs.com, following a link within the buying page to one of its sections puts the section's heading just below the menu again. 10.52.4 removed the page's own offset for those headings ahead of a theme update that sets one on every page, and that update had not shipped when 10.52.5 was released, so the headings landed under the menu. Now the page adds its offset only while the theme does not set one, so a heading never lands twice as far down, and the page's offset switches itself off once the theme sets its own. A link from another page still left the heading partly under the menu, which 10.52.6 fixes.
  • The changelog entry for 10.52.4 is corrected. It said the site's theme already set that offset, which was not true when 10.52.5 was released. It left the Software section of the Reports screen out of what changed in the plugin you run. It gave the translation template's count of new and dropped strings from before the Reports changes. Its item on the Reports screen named only some of what changed there, in shorthand, and did not say that the bars for each app now measure downloads instead of update checks, and now it says what changed. And it was dated 2026-10-08, the day it was written, instead of 2026-10-14, the day it was released.
v10.52.4 · Oct 14, 2026
  • In the plugin you run, this release changes the version number, this changelog, this readme's entry for the Bodholdt Labs license and update service under External services, the translation template, the Software section of the Reports screen, and two messages that say what happens when a license ends: the trial reminder email and the notice in a client the SDK generator builds. To choose their wording, both now ask the cls_download_serve_lapsed_license filter, and the wording changes only for a product your code opts in through it. Separately, the plain-text trial reminder drops the dash before its sign-off for every product. The archive also rewords comments in two of its stylesheets, which changes nothing you see, and no longer includes tools/verify-paid-claims.php, a check meant only for bodholdtlabs.com's own builds. Everything else in this entry is in a file that runs only on bodholdtlabs.com and is not part of the plugin you receive, so it is here for the record.
  • The trial reminder email used to tell every trial user to choose a paid option before the trial ends "to keep downloads, updates, and support." For a product your store keeps serving after its licenses lapse, downloads and updates do not stop when the trial ends, so for that product the email now says "Choose a paid option before the trial ends to keep an active license." It says nothing about what stops, or about when support ends. For every other product the email says what it said before.
  • A client the SDK generator builds for such a product ends its "License not active" notice with "to activate it on this site." instead of "to enable updates and support.", because a site whose lapsed key is still entered keeps receiving updates. A client for any other product is generated exactly as before. A client you generated earlier stays as it is until you generate it again.
  • cls_download_serve_lapsed_license is now asked in two more places, read only and only to choose that wording. The trial reminder asks about a copy of the trial's license whose end date is set to the day before the email is sent. The SDK generator asks about a stand-in license for the product, with ID 0 and no key or email, so a callback that decides license by license answers the generator for that stand-in. Neither question opens a download.
  • The plain-text trial reminder now ends with your sender name on its own line, without a dash in front of it. The translation template gains thirteen strings and drops three. For the trial reminder it gains three and drops one: the new sentence in the HTML email and in the plain-text email, and the plain-text reminder with its new sign-off, which replaces the old one. The other ten it gains and two it drops belong to the Software section of the Reports screen. If your store uses a translation, the plain-text trial reminder, and for a product you opt in the HTML email's new sentence, show in English until your translation adds the new strings.
  • This readme's entry for the Bodholdt Labs license and update service now says that WordPress adds your site's address to the user agent of each update check, and that bodholdtlabs.com counts these checks by site. The requests themselves have not changed.
  • On bodholdtlabs.com, the buying page no longer adds its own scroll offset above each section heading. This was meant to ship after a theme update that sets one for every page, and that update had not shipped, so following a link to a section of that page put its heading under the menu. 10.52.5 puts the offset back until the theme sets its own.
  • On the Reports screen, the Software section is now headed Software (desktop apps) and says what its numbers mean: a download is a file fetch, from a new install or from an app updating itself, and is not a unique person, while an update check is an installed app asking whether a newer version exists, so checks are not an install count. The section now opens with four counts: downloads, update checks and requests refused by your location rules in the date range you chose, and downloads all time. A line under them names the dates that range covers. Two new graphs show downloads and update checks over time, by day, or by month for a range longer than 92 days. The bars for each app, now under By app, measure downloads instead of update checks, and the figures beside each bar start with downloads. The apps were still listed in order of update checks until 10.52.6, which lists them by downloads. All of it reads the counts the plugin already keeps, and nothing new is recorded. If your store uses a translation, the section's new wording shows in English until your translation adds it.
v10.52.3 · Oct 1, 2026
  • In the plugin you run, this release adds one developer filter, and nothing your store or your customers see changes unless your own code uses it. Beyond that, it changes the version number, this changelog, this readme's answer to "What happens after a refund or dispute?", the note under No longer active in your customer portal, which changes only for a product your code opts in, and the translation template, which gains that note's three strings. That readme answer used to say a refund or dispute on a subscription invoice changes its license; it now says when that happens and when it does not. Everything else is in files that run only on bodholdtlabs.com and are not part of the plugin you receive, so it is here for the record.
  • New filter: cls_download_serve_lapsed_license. Return true for a product and your store keeps serving that product's downloads and updates to its lapsed licenses, meaning licenses whose term or trial ran out or whose subscription ended. A subscription counts as ended once your Stripe webhook has recorded its end; one whose end reached your store only through Sync from Stripe, or before your store ran 10.37.2, is still refused. The filter stays off unless your code turns it on, and an active license never reaches it. A license you revoked is refused whatever the filter returns, and so is a key your store never issued. A one-time purchase that was fully refunded, lost in a dispute or is under an open dispute is refused too. For a subscription, the plugin may not tie a refund or dispute to the license at all, so a subscription that was refunded or disputed and then ended can be served like any other lapsed license. Revoke the license if you need to stop that. A lapsed license's own menu has no Revoke, so select its checkbox under Manage Licenses and choose Revoke in the bar that appears. Changing its end date does not stop it.
  • On bodholdtlabs.com, a Bodholdt Atelier license that has lapsed now keeps receiving updates in your dashboard on any site where its key is still entered. Before this release the update was offered and its download was then refused.
  • On the buying page, the answer to "I'm an agency. Do you offer custom pricing?" now says no: I charge everyone the prices and site limits on the cards, Foundry covers up to 127 Licensing installations, and if you need a copy of your receipt, you open a ticket and choose Sales. It no longer mentions invoicing or a master services agreement.
v10.52.2 · Sep 30, 2026
  • In the plugin you run, this release changes one heading your customers see, one paragraph of this readme, the translation template and the version number. Everything else is in the file that renders the Bodholdt Labs storefront, which is not part of the plugin you receive, so it is here for the record.
  • The customer portal's heading now reads My Account instead of Manage Subscription, because the same page serves one-time and lifetime buyers, who have no subscription to manage. If your store uses a translation, the new heading shows in English until your translation adds it. If the plugin created your portal page, that page's title still reads Manage Subscription; rename it under Pages if you want the two to match.
  • This readme's description now says that the plugin you buy runs a seven-day evaluation from its first activation, with every feature unlocked. It used to say "no key or card", which could read as a way to try Bodholdt Licensing without buying it.
  • On the storefront, every paid card now carries its terms right under its Buy button: the 14-day money-back guarantee and, for monthly and annual plans, that you can cancel anytime from the customer portal and keep access to the end of the period you paid for. The cancel sentence hides while Lifetime is selected, because a lifetime purchase has nothing to cancel.
  • The plans on each paid product's pages now say what happens if a license ends, in that product's own terms. The backup pages instead advise keeping a copy of the plugin's ZIP off your server and downloading a fresh one after each update, because your backups leave the plugin out on purpose, so a restore on a new server starts by installing it. The buying page's answer about backups now says the same.
  • The prices now say that they are in US dollars and do not include tax, and that any sales tax, VAT or GST that applies is added at checkout. The line shows only while checkout really does add that tax.
  • The answer to "What counts as a site?" now says why the largest plan stops at 127 sites: a license record stores its site count in a small number field whose largest value is 127.
  • Bodholdt Contact, which is free, now has its own section after the paid products on the buying page, with a card that links to the free edition on its product page.
  • The backup feature tables have one column, so their links now say what they show: "See what the free backup plugins include" on the buying page and "See what the free edition includes" on the backup pages.
  • The Bodholdt Licensing and Bodholdt Tickets sections of the buying page now have fixed addresses, /buy-plugins/#clspp-licensing and /buy-plugins/#clspp-tickets, so a link can go straight to them, and a section reached that way no longer hides its heading under the menu bar.
  • Smaller fixes: a paid card shows its annual price even before the page's script runs; screen readers no longer read out the tick before every bullet; the cards now spell out the abbreviations SDK, MRR, CSAT, IOSS, CRM, FK and BLOB; the line under the last Buy buttons now ends by saying that annual plans are billed once a year; and some notes meant for developers no longer appear in the page source.
v10.52.1 · Sep 29, 2026
  • Nothing in the plugin you run changes in this release apart from its version number, this changelog and one line of its translation template: translation bug reports now point to https://bodholdtlabs.com/support/ instead of a WordPress.org forum this plugin has never had. Everything else is in the file that renders the Bodholdt Labs storefront, which is not part of the plugin you receive, so it is here for the record.
  • What changed there, starting with the Bodholdt Licensing plans: the "Keep 100%" badge and the matching bullet came off Foundry, because they made something true of every plan look like a Foundry extra. The section now says, for every plan, that I take no cut of your sales and that your payment processor's normal fees still apply, and it says what a Bodholdt Licensing key does and what Studio and Foundry add.
  • The "Most popular" badge is gone from the Bodholdt Tickets plans, because no sales figure stood behind it. The Bodholdt Tickets section now says what any paid plan adds, and its description no longer leads with license-aware tickets, which only the paid plans have.
  • The Bodholdt Atelier section now says what a license adds. Its card says "What a license gets you:" instead of "The same features, plus:", and the 127-site allowance is stated as a limit instead of listed as something a license adds. The free Bodholdt Atelier edition is called Free, like the other free editions, rather than Free Lite, and its card and the comparison table both say every work type, because the free edition carries all of them.
  • Buttons on the storefront say what they do. The free-edition buttons read "See the free edition", because they take you to the free edition on its product page rather than start a download, and the Bodholdt Backup Pro button says Buy like the others. The Bodholdt Backup Pro card also says that it works with both backup plugins at once and that its email support is for Bodholdt Backup Pro.
  • The Annual, Monthly and Lifetime switch on the buying page now sits in the Bodholdt Backup Pro section, the first with paid plans, instead of above two free cards it cannot change. The Bodholdt Backup for Google Drive and Bodholdt Backup for OneDrive landing pages, which have only a free card, no longer show it at all.
  • The lifetime answer on the buying page now says what happens if I discontinue a product in the normal way: I aim to announce it at least 12 months ahead and give lifetime customers a free license for the closest equivalent successor product.
  • Three lines on the storefront were wrong and are now right. The free cards for Bodholdt Backup for Google Drive and Bodholdt Backup for OneDrive no longer end with "no telemetry", because each free build's update check sends the site's address. The Bodholdt Licensing trial answer on the buying page no longer says "no key or card", which could read as a way to try Bodholdt Licensing without buying it; it now says that the plugin you buy runs for seven days from its first activation, with every feature unlocked, before it needs a key. And Bodholdt Backup for OneDrive is now called a sister plugin to Bodholdt Backup for Google Drive instead of the same backup engine, because the two no longer work identically.
v10.52.0 · Sep 23, 2026
  • New: software distribution. You can now distribute desktop apps from your store, not only WordPress plugins. Add a product under Software, give it the app's public signing key, and publish releases with one file per platform. The plugin serves update feeds that Sparkle (macOS) and WinSparkle (Windows) read, plus a JSON feed, and a download button shortcode.
  • Every file's signature is checked against the product's key when it is attached and again when the release is published, so a feed never points at a file that installed apps would refuse. Published files are never replaced, the build number must rise with every release, and a file that an earlier release already carried cannot be published again under a new version.
  • Signed feeds: a product can require its feeds to be signed on your build machine with Sparkle's sign_update. The plugin checks the signature and that the signed feed says exactly what it rendered, and keeps serving the previous signed feed until then.
  • A critical release stays critical in every later release's feed entry, so someone several versions behind cannot skip a security fix. Security advisories reach installed apps before a fix exists, and leave the feed once one is published.
  • Remove a release from the feeds while its files stay downloadable, or withdraw a compromised build so its files are refused.
  • Location rules per product, from a country source you choose (a variable your web server sets, or Cloudflare with a secret header). Every unknown case refuses, and anything that widens access is a wp-config constant, never a setting.
  • Download counts per day and version, with nothing about the person downloading stored anywhere. Each product shows its own numbers in every edition.
  • Files are kept in a private folder outside the web root, re-checked every day, and sent by PHP, or by nginx once a built-in test downloads a file from outside and confirms the headers and that the folder cannot be reached directly.
  • Build machines can publish through the REST API with an Application Password for an account that holds only the new Software publisher role. An administrator's Application Password is refused there.
  • Software products do not count toward your plan's product limit.
v10.51.8 · Sep 5, 2026
  • Wording only. When a license has ended, the page that lists it now says that if you need a copy of what you had, you should write in and we will sort it out. It previously pointed you at buying again, which is not an answer to the question somebody in that position is actually asking. Nothing about what a license does or does not allow has changed: an ended license still does not download or update, and the plugins it licensed keep running on your sites, because they are GPL and self-hosted and the copy you installed is yours.
v10.51.7 · Sep 5, 2026
  • Your purchase email now says which tier you bought and how many sites the key covers. It named only the product, so a Studio or Foundry buyer had to open the portal to find out what they actually had.
  • The billing button on the licenses page no longer does nothing when the page has been open a while. An expired page token made the button silently reload the page with your email wiped and no message at all, which reads exactly like a broken site. It now says the request expired and asks you to try again.
  • The "not included" dash in the plan comparison table was too faint to meet the contrast standard. It is now readable, and still visibly dimmer than the text around it.
  • The buying page said every plugin ships with a money-back guarantee and email support. Both are true of the paid plugins; the free-only ones have nothing to refund and no license to carry support. GPL licensing, which really is true of all of them, is now its own sentence.
  • Translators following the source references in the shipped catalog no longer land on files that are not in the download.
v10.51.6 · Sep 5, 2026
  • A one-time purchase no longer receives an email explaining how to cancel a subscription. Every purchase email ended with a Manage Subscription heading and button, whichever way you had paid, so a customer who bought a lifetime license was given cancellation instructions for something they never had. The destination was always right, because that page is where both kinds of customer manage their licenses; only the label was wrong. It now says what the order actually was, worked out from the licenses in the order rather than restated.
  • The billing-link form can no longer be used to send repeated emails to somebody else's address. It is a public form that takes any email, and it was capped only by requests per minute per visitor, so one visitor could aim a long run of messages at an address they chose. It is now also capped per recipient, in the same shape the verification-code form has used since 10.18. Both caps answer exactly as a successful request does, so nothing about them reveals whether an address has an account.
v10.51.5 · Sep 5, 2026
  • The key-lookup page no longer says a code was sent when it sent nothing. If you asked for a code less than a minute ago, or you have reached the daily limit, it now says exactly that instead of "New code sent! Check your inbox." This mattered most to the person it was worst for: if your license email had not arrived, the order page sends you here to look your keys up, and clicking Resend a few times could leave you told five times that a code was on its way when none was. The Resend button also counts down now rather than letting you ask again into a wall.
  • A license that has ended is shown to you instead of being hidden. Before, an expired or cancelled license vanished from the lookup entirely and the page said it could not find any licenses for your email and suggested you check the spelling, which is the wrong thing to tell someone about a purchase they really made. Ended licenses are now listed with the date they ended, marked clearly as no longer active, and with no download button, because they do not download or update. What you can still do is unchanged.
  • The Bodholdt Tickets plans now say that licensing-aware customer context needs Bodholdt Licensing installed on the same site. It always did, and the plugin's own readme said so, but the buying page did not.
v10.51.4 · Sep 5, 2026
  • Nothing in your install changes in this release either. Like 10.51.3 it touches only the file that renders the Bodholdt Labs storefront, which is not part of the plugin you receive.
  • What changed there: the Bodholdt Atelier comparison box told a free-edition reader that email support was not included, and then two lines below told them that bug reports, pre-sales and billing questions are always free. Both were true and together they were confusing. The note now says the whole of it, including that free-edition questions get answered when we can. The row is unchanged, because a license really is what makes support a commitment rather than a courtesy.
v10.51.3 · Sep 5, 2026
  • Nothing in your install changes in this release. The only file it touches is the one that renders the Bodholdt Labs storefront, which is not part of the plugin you receive, so this entry is here for the record rather than because there is anything for you to do.
  • What changed there: our own top tier no longer claims priority email support, because nothing anywhere ever delivered it. There was no mailbox rule, no queue, no service level and no routing that treated one customer's email differently from another's, so the claim described an intention rather than a behaviour. It is deleted rather than softened, since a gentler version of the same sentence would still say that customers on the tiers below wait longer, and that would have been a new thing to be wrong about. Every paid tier gets email support from the developer while the license is active, which is what our support page has always said and what actually happens.
Show 72 older releases
v10.51.2 · Sep 4, 2026
  • A store no longer locks itself when it cannot reach us. If thirty days passed without a successful licence check, this plugin used to treat that as an expired licence and switch off checkout, the pricing page and new licence creation, even though nothing was wrong with the licence and the only thing that had failed was reaching bodholdtlabs.com. Your own outage is not your customers' problem, and it is not ours to make yours. The store now keeps working, and the admin notice asking you to check that your server can reach us stays on screen while it does. A licence we have actually declined still stops new licence creation, exactly as before.
  • Support credits are retired. Every paid licence now includes email support from the developer for as long as the licence is active, and a one-time licence has no renewal date to stop it. Lifetime purchases no longer grant a credit balance, the pricing pages no longer describe one, and nothing is taken from anyone: no credit was ever issued. If you run your own support desk on Bodholdt Tickets, its credit feature is untouched and still yours to switch on.
v10.51.1 · Sep 2, 2026
  • The two update check routes no longer invent a version. A product that is in your catalog but has no entry on the Product Versions screen used to be answered with version 1.0.0, tested up to 6.9, requires PHP 8.0 and an empty changelog, none of which you had set. Both routes now answer it the way they answer a product they have never heard of: the query string route with result error and Product not found, the REST route with a 404. Nothing changes for any product that has a version set, and nothing changes for the free self-served products, which already answered this way.
  • No installed copy could have been harmed by the old answer, because 1.0.0 never compares higher than a version that is already installed. The route was simply stating a version that did not exist, and this release makes it say so instead.
v10.51.0 · Sep 2, 2026
  • Reports, Downloads now records two versions for every download instead of one. The first is the version your Product Versions screen advertised at the moment of the download, which is what the report has always shown. The second is the version read from the plugin header inside the ZIP that was actually sent. When the two differ the row says so, a short notice sits above the table with the count, and the CSV export gains a Served version column and a Match column so the same comparison survives a spreadsheet.
  • Why both: a version pointer and a file on disk can drift apart, and until now the report could only ever repeat the pointer. Recording what was really sent makes that drift visible in the one place you already look.
  • Where the second version comes from. Bodholdt Licensing does not open archives itself. It asks for a reader through the new cls_downloads_served_version_reader filter, which takes a callable that receives the absolute path of the file about to be streamed and returns its version, or an empty string. If nothing supplies a reader the column stays empty and the report shows "not read", never a match it did not establish. The reading happens before the first byte is sent and can never cost anyone the download: anything the reader prints is discarded and any error it raises is swallowed.
  • This adds one column, served_version, to the downloads table. It arrives the way every schema change here arrives, through the self-heal that runs on the first page load after an update, so there is no activation step. The table stays anonymous: no address, no browser, no key. A file's version is a fact about the file.
  • On the Bodholdt Labs store itself, a host-only change that is not part of the plugin you run: the download button on the two free backup plugin pages keeps recording a real version after the retired paid entries are stood down, by reading the free edition's own version entry instead.
v10.50.1 · Sep 1, 2026
  • A storefront-only release. Nothing in the plugin you run changed. The files that changed are the Bodholdt Labs store pages, which are host-only and have never been part of the distributed plugin, so this build is byte-for-byte 10.50.0 apart from the version strings and this note. There is no reason to hurry the update.
  • Recorded here because the store's changelog and yours are the same file. Bodholdt Backup Pro, the paid companion for the two backup plugins, is on the store's pricing page now instead of only being reachable by a direct link: it gets its own section, its own card and its real prices, and the two free backup sections link to it rather than only naming it.
  • The wording is careful for the same reason it was careful last release. The free backup editions already email you after every backup attempt, success or failure, and both new paragraphs say so before they say anything about the companion, so nobody can read this as the moment they start being notified. What is sold is the delivery channel and the digest, never "alerts" on their own.
  • The companion's own section leads with the fact that it is an add-on and takes no backups of its own, because one of the two backup plugins has to be running for it to have anything to report on.
  • No price changed. The backup plugins are still free with no paid plan, and their checkout is still closed with the same explanation.
v10.50.0 · Sep 1, 2026
  • The two backup plugins are free now, with no paid plan, and the store says so everywhere at once.
  • Bodholdt Backup for Google Drive and Bodholdt Backup for OneDrive had a $29/yr Complete plan. It is retired. Everything it included is in the free edition, including the dashboard updates that were the last thing it alone could do, and the Slack and Discord delivery it also carried now lives in Bodholdt Backup Pro, a separate companion that covers both clouds on one license and adds a scheduled backup-health digest. So the buy links, the cart builder and the public products feed all stop offering the two backup plugins, and the free card is the only card left on their pricing block.
  • Nothing was deleted to do it. Both products keep their catalog entries, their Stripe objects and their update pointers exactly as they were, because existing licenses activate and update through them. If you hold one, nothing about it changed. Only the checkout closed, and a stale buy link now explains that the plugin is free rather than failing with an unhelpful error.
  • Two things this release is careful about, because they have been got wrong before. The free backup builds have always emailed you after every backup attempt, success or failure, so no copy anywhere now implies a free user hears nothing when a backup fails; the companion is described by what it actually adds, which is the chat channel and the digest. And the pricing block no longer falls back to the backup family's copy for a product it does not recognize. It used to, which is how a companion plugin that takes no backups once rendered a card promising full and incremental backups. An unknown product now renders nothing.
  • The free-download line under each download button names the product when the product has one edition, and keeps naming the edition when it does not.
v10.49.1 · Sep 1, 2026
  • Two fixes: a way to keep a product out of the store listing without taking it off sale, and an update check that finally reports the WordPress versions you configured.
  • Products can now be marked "Unlisted". An unlisted product is left out of the cart builder and the public products feed, so it is not advertised, but nothing else about it changes. Anyone with a direct buy link can still buy it, licenses still activate, downloads still work, and updates still arrive. There is a checkbox for it in the product editor, and the products list shows an Unlisted badge so it is not forgotten.
  • The update check now answers with the WordPress compatibility fields it was given. It was renaming "tested_wp" and "requires_wp" to "tested" and "requires" in the response, while every client reads the original names. The result was that installed plugins showed an empty "Tested up to" and a fixed "Requires WordPress 6.0" no matter what was published for them. Both spellings are sent now, so existing installs are fixed without anyone needing to update anything first.
v10.49.0 · Aug 31, 2026
  • The store now says what a paid backup plan is really for, and the checkout page looks like ours.
  • The paid backup plan's bullet list led with automatic updates. Alerts and support are the substance of the plan, so they come first now, and the updates line says plainly that updates install from your dashboard while your license is active.
  • The free download blurb is scoped to the edition it describes. It used to promise "no license key" in the name of the whole product, on the same page that sells a keyed edition of that product.
  • The Atelier pages no longer sell automatic updates as something a license adds. The free Lite edition ships a working updater with no key to enter, so that line was wrong. A license adds email support and a site allowance of up to 127 activations.
  • The "Confirm your purchase" page now carries the Bodholdt Labs mark, wordmark, and site colors, so it reads as part of bodholdtlabs.com instead of a plain unbranded page. It still loads nothing from anywhere: no external requests, no third-party assets, and the checkout flow itself is unchanged.
v10.48.5 · Aug 30, 2026
  • Rate limits on the public endpoints now allow the number they say.
  • WordPress asks a REST route for permission twice on every request, once to serve it and once more to work out which methods that route allows. Both asks were counted, so a limit set to thirty a minute was letting through fifteen. The answer is now worked out once per request and reused, so the configured number is the number enforced. Nothing about the limits themselves changed.
v10.48.4 · Aug 30, 2026
  • The page you land on after paying no longer says your purchase is unavailable.
  • Stripe sends you back to the site the moment your payment goes through, but the confirmation that unlocks your keys arrives separately, a second or two later. The page could not tell that short wait apart from a link that had genuinely expired, so it showed the same discouraging message for both, and it never updated.
  • It now says your order is being confirmed, checks again on its own for up to thirty seconds, and then, if something really is stuck, tells you plainly what to do and gives you a support address. A link that has actually expired reads the same as before.
v10.48.3 · Aug 30, 2026
  • The Atelier section of the store finishes catching up with the change to one product.
  • Its product page was still drawing three plan cards. Two of them had no name, no description and an empty button, because the plans they pointed at were retired last week. Those two cards are gone and one remains.
  • The site allowance is now stated as what it actually is. Several places said a license covers unlimited sites; a license record holds up to 127 activations, so that is what they say now.
  • The question "what is the difference between Solo, Pro and Agency" has been removed from the Atelier page. Those plans no longer exist, and the answer quoted prices for them.
  • The plugin catalog and the home page now lead with the free edition for the four plugins that have one, with the license price underneath, instead of showing only a price.
v10.48.2 · Aug 30, 2026
  • A failed download could return a database error page instead of the plugin ZIP.
  • The download recorder claimed in its own documentation that it could never break a download, but it only checked that its table existed. If the database connection dropped, WordPress retried for about five seconds and then rendered its database error page, and because the recorder runs before any of the file is sent, that page arrived in place of the ZIP.
  • The file is read from the disk and never needed the database. So when the database cannot be reached the download now proceeds and only the download statistic is lost, which is the right way round.
v10.48.1 · Aug 30, 2026
  • Three product sections on the store page were showing each other's copy.
  • The paragraph under Bodholdt Tickets described Bodholdt Licensing, the one under Bodholdt Atelier described Bodholdt Tickets ("up to 3 agents, unlimited tickets, and Claude-BYOK AI", none of which are Atelier concepts), and Atelier's own paragraph had ended up at the foot of the licence-expiry FAQ, which is not a product section at all. Each section now carries its own description.
  • Atelier's description also stops implying its free edition is a reduced one.
v10.48.0 · Aug 29, 2026
  • Bodholdt Atelier is now one product on the storefront instead of four cards.
  • The ladder was removed because it was inverted rather than merely complicated. The free edition of Atelier ships an all-open licensing stub, while a paid base-tier licence locked the Foundry, the Marketplace and the Lightroom publish API. Paying made the product worse than not paying. The Agency tier, meanwhile, added no feature over Pro at all: its only differences were a seat count and priority support.
  • So the pricing page now shows Free Lite beside a single Atelier licence, and every feature row in the comparison table is a tick in both columns. A licence buys automatic updates in your dashboard, support, and an unlimited site allowance. It does not buy a feature.
  • A tier that is no longer sold now says so. The retired-tier check runs before the valid-tier check, so following an old "Buy Pro" link tells you the tier was retired rather than that it was invalid, whether or not it still exists in the product configuration.
  • Also in this release, and unrelated: the shared arcade toast script now sanitises the icon markup it is handed and coerces the points value before writing either into the page. That hardening was written on 28 August and had not reached the site.
v10.47.0 · Aug 27, 2026
  • When a license is issued, the plan and the number of sites it allows now always come from the same place. Before this they were set separately, so a license could be labeled with one plan while allowing the site count from another. Every route that creates a license goes through one check now, including bundle purchases that apply a tier to each product they grant. If a request arrives with a count that does not match the plan, the plan wins and one line goes into the activity log.
v10.46.1 · Aug 27, 2026
  • A signed download link is now tied to the product it was issued for, so a link for one product cannot be edited into a link for another. The link settings also explain, where you set them, why the single use mode is not offered yet.
v10.45.0 · Aug 27, 2026
  • Purchase emails now carry a real download link for each product bought, good for 24 hours, instead of one link to a page repeated for every item. The link carries no license key and is tied to one product and one license, so a copied link is not an anonymous pass. When it expires, the customer portal still has everything.
v10.44.1 · Aug 27, 2026
  • The dashboard File Storage line now tells the truth about a protected uploads folder. If the protection test passed it reads as done, rather than as something you still need to go and fix. A folder that is inside the web root by accident still reads as a warning.
v10.44.0 · Aug 27, 2026
  • Paid files can now live in a protected folder inside WordPress uploads, so a store on shared hosting can sell without a folder above the web root. The plugin creates the folder with a long random name, writes deny rules for Apache and IIS, and then tests the protection from the outside before it will serve anything from there. If it cannot prove protection it says so plainly and shows you the rule to paste. Downloads now send Cache-Control no-store, so a CDN cannot keep a copy of a paid archive at its edge.
v10.43.23 · Aug 26, 2026
  • Groundwork for the protected uploads folder and the check that proves it from the outside.
v10.43.22 · Aug 26, 2026
  • Plainer punctuation across the operator screens.
v10.43.21 · Aug 26, 2026
  • Accessibility pass across the pricing page and the customer portal.
v10.43.20 · Aug 25, 2026
  • Three screens stopped claiming more than they had actually checked.
v10.43.19 · Aug 25, 2026
  • The account credit shown to a customer is now worked out from their real balance instead of repeated from a fixed line of copy.
v10.43.18 · Aug 25, 2026
  • The setup wizard no longer reports a step as complete unless it actually checked it.
v10.43.17 · Aug 25, 2026
  • Fixes a setting that was keeping every customer storefront out of search engines.
v10.43.16 · Aug 25, 2026
  • Plainer punctuation in the copy your customers read.
v10.43.15 · Aug 25, 2026
  • The free support door stops advertising the paid one. Update checks are cached as well, so a busy store makes fewer round trips.
v10.43.14 · Aug 25, 2026
  • An error on the payment path is now handled inside checkout, instead of leaving the customer to interpret a separate failure.
v10.43.13 · Aug 25, 2026
  • The buy page shows the price first.
v10.43.12 · Aug 24, 2026
  • The arcade is fully translatable now, and its toasts can be dismissed. Several labels the arcade shows (the dismiss button, the "Nice" message on a plain points toast, and the level badge) stayed in English no matter what language your site runs in, because the shared arcade code never passed them through for translation. They now translate like everything else, the level number is formatted for your locale, and every celebration has a close button. Toasts also pause while you hover or focus them, and skip their timer entirely if you have asked your system to reduce motion.
  • A site that cannot create the arcade tables now keeps trying. On a host where the database user is not allowed to create tables, the plugin recorded the arcade as installed anyway and never tried again, so the arcade stayed silently broken forever. It now confirms the tables really exist before recording success, and retries later if they do not.
v10.43.11 · Aug 24, 2026
  • The Fun Pass box now matches the arcade. Since 10.43.10 the arcade has been off on a fresh install, but the Fun Pass checkbox under Settings, Arcade still drew itself as switched on, and saving that panel turned the arcade on for real. The box now shows the truth. If you had turned the arcade on yourself, it stays on.
v10.43.10 · Aug 24, 2026
  • The arcade (XP, ranks, HUD, confetti) is now off by default. Turn it on any time under the plugin's Arcade settings. Nothing else changes.
v10.43.9 · Aug 21, 2026
  • Small copy corrections on the pricing block. A few lines on the storefront pricing block did not match what the product pages said. They now agree.
v10.43.8 · Aug 21, 2026
  • The translation catalog now carries the corrected spellings. The spelling and copy sweep from 10.43.7 reached the strings translators work from, so a translated store no longer inherits the old wording.
v10.43.7 · Aug 21, 2026
  • American spellings throughout the customer-facing copy, and one price that disagreed with itself. The checkout confirmation screen printed the raw catalog value, so a card reading "$99.00" was followed one click later by "$99" for the same product. Both now run through the same formatter. Identifiers, function names, and code samples were deliberately left alone, so nothing you have built against the plugin changes.
v10.43.6 · Aug 21, 2026
  • Free downloads are one click again. Four of the five free builds sat behind an email gate: enter an address, wait for a six-digit code, enter the code, then get the link by mail. It was never access control, since the builds are GPL and the download route is public by design. The gate is gone, and the unused claim endpoint and mail helper went with it.
v10.43.5 · Aug 21, 2026
  • Accessibility pass on the pricing block and the customer portal. Three gradient colors failed contrast against the page behind them, the worst at about 3.1 to 1. All three were lightened on the same hue to at least 5.5 to 1, which improves them both as text and as backgrounds under dark text.
  • The comparison table is usable on a phone again. At 375px the first column was wider than its own container, so every tier column started off-screen with nothing to show there was more to see.
v10.43.4 · Aug 21, 2026
  • The billing email no longer sends a wall of identical buttons. Checkout creates a new Stripe customer record whenever a buyer does not reuse an existing session, so one person accumulates several, and the email emitted one button per record labeled only "Billing account 2 (canceled)". Each link is now named after the plan it manages, and while any subscription is still live the dormant records are left out instead of listed.
v10.43.3 · Aug 21, 2026
  • A verified email with no licenses now has a way forward. Someone who verified their address and owned nothing was told we could not find any licenses, and was then shown a prompt to buy a support credit, on a screen with no link to the store anywhere. The empty state now points at the store instead of asking someone who owns nothing to buy support for nothing.
v10.43.2 · Aug 20, 2026
  • The Getting Started Guide now lists every webhook event the plugin actually requires. It said seven; the endpoint check has required nine since 10.39.0 and fails closed until all nine are enabled, so anyone who followed the guide left paid checkout permanently blocked on their own store. The guide now renders the list and the count from the same source the check enforces, so the two cannot drift apart again.
  • Lifetime support credit grants are now bounded. The grant scales with a licence's seat allowance, and its top branch scaled linearly with no upper limit, so a 127-seat lifetime tier issued 762 non-expiring credits against your own support capacity. The ladder is unchanged (15 / 50 / 150) and is now capped at 150. Set CLS_LIFETIME_CREDITS_MAX in wp-config.php, or filter cls_lifetime_credits_ceiling, to choose your own ceiling.
  • The purchase email says the download link is valid for 24 hours, which it always was, and the trial email now carries a link back to the customer portal. Previously a trial customer's email contained no route back.
  • Housekeeping: the readme's stable tag matched an older release than the plugin header, and the translation template still referenced a file removed from the build.
v10.43.1 · Aug 19, 2026
  • The packaged archive no longer carries code for retired products. class-cls-vault.php, class-cls-watch.php, and the Google Drive written-consent gate were still in the download at about 144 KB. Nothing referenced them and nothing loaded them, so no behavior changes, but they should not have been shipping.
  • Changelog corrections. The 10.41.1 entry described a Google Drive consent gate and holds on Vault, Watch, and the Backup Bundle as if they were in force. They are not: the gate was removed in Google Drive 6.47.1 after the clause behind it turned out to be misquoted, and the rest are retired. That entry now says so, and the changelog states plainly which products are retired.
  • Note on older entries: anything below 10.42.0 that mentions Bodholdt Vault, Bodholdt Watch, or the Backup Bundle is history, not a current feature. All three are retired. They are not sold, they are not loaded, and they are not part of any current plan. They stay in this list only because it is a record of what shipped when.
v10.43.0 · Aug 19, 2026
  • The Payments screen now lists the webhook events the plugin actually requires. It showed seven events and said "all seven required events" while the readiness check fails closed on nine, so an operator who followed this screen subscribed to seven and blocked paid checkout on their own store. The list, the count and the wording are now built from the same source the readiness check reads, so the two cannot drift apart again. The two that were missing are checkout.session.async_payment_succeeded and checkout.session.async_payment_failed, which cover delayed settlement methods.
  • Your pricing page is no longer hidden from search engines. The plugin was sending noindex, nofollow, noarchive on whichever page is configured as your shop. That page is a public price list with no customer data on it, and hiding it kept your most important commercial page out of search results entirely. Your order-confirmation and account pages are still protected, because those can show license keys and billing state.
v10.42.4 · Aug 17, 2026
  • Accessibility fix. Two admin tables, the download report and the reviews list, were drawing their alternating rows with a light grey background inherited from WordPress while the plugin uses light text, leaving those rows at roughly 1.5 to 1 contrast against a 4.5 to 1 standard. They now use the same dark stripe as every other table and read at roughly 9.8 to 1. No text colors changed and no data changed.
v10.42.3 · Aug 16, 2026
  • Corrected the required Stripe webhook event count in the setup instructions. The documentation said seven where the plugin requires nine and fails closed until all nine are present.
  • The free-download email no longer opens by thanking the reader for a purchase they did not make.
  • Ships includes/product-retirement-policy.php, which the main plugin file requires and which the previous packaged build omitted.
v10.41.1 · Aug 9, 2026
  • Historical entry, superseded. This release added a written-consent gate that blocked Google Drive checkout, license issuance and activation, and it recorded holds on the Backup Bundle, the legacy Cloudflare R2 Vault prototype, and Bodholdt Watch. The clause behind the Google Drive hold was later found to have been misquoted. The gate was removed in Google Drive 6.47.1, Google Drive is sold and activated normally, and the Vault and Watch code paths are retired and are never loaded. Nothing described in this entry is in force.
v10.41.0 · Aug 8, 2026
  • Internal, unreleased groundwork added quota-reclaim behavior for the disabled legacy Vault prototype. It is not a customer-facing storage service.
v10.40.0 · Aug 8, 2026
  • Internal, unreleased groundwork added an optional legacy R2 storage prototype. It is disabled for customer and production use; historical provider options do not activate it.
v10.39.3 · Aug 8, 2026
  • Maintenance release. The Backup Bundle description now mentions the included Bodholdt Watch backup assurance, and internal build tooling now handles multisite correctly.
v10.39.2 · Aug 8, 2026
  • Removed decorative emoji across the plugin for a cleaner interface; the checkout accent color now meets contrast standards on dark and light themes.
v10.39.1 · Aug 8, 2026
  • Checkout success page license card now adapts to the store theme for readability; removed a decorative emoji; renamed an admin dashboard estimate for accuracy.
v10.39.0 · Aug 7, 2026
  • New: optional Stripe Managed Payments support. When the operator enables the cls_managed_payments_enabled option, new checkout sessions ask Stripe to act as merchant of record through its Link service, so Stripe calculates, collects, and remits applicable taxes and selects the available payment methods. The feature is fully inactive unless enabled, and existing subscriptions always keep their current billing.
  • New: a cls_managed_payments_excluded_products option keeps specific products, such as human support services, on the ordinary card rail. A checkout containing an excluded product uses the ordinary rail for the whole session.
  • The webhook listener now understands the async payment outcome events that delayed settlement methods produce, fulfilling an order when the funds arrive and acknowledging a failed payment without changing any state. Both events are part of the required webhook endpoint configuration.
  • When Managed Payments is enabled, the canonical Stripe Price check also requires a tax code on every non-excluded product, and a tools script reports and backfills tax codes for existing products.
  • The lifetime revenue counter now reads the tax exclusive subtotal instead of the session total, so buyer taxes that Stripe remits are never counted as revenue. The two figures are identical on the ordinary card rail.
  • Stripe objects removed by a customer data deletion request now produce a clear explanation instead of a generic retrieval error.
v10.38.1 · Aug 7, 2026
  • The pricing page now describes the included Bodholdt Watch backup assurance on the paid Backup tiers and the Backup Bundle.
v10.38.0 · Aug 7, 2026
  • New: optional Bodholdt Watch integration. When the operator configures the three cls_watch_* options, successful activations and license checks return a signed site token, and license lifecycle changes (activation, renewal, cancellation, refund, revocation, expiry) sync to the Watch backup assurance service through a durable retry outbox with a weekly reconciliation snapshot.
  • The integration is fully inert until configured: with the options unset there are no new response fields, no new scheduled tasks, and no outbound requests. Self-hosted stores are unaffected.
  • Event delivery never runs inside a license lock or on a customer facing request path, so checkout, activation, and Stripe webhooks keep their existing timing even if the Watch service is unreachable.
  • Reliability: if event delivery keeps failing for more than 24 hours, the weekly task emails the site administrator with the count and the most recent error.
v10.37.6 · Jul 23, 2026
  • Pricing accuracy: removed the "Streaming restore (FK-safe, BLOB-safe)" line from the paid Backup tier. The free build's full restore already uses that same streaming, FK-safe, BLOB-safe engine, so it was never a paid upgrade. The genuine upgrade is selective restore, choosing what to restore, which the tier already lists.
  • Documentation: backfilled the release history below (10.24 through 10.37) so the changelog reflects the full recent record.
v10.37.5 · Jul 23, 2026
  • Pricing accuracy: the Backup Agency tier now reads "Up to 127 sites" (and 127 in the comparison table and the agency FAQ) instead of "Unlimited", matching the enforced activation limit.
  • Copy polish: removed em dashes used as sentence punctuation in the Backup Bundle heading and the Licensing pitches, and demoted the pricing section heading to <h2> so each page has a single <h1>.
v10.37.4 · Jul 23, 2026
  • Fixed: higher pricing tiers (Pro, Agency, Studio, Foundry) could not complete checkout. The payment-boundary price check compared the tier's Stripe price against the wrong product and returned a price mismatch, bouncing buyers back to the pricing page. Non-default tiers now check out correctly.
  • Fixed: the "Manage Billing & Subscriptions" button on the customer subscription-management page did nothing. It now submits and emails the billing-portal access link as intended.
v10.37.3 · Jul 20, 2026
  • Stripe webhooks now acknowledge checkout sessions created by other integrations on the same Stripe account, so unrelated events cannot disable the webhook endpoint.
  • License activation is serialized regardless of key letter casing, so the per-license site limit cannot be bypassed by concurrent requests.
  • A licensed store re-verifies from any page load when the scheduled check has not run, instead of self-locking after 30 days on hosts without wp-cron.
  • Reports keep showing the last known figures when Stripe is briefly unreachable, instead of a fresh 0.
  • Fixed two Settings notices that reported success when a store page slug or vault path was actually rejected.
v10.37.2 · Jul 17, 2026
  • Enforces Hobby, Studio, and Foundry activation and product entitlements against the canonical commercial-license ledger, including Multisite.
  • Verifies replacement keys before saving, preserves a working state during transient failures, and releases activations on clear or uninstall.
  • Hardens generated clients and the built-in updater so license keys stay out of URLs and are sent only to an exact matching HTTPS origin and product.
  • Validates carts, canonical Stripe Prices, currencies, recurrence, products, tiers, bundles, and trial rules on the server before Checkout.
  • Makes checkout fulfillment, subscription state, refunds, disputes, and email retry ordered, durable, transactional, and idempotent.
  • Requires all nine documented Stripe events and proves webhook readiness before paid checkout.
  • Makes the private product vault fail closed, validates exact product references on downloads, applies download throttling, and redacts operational logs.
  • Hardens customer OTP, portal, review, REST, AJAX, admin, settings, product, license, and GDPR paths against replay, enumeration, injection, privilege, and data-integrity failures.
  • Corrects expiry-date boundaries, domain-seat locking, manual Stripe sync, review eligibility, currency handling, plan limits, and multi-customer billing portal access.
  • Removes customer email addresses from portal URLs and persistent browser cookies and applies private-cache/referrer protections to sensitive pages.
  • Makes settings migration exclude credentials and environment-specific storage paths and makes uninstall/network cleanup deliberate and consistent.
  • Updates first-run guidance, translation catalog, compatibility declarations, public documentation, and sanitized release screenshots.
v10.37.1
  • Shared admin engine reconciliation across the Bodholdt product line.
v10.36.0
  • Admin dashboard: optional recurring-revenue "Compounding Vault" view added to the built-in gamification, with a Settings > Arcade switch to turn the whole layer (and its motion and sound) off.
v10.35.0
  • Introduced an optional, fully dismissible admin gamification layer that respects reduced-motion preferences.
v10.34.0
  • Admin redesign across the board: refreshed Dashboard, Activity Log, and Manage Licenses (status chips, inline expiry editing, per-row menus, and a bulk-action bar), cleaner Settings sub-tabs, a clearer "Connect a Plugin" screen, and a split list/editor for Products with safer per-product saving.
v10.33.0
  • Added download tracking and a Reports > Downloads section.
v10.32.0
  • New Sender Identity settings with a live email preview.
v10.31.0
  • Portable customer-reviews display you can place on any page, plus a support line in review-request emails.
v10.30.0
  • Automatic post-purchase review-request email.
v10.29.0
  • Verified customer reviews, so only real, purchase-linked customers can leave one.
v10.28.0
  • Pricing-page refinements and Free-card alignment on the buy-plugins page.
v10.27.0
  • Aligned the Atelier pricing and pitch copy.
v10.26.0
  • Wired the Atelier product family into the pricing page and comparison matrix.
v10.25.0
  • Entitlement gating for the free "Lite" builds.
v10.24.0
  • Self-serve free tier: the free build became a direct, no-key download (with abuse caps and Cloudflare-aware IP trust), and the marketing copy was realigned to the free-and-paid model.
After purchase, you'll receive a download link and license key by email. In your WordPress admin, go to Plugins → Add New → Upload Plugin, choose the ZIP you downloaded, click Install, then Activate. The plugin will prompt you for your license key on its settings page. Paste it in and you're live.
Each WordPress installation domain that activates the key counts as one site, including staging and development domains. Clear the key on an old site to release its activation before moving it. Why 127? A license record stores its site count in a small number field whose largest value is 127, so 127 sites is the most one license can hold.
Yes. Contact support before changing plans so we can confirm the price, effective date, and license limits for your order. Your current entitlement remains in place until the change is confirmed.
Yes. Contact support before renewal so we can confirm the effective date and the site limit that will apply. We do not silently deactivate existing sites.
Lifetime means the supported lifetime of the product, not the customer's lifetime. For a normal discontinuation, we aim to give 12 months' notice and a license for the closest equivalent successor. A binding legal, provider-policy, security, or privacy issue may require an earlier stop and a bounded recovery path instead. The current Terms of Service govern the details.
Yes. Open the Stripe billing portal from your account dashboard and cancel there. You keep access until the end of the billing period.
14 days, no questions asked, full refund. Open a ticket on our Support page (bodholdtlabs.com/support) using the email you bought with.
Two reasons: Stripe's per-transaction fees compound when you charge 12 times instead of once, and monthly subs have higher churn risk for us. Annual or lifetime is the better deal if you know you're sticking around.
Hobby licenses 1 product on 1 site. Studio unlocks unlimited products, 5 sites, and the full reporting dashboard for revenue, MRR, license health, and seat utilization. Foundry raises the activation limit to 127 sites. Current monthly, annual, and lifetime prices are shown in the pricing cards above. All three include license keys, the auto-updater, the customer and Stripe billing portals, and the SDK generator.
There is no separate free edition. From its first activation, the plugin you buy runs for seven days without a key, with every feature unlocked. After that, a key is what keeps your store issuing new licenses and taking orders, and it brings Licensing's own updates and email support from me while it is active. Every plan has the 14-day money-back guarantee.