Summary
Templates Cloud can present a valid Neve Pro Personal key as verified even though that plan is not eligible for Templates Cloud. The activation flow is expected to reject an ineligible key with a clear, persistent status. Instead, the reported workflow shows a green verified state, followed by the Templates Cloud license prompt when the user returns to the feature. This creates a false impression that activation succeeded and leaves the user unable to determine why access remains unavailable.
Customer context
- Product / area: Templates Cloud license activation
- Version: Customer version not provided; code inspected at v1.4.2
- Environment: WordPress site; WordPress, PHP, and plugin versions not provided
- Integration / third party: Neve Pro Personal Yearly license
- Reported error / symptom: The entered key receives a green confirmation, but the license prompt returns after navigating away
- Impact: Templates Cloud remains inaccessible and the activation state is misleading
Reproduction notes
Reported workflow:
- Open the Templates Cloud license screen.
- Enter a valid Neve Pro Personal license key.
- Submit the key and observe a green confirmation/verified state.
- Leave the page and return to Templates Cloud.
- Observe that the license prompt is shown again instead of an unambiguous ineligible-plan status.
The sequence was not independently executed against the external service. Account records confirm the reported key is an active Neve Pro Personal license, and documentation confirms that plan is not eligible for Templates Cloud. The referenced screenshot was unavailable through HelpScout.
Diagnosis
Conclusion
The reported behavior is consistent with a confirmed acceptance-criteria mismatch in the plugin. The activation request treats a successful HTTP response without a message as success and can render the returned license as Verified, while Templates Cloud access independently checks a hard-coded tier allowlist. A valid but ineligible response can therefore be acknowledged as verified while the feature continues to display its license/PRO prompt. The verified account context and product documentation establish that Neve Pro Personal is not eligible; the exact live API payload was not captured.
Where this likely occurs
- License settings UI:
assets/src/Components/License.js — License::onSaveLicense() and isValid approx. lines 16–23 and 49–75. A successful request places the API object directly into state, saves the raw key, and regards valid or license equal to valid as verified.
- Success presentation:
assets/src/Components/License.js — licenseStatusMsg approx. lines 87–98. A license classified as valid is displayed as Verified - Expires at ....
- Activation response classification:
assets/src/Components/CloudLibrary/common.js — fetchLibrary() lines 33–81. An HTTP-success response is classified as successful when its JSON has no message; product and plan eligibility are not evaluated in this path.
- Templates Cloud entitlement:
assets/src/store/selectors.js — getUserStatus() lines 17–40. Access is determined separately through a hard-coded raw-tier allowlist.
- Returned prompt:
assets/src/Components/CloudLibrary/Library.js — Library render branch lines 406–418. A failed tier check renders the Templates Cloud PRO prompt and key link.
- Server-side persistence and revalidation:
includes/License.php — License::check_license() lines 126–155 and License::get_license_data() lines 181–188. The API response and raw key are persisted separately after a successful server-side check.
- Plan mapping:
includes/License.php — License::NEVE_CATEGORY_MAPPING lines 21–31 and License::get_license_tier() lines 196–210. Neve categories are normalized for PHP consumers, independently of the JavaScript raw-tier allowlist.
- Git history: the separate API-backed verification and tier-based entitlement paths entered the release line in v1.1.29 through commits including
693e7ba93a50c98073de6ccc155f411235b120f4, aff9da28, and f021c30e61492d88df02ec405974be233c812083. The inspected release is v1.4.2 at 810ad4f83fbb858e342c5219dc6bdbbe8358b524.
Engineering notes
The product documentation states that a Templates Cloud license or Neve Pro Agency license is eligible; Neve Pro Personal is not. The inspected flow has two contracts: API-level license validity for the settings UI and raw-tier membership for feature access. The ticket supplies runtime evidence that the former displayed success for an ineligible Personal key, while the latter returned the user to the prompt. This inspection covers the plugin code and verified plan context, not the external Templates Cloud API implementation or its response payload for this request.
The settings write path also checks its response using !r[optionName] === value in assets/src/Components/License.js — License::updateKey() lines 33–47, and the caller does not use the returned result. That observation may affect persistence diagnostics, but the available ticket evidence more directly matches the split validity-versus-entitlement path and does not establish a settings-write failure.
Test coverage status
tests/tc-disabled-test.php covers active-license handling and Neve plan mapping, including Personal plan scenarios in test_personal_license_does_not_show_business_agency_onboarding_promo_text() lines 140–149 and test_neve_personal_category_does_not_show_business_agency_onboarding_promo_text() lines 191–207. Those tests do not exercise the React activation flow, the raw-tier selector, or navigation/reload after entering an ineligible key. No relevant JavaScript or e2e coverage was found during inspection.
What to verify or explore next
- Reproduce on v1.4.2 by entering a valid Neve Personal key in the Templates Cloud license screen and recording the activation response, immediate status, and status after navigating back.
- Compare the API payloads for Neve Personal, Neve Agency, and standalone Templates Cloud licenses, especially
license, valid, tier, message, and HTTP status.
- Verify whether the returning prompt appears in the library view, the license settings view, or both.
- Exercise the same workflow with a failed WordPress Settings REST write to distinguish entitlement mismatch from key-persistence failure.
- Run the relevant PHP suite in
tests/tc-disabled-test.php and any browser-level license flow available in the release environment.
Unknowns / follow-up
- The customer’s exact plugin, WordPress, and PHP versions are unavailable.
- HelpScout returned no retrievable image for the referenced attachment, so the precise green UI element could not be visually confirmed.
- The external Templates Cloud API response from the customer’s activation attempt is unavailable.
Confidence
Confidence: 88/100
The customer’s reported sequence matches a reachable mismatch in the inspected v1.4.2 code: license verification and Templates Cloud entitlement use different acceptance criteria. Account and documentation evidence confirms the submitted Neve Personal license is valid for Neve but ineligible for standalone Templates Cloud, and no existing issue was found.
Source: HelpScout #3398123677
Generated by bug-report-triage (ID: bug-report-triage_6a65b086447ff8.33053914)
Summary
Templates Cloud can present a valid Neve Pro Personal key as verified even though that plan is not eligible for Templates Cloud. The activation flow is expected to reject an ineligible key with a clear, persistent status. Instead, the reported workflow shows a green verified state, followed by the Templates Cloud license prompt when the user returns to the feature. This creates a false impression that activation succeeded and leaves the user unable to determine why access remains unavailable.
Customer context
Reproduction notes
Reported workflow:
The sequence was not independently executed against the external service. Account records confirm the reported key is an active Neve Pro Personal license, and documentation confirms that plan is not eligible for Templates Cloud. The referenced screenshot was unavailable through HelpScout.
Diagnosis
Conclusion
The reported behavior is consistent with a confirmed acceptance-criteria mismatch in the plugin. The activation request treats a successful HTTP response without a
messageas success and can render the returned license asVerified, while Templates Cloud access independently checks a hard-coded tier allowlist. A valid but ineligible response can therefore be acknowledged as verified while the feature continues to display its license/PRO prompt. The verified account context and product documentation establish that Neve Pro Personal is not eligible; the exact live API payload was not captured.Where this likely occurs
assets/src/Components/License.js—License::onSaveLicense()andisValidapprox. lines 16–23 and 49–75. A successful request places the API object directly into state, saves the raw key, and regardsvalidorlicenseequal tovalidas verified.assets/src/Components/License.js—licenseStatusMsgapprox. lines 87–98. A license classified as valid is displayed asVerified - Expires at ....assets/src/Components/CloudLibrary/common.js—fetchLibrary()lines 33–81. An HTTP-success response is classified as successful when its JSON has nomessage; product and plan eligibility are not evaluated in this path.assets/src/store/selectors.js—getUserStatus()lines 17–40. Access is determined separately through a hard-coded raw-tier allowlist.assets/src/Components/CloudLibrary/Library.js—Libraryrender branch lines 406–418. A failed tier check renders the Templates Cloud PRO prompt and key link.includes/License.php—License::check_license()lines 126–155 andLicense::get_license_data()lines 181–188. The API response and raw key are persisted separately after a successful server-side check.includes/License.php—License::NEVE_CATEGORY_MAPPINGlines 21–31 andLicense::get_license_tier()lines 196–210. Neve categories are normalized for PHP consumers, independently of the JavaScript raw-tier allowlist.693e7ba93a50c98073de6ccc155f411235b120f4,aff9da28, andf021c30e61492d88df02ec405974be233c812083. The inspected release is v1.4.2 at810ad4f83fbb858e342c5219dc6bdbbe8358b524.Engineering notes
The product documentation states that a Templates Cloud license or Neve Pro Agency license is eligible; Neve Pro Personal is not. The inspected flow has two contracts: API-level license validity for the settings UI and raw-tier membership for feature access. The ticket supplies runtime evidence that the former displayed success for an ineligible Personal key, while the latter returned the user to the prompt. This inspection covers the plugin code and verified plan context, not the external Templates Cloud API implementation or its response payload for this request.
The settings write path also checks its response using
!r[optionName] === valueinassets/src/Components/License.js—License::updateKey()lines 33–47, and the caller does not use the returned result. That observation may affect persistence diagnostics, but the available ticket evidence more directly matches the split validity-versus-entitlement path and does not establish a settings-write failure.Test coverage status
tests/tc-disabled-test.phpcovers active-license handling and Neve plan mapping, including Personal plan scenarios intest_personal_license_does_not_show_business_agency_onboarding_promo_text()lines 140–149 andtest_neve_personal_category_does_not_show_business_agency_onboarding_promo_text()lines 191–207. Those tests do not exercise the React activation flow, the raw-tier selector, or navigation/reload after entering an ineligible key. No relevant JavaScript or e2e coverage was found during inspection.What to verify or explore next
license,valid,tier,message, and HTTP status.tests/tc-disabled-test.phpand any browser-level license flow available in the release environment.Unknowns / follow-up
Confidence
Confidence: 88/100
The customer’s reported sequence matches a reachable mismatch in the inspected v1.4.2 code: license verification and Templates Cloud entitlement use different acceptance criteria. Account and documentation evidence confirms the submitted Neve Personal license is valid for Neve but ineligible for standalone Templates Cloud, and no existing issue was found.
Source: HelpScout #3398123677
Generated by bug-report-triage (ID: bug-report-triage_6a65b086447ff8.33053914)