Other Rules
LICENSE
Dokan Conditional Category Attributes — Authorization & Licensing Notes
Version: 2.0.0 (Server) / 2.0.0(Plugin)
Developer: OpequeGlass
Last Updated: June 2026
1. Authorization System Overview
Dokan Conditional Category Attributes uses a server-bound authorization system that validates license keys against the OpequeGlass licensing server. The system is designed to protect commercial distribution while ensuring legitimate customers retain full feature access.
Key Principles:
- Authorization is required for all attribute filtering features to function
- First-activation expiry — the timer starts when you first activate, not when you purchase
- Status is dynamic — recalculated from live database on every request (zero caching)
- Domain-bound — each production domain consumes one activation slot
- Graceful degradation — without active authorization, the plugin UI shows a lock overlay but preserves your configuration data
2. Authorization Tiers
Table
Â
Â
| Tier | Sites | Duration | Best For |
|---|---|---|---|
| Single Site | 1 production + 1 staging subdomain | 1 year from first activation | Individual marketplace operators |
| Multi-Site | 5 production domains | 2 years from first activation | Agencies managing multiple clients |
| Business | Unlimited | 3 years from first activation | Large organizations, white-label deployments |
Key Format:
DKN-XXXX-XXXX-XXXX-XXXX (auto-generated, uppercase)3. Status Definitions & Behavior
The authorization system uses four distinct statuses. Understanding these is critical for troubleshooting:
Table
Â
Â
| Status | Meaning | Can Activate? | How It’s Set |
|---|---|---|---|
| INACTIVE | License exists but is not currently bound to any site | Â Yes | Automatically when 0 active sites detected |
| ACTIVE | Currently bound to one or more sites |  Yes (if slots available) | Automatically when ≥1 active site detected |
| EXPIRED | Past expiry date (terminal state) | Â No | Automatically when expiry_date < now() |
| SUSPENDED | Manually blocked by admin (terminal state) | Â No | Manually via admin panel |
Important: OnlyEXPIREDandSUSPENDEDstatuses block activation.INACTIVEsimply means “available to use.”
4. Activation Process
Step 1: Enter Authorization Token
Navigate to Authorization Manager in your WordPress admin menu. Enter your
DKN- token in the activation field.Step 2: Domain Resolution
The plugin extracts your site URL, strips the
www. prefix, and transmits:- License key
- Site domain
- Site URL
- API secret (for server validation)
Step 3: Server Validation
The server checks:
- Does the key exist?
- Is the status not
expiredorsuspended? - Does the domain already exist (reactivation) or are slots available?
- Is this the first activation? (If so, sets
first_activation_dateand calculatesexpiry_date)
Step 4: Local Storage
On success, the plugin stores:
- Token, status, type, max sites
- Expiry date and remaining days
- First activation date
- Activated-at timestamp
- Integrity fingerprint (anti-tamper)
5. Expiry Mechanics (First-Activation Based)
Unlike traditional licenses that expire from purchase date, this system uses first-activation expiry:
Â
Table
| Tier | Expiry Years | Example |
|---|---|---|
| Single | 1 year | Activate Jan 15, 2026 → Expires Jan 15, 2027 |
| Multi | 2 years | Activate Jan 15, 2026 → Expires Jan 15, 2028 |
| Business | 3 years | Activate Jan 15, 2026 → Expires Jan 15, 2029 |
Before First Activation:
- Status:
INACTIVE - Expiry:
null(displayed as “Waiting for first activation”) - The timer only starts when you click Activate
Auto-Correction: On every sync/validation, the server recalculates
expiry_date from + product config. This prevents drift if the database is manually edited.6. Domain Binding Rules
What Counts as a Site?
- Production domains:
example.com,shop.example.com— each counts as one binding - Staging subdomains: Typically permitted under the same root domain but may require verification
- Localhost / .local: Permitted for development; may require manual override
Reactivation
If your domain is already registered (e.g., after a plugin reinstall):
- The server updates
last_checkinand returns “Already active” - No additional slot is consumed
- Expiry is not reset
Site Migration
- Deactivate on the old domain first (via Authorization Manager)
- Activate on the new domain
- If the old domain is inaccessible, contact support with your token and proof of ownership
7. Deactivation
Client-Side Deactivation
Click Deactivate Authorization in the Authorization Manager. This:
- Opens a confirmation modal (prevents accidental clicks)
- Sends
deactivaterequest to the server - Marks the site as
inactivein the database - Triggers status sync (may set license to
INACTIVEif no active sites remain) - Clears all local authorization options
- Updates the UI to show the activation form (no page reload)
Admin-Initiated Deactivation (Server)
From the license server admin panel, you can:
- Suspend a license: Blocks all activations/validations, pings all client sites to disable features
- Deactivate a single site: Removes one domain from a multi-site license without affecting others
8. Feature Lock Behavior
When authorization is missing, expired, or suspended:
Table
Â
Â
| Feature | Behavior |
|---|---|
| Category attribute configuration | Blocked — lock overlay with “Authorization Required” message |
| Existing attribute filters | Continue working — frontend filtering is preserved |
| Plugin updates | Blocked — update checker requires ACTIVE status |
| Support access | Blocked — requires active authorization |
Data Preservation: Your category-to-attribute mappings (
_allowed_attributes term meta) are never deleted during deactivation. Reactivating the same license restores full functionality instantly.9. Update Checking
The plugin contacts server to check for updates:
Requirements for updates:
- Valid
ACTIVEauthorization - Current version transmitted to server
- Domain validated against active sites list
Update response includes:
- New version number
- Download URL (signed)
- Tested WordPress/PHP versions
- Changelog sections
10. Integrity & Security
Anti-Tamper Measures
The plugin generates an integrity fingerprint from:
plain
Â
If local options are manually edited, the fingerprint mismatch triggers a forced server re-sync. If re-sync fails, features are locked.
Zero-Cache Headers
All API responses include aggressive no-cache headers to prevent proxy/CDN caching of authorization state.
API Secret Validation
All server requests require a shared
api_secret. Requests without it receive HTTP 401.11. FastSpring Integration
For purchases through FastSpring:
- Order completed → Webhook creates license key in database
- Subscription renewed →
expiry_dateextended by tier’sexpiry_years - Subscription canceled → License set to
INACTIVE - Refund issued → License set to
INACTIVE
Product Mapping:
Table
Â
Â
| FastSpring Product | License Type | Max Sites | Expiry |
|---|---|---|---|
dokan-Business | Business | Unlimited | 3 years |
dokan-multi | Multi | 5 | 2 years |
dokan-Single | Single | 1 | 1 year |
12. Troubleshooting
“Authorization Required” Lock Overlay
- Your license is inactive, expired, or suspended
- Navigate to Authorization Manager and check status
- Click Sync Now to refresh from server
“Maximum site limit reached”
- Your tier’s site slots are full
- Deactivate unused sites or upgrade to a higher tier
“License has expired”
- Purchase a renewal through your original channel
- The renewal extends from the original expiry date (no lost time)
“Server returned invalid response”
- Check that your server can reach
https://dokanconditionalattribute.com - Verify SSL/TLS is enabled on your hosting
- Check server logs for blocked outbound requests
Sync Shows “Stale”
- Last sync was >30 seconds ago
- Click Sync Now or Quick Sync (AJAX, no reload)
- If persistent, check server connectivity
13. Glossary
Table
Â
Â
| Term | Definition |
|---|---|
| Authorization Token | Your DKN- license key |
| First Activation | The moment you first click “Activate” — starts the expiry timer |
| Integrity Fingerprint | Cryptographic checksum preventing local option tampering |
| Site Slot | One production domain binding |
| Terminal State | expired or suspended — cannot be changed by automatic sync |
| Zero Cache | Aggressive no-cache headers preventing stale authorization data |
These notes reflect the current implementation as of License Server v3.5.0 and Plugin v3.0.1. For the latest terms, always refer to your purchase agreement and the live documentation.
Â
Â