octobercms/october · error · ValidationException
License is unpaid or has expired. Please visit octobercms.co
Error message
License is unpaid or has expired. Please visit octobercms.com to obtain a license.
What it means
When attaching a project, October validates the ID against the gateway via UpdateManager::requestProjectDetails($projectId). If the response's is_active flag is falsy (defaults to false when absent), a ValidationException on project_id states the license is unpaid or expired. The gateway will not serve composer packages for that project until the license is active, so attach is refused before storeProjectDetails/ensureComposerRegistered run.
Source
Thrown at modules/system/controllers/Updates.php:253
/**
* onAttachProject validates the project ID and execute the project installation
*/
public function onAttachProject()
{
try {
if (!$projectId = trim(post('project_id'))) {
throw new ValidationException(['project_id' => Lang::get('system::lang.project.id.missing')]);
}
// Validate input with gateway
$manager = UpdateManager::instance();
$result = $manager->requestProjectDetails($projectId);
// Check project status
$isActive = $result['is_active'] ?? false;
if (!$isActive) {
throw new ValidationException(['project_id' => __("License is unpaid or has expired. Please visit octobercms.com to obtain a license.")]);
}
// Store project details
$manager->storeProjectDetails($result);
// Add gateway as a composer repo
$this->ensureComposerRegistered();
Flash::success(__("Thanks for being a customer of October CMS!"));
return Backend::redirect('system/updates');
}
catch (Exception $ex) {
throw new ValidationException(['project_id' => $ex->getMessage()]);
}
}
/**
* Make sure composer is ready to receive updatesView on GitHub (pinned to b608633a7e)
Solutions
- Log in at octobercms.com, open the account/project page and check the license status; renew or pay if lapsed, then retry attaching
- Verify you copied the correct Project ID for this project (not another project's)
- If the license clearly shows active, contact October CMS support or check gateway status before retrying
Defensive patterns
Strategy: validation
Validate before calling
$result = \UpdateManager::instance()->requestProjectDetails($projectId);
if (!($result['is_active'] ?? false)) {
// surface a billing warning and stop before attaching the project
} Prevention
- Keep the October CMS license active; check its status on the account dashboard before debugging
- Verify the Project ID belongs to the account you expect
- Treat is_active=false as a hard stop: composer operations against the gateway will fail
When it happens
Trigger: onAttachProject with a syntactically valid Project ID whose license is inactive: expired annual license, unpaid invoice, refunded/trial ended, or an ID belonging to a different account.
Common situations: License lapsed mid-project; developer copied the wrong project ID from the account dashboard; purchase not yet provisioned on the gateway.
Related errors
- system::lang.project.id.missing
- system::lang.server.response_not_found
- system::lang.server.response_empty
- system::lang.server.response_invalid
- system::lang.server.response_empty
AI-assisted analysis of octobercms/october@b608633a7e (2026-08-21).
Data as JSON: /api/errors/cc5acce063b5352c.
Report an issue: GitHub.