{"id":273481,"date":"2026-02-10T18:41:01","date_gmt":"2026-02-10T18:41:01","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/dmsi-ddls-digital-downloads-licensing-subscriptions\/"},"modified":"2026-05-23T20:42:54","modified_gmt":"2026-05-23T20:42:54","slug":"dmsi-ddls-digital-downloads-licensing-subscriptions","status":"publish","type":"plugin","link":"https:\/\/it.wordpress.org\/plugins\/dmsi-ddls-digital-downloads-licensing-subscriptions\/","author":23427519,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.1.1","stable_tag":"2.1.1","tested":"7.0","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"DMSI DDLS - Digital Downloads, Licensing & Subscriptions","header_author":"DMSI - Dream Makers Software Innovations","header_description":"Complete WooCommerce licensing, subscription management, and digital product delivery for software and digital products vendors.","assets_banners_color":"2b3443","last_updated":"2026-05-23 20:42:54","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/dmsi.gr\/donate\/","header_plugin_uri":"https:\/\/dmsi.gr\/ddls\/ddls-overview\/","header_author_uri":"https:\/\/dmsi.gr","rating":0,"author_block_rating":0,"active_installs":0,"downloads":415,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"nikosdmsi","date":"2026-02-10 18:40:39"},"1.0.1":{"tag":"1.0.1","author":"nikosdmsi","date":"2026-02-13 07:01:37"},"1.2.0":{"tag":"1.2.0","author":"nikosdmsi","date":"2026-03-13 22:47:11"},"2.1.1":{"tag":"2.1.1","author":"nikosdmsi","date":"2026-05-23 20:42:54"}},"upgrade_notice":{"1.0.0":"<p>Initial release. Install to start managing software licenses through WooCommerce.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3458339,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3458339,"resolution":"256x256","location":"assets","locale":"","width":255,"height":255},"icon.svg":{"filename":"icon.svg","revision":3458339,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3458339,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3458339,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1","1.2.0","2.1.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3458339,"resolution":"1","location":"assets","locale":"","width":1831,"height":885},"screenshot-10.png":{"filename":"screenshot-10.png","revision":3458339,"resolution":"10","location":"assets","locale":"","width":1826,"height":879},"screenshot-11.png":{"filename":"screenshot-11.png","revision":3458339,"resolution":"11","location":"assets","locale":"","width":1824,"height":875},"screenshot-12.png":{"filename":"screenshot-12.png","revision":3458339,"resolution":"12","location":"assets","locale":"","width":1832,"height":893},"screenshot-13.png":{"filename":"screenshot-13.png","revision":3458339,"resolution":"13","location":"assets","locale":"","width":1832,"height":602},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3458339,"resolution":"2","location":"assets","locale":"","width":1829,"height":790},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3458339,"resolution":"3","location":"assets","locale":"","width":1813,"height":886},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3458339,"resolution":"4","location":"assets","locale":"","width":1832,"height":889},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3458339,"resolution":"5","location":"assets","locale":"","width":1832,"height":888},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3458339,"resolution":"6","location":"assets","locale":"","width":1829,"height":864},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3458339,"resolution":"7","location":"assets","locale":"","width":1824,"height":884},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3458339,"resolution":"8","location":"assets","locale":"","width":1806,"height":884},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3458339,"resolution":"9","location":"assets","locale":"","width":1830,"height":889}},"screenshots":{"1":"Dashboard - Upper section with license overview, subscription revenue, and expiring licenses","2":"Dashboard - Lower section with top products, renewals due, and system status","3":"Customer Portal - Product overview with license, downloads, support, subscription, and purchase info","4":"Licenses - List view with filtering, search, and bulk actions","5":"Edit License - Configure license key, customer, product, type, activation limit, and expiration","6":"Licensed Products - Product list with license type, activation limits, and pricing","7":"Subscriptions - Track subscription status, billing, and renewal dates","8":"Customer Portal - My Products page with product cards, license status, and quick actions","9":"Reports - License and revenue analytics","10":"Versions - Software version management and release tracking","11":"Activations - Track license activations across sites and devices","12":"Background Jobs - Automated task scheduling and processing status","13":"Settings - General configuration options"}},"plugin_section":[],"plugin_tags":[5346,146554,26437,448,286],"plugin_category":[41,45],"plugin_contributors":[255581],"plugin_business_model":[],"class_list":["post-273481","plugin","type-plugin","status-publish","hentry","plugin_tags-digital-downloads","plugin_tags-license-manager","plugin_tags-software-license","plugin_tags-subscription","plugin_tags-woocommerce","plugin_category-communication","plugin_category-ecommerce","plugin_contributors-nikosdmsi","plugin_committers-nikosdmsi"],"banners":{"banner":"https:\/\/ps.w.org\/dmsi-ddls-digital-downloads-licensing-subscriptions\/assets\/banner-772x250.png?rev=3458339","banner_2x":"https:\/\/ps.w.org\/dmsi-ddls-digital-downloads-licensing-subscriptions\/assets\/banner-1544x500.png?rev=3458339","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/dmsi-ddls-digital-downloads-licensing-subscriptions\/assets\/icon.svg?rev=3458339","icon":"https:\/\/ps.w.org\/dmsi-ddls-digital-downloads-licensing-subscriptions\/assets\/icon.svg?rev=3458339","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/dmsi-ddls-digital-downloads-licensing-subscriptions\/assets\/screenshot-1.png?rev=3458339","caption":"Dashboard - Upper section with license overview, subscription revenue, and expiring licenses"},{"src":"https:\/\/ps.w.org\/dmsi-ddls-digital-downloads-licensing-subscriptions\/assets\/screenshot-2.png?rev=3458339","caption":"Dashboard - Lower section with top products, renewals due, and system status"},{"src":"https:\/\/ps.w.org\/dmsi-ddls-digital-downloads-licensing-subscriptions\/assets\/screenshot-3.png?rev=3458339","caption":"Customer Portal - Product overview with license, downloads, support, subscription, and purchase info"},{"src":"https:\/\/ps.w.org\/dmsi-ddls-digital-downloads-licensing-subscriptions\/assets\/screenshot-4.png?rev=3458339","caption":"Licenses - List view with filtering, search, and bulk actions"},{"src":"https:\/\/ps.w.org\/dmsi-ddls-digital-downloads-licensing-subscriptions\/assets\/screenshot-5.png?rev=3458339","caption":"Edit License - Configure license key, customer, product, type, activation limit, and expiration"},{"src":"https:\/\/ps.w.org\/dmsi-ddls-digital-downloads-licensing-subscriptions\/assets\/screenshot-6.png?rev=3458339","caption":"Licensed Products - Product list with license type, activation limits, and pricing"},{"src":"https:\/\/ps.w.org\/dmsi-ddls-digital-downloads-licensing-subscriptions\/assets\/screenshot-7.png?rev=3458339","caption":"Subscriptions - Track subscription status, billing, and renewal dates"},{"src":"https:\/\/ps.w.org\/dmsi-ddls-digital-downloads-licensing-subscriptions\/assets\/screenshot-8.png?rev=3458339","caption":"Customer Portal - My Products page with product cards, license status, and quick actions"},{"src":"https:\/\/ps.w.org\/dmsi-ddls-digital-downloads-licensing-subscriptions\/assets\/screenshot-9.png?rev=3458339","caption":"Reports - License and revenue analytics"},{"src":"https:\/\/ps.w.org\/dmsi-ddls-digital-downloads-licensing-subscriptions\/assets\/screenshot-10.png?rev=3458339","caption":"Versions - Software version management and release tracking"},{"src":"https:\/\/ps.w.org\/dmsi-ddls-digital-downloads-licensing-subscriptions\/assets\/screenshot-11.png?rev=3458339","caption":"Activations - Track license activations across sites and devices"},{"src":"https:\/\/ps.w.org\/dmsi-ddls-digital-downloads-licensing-subscriptions\/assets\/screenshot-12.png?rev=3458339","caption":"Background Jobs - Automated task scheduling and processing status"},{"src":"https:\/\/ps.w.org\/dmsi-ddls-digital-downloads-licensing-subscriptions\/assets\/screenshot-13.png?rev=3458339","caption":"Settings - General configuration options"}],"raw_content":"<!--section=description-->\n<p><strong>DMSI DDLS - Digital Downloads, Licensing &amp; Subscriptions<\/strong> (DDLS) is a comprehensive solution for software vendors, digital product sellers, and subscription-based businesses who need to manage licenses, subscriptions, and digital downloads through WooCommerce.<\/p>\n\n<h4>Why Choose DDLS?<\/h4>\n\n<p>Unlike expensive alternatives that cost $500-700\/year, DDLS provides enterprise-grade licensing features completely free. Built specifically for WordPress and WooCommerce, it integrates seamlessly with your existing store.<\/p>\n\n<h4>Core Features<\/h4>\n\n<p><strong>License Management<\/strong><\/p>\n\n<ul>\n<li>Generate unique license keys automatically on purchase<\/li>\n<li>Set activation limits per license (unlimited or fixed number)<\/li>\n<li>Track activations with detailed site information<\/li>\n<li>License expiration with automatic notifications<\/li>\n<li>License status management (active, expired, suspended, revoked)<\/li>\n<li>Transfer licenses between customers (with admin approval)<\/li>\n<li>Bulk actions (activate, suspend, delete)<\/li>\n<\/ul>\n\n<p><strong>Subscription Management<\/strong><\/p>\n\n<ul>\n<li>Custom subscription system (no WooCommerce Subscriptions required)<\/li>\n<li>Subscription tracking and status management<\/li>\n<li>Manual renewal order creation<\/li>\n<li>Grace periods for expired subscriptions<\/li>\n<li>Admin notifications for renewals due<\/li>\n<\/ul>\n\n<p><strong>Digital Downloads<\/strong><\/p>\n\n<ul>\n<li>Secure file delivery with signed URLs<\/li>\n<li>Version management for software products<\/li>\n<li>Multiple files per product version<\/li>\n<li>Platform-specific downloads (Windows, Mac, Linux)<\/li>\n<li>Download tracking and logging<\/li>\n<li>Access control based on license status<\/li>\n<\/ul>\n\n<p><strong>Customer Portal<\/strong><\/p>\n\n<ul>\n<li>Self-service license management<\/li>\n<li>View and download purchased products<\/li>\n<li>Deactivate sites from the portal<\/li>\n<li>View subscription status<\/li>\n<li>Download history<\/li>\n<li>Account settings<\/li>\n<\/ul>\n\n<p><strong>Email Notifications<\/strong><\/p>\n\n<ul>\n<li>30+ email templates<\/li>\n<li>Customer and admin notifications<\/li>\n<li>License lifecycle emails (created, activated, expiring, expired)<\/li>\n<li>Subscription status emails<\/li>\n<li>Email queue with retry logic<\/li>\n<li>Email logs<\/li>\n<\/ul>\n\n<p><strong>REST API<\/strong><\/p>\n\n<ul>\n<li>License validation endpoint<\/li>\n<li>Activation and deactivation endpoints<\/li>\n<li>Download endpoints<\/li>\n<li>Secure API key authentication<\/li>\n<li>Rate limiting protection<\/li>\n<\/ul>\n\n<p><strong>Admin Dashboard<\/strong><\/p>\n\n<ul>\n<li>Overview widgets with key metrics<\/li>\n<li>License status summary<\/li>\n<li>Recent activity feed<\/li>\n<li>Quick actions for common tasks<\/li>\n<\/ul>\n\n<p><strong>Reports<\/strong><\/p>\n\n<ul>\n<li>License reports<\/li>\n<li>Customer reports<\/li>\n<li>Basic analytics<\/li>\n<li>Export capabilities<\/li>\n<\/ul>\n\n<p><strong>Security<\/strong><\/p>\n\n<ul>\n<li>4 user roles with granular permissions<\/li>\n<li>API key authentication<\/li>\n<li>Audit logging<\/li>\n<li>GDPR compliance tools<\/li>\n<\/ul>\n\n<p><strong>Bundle Products<\/strong><\/p>\n\n<ul>\n<li>Group multiple DDLS products into a single purchasable SKU<\/li>\n<li>One parent license + one child license per bundled product generated on purchase<\/li>\n<li>One subscription covers the entire bundle \u2014 one renewal, one email<\/li>\n<li>Child licenses inherit each product's own activation limit and duration<\/li>\n<li>Customer portal shows child licenses grouped under the bundle with \"Managed by\" labels<\/li>\n<li>Renewal extends all child licenses atomically in a single transaction<\/li>\n<li>Bundle badge in DDLS Products list shows child product count<\/li>\n<\/ul>\n\n<h4>Premium Extensions<\/h4>\n\n<p>Extend DDLS functionality with optional premium extensions, available at <a href=\"https:\/\/dmsi.gr\/\">dmsi.gr<\/a>:<\/p>\n\n<ul>\n<li><strong><a href=\"https:\/\/dmsi.gr\/dmsi-update-server\/\">Update Server<\/a><\/strong> - Automatic plugin\/theme updates<\/li>\n<li><strong><a href=\"https:\/\/dmsi.gr\/dmsi-subscriptions-pro\/\">Subscriptions Pro<\/a><\/strong> - Automatic renewals, payment retry, dunning<\/li>\n<li><strong><a href=\"https:\/\/dmsi.gr\/dmsi-analytics\/\">Analytics Pro<\/a><\/strong> - Advanced revenue analytics and reporting<\/li>\n<li><strong><a href=\"https:\/\/dmsi.gr\/dmsi-webhooks\/\">Webhooks<\/a><\/strong> - Outbound event notifications<\/li>\n<li><strong><a href=\"https:\/\/dmsi.gr\/dmsi-support-desk\/\">Support Desk<\/a><\/strong> - Customer support ticketing<\/li>\n<li><strong><a href=\"https:\/\/dmsi.gr\/dmsi-team-management\/\">Team Management<\/a><\/strong> - Multi-user license management<\/li>\n<li><strong><a href=\"https:\/\/dmsi.gr\/dmsi-advanced-api\/\">Advanced API<\/a><\/strong> - Enterprise REST and GraphQL APIs<\/li>\n<li><strong><a href=\"https:\/\/dmsi.gr\/dmsi-service-management\/\">Service Management<\/a><\/strong> - Service contracts and SLA tracking<\/li>\n<\/ul>\n\n<h4>Perfect For<\/h4>\n\n<ul>\n<li>Software developers selling plugins, themes, or desktop applications<\/li>\n<li>Digital product sellers needing license control and secure downloads<\/li>\n<li>Subscription-based businesses with recurring billing needs<\/li>\n<li>Agencies managing client licenses and software access<\/li>\n<li>E-book, course, or media creators with download access control<\/li>\n<li>Anyone selling digital products through WooCommerce<\/li>\n<\/ul>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WordPress 6.0 or higher<\/li>\n<li>WooCommerce 7.0 or higher<\/li>\n<li>PHP 8.0 or higher<\/li>\n<li>MySQL 5.7 or higher<\/li>\n<\/ul>\n\n<h4>Documentation<\/h4>\n\n<p>Comprehensive documentation is available at <a href=\"https:\/\/dmsi.gr\/docs\/ddls\/\">dmsi.gr\/docs\/ddls\/<\/a><\/p>\n\n<h4>Support<\/h4>\n\n<p>For support questions, please visit <a href=\"https:\/\/dmsi.gr\/support\/get-help\/\">dmsi.gr\/support\/<\/a><\/p>\n\n<h3>Privacy Policy<\/h3>\n\n<p>DMSI Digital Downloads, Licensing &amp; Subscriptions stores the following data:<\/p>\n\n<ul>\n<li>Customer information (name, email) linked to WooCommerce orders<\/li>\n<li>License keys and activation records<\/li>\n<li>Site URLs where licenses are activated<\/li>\n<li>Download logs for security auditing<\/li>\n<li>Email logs for delivery tracking<\/li>\n<\/ul>\n\n<p>This data is stored in your WordPress database and is not transmitted to external servers except when customers activate licenses (their site URL is recorded).<\/p>\n\n<p>For GDPR compliance, customers can request data export or deletion through the Customer Portal or WordPress privacy tools.<\/p>\n\n<!--section=installation-->\n<h4>Automatic Installation<\/h4>\n\n<ol>\n<li>Log in to your WordPress dashboard<\/li>\n<li>Navigate to Plugins &gt; Add New<\/li>\n<li>Search for \"DMSI Digital Downloads Licensing\"<\/li>\n<li>Click \"Install Now\" and then \"Activate\"<\/li>\n<li>Go to DDLS &gt; Settings to configure the plugin<\/li>\n<\/ol>\n\n<h4>Manual Installation<\/h4>\n\n<ol>\n<li>Download the plugin ZIP file<\/li>\n<li>Log in to your WordPress dashboard<\/li>\n<li>Navigate to Plugins &gt; Add New &gt; Upload Plugin<\/li>\n<li>Choose the ZIP file and click \"Install Now\"<\/li>\n<li>Activate the plugin<\/li>\n<li>Go to DDLS &gt; Settings to configure the plugin<\/li>\n<\/ol>\n\n<h4>After Installation<\/h4>\n\n<ol>\n<li>Navigate to DDLS &gt; Settings to configure general options<\/li>\n<li>Create your first licensable product in WooCommerce<\/li>\n<li>Configure the license settings for your product<\/li>\n<li>Test a purchase to verify license generation<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20require%20woocommerce%3F\"><h3>Does this plugin require WooCommerce?<\/h3><\/dt>\n<dd><p>Yes, DDLS is built as a WooCommerce extension and requires WooCommerce 7.0 or higher to function.<\/p><\/dd>\n<dt id=\"how%20do%20license%20keys%20get%20generated%3F\"><h3>How do license keys get generated?<\/h3><\/dt>\n<dd><p>License keys are automatically generated when a customer completes a purchase. You can also manually create licenses from the admin dashboard.<\/p><\/dd>\n<dt id=\"can%20i%20limit%20how%20many%20sites%20a%20license%20can%20be%20activated%20on%3F\"><h3>Can I limit how many sites a license can be activated on?<\/h3><\/dt>\n<dd><p>Yes, you can set activation limits per product or per license. Options include unlimited activations or a specific number (1, 2, 5, 10, etc.).<\/p><\/dd>\n<dt id=\"does%20it%20support%20recurring%20subscriptions%3F\"><h3>Does it support recurring subscriptions?<\/h3><\/dt>\n<dd><p>Yes, DDLS includes a subscription management system. The core plugin tracks subscriptions and notifies admins when renewals are due. For automatic payment processing and retry logic, the <a href=\"https:\/\/dmsi.gr\/dmsi-subscriptions-pro\/\">Subscriptions Pro<\/a> extension is available.<\/p><\/dd>\n<dt id=\"can%20customers%20manage%20their%20own%20licenses%3F\"><h3>Can customers manage their own licenses?<\/h3><\/dt>\n<dd><p>Yes, the Customer Portal allows customers to view licenses, deactivate sites, download products, and view their subscription status. Site activation is done via the REST API from your software.<\/p><\/dd>\n<dt id=\"is%20there%20an%20api%20for%20license%20validation%3F\"><h3>Is there an API for license validation?<\/h3><\/dt>\n<dd><p>Yes, DDLS provides a REST API for license validation, activation, and deactivation. This allows your software to verify licenses programmatically.<\/p><\/dd>\n<dt id=\"does%20it%20support%20multiple%20files%20per%20product%3F\"><h3>Does it support multiple files per product?<\/h3><\/dt>\n<dd><p>Yes, you can upload multiple files per product version, including platform-specific builds (Windows, Mac, Linux).<\/p><\/dd>\n<dt id=\"how%20secure%20are%20the%20download%20links%3F\"><h3>How secure are the download links?<\/h3><\/dt>\n<dd><p>Downloads use signed URLs with expiration times to prevent unauthorized access. Each download is logged for security auditing.<\/p><\/dd>\n<dt id=\"is%20the%20plugin%20translatable%3F\"><h3>Is the plugin translatable?<\/h3><\/dt>\n<dd><p>Yes, DDLS is fully internationalized with 2,400+ translatable strings. Translation files can be added to the languages folder.<\/p><\/dd>\n<dt id=\"does%20it%20include%20automatic%20updates%20for%20my%20software%3F\"><h3>Does it include automatic updates for my software?<\/h3><\/dt>\n<dd><p>The core plugin manages licenses and downloads. For automatic plugin\/theme update delivery, the <a href=\"https:\/\/dmsi.gr\/dmsi-update-server\/\">Update Server<\/a> extension is available.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.1.1<\/h4>\n\n<p><strong>Bundle UX Improvements<\/strong>\n* Customer portal: bundle licenses now display as a single card in the list; child keys and details accessible via VIEW DETAILS\n* Customer portal VIEW DETAILS: Included Extensions table shows all child licenses with name, key, activations, and expiry; Active Sites section hidden for bundle parents\n* Order email: child extension keys now shown with product name labels; parent bundle container key omitted<\/p>\n\n<h4>2.1.0<\/h4>\n\n<p><strong>New: Bundle Products<\/strong>\n* Added Bundle product type \u2014 group multiple DDLS products into a single purchasable SKU\n* New <code>lnl_dmsilm_bundle_items<\/code> database table maps bundle products to their child products\n* Order processor creates one parent license + one child license per bundled product on purchase\n* Child licenses use each child product's own License Type, Activation Limit, and Duration settings\n* One subscription per bundle linked to the parent license; child licenses never get individual subscriptions\n* Bundle renewal extends all non-cancelled child licenses atomically in a single DB transaction\n* Single consolidated renewal email lists all renewed products with new expiry dates\n* Admin: Bundled Products multi-select on WooCommerce product edit Licensing tab (visible when type = Bundle)\n* Admin: \"Bundle \u00b7 N products\" badge in DDLS Products list for bundle products\n* Customer portal: child licenses grouped under bundle parent row with \"Managed by [Bundle Name]\" label\n* Customer portal: renewal action on bundle (parent) row only; child rows show no renewal button\n* Extension hook compatibility: <code>dmsilm_license_created<\/code> fires per child with synthetic order item (3 args) so Team Management and other extensions work automatically<\/p>\n\n<h4>2.0.1<\/h4>\n\n<p><strong>New: Per-Variation File Uploads<\/strong>\n* Added variation_id column to files table \u2014 assign downloadable files to specific WooCommerce product variations\n* Variation dropdown on Add File and Edit File forms (auto-populated via AJAX for variable products)\n* Files grouped by variation on Version edit page with section headers\n* Version variation dropdown filters the files section in real-time<\/p>\n\n<p><strong>Improvements<\/strong>\n* File uploads now stored in protected directory (wp-content\/uploads\/dmsilm-files\/) with .htaccess deny rules\n* AJAX-based file upload with progress bar (0-90% upload, 90-100% server processing)\n* Modernized Add File page UI with drag &amp; drop zone, file preview, and card layout\n* Delete file now also removes the physical file from disk\n* Form processing moved to admin_init hook \u2014 eliminates white screen flashes on edit\/delete\/update<\/p>\n\n<p><strong>Bug Fixes<\/strong>\n* Fixed file upload not working when accessed via shell route URLs (only legacy slug was recognized)\n* Fixed \"Invalid file type\" error on MSI uploads (disabled WordPress MIME check for admin uploads)\n* Fixed in_array() null haystack error when saving files (platform validation used uninitialized static property)\n* Fixed delete file not actually deleting (missing delete(true) for physical file removal)\n* Fixed file edit\/delete causing white screen flash (redirect inside render callback)<\/p>\n\n<h4>2.0.0<\/h4>\n\n<p><strong>New: Support Plan Product Type<\/strong>\n* Added custom WooCommerce product type \"Support Plan\" for selling support contracts as standalone products\n* Admin product data tab with support level, duration, and contract settings\n* Order completion handler automatically creates support contracts on purchase\n* Support Plan products visible in WooCommerce product type dropdown<\/p>\n\n<p><strong>New: EULA &amp; Terms System<\/strong>\n* Full EULA management system with admin CRUD interface\n* 5 bundled legal templates: Standard Software License, SaaS\/Subscription ToS, Free\/Open Source, Freemium Plugin, API\/Developer Service\n* Template picker with one-click loading on EULA creation\n* Placeholder substitution engine ({company_name}, {product_name}, {governing_law}, etc.)\n* Custom template creation \u2014 save any EULA as a reusable template\n* EULA Templates admin section with list table\n* Governing Law field added to General Settings\n* Legal disclaimer on all EULA forms<\/p>\n\n<p><strong>New: Standalone Support Contracts &amp; Portal Binding<\/strong>\n* Support contracts can now exist without a parent license (standalone purchases)\n* Supported Products multi-select field on product edit page \u2014 defines which products a contract covers\n* supported_product_ids column added to support_contracts table\n* Auto-bind logic links standalone contracts to eligible licenses on creation\n* Customer portal binding UI \u2014 button, modal, and eligible license list via AJAX\n* Binding confirmation email sent on successful contract-to-license binding\n* WooCommerce order email includes support contract line for standalone items<\/p>\n\n<p><strong>New: Support Level \"None\" &amp; Upgrade Discovery<\/strong>\n* \"None\" option added to support level dropdown (product and variation level)\n* Contracts with support_level='none' filtered from customer portal display\n* Dashboard support count widget excludes 'none' contracts\n* find_support_products() discovers purchasable support products for upgrade prompts\n* Support Purchase URL field on product admin for manual override\n* Cache invalidation for support product discovery<\/p>\n\n<p><strong>New: Version Variation Support<\/strong>\n* variation_id column added to versions table (schema migration)\n* Version model updated with variation_id property and methods\n* Admin Versions UI includes variation dropdown on add\/edit forms\n* Versions list table shows variation column\n* Customer portal downloads filtered by purchased variation<\/p>\n\n<p><strong>New: Entitled Major Version<\/strong>\n* entitled_major_version field on licenses \u2014 restricts update entitlement to a specific major version (e.g., 3.x.x only)\n* Entitled Major Version setting on product edit page \u2014 auto-stamps onto licenses at purchase time\n* \"Lifetime\" option added to Override License Duration dropdown<\/p>\n\n<p><strong>New: Email Capture on Activation<\/strong>\n* email_notice field added to activation API response when customer email is captured\n* Informs API callers that the email was stored and how to request removal<\/p>\n\n<p><strong>New: Admin-Configurable Platform Values<\/strong>\n* Platform dropdown values (Windows, Mac, Linux, etc.) are now admin-configurable via Settings &gt; Platforms tab\n* Add, edit, and delete platform options from the admin UI<\/p>\n\n<p><strong>Security: License Cross-Activation Fix<\/strong>\n* Added product_id validation to all license API routes (activate, deactivate, validate, check-in, verify)\n* Prevents licenses from one product being used to activate a different product\n* validate_product_ownership() helper enforces ownership across all endpoints\n* Unified licenses AJAX handlers updated with product validation<\/p>\n\n<p><strong>Improvements<\/strong>\n* Added inline file upload on Add Version form \u2014 attach files during version creation\n* Made support levels list table responsive for smaller screens<\/p>\n\n<p><strong>Bug Fixes<\/strong>\n* Fixed license type info display showing \"12 months\" instead of \"Lifetime\" for lifetime licenses\n* Fixed support level edit modal always showing permissions\/SLA checkboxes as checked\n* Fixed support levels \"Name\" column too narrow (19px) causing vertical text wrapping\n* Fixed all Versions admin URLs using legacy page slug \u2014 migrated to new shell format\n* Fixed Edit and Deprecate\/Restore action links broken on Versions grouped view page\n* Fixed Versions grouped view filter URLs encoding ampersand with add_query_arg\n* Fixed Override License Duration not accepting lifetime value in save handler\n* Fixed email logs bulk delete using unregistered page slug\n* Fixed license copy icon duplicate and handler mismatch\n* Fixed default support level fallback\n* Fixed version numbering incorrectly set to 1.3.0 in plugin header and constant<\/p>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Added is_lifetime flag to License Types \u2014 allows lifetime licenses with no expiry<\/li>\n<li>Added variable product support: per-variation license configuration and order processing<\/li>\n<li>Added resolve_effective_settings() for merging product\/variation\/license-type settings<\/li>\n<li>Added variation metadata (license type, activation limit, duration) to API responses<\/li>\n<li>Added license type permissions info display on product edit page<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Renamed customer portal \"Support\" tab to \"Support Contracts\" to avoid conflict with Support Desk extension's \"Support\" tab<\/li>\n<li>Customer portal now backed by a real WordPress page \u2014 fixes theme page title banner showing \"Recent Posts\"<\/li>\n<li>Added \"Portal Page Title\" setting (replaces \"Portal URL Slug\") \u2014 title syncs to the portal WP page<\/li>\n<li>Portal page auto-created on activation and recreated if deleted while portal is enabled<\/li>\n<li>Removed \"My Portal\" h1 from portal shell \u2014 theme handles the page title via its standard page template<\/li>\n<li>Moved logout link to bottom of portal sidebar; removed username display from portal header<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Added 3-column admin shell layout with URL router (section\/view params) and dmsilm_admin_shell_sections \/ dmsilm_admin_shell_pages filters for extensions<\/li>\n<li>Added draggable dashboard widget system<\/li>\n<li>Added Extension Status dashboard widget showing installed\/active extensions<\/li>\n<li>Added unified extension license page in Core Settings section<\/li>\n<li>Added consolidated license admin notice (replaces per-extension notices)<\/li>\n<li>Added CSS design tokens at :root for consistent theming across Core and extensions<\/li>\n<li>Added shared dmsilm-chartjs script handle registered by Core<\/li>\n<li>Added License Types \u2014 full model, database table, settings tab with CRUD UI, dynamic dropdown on product and variation edit pages<\/li>\n<li>Added variation metadata (license type, activation limit, duration) to API responses<\/li>\n<li>Added resolve_effective_settings() for merging product\/variation\/license-type settings; updated order processor<\/li>\n<li>Added variable product support: per-variation license configuration and order processing<\/li>\n<li>Added 3-column customer portal shell with section\/view routing<\/li>\n<li>Added Email UID \u2014 unique message ID generation, schema migration, X-DMSI-UID header injection<\/li>\n<li>Added Email Logs: Email ID column, search-by-UID, per-email detail view<\/li>\n<li>Added extension settings tab hooks (dmsilm_settings_tabs filter, dmsilm_settings_tab_content_{tab} and dmsilm_settings_save_{tab} actions)<\/li>\n<li>Added public key-based REST API routes: POST \/licenses\/activate and \/licenses\/deactivate<\/li>\n<li>Added order processor filters: dmsilm_license_data_before_create, dmsilm_subscription_data_before_create, dmsilm_support_contract_data_before_create<\/li>\n<li>Added Files section placeholder on Add Version form (shows \"Save first\" message)<\/li>\n<li>Added Media Library option to file upload page (choose existing files or upload new ones)<\/li>\n<li>Added License Type permissions info box on product edit page (shows activation limit, duration, updates, premium content, API access)<\/li>\n<li>Fixed license activation and customer portal product visibility issues<\/li>\n<li>Fixed settings tabs, capability manager registration, and legacy URL redirects<\/li>\n<li>Fixed Versions page: \"Add Version\" and \"Add the first version\" buttons not navigating to add form<\/li>\n<li>Fixed Versions page: product groups rendering beside filters instead of below them<\/li>\n<li>Fixed database upgrade routine not running on plugin file updates (missing plugins_loaded version check)<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fixed Email Logs: CSV export, column sorting, filters, view modal, close button, modal styling<\/li>\n<li>Fixed Email Settings: 403 error, undefined method, queue status queries<\/li>\n<li>Fixed Email Templates: preview\/edit routing, template loading, CSS layout, editor toolbar, validator warnings, iframe link navigation<\/li>\n<li>Fixed Advanced tab: wired Test Mode to email sending<\/li>\n<li>Fixed JS\/AJAX timing for all email admin pages<\/li>\n<li>Removed non-functional Real Data preview option<\/li>\n<li>Added portal_url and preferences_url template variables<\/li>\n<li>Fixed Dashboard: system activity labels, expiring licenses link, renewals due link<\/li>\n<li>Fixed Licenses: filter dropdowns resetting (nonce conflict), layout overlap, added Reset button<\/li>\n<li>Fixed Subscriptions: same filter nonce conflict, status tabs, renewal_due pseudo-status, Clear All button<\/li>\n<li>Fixed Products: filter nonce conflict, removed redundant Filter button<\/li>\n<li>Fixed Downloads: filter nonce conflict, native date pickers for date filters<\/li>\n<li>Added Reset button to all list table filters<\/li>\n<li>Auto-submit on filter dropdown change across all admin list pages<\/li>\n<li>Fixed Reports: revenue tab not loading from dashboard link<\/li>\n<li>Fixed Activations: custom nonce conflict, status tabs<\/li>\n<li>Fixed Customers: custom nonce conflict, search<\/li>\n<li>Fixed Settings: tab navigation from external links<\/li>\n<li>Fixed Email Stats: date range selection from external links<\/li>\n<li>Fixed Email Stats: page not accessible (missing submenu registration, capability mismatch)<\/li>\n<li>Added Email Stats: full CSS styling (header, widget cards, charts, tables, queue status, responsive)<\/li>\n<li>Added Email Stats: asset enqueuing (Chart.js, localizations)<\/li>\n<li>Added Email Stats: AJAX handler registration for refresh and chart data<\/li>\n<li>Added Email Logs: \"View Statistics\" link in page header<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial public release<\/li>\n<li>License management with automatic key generation<\/li>\n<li>Activation tracking and limits<\/li>\n<li>Subscription tracking system<\/li>\n<li>Digital download delivery with versioning<\/li>\n<li>Customer portal for self-service<\/li>\n<li>30+ email templates<\/li>\n<li>REST API for license validation<\/li>\n<li>Admin dashboard with overview widgets<\/li>\n<li>4 user roles with permissions<\/li>\n<li>Audit logging and GDPR tools<\/li>\n<\/ul>","raw_excerpt":"Complete software licensing, subscription management, and digital product delivery for WooCommerce.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/273481","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=273481"}],"author":[{"embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/nikosdmsi"}],"wp:attachment":[{"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=273481"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=273481"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=273481"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=273481"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=273481"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=273481"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}