[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fkg3XEoH5YzGmVpemp5cLgUZz9752GRC8RoD8rAk_JLQ":3},{"slug":4,"display_name":4,"profile_url":5,"plugin_count":6,"total_installs":7,"avg_security_score":8,"avg_patch_time_days":9,"trust_score":10,"computed_at":11,"plugins":12},"junaidbhatti","https:\u002F\u002Fprofiles.wordpress.org\u002Fjunaidbhatti\u002F",1,0,100,30,94,"2026-05-20T01:17:42.687Z",[13],{"slug":14,"name":15,"version":16,"author":4,"author_profile":5,"description":17,"short_description":18,"active_installs":7,"downloaded":19,"rating":8,"num_ratings":6,"last_updated":20,"tested_up_to":21,"requires_at_least":22,"requires_php":23,"tags":24,"homepage":30,"download_link":31,"security_score":8,"vuln_count":7,"unpatched_count":7,"last_vuln_date":32,"fetched_at":33},"jb-license-manager","JB License Manager for WooCommerce","2.0.0","\u003Cp>\u003Cstrong>JB License Manager for WooCommerce\u003C\u002Fstrong> turns your WordPress + WooCommerce site into a complete software licensing server. Sell plugins, themes, SaaS tools, or any digital product and automatically deliver encrypted license keys, control which domains can use each license, and revoke access instantly — all from your own WordPress dashboard.\u003C\u002Fp>\n\u003Ch3>🔑 Core Licensing\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Automatic key generation\u003C\u002Fstrong> — cryptographically random keys with customizable prefix (e.g. \u003Ccode>MYAPP-XXXXXX-XXXXXX-XXXXXX\u003C\u002Fcode>)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>WooCommerce auto-delivery\u003C\u002Fstrong> — license key is emailed to the customer the moment an order is completed, processing, or payment confirmed\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Multi-domain activation\u003C\u002Fstrong> — each license can allow 1 to unlimited domains (configured per product)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Domain allow \u002F disallow\u003C\u002Fstrong> — admin or customer can block a specific domain without revoking the whole license\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Instant remote deactivation\u003C\u002Fstrong> — when a domain is disallowed, the client plugin detects it within 15 seconds via WordPress Heartbeat and immediately locks premium features — no click required on the client site\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Expiry by months or years\u003C\u002Fstrong> — set 1 Month, 3 Months, 6 Months, 1 Year, 2 Years, or any duration (1–120 months \u002F 1–10 years)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Status management\u003C\u002Fstrong> — Active, Inactive, Suspended, Expired, Revoked\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Automatic expiry\u003C\u002Fstrong> — daily cron marks licenses expired and sends reminder emails\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Domain-level encryption\u003C\u002Fstrong> — activated domain names are hashed and never stored in plain text\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>🛒 WooCommerce Integration\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Dedicated \u003Cstrong>License\u003C\u002Fstrong> product tab — enable licensing per product with one click\u003C\u002Fli>\n\u003Cli>Set \u003Cstrong>max domains\u003C\u002Fstrong>, \u003Cstrong>validity period\u003C\u002Fstrong>, and \u003Cstrong>key prefix\u003C\u002Fstrong> per product\u003C\u002Fli>\n\u003Cli>Auto-fill license settings from product when creating a manual license\u003C\u002Fli>\n\u003Cli>License key shown on the \u003Cstrong>order details page\u003C\u002Fstrong> inside WooCommerce\u003C\u002Fli>\n\u003Cli>\u003Cstrong>My Account \u003Cspan aria-hidden=\"true\" class=\"wp-exclude-emoji\">→\u003C\u002Fspan> Licenses\u003C\u002Fstrong> — full customer portal with all purchased licenses\u003C\u002Fli>\n\u003Cli>Customer can \u003Cstrong>view\u003C\u002Fstrong>, \u003Cstrong>copy\u003C\u002Fstrong>, and \u003Cstrong>allow\u002Fdisallow\u003C\u002Fstrong> their own domains without contacting support\u003C\u002Fli>\n\u003Cli>Per-domain popup card showing activation date, last validated time, and IP address\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>🌐 REST API\u003C\u002Fh3>\n\u003Cp>Full public and admin REST API at \u003Ccode>\u002Fwp-json\u002Fjblm\u002Fv1\u002F\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Public endpoints (license key authentication):\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>POST \u002Factivate\u003C\u002Fcode> — register a domain against a license key\u003C\u002Fli>\n\u003Cli>\u003Ccode>POST \u002Fvalidate\u003C\u002Fcode> — verify a license key + domain (12-hour cached on client)\u003C\u002Fli>\n\u003Cli>\u003Ccode>POST \u002Fdeactivate\u003C\u002Fcode> — release a domain slot\u003C\u002Fli>\n\u003Cli>\u003Ccode>POST \u002Fstatus\u003C\u002Fcode> — lightweight heartbeat check (does not update last_validated)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Admin endpoints (API key or logged-in admin):\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>GET \u002Flicenses\u003C\u002Fcode> — list all licenses with pagination, search, status filter\u003C\u002Fli>\n\u003Cli>\u003Ccode>POST \u002Flicenses\u003C\u002Fcode> — create a license programmatically\u003C\u002Fli>\n\u003Cli>\u003Ccode>GET \u002Flicenses\u002F{id}\u003C\u002Fcode> — get single license with activations\u003C\u002Fli>\n\u003Cli>\u003Ccode>PUT \u002Flicenses\u002F{id}\u003C\u002Fcode> — update status, max_domains, expiry\u003C\u002Fli>\n\u003Cli>\u003Ccode>DELETE \u002Flicenses\u002F{id}\u003C\u002Fcode> — revoke a license\u003C\u002Fli>\n\u003Cli>\u003Ccode>GET \u002Flicenses\u002F{id}\u002Factivations\u003C\u002Fcode> — list all domain activations\u003C\u002Fli>\n\u003Cli>\u003Ccode>GET \u002Fstats\u003C\u002Fcode> — dashboard stats (total, active, expired, expiring, revoked)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>📊 Admin Dashboard\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Stats cards\u003C\u002Fstrong> — Total \u002F Active \u002F Expiring Soon \u002F Expired \u002F Revoked at a glance\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Filterable table\u003C\u002Fstrong> — search by email or key, filter by status\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Click-to-copy\u003C\u002Fstrong> license keys\u003C\u002Fli>\n\u003Cli>\u003Cstrong>View Sites popup modal\u003C\u002Fstrong> — see all activated domains per license, allow\u002Fdisallow with one click, quick status change\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Domain progress bar\u003C\u002Fstrong> — visual fill showing slots used vs. available\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Expiry countdown\u003C\u002Fstrong> — “14d left” shown in amber when expiring soon\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Activity Logs page\u003C\u002Fstrong> — last 500 events with time, license key, action, domain, IP, and result\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Settings page\u003C\u002Fstrong> — key prefix, expiry reminder days, email from name\u002Faddress, email subject and template, REST API key\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>✉️ Email Notifications\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>License delivery email\u003C\u002Fstrong> — sent automatically on WooCommerce order completion\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Expiry reminder email\u003C\u002Fstrong> — sent N days before expiry (configurable)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Status change email\u003C\u002Fstrong> — sent when license is suspended or revoked\u003C\u002Fli>\n\u003Cli>Fully customizable HTML template with placeholder tags: \u003Ccode>{license_key}\u003C\u002Fcode>, \u003Ccode>{expires_at}\u003C\u002Fcode>, \u003Ccode>{max_domains}\u003C\u002Fcode>, \u003Ccode>{order_id}\u003C\u002Fcode>, \u003Ccode>{customer_email}\u003C\u002Fcode>, \u003Ccode>{site_name}\u003C\u002Fcode>, \u003Ccode>{site_url}\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>📤 CSV Export \u002F Import\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Export all or filtered licenses to CSV with one click\u003C\u002Fli>\n\u003Cli>CSV includes: ID, License Key, Customer Email, Status, Max Domains, Active Domains, Expiry, Order ID, Product ID, Created At, Active Domain URLs\u003C\u002Fli>\n\u003Cli>Bulk import licenses from CSV — only \u003Ccode>customer_email\u003C\u002Fcode> required; other columns optional\u003C\u002Fli>\n\u003Cli>Drag-and-drop upload zone in admin\u003C\u002Fli>\n\u003Cli>Duplicate keys automatically skipped on import with per-row error reporting\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>🔒 Security\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>All domain names stored as \u003Cstrong>SHA-256 hashes\u003C\u002Fstrong> — even database access cannot reveal which domains are activated\u003C\u002Fli>\n\u003Cli>Encryption secret key auto-generated on activation and stored securely in the database. Optionally define \u003Ccode>JBLM_SECRET_KEY\u003C\u002Fcode> in wp-config.php to use a custom value\u003C\u002Fli>\n\u003Cli>All AJAX handlers protected with \u003Ccode>wp_nonce\u003C\u002Fcode> and \u003Ccode>current_user_can()\u003C\u002Fcode> checks\u003C\u002Fli>\n\u003Cli>All API inputs sanitized with \u003Ccode>sanitize_text_field()\u003C\u002Fcode>, \u003Ccode>sanitize_email()\u003C\u002Fcode>, \u003Ccode>intval()\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>All outputs escaped with \u003Ccode>esc_html()\u003C\u002Fcode>, \u003Ccode>esc_attr()\u003C\u002Fcode>, \u003Ccode>esc_url()\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>All database queries use \u003Ccode>$wpdb->prepare()\u003C\u002Fcode> with parameterized placeholders\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>📦 Client SDK\u003C\u002Fh3>\n\u003Cp>Include the bundled \u003Ccode>jblm-client.php\u003C\u002Fcode> in your plugin or theme see sample below:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>\u003C?php\n\u002F**\n * Plugin Name: Your Plugin Name\n * Version: 1.0.0\n *\u002F\n\n\u002F\u002F ============================================================\n\u002F\u002F STEP 1 — Load the license client\n\u002F\u002F Copy jblm-client.php into your plugin folder, then include it.\n\u002F\u002F ============================================================\nrequire_once plugin_dir_path( __FILE__ ) . 'jblm-client.php';\n\n\n\u002F\u002F ============================================================\n\u002F\u002F STEP 2 — Set up your license\n\u002F\u002F Replace the two values below:\n\u002F\u002F   - 'https:\u002F\u002Fyoursite.com'  \u003Cspan aria-hidden=\"true\" class=\"wp-exclude-emoji\">→\u003C\u002Fspan> the site where you installed JB License Manager\n\u002F\u002F   - 'your-plugin-slug'      \u003Cspan aria-hidden=\"true\" class=\"wp-exclude-emoji\">→\u003C\u002Fspan> any unique name for your plugin (no spaces)\n\u002F\u002F ============================================================\n$license = new JBLM_Client(\n    'https:\u002F\u002Fyoursite.com',   \u002F\u002F \u003Cspan aria-hidden=\"true\" class=\"wp-exclude-emoji\">←\u003C\u002Fspan> CHANGE THIS\n    'your-plugin-slug'        \u002F\u002F \u003Cspan aria-hidden=\"true\" class=\"wp-exclude-emoji\">←\u003C\u002Fspan> CHANGE THIS  e.g. 'my-seo-plugin'\n);\n\n\n\u002F\u002F ============================================================\n\u002F\u002F STEP 3 — Register AJAX (required for Activate\u002FDeactivate buttons)\n\u002F\u002F Just copy this line as-is. Don't change anything.\n\u002F\u002F ============================================================\nadd_action( 'plugins_loaded', function() use ( $license ) {\n    $license->register_ajax_hooks();\n});\n\n\n\u002F\u002F ============================================================\n\u002F\u002F STEP 4 — Block your premium features if license is not active\n\u002F\u002F Put this check at the top of any function that has premium code.\n\u002F\u002F If the license is invalid, the function will stop here.\n\u002F\u002F ============================================================\nfunction my_premium_feature() {\n    global $license;\n\n    if ( ! $license->is_valid() ) {\n        return; \u002F\u002F \u003Cspan aria-hidden=\"true\" class=\"wp-exclude-emoji\">←\u003C\u002Fspan> stops here if no valid license\n    }\n\n    \u002F\u002F Your premium code goes below this line \u003Cspan aria-hidden=\"true\" class=\"wp-exclude-emoji\">↓\u003C\u002Fspan>\n    echo 'Premium feature is running!';\n}\n\n\n\u002F\u002F ============================================================\n\u002F\u002F STEP 5 — Show the License Key field on your settings page\n\u002F\u002F Call this inside the function that renders your settings page.\n\u002F\u002F It will show an input box + Activate \u002F Deactivate buttons.\n\u002F\u002F ============================================================\nfunction my_plugin_settings_page() {\n    global $license;\n\n    echo '\u003Ch1>My Plugin Settings\u003C\u002Fh1>';\n\n    \u002F\u002F This one line draws the full license box — input + buttons\n    $license->render_settings_field();\n\n    \u002F\u002F ... rest of your settings fields\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>The SDK handles:\u003Cbr \u002F>\n* License activation, validation (12 h cache), deactivation\u003Cbr \u002F>\n* WordPress Heartbeat integration for instant deactivation — no click needed\u003Cbr \u002F>\n* Built-in settings page with Activate \u002F Check Status \u002F Deactivate buttons\u003Cbr \u002F>\n* Friendly Urdu\u002FEnglish error messages for common failure cases\u003C\u002Fp>\n\u003Ch3>⚡ Performance\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>License validation results cached as WordPress transients (12 hours by default)\u003C\u002Fli>\n\u003Cli>Heartbeat status check (\u003Ccode>\u002Fstatus\u003C\u002Fcode>) does not write to the database — read-only\u003C\u002Fli>\n\u003Cli>Index on \u003Ccode>license_key\u003C\u002Fcode>, \u003Ccode>domain_hash\u003C\u002Fcode>, \u003Ccode>user_id\u003C\u002Fcode>, \u003Ccode>status\u003C\u002Fcode>, and \u003Ccode>created_at\u003C\u002Fcode> columns\u003C\u002Fli>\n\u003Cli>WooCommerce integration only loads when WooCommerce is active\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Privacy Policy\u003C\u002Fh3>\n\u003Cp>JB License Manager for WooCommerce stores the following data in your WordPress database:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>License keys\u003C\u002Fstrong> (hashed) and associated customer email addresses\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Domain names\u003C\u002Fstrong> (stored as SHA-256 hashes — not in plain text)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>IP addresses\u003C\u002Fstrong> of activation and validation requests\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Timestamps\u003C\u002Fstrong> of all license events\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>This data is stored solely on your own WordPress server. No data is transmitted to any third-party service by this plugin.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>External connections:\u003C\u002Fstrong> Client sites that use the bundled SDK connect to your WordPress store URL to activate, validate, and check license status. This is a direct connection between two sites you control.\u003C\u002Fp>\n\u003Cp>If you collect or process personal data (such as customer email addresses), ensure your site has an appropriate privacy policy as required by GDPR, CCPA, or your local regulations.\u003C\u002Fp>\n\u003Ch3>Developer SDK\u003C\u002Fh3>\n\u003Cp>The client-side SDK (for your own plugins\u002Fthemes to validate licenses against this server) is available as a \u003Cstrong>separate download\u003C\u002Fstrong> from the plugin’s GitHub page. It is NOT included in the WordPress.org version of this plugin.\u003C\u002Fp>\n\u003Cp>The WordPress.org version of this plugin is the \u003Cstrong>license server\u003C\u002Fstrong> — it stores and manages licenses. It does not lock any features behind a license check.\u003C\u002Fp>\n","Sell software licenses via WooCommerce. Auto-deliver keys, multi-domain activation, instant deactivation, REST API, and My Account license page.",203,"2026-03-18T21:05:00.000Z","6.9.4","5.8","7.2",[25,26,27,28,29],"license-activation","license-key","license-manager","software-license","woocommerce-license","https:\u002F\u002Fwordpress.org\u002Fplugins\u002Fjb-license-manager\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fjb-license-manager.2.0.0.zip",null,"2026-04-16T10:56:18.058Z"]