nexu-io/open-design · error · DeployError
cloudflare_zone_not_full
cloudflare_zone_not_full
Error message
Cloudflare custom domains require a full DNS zone.
What it means
Thrown by validateCloudflarePagesDeploySelection in apps/daemon/src/deploy.ts:611 as `DeployError('Cloudflare custom domains require a full DNS zone.', 400, { errorCode: 'cloudflare_zone_not_full' })` when the zone's `type` is present and not `'full'`. Cloudflare distinguishes `full` (nameserver setup, full DNS control) from `partial` (CNAME setup, limited). The custom-domain CNAME flow assumes full DNS authority, so partial zones are rejected.
Source
Thrown at apps/daemon/src/deploy.ts:611
});
const json = await readCloudflareJson(resp);
if (!resp.ok || json?.success === false) {
throw cloudflareError(json, resp.status, 'Cloudflare zone lookup failed.');
}
const zone = json?.result ?? json;
const zoneName = normalizeCloudflareZoneName(zone?.name);
if (!zoneName || zoneName !== selection.zoneName) {
throw new DeployError('Cloudflare zone selection no longer matches the selected domain.', 400, {
errorCode: 'cloudflare_zone_mismatch',
});
}
if (zone?.status && zone.status !== 'active') {
throw new DeployError('Cloudflare custom domains require an active zone.', 400, {
errorCode: 'cloudflare_zone_inactive',
});
}
if (zone?.type && zone.type !== 'full') {
throw new DeployError('Cloudflare custom domains require a full DNS zone.', 400, {
errorCode: 'cloudflare_zone_not_full',
});
}
return { ...selection, zoneName };
}
async function setupCloudflarePagesCustomDomain({ config, projectId, selection, pagesDevUrl, priorMetadata }: { config: DeployConfig; projectId: string; selection: CloudflarePagesDeploySelection; pagesDevUrl: string; priorMetadata?: JsonObject | undefined }) {
if (!config.projectName) throw new DeployError('Cloudflare Pages project name could not be generated.', 400);
const pagesTarget = normalizeHostname(hostnameFromUrl(pagesDevUrl) || `${config.projectName}.pages.dev`);
const marker = cloudflarePagesDnsMarker(projectId, config.projectName, pagesTarget);
const base = {
hostname: selection.hostname,
url: `https://${selection.hostname}`,
zoneId: selection.zoneId,
zoneName: selection.zoneName,
domainPrefix: selection.domainPrefix,
};
View on GitHub (pinned to 5be4028344)
Solutions
- Convert the zone to a full (nameserver) setup in Cloudflare so type becomes 'full'.
- Alternatively, choose a different zone that is already full-setup, or skip the custom-domain option and use the default *.pages.dev URL.
Example fix
null
Defensive patterns
Strategy: try-catch
Validate before calling
null
Type guard
function isZoneNotFull(err: unknown): boolean {
return err instanceof DeployError && err.status === 400
&& (err as any).details?.errorCode === 'cloudflare_zone_not_full';
} Try / catch
try {
await deployToCloudflarePages({ config, files, projectId, cloudflarePages: selection });
} catch (err) {
if (isZoneNotFull(err)) {
return res.status(400).json({
error: 'This zone uses CNAME (partial) setup. Use a full-setup zone or the default *.pages.dev URL.',
errorCode: 'cloudflare_zone_not_full',
});
}
throw err;
} Prevention
- In the zone picker, only offer zones whose type is 'full'.
- If the org uses partial zones, fall back to the default pages.dev hostname instead of a custom domain.
- Document that custom domains require full (nameserver) Cloudflare setup.
When it happens
Trigger: The selected zone matches by name and is active, but `zone.type === 'partial'` (CNAME setup). The user added the domain to Cloudflare via CNAME setup rather than changing nameservers.
Common situations: Domain is hosted elsewhere with Cloudflare used only as a CDN via CNAME setup; the zone was added in partial mode to avoid nameserver migration; org policy forbids full zones.
Related errors
- cloudflare_zone_inactive
- Cloudflare zone is required for a custom domain.
- Select a valid Cloudflare domain for the custom domain.
- Enter a valid subdomain prefix, for example "demo".
- cloudflare_zone_mismatch
AI-assisted analysis of nexu-io/open-design@5be4028344 (2026-08-12).
Data as JSON: /api/errors/81b0eb5d260d2673.
Report an issue: GitHub.