octobercms/october · error · SystemException

Unable to find global blueprint with ID "%s".

Error message

Unable to find global blueprint with ID "%s".

What it means

Thrown by getBlueprintDefinition() on global records (HasGlobalBlueprint trait) when blueprint_uuid is set but BlueprintIndexer::findGlobal($uuid) returns null — the registry knows no global blueprint with that UUID. This is the dangling-reference variant for globals: the data points at a blueprint the current environment does not have.

Source

Thrown at modules/tailor/models/globalrecord/HasGlobalBlueprint.php:81

    }

    /**
     * getBlueprintDefinition
     */
    public function getBlueprintDefinition(): GlobalBlueprint
    {
        if ($this->blueprintCache !== null) {
            return $this->blueprintCache;
        }

        $uuid = $this->blueprint_uuid;
        if (!$uuid) {
            throw new SystemException('Missing global definition. Call GlobalRecord::inGlobal() to set one.');
        }

        $blueprint = BlueprintIndexer::instance()->findGlobal($uuid);
        if (!$blueprint) {
            throw new SystemException(sprintf('Unable to find global blueprint with ID "%s".', $uuid));
        }

        return $this->blueprintCache = $blueprint;
    }

    /**
     * fetchBlueprintContent
     */
    public function fetchBlueprintContent()
    {
        $content = $this->content;
        $contentColumns = $this->getFieldsetColumnNames();

        // Fetch content attributes
        foreach ($contentColumns as $key) {
            if (array_key_exists($key, $content)) {
                $this->$key = $content[$key];
            }

View on GitHub (pinned to b608633a7e)

Solutions

  1. Run php artisan tailor:sync followed by php artisan cache:clear
  2. If the global was recreated, reassign the orphaned rows' blueprint_uuid to the new blueprint UUID
  3. Re-import or restore the tailoring file that defined the missing global blueprint
  4. As a last resort, remove orphaned global rows

Example fix

// Point orphaned global rows at the recreated blueprint
$blueprint = \Tailor\Classes\BlueprintIndexer::instance()->findGlobalByHandle('site_settings');
\Tailor\Models\GlobalRecord::where('blueprint_uuid', $oldUuid)
    ->update(['blueprint_uuid' => $blueprint->uuid]);
Defensive patterns

Strategy: validation

Validate before calling

$blueprint = \Tailor\Classes\BlueprintIndexer::instance()->findGlobal($model->blueprint_uuid);
if (!$blueprint) {
    // orphaned row: reattach to the current global blueprint or skip
}

Type guard

function globalUuidResolves(?string $uuid): bool
{
    return $uuid !== null
        && \Tailor\Classes\BlueprintIndexer::instance()->findGlobal($uuid) !== null;
}

Prevention

When it happens

Trigger: Global record rows persisting a UUID from a deleted/recreated global blueprint; database dumps restored without the corresponding blueprint content; blueprints not synced (tailor:sync never run) on the current environment.

Common situations: Recreating a global in Tailor after deleting it (new UUID minted, old rows orphaned); staging-to-production content pushes that include records but not blueprint definitions; cache holding a stale blueprint registry.

Related errors


AI-assisted analysis of octobercms/october@b608633a7e (2026-08-21). Data as JSON: /api/errors/bec43dbd83a25154. Report an issue: GitHub.