Skip to content

Templates Cloud marks an ineligible Neve Personal license as verified before returning to the license prompt #501

Description

@pirate-bot

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:

  1. Open the Templates Cloud license screen.
  2. Enter a valid Neve Pro Personal license key.
  3. Submit the key and observe a green confirmation/verified state.
  4. Leave the page and return to Templates Cloud.
  5. 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.jsLicense::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.jslicenseStatusMsg approx. lines 87–98. A license classified as valid is displayed as Verified - Expires at ....
  • Activation response classification: assets/src/Components/CloudLibrary/common.jsfetchLibrary() 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.jsgetUserStatus() lines 17–40. Access is determined separately through a hard-coded raw-tier allowlist.
  • Returned prompt: assets/src/Components/CloudLibrary/Library.jsLibrary 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.phpLicense::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.phpLicense::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.jsLicense::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)

Metadata

Metadata

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions